1

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

首先我生成相关矩阵:

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 的评论中可以清楚地看出,问题在于我的初始相关矩阵不合理。

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

  1. 49 个变量中的每一个都应与第一个变量相关 >.5。
  2. 约 40 个变量应具有 >.8 的高相关性
  3. 其余约 9 个变量应该彼此具有低或负相关。

这整个要求是不可能的吗?

4

2 回答 2

2

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

**编辑

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

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
于 2013-09-16T21:21:38.320 回答
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()

在此处输入图像描述

于 2013-09-17T21:02:45.937 回答