指定相关矩阵以生成相关二进制变量

时间:2013-09-26 22:05:28

标签: r correlation

我想从预先指定的相关矩阵创建相关二元变量,其中大部分变量是高度相关的,而一些变量是相对不相关的。

例如我的相关矩阵是:

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不是肯定的。

如何指定满足我标准的相关矩阵(即大多数高相关性和少数低相关性)?

1 个答案:

答案 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