Python中的t copula仿真

rho*_*del 12 python simulation scipy

我正在尝试使用Python模拟t-copula,但我的代码会产生奇怪的结果(表现不佳):

我遵循Demarta&McNeil(2004)在"The t Copula and Related Copulas"中提出的方法,该方法指出:

t copula模拟

通过直觉,我知道自由度参数越高,t copula应该越像高斯型(因此尾部依赖性越低).但是,考虑到我从scipy.stats.invgamma.rvs或从中抽样scipy.stats.chi2.rvs,我的参数产生更高的值,我的参数s越高df.这没有任何意义,因为我发现多篇论文表明df- > inf,t-copula - > Gaussian copula.

这是我的代码,我做错了什么?(我是Python的初学者).

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)
Run Code Online (Sandbox Code Playgroud)

我的结果与我(应该)期望的结果完全相反:更高的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()
Run Code Online (Sandbox Code Playgroud)

df=4: 散点图

df=100: 在此输入图像描述

invgamma.rvs直接使用它会变得更加糟糕,即使它们应该产生相同的效果.对于dfs> = 30,我经常收到一个ValueError("ValueError:数组不能包含infs或NaNs")

非常感谢您的帮助,非常感谢!

KT.*_*KT. 2

您的代码中有一个明显的问题。也就是说,这个:

s = chi2.rvs(df)
Run Code Online (Sandbox Code Playgroud)

必须改成这样:

s = chi2.rvs(df, size=n_samples)[:, np.newaxis]
Run Code Online (Sandbox Code Playgroud)

否则,变量s只是一个常数,您X最终将成为多元正态分布的样本(按 缩放np.sqrt(df/s)),而不是您需要的 t 分布。

您很可能获得“尾重”图表,只是因为您不走运并且您的采样值s最终太小。不过,这与 无关,但当较小时df,似乎更容易达到“不幸”的值。df