Моделирование t связки в Python
Я пытаюсь имитировать t-copula с использованием Python, но мой код дает странные результаты (не очень хорошо):
Я следовал подходу, предложенному Demarta & McNeil (2004) в "The t Copula and Related Copulas", в котором говорится:
По интуиции я знаю, что чем выше параметр степеней свободы, тем больше копула должна напоминать гауссовую (и, следовательно, более низкую зависимость хвоста). Однако, учитывая, что я scipy.stats.invgamma.rvs
пример из scipy.stats.invgamma.rvs
или, альтернативно, из scipy.stats.chi2.rvs
, дает более высокие значения для моего параметра s
более высокий мой параметр df
. Это не имеет никакого смысла, поскольку я нашел несколько статей, в которых говорится, что для df
→ inf
, 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
:
df=100
:
Особенно это особенно invgamma.rvs
непосредственном использовании invgamma.rvs
, хотя они должны давать то же самое. Для dfs> = 30 я часто получаю ValueError ("ValueError: array не должен содержать infs или NaNs")
Большое спасибо за вашу помощь, очень ценим!