Моделирование t связки в Python

Я пытаюсь имитировать t-copula с использованием Python, но мой код дает странные результаты (не очень хорошо):

Я следовал подходу, предложенному Demarta & McNeil (2004) в "The t Copula and Related Copulas", в котором говорится:

t copula simulation

По интуиции я знаю, что чем выше параметр степеней свободы, тем больше копула должна напоминать гауссовую (и, следовательно, более низкую зависимость хвоста). Однако, учитывая, что я scipy.stats.invgamma.rvs пример из scipy.stats.invgamma.rvs или, альтернативно, из scipy.stats.chi2.rvs, дает более высокие значения для моего параметра s более высокий мой параметр df. Это не имеет никакого смысла, поскольку я нашел несколько статей, в которых говорится, что для dfinf, t-copula → гауссовой связки.

Вот мой код, что я делаю неправильно? (Я новичок в Python fyi).

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.stats import invgamma, chi2, t

#Define number of sampling points
n_samples = 1000
df = 10

calib_correl_matrix = np.array([[1,0.8,],[0.8,1]]) #I just took a bivariate correlation matrix here
mu = np.zeros(len(calib_correl_matrix))
s = chi2.rvs(df)
#s = invgamma.pdf(df/2,df/2) 
Z = np.random.multivariate_normal(mu, calib_correl_matrix,n_samples)
X = np.sqrt(df/s)*Z #chi-square method
#X = np.sqrt(s)*Z #inverse gamma method

U = t.cdf(X,df)

Мои результаты ведут себя точно противоположно тому, что я (должен) ожидать: более высокий df создает гораздо более высокую зависимость от хвоста, здесь также визуально:

 U_pd = pd.DataFrame(U)
 fig = plt.gcf()
 fig.set_size_inches(14.5, 10.5)
 pd.plotting.scatter_matrix(U_pd, figsize=(14,10), diagonal = 'kde')
 plt.show()

df=4: scatter_plot

df=100: enter image description here

Особенно это особенно invgamma.rvs непосредственном использовании invgamma.rvs, хотя они должны давать то же самое. Для dfs> = 30 я часто получаю ValueError ("ValueError: array не должен содержать infs или NaNs")

Большое спасибо за вашу помощь, очень ценим!

Ответы