1

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

例如,我的相关矩阵将是:

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

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

4

1 回答 1

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 个以及彼此之间相关性较低的 3 个。

 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
于 2013-09-27T00:11:29.457 回答