假设我有一个向量:
Q<-rnorm(10,mean=0,sd=20)
从这个向量我想:
1.
创建10个变量 (a1...a10)
,每个变量具有高于.5(即在.5和1之间)与Q的相关性 .
第一部分可以完成:
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
3 回答
我刚才回答了一个非常相似的问题
R: Constructing correlated variables
我不熟悉抖动,所以也许我的解决方案更冗长,但它可以让你确切地确定每个变量和q应该是什么相互关系 .
该答案中引用的F矩阵描述了您想要对数据施加的相互关系 .
EDIT to answer question in comment:
如果我没有记错,您正在尝试创建多变量相关数据集 . 因此集合中的所有变量都有不同程度的相关性 . 我假设Q是你的标准或DV,a1-a10是预测变量或IV .
在F矩阵中,您将反映这些变量之间的关系 . 例如
描述了三个变量之间的关系 . 第一个可以是Q,第二个是a1,第三个是a2 . 所以在这种情况下,q与a1(.90)和a2(.20)相关 .
a1与a2(.40)相关
矩阵的其余部分是多余的 .
在代码的其余部分中,您只是创建原始的,不相关的变量,然后施加先前从F矩阵中提取的加载 .
我希望这有帮助 . 如果R中有一个包可以做到这一切,请告诉我 . 我构建它是为了帮助我理解多变量数据集是如何实际生成的 .
要将此概括为10个变量加q,只需将现在设置为3的参数设置为11并创建一个11x11 F矩阵 .
作为解决方案的指针使用R中的噪声函数jitter:
要生成具有规定相关性(或方差)的数据,您可以从随机数据开始,并使用所需相关矩阵的Cholesky分解对其进行重新缩放 .