假设我有一个向量:
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
答案 0 :(得分:4)
作为解决方案的指针,使用R:
中的噪声函数jitterset.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矩阵。