web-dev-qa-db-ja.com

Python)でのtコピュラのシミュレーション

Pythonを使用してt-コピュラをシミュレートしようとしていますが、コードで奇妙な結果が得られます(正常に動作していません)。

私は、「The t Copula and Related Copulas」の Demarta&McNeil (2004)によって提案されたアプローチに従いました。

t copula simulation

直感的には、自由度パラメーターが高いほど、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: scatter_plot

df=100: enter image description here

invgamma.rvsを直接使用すると、同じ結果になるはずですが、特に悪化します。 dfs> = 30の場合、ValueErrorを受け取ることがよくあります( "ValueError:配列にはinfまたはNaNを含めることはできません")

どうもありがとうございました!

12
rhonsprudel

コードに明らかな問題が1つあります。つまり、これ:

_s = chi2.rvs(df)
_

次のようなものに変更する必要があります。

_s = chi2.rvs(df, size=n_samples)[:, np.newaxis]
_

それ以外の場合、変数sは単一の定数であり、Xは、t分布ではなく、多変量正規分布(np.sqrt(df/s)でスケーリング)からのサンプルになります。あなたが必要です。

運が悪く、サンプル値sが小さすぎたという理由だけで、「テールヘビー」チャートを取得した可能性があります。これはdfとは何の関係もありませんが、dfが小さいほど、「不運な」値に到達しやすいようです。

1
KT.