rho*_*del 12 python simulation scipy
我正在尝试使用Python模拟t-copula,但我的代码会产生奇怪的结果(表现不佳):
我遵循Demarta&McNeil(2004)在"The t Copula and Related Copulas"中提出的方法,该方法指出:

通过直觉,我知道自由度参数越高,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")
非常感谢您的帮助,非常感谢!
您的代码中有一个明显的问题。也就是说,这个:
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
| 归档时间: |
|
| 查看次数: |
1316 次 |
| 最近记录: |