相関行列で指定された相関変数を生成したいと考えています。
まず、相関行列を生成します。
require(psych)
require(Matrix)
cor.table <- matrix( sample( c(0.9,-0.9) , 2500 , prob = c( 0.8 , 0.2 ) , repl = TRUE ) , 50 , 50 )
k=1
while (k<=length(cor.table[1,])){
cor.table[1,k]<-0.55
k=k+1
}
k=1
while (k<=length(cor.table[,1])){
cor.table[k,1]<-0.55
k=k+1
}
ind<-lower.tri(cor.table)
cor.table[ind]<-t(cor.table)[ind]
diag(cor.table) <- 1
この相関行列は一貫していないため、固有値分解は不可能です。一貫性を持たせるために、nearPD を使用します。
c<-nearPD(cor.table)
これが完了したら、相関変数を生成します。
fit<-principal(c, nfactors=50,rotate="none")
fit$loadings
loadings<-matrix(fit$loadings[1:50, 1:50],nrow=50,ncol=50,byrow=F)
loadings
cases <- t(replicate(50, rnorm(10)) )
multivar <- loadings %*% cases
T_multivar <- t(multivar)
var<-as.data.frame(T_multivar)
cor(var)
しかし、結果として得られる相関関係は、私が最初に指定したものとはかけ離れています。
そのような相関関係を作成することはできませんか、それとも何か間違っていますか?
UPDATE
Greg Snow のコメントから、私の最初の相関行列が不合理であることが問題であることが明らかになりました。
問題は、マトリックスを合理的にするにはどうすればよいかということです。目標は次のとおりです。
- 49 個の変数のそれぞれが、最初の変数と >.5 の相関を持つ必要があります。
- ~40 の変数は、相互に .8 を超える高い相関関係を持つ必要があります。
- 残りの ~9 個の変数は、互いに低い相関または負の相関を持つ必要があります。
この要件全体は不可能ですか?