【问题标题】:Create correlated variables from existing variable [closed]从现有变量创建相关变量 [关闭]
【发布时间】:2013-09-16 11:26:09
【问题描述】:

假设我有一个向量:

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

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

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

在此处继续:Eigenvalue decomposition of correlation matrix

【问题讨论】:

标签: r correlation


【解决方案1】:

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

set.seed(100)
t = rnorm(10,mean=0,sd=20)
t1 = jitter(t, factor = 100)
cor(t,t1)
[1] 0.8719447

【讨论】:

  • 谢谢,这是很好的帮助。我会不断修改问题,直到得到最终结果。你能解释一下 factor 参数代表什么吗?抖动帮助没有解释这一点。
  • 来自文档:jitter 有两个选项:factoramount。我想你得到了解释 amount 的部分。当 amountNULL(默认)时,函数返回 x + runif(n, -a, a) 其中 a = factor * d/5 其中 d 是相邻唯一(除了模糊)x 值之间的最小差异。
【解决方案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

【讨论】:

  • 感谢您的帮助。在这种情况下,您可以指定变量应该如何与 Q 相关联。这是我问题的第一部分。第 2 部分是如何指定这些变量之间的相关性。这是否也涉及第二部分?
  • 是的,您必须指定整个相关矩阵:第一行(和第一列)包含新变量与Q 的相关性;其他元素是新变量之间的相关性。
【解决方案3】:

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

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 矩阵。

【讨论】:

  • 我也不熟悉 rmvnorm,它完全有可能提供一个不太复杂的解决方案。我已经进行了编辑以回答您的第二个问题。
  • 是的,这是完美的,正是我想要的。剩下的问题是如何为更大的变量集指定相关矩阵?对于 3 个变量,您可以手动编写代码,但如果有 50 个呢?
  • 只是展开模板。它目前是 3x3,对。因此,将其设为 50x50。然后,更改代码以反映帽子。基本上,每当您看到“3”时,将其设为 50。
  • 您可以通过编程方式生成这样的矩阵。如果它按照您描述的方式构建,我可能会在 Excel 中创建它,然后将其加载到您的程序中。
  • 请看我的最终编辑。这是最后一期
猜你喜欢
  • 2020-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-09
相关资源
最近更新 更多