4

假设我有一个向量:

Q<-rnorm(10,mean=0,sd=20)

从这个向量我想:

1.创建 10 个变量(a1...a10),每个变量与 Q 的相关性高于 0.5(即介于 0.5 和 1 之间)。

第一部分可以通过以下方式完成:

t1<-sapply(1:10, function(x) jitter(t, factor=100))

2.这些变量中的每一个(a1...a10)都应该具有预先指定的相互关系。例如,一些应该是相关的 .8 和一些 -.2。

这两件事能做到吗?

我创建了一个相关矩阵:

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
    }   
    diag(cor.table) <- 1

但是,当我应用@SprengMeister 提供的出色解决方案时,我得到了错误:

Error in eigen(cor.table)$values > 0 : 
  invalid comparison with complex values

继续这里:相关矩阵的特征值分解

4

3 回答 3

6

作为解决方案的指针,在 R 中使用噪声函数抖动

set.seed(100)
t = rnorm(10,mean=0,sd=20)
t1 = jitter(t, factor = 100)
cor(t,t1)
[1] 0.8719447
于 2013-09-16T11:44:36.777 回答
2

要生成具有规定相关性(或方差)的数据,您可以从随机数据开始,并使用所需相关性矩阵的 Cholesky 分解对其进行重新缩放。

# Sample data
Q <- rnorm(10, mean=0, sd=20)
desired_correlations <- matrix(c(
  1, .5, .6, .5,
  .5, 1, .2, .8,
  .6, .2, 1, .5,
  .5, .8, .5, 1 ), 4, 4 )
stopifnot( eigen( desired_correlations )$values > 0 )

# Random data, with Q in the first column
n <- length(Q)
k <- ncol(desired_correlations)
x <- matrix( rnorm(n*k), nc=k )
x[,1] <- Q

# Rescale, first to make the variance equal to the identity matrix, 
# then to get the desired correlation matrix.
y <- x %*% solve(chol(var(x))) %*% chol(desired_correlations)
var(y)
y[,1] <- Q  # The first column was only rescaled: that does not affect the correlation
cor(y)      # Desired correlation matrix
于 2013-09-16T13:39:37.363 回答
1

不久前我回答了一个非常相似的问题

R:构建相关变量

我对抖动不熟悉,所以也许我的解决方案更冗长,但它可以让你准确地确定每个变量和 q 的相互关系应该是什么。

该答案中引用的 F 矩阵描述了您要对数据施加的相互关系。

编辑以在评论中回答问题:

如果我没记错的话,您正在尝试创建一个多元相关数据集。因此,集合中的所有变量都具有不同程度的相关性。我假设 Q 是您的标准或 DV,a1-a10 是预测变量或 IV。

在 F 矩阵中,您将反映这些变量之间的关系。例如

  cor_Matrix <- matrix(c(1.00, 0.90, 0.20 ,
                         0.90, 1.00, 0.40 ,
                         0.20, 0.40, 1.00), 
                         nrow=3,ncol=3,byrow=TRUE)

描述了三个变量之间的关系。第一个可以是Q,第二个是a1,第三个是a2。所以在这种情况下,q 与 a1 (.90) 和 a2 (.20) 相关。

a1 与 a2 (.40) 相关

矩阵的其余部分是多余的。

在其余代码中,您只是创建原始的、不相关的变量,然后施加您之前从 F 矩阵中提取的载荷。

我希望这有帮助。如果 R 中有一个包可以完成所有这些,请告诉我。我构建它是为了帮助我了解多变量数据集是如何实际生成的。

要将其推广到 10 个变量加上 q,只需将现在设置为 3 的参数设置为 11 并创建一个 11x11 F 矩阵。

于 2013-09-16T13:29:56.857 回答