2017-01-30 13 views
2

こんにちは、60個の変数の相関バイナリデータ(0/1)を一度に生成したいと思います。 bindatamvrnormのようなパッケージをいくつか試しましたが、私が与えるランダムな相関行列が正しいとは言えません。 (切り捨てられた正規分布から作成しようとしました...)共分散行列の仕様との相関データのシミュレーション

私の欲しいのは、私の変数間の平均相関を0.7のように指定し、負の相関もあります。それは可能ですか?おかげ

EDIT:私のスクリプト

set.seed(1) 
mymatrix <- matrix(rnorm(25, mean=0.7, sd=0.2), ncol=5) # random matrix mean 0.7 
mymatrix[lower.tri(mymatrix)] = t(mymatrix)[lower.tri(mymatrix)] # make it symmetric 
mymatrix[mymatrix>1]<-0.7 # make numbers between 0 and 1 
mymatrix[mymatrix<0]<-0.7 
library(bindata) 
res=rmvbin(1000, margprob=diag(mymatrix), bincorr = mymatrix) 
#### Error in commonprob2sigma(commonprob, simulvals) : 
#### Matrix commonprob not admissible. 
+1

でそれを行うとの正確なテキストを提供することができます「私が与えるランダム相関行列は右ではないことを私に言って、エラーを。」 – lmo

+0

@lmoありがとう、編集を参照してください.. – agenis

答えて

1

あなたのマトリックス(スニペットからmymatrix)が正定値ではなく、それが有効な共分散行列することはできません、ましてやその対角線エントリとして有効な相関行列であること1ではありません。ランダム行列をその転置行列に掛けてランダム共分散行列を構築して、それが少なくとも正の定理となるようにしてください。相関行列を作成するには、それに応じて共分散行列を再スケールする必要があります。例えば、以下articleを参照して、指定された相関構造を持つ多変量ベルヌーイベクトルを生成する元の問題として

rmat <- matrix(rnorm(25),5,5) 
cov_mat <- rmat%*%t(rmat) 
corr_mat <- cov_mat/sqrt(diag(cov_mat)%*%t(diag(cov_mat))) 

。基本的には、ガウス型コピュラを使用する必要があります。ベルヌーイの場合、各変数対に対して比較的単純な代数です。私はあなたが上記のパッケージがあなたのためにそれをすると思います。

[編集]ベルヌーイベクトルの場合、すべての相関行列が許容できるわけではありません。限界確率はそれぞれ0.5である単純な3変数の場合を考えてください。簡単な代数を行うと、(X_i、X_j)の相関が4E [X_i X_j] -1になります。彼らは各ペアの[-1,1]の範囲にあります。すべてのi、jが等しくない場合、(X_i、X_j)の相関を-0.5にしたいとします。これは、すべてのi、jが等しくない場合にE [X_i X_j] = 1/8を必要とします。各サブセットがサンプル空間の半分をカバーし、各ペアがサンプル空間のわずか1/8のオーバーラップを持つサンプル空間の3つのサブセットのベン図を描画しようとすると、これは論理的に不可能であることが容易に分かります。

したがって、最終行は、論理的に実現可能なバイナリ相関行列を関数に提供する必要があることです。これは有効な相関行列ではありません。特定の相関係数を気にしない場合は、有効な相関行列でガウス分布を使用してください。興味のあるあなたのパッケージのために、あなたはおそらく、あなたは、おもちゃの例を提供する必要があります

rmvbin(1000,margprob=rep(0.5,5),sigma=corr_mat) 
+0

答えをありがとう、私はあなたの最初の段落を理解しますが、あなたが言及する記事は本当に私の数学の知識のために複雑すぎる....私はあなたのmodifで私のコードを再実行しようとした: "警告:結果の共分散行列は正定値ではありません"。返されるすべての値はNAです。 – agenis

+0

上記のEDITを参照してください。 – Julius

+0

それは正しいです。私は投稿を編集します。ありがとう! – Julius