不可能从这个相关矩阵创建相关变量?

时间:2013-09-16 17:40:13

标签: r correlation

我想生成由相关矩阵指定的相关变量。

首先我生成相关矩阵:

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)

然而,由此产生的相关性远非我最初指定的任何内容。

是否无法创建此类关联或我做错了什么?

来自Greg Snow的评论

UPDATE很明显问题是我的初始相关矩阵是不合理的。

那么问题是如何使矩阵合理化。目标是:

  1. 49个变量中的每一个都应该将&gt; .5与第一个变量相关联。
  2. ~40个变量应该具有彼此高的> .8相关性
  3. 剩下的~9个变量之间应该有较低或负相关。
  4. 这整个要求是不可能的吗?

2 个答案:

答案 0 :(得分:2)

尝试使用MASS包中的mvrnorm函数,而不是尝试自己构造变量。

**修改

这是一个正定矩阵(所以它作为相关矩阵)并接近你的标准,你可以从那里调整值(所有的特征值都需要是正的,所以你可以看到如何变化一个数字影响事物):

cor.mat <- matrix(0.2,nrow=50, ncol=50)
cor.mat[1,] <- cor.mat[,1] <- 0.55
cor.mat[2:41,2:41] <- 0.9
cor.mat[42:50, 42:50] <- 0.25
diag(cor.mat) <- 1

eigen(cor.mat)$values

答案 1 :(得分:1)

根据您的上述规范进行的一些数值实验表明,生成的矩阵永远不会(从来没有?很好,几乎没有...)是肯定的,但它也看起来不远具有这些值的PD(使lcor低于负值几乎肯定会使事情变得更糟......)

rmat <- function(n=49,nhcor=40,hcor=0.8,lcor=0) {
    m <- matrix(lcor,n,n)  ## fill matrix with 'lcor'
    ## select high-cor variables
    hcorpos <- sample(n,size=nhcor,replace=FALSE)
    ## make all of these highly correlated
    m[hcorpos,hcorpos] <- hcor                
    ## compute min real part of eigenvalues
    min(Re(eigen(m,only.values=TRUE)$values))
}
set.seed(101)
r <- replicate(1000,rmat())
## NEVER pos definite
max(r)
## [1] -1.069413e-15
par(las=1,bty="l")
png("eighist.png")
hist(log10(abs(r)),breaks=50,col="gray",main="")
dev.off()

enter image description here