【问题标题】:Impossible to create correlated variables from this correlation matrix?不可能从这个相关矩阵创建相关变量?
【发布时间】:2013-09-16 17:40:13
【问题描述】:

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

首先我生成相关矩阵:

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 个变量应彼此具有低相关性或负相关性。

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

【问题讨论】:

    标签: r correlation


    【解决方案1】:

    尝试使用 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
    

    【讨论】:

    • rmvnorm(n=4, mean=c(rep(0,50)),cor.table, method="svd") 这仍然不会在原始相关矩阵附近产生任何东西跨度>
    • @user1723765,只有 4 次观察,样本相关性将是高度可变的。如果样本量为 1,000,您会得到什么结果?你是如何计算相关性和比较的?你试过mvrnormempirical=TRUE吗?
    • 请看我的编辑。相关性与期望的相关性仍然相去甚远。我认为nearPD已经扭曲了整个事情。不能从我的初始矩阵创建相关变量吗?
    • 您的初始表作为相关矩阵不合理,例如变量 2 和 3 与变量 4 的相关性均为 0.9,但预计彼此之间的相关性为 -0.9,因此 @ 987654325@ 函数需要对值进行相当多的更改才能获得合理的值。另请注意,nearPD 默认计算协方差,如果你有它计算相关性,请将其传递给mvrnorm,然后将结果的相关性与c 矩阵进行比较,您应该会看到相似的值。
    • ok,所以问题是初始相关矩阵不合理。现在我明白了。请查看我的编辑。
    【解决方案2】:

    根据您的上述规范进行的一些数值实验表明,生成的矩阵永远不会(什么永远不会?嗯,几乎永远不会......)是正定的,但它看起来也不远具有这些值的 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()
    

    【讨论】:

    • 感谢您的帮助。所以这表明我的初始矩阵不起作用。有没有办法找到类似的东西可以工作?请参阅我帖子的最后几行,我在其中指定了我要查找的内容。不需要精确的相关值,只需满足指定的 3 个条件。
    • 自己尝试一下……我编写了这个函数,以便于调整。我建议修改lcor,这样有点积极...
    猜你喜欢
    • 2013-09-07
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多