我想从预先指定的相关矩阵创建相关二元变量,其中大部分变量是高度相关的,而一些变量是相对不相关的。
例如我的相关矩阵是:
cor.mat<-matrix(0.8,nrow=50,ncol=50)
cor.mat[,sample(1:50,10)]<-0.2
diag(cor.mat) <- 1
然后我会使用rmvbin:
library(bindata)
rmvbin(100, margprob=rep(.6,50), bincorr=cor.mat)
然而,在这种情况下,我得到NaNs
作为输出,因为sigma不是肯定的。
如何指定满足我标准的相关矩阵(即大多数高相关性和少数低相关性)?
答案 0 :(得分:0)
您的相关矩阵应该是对称的。这意味着如果你把对角线以下的所有东西拿走,它就像对角线上方所有东西的镜像一样。这必须是相关矩阵的情况,因为xi和xj的相关性应该与xj和xi的相关性相同。
我将制作一个11x11矩阵,因为我不想输入你的50x50矩阵。高相关部分看起来像这样。
1 .8 .8 .8 .8 .8 .8 .8
.8 1 .8 .8 .8 .8 .8 .8
.8 .8 1 .8 .8 .8 .8 .8
.8 .8 .8 1 .8 .8 .8 .8
.8 .8 .8 .8 1 .8 .8 .8
.8 .8 .8 .8 .8 1 .8 .8
.8 .8 .8 .8 .8 .8 1 .8
.8 .8 .8 .8 .8 .8 .8 1
这是你前8个变量的矩阵。然后添加另外3个与你拥有的8相关的低相关性。
1 .8 .8 .8 .8 .8 .8 .8 .2 .2 .2
.8 1 .8 .8 .8 .8 .8 .8 .2 .2 .2
.8 .8 1 .8 .8 .8 .8 .8 .2 .2 .2
.8 .8 .8 1 .8 .8 .8 .8 .2 .2 .2
.8 .8 .8 .8 1 .8 .8 .8 .2 .2 .2
.8 .8 .8 .8 .8 1 .8 .8 .2 .2 .2
.8 .8 .8 .8 .8 .8 1 .8 .2 .2 .2
.8 .8 .8 .8 .8 .8 .8 1 .2 .2 .2
.2 .2 .2 .2 .2 .2 .2 .2 1 .2 .2
.2 .2 .2 .2 .2 .2 .2 .2 .2 1 .2
.2 .2 .2 .2 .2 .2 .2 .2 .2 .2 1
该矩阵可分为4个部分。只有高度相关的变量x1到x8之间具有相关性的部分,即左上部分。只有低相关变量x9到x11之间相关性的部分,右下角。最后,右上角和左下角是三个和八个之间的相关性。这两个必须是彼此转置。
在R中构建此矩阵的方法有很多种。
cormat=matrix(.8,nrow=11,ncol=11)
cormat[,9:11]=.2 #set the right columns
cormat[9:11,]=.2 #set the bottom rows
diag(cormat)=1 #set the diagonal
如果您担心矩阵不是正定的,只需检查特征值是否都是正定的
eigen(cormat)$values