【发布时间】:2017-07-03 14:14:29
【问题描述】:
对于一个科学项目,我正在寻找一种方法来生成一定范围内的随机数据(例如 min=0,max=100000),并与另一个在 R 中已经存在的变量具有一定的相关性>。目标是稍微丰富数据集,这样我就可以生成一些更有意义的图表(不用担心,我正在处理虚构数据)。
例如,我想使用以下数据生成与 r=-.78 相关的随机值:
var1 <- rnorm(100, 50, 10)
我已经遇到了一些非常好的解决方案(即https://stats.stackexchange.com/questions/15011/generate-a-random-variable-with-a-defined-correlation-to-an-existing-variable),但只能得到非常小的值,我无法对其进行转换,因此在其他原始值的上下文中是有意义的。
如下示例:
var1 <- rnorm(100, 50, 10)
n <- length(var1)
rho <- -0.78
theta <- acos(rho)
x1 <- var1
x2 <- rnorm(n, 50, 50)
X <- cbind(x1, x2)
Xctr <- scale(X, center=TRUE, scale=FALSE)
Id <- diag(n)
Q <- qr.Q(qr(Xctr[ , 1, drop=FALSE]))
P <- tcrossprod(Q) # = Q Q'
x2o <- (Id-P) %*% Xctr[ , 2]
Xc2 <- cbind(Xctr[ , 1], x2o)
Y <- Xc2 %*% diag(1/sqrt(colSums(Xc2^2)))
var2 <- Y[ , 2] + (1 / tan(theta)) * Y[ , 1]
cor(var1, var2)
我得到的 var2 值介于 -0.5 和 0.5 之间。平均值为 0。我想要更多的分布式数据,所以我可以简单地通过添加 50 来转换它,并且与我的第一个变量相比具有非常相似的范围。
你们中有人知道生成这种或多或少有意义的数据的方法吗?
提前非常感谢!
【问题讨论】:
-
你可以只使用线性变换。
r-value 将保持不变 -
您所做的似乎是生成完全随机的数据,并对其进行调整以使相关性正确。您也可以做相反的事情并在源数据上产生噪声,然后将其放大以获得所需的相关性,也许您会更接近原始形状。
标签: r random correlation generated