从现有变量创建相关变量

时间:2013-09-16 11:26:09

标签: r correlation

假设我有一个向量:

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

从这个载体我想:

1.创建10个变量(a1...a10),每个变量与Q之间的相关性高于.5(即介于.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

继续在这里:Eigenvalue decomposition of correlation matrix

3 个答案:

答案 0 :(得分:4)

作为解决方案的指针,使用R:

中的噪声函数jitter
set.seed(100)
t = rnorm(10,mean=0,sd=20)
t1 = jitter(t, factor = 100)
cor(t,t1)
[1] 0.8719447

答案 1 :(得分: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

答案 2 :(得分:1)

我刚才回答了一个非常类似的问题

R: Constructing correlated variables

我不熟悉抖动,所以也许我的解决方案更冗长,但它可以让你确切地确定每个变量和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矩阵。