Pythonを使用してt-コピュラをシミュレートしようとしていますが、コードで奇妙な結果が得られます(正常に動作していません)。
私は、「The t Copula and Related Copulas」の Demarta&McNeil (2004)によって提案されたアプローチに従いました。
直感的には、自由度パラメーターが高いほど、tコピュラがガウス分布に似ているはずです(したがって、テール依存性が低くなります)。ただし、scipy.stats.invgamma.rvs
または代わりにscipy.stats.chi2.rvs
からサンプリングすると、パラメータs
の値が高くなります。パラメータdf
が高くなります。 df
--> inf
、t-copula-> Gaussian 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
を直接使用すると、同じ結果になるはずですが、特に悪化します。 dfs> = 30の場合、ValueErrorを受け取ることがよくあります( "ValueError:配列にはinfまたはNaNを含めることはできません")
どうもありがとうございました!
コードに明らかな問題が1つあります。つまり、これ:
_s = chi2.rvs(df)
_
次のようなものに変更する必要があります。
_s = chi2.rvs(df, size=n_samples)[:, np.newaxis]
_
それ以外の場合、変数s
は単一の定数であり、X
は、t分布ではなく、多変量正規分布(np.sqrt(df/s)
でスケーリング)からのサンプルになります。あなたが必要です。
運が悪く、サンプル値s
が小さすぎたという理由だけで、「テールヘビー」チャートを取得した可能性があります。これはdf
とは何の関係もありませんが、df
が小さいほど、「不運な」値に到達しやすいようです。