生成不相关的变量,每个变量与现有的响应变量很好地相关

时间:2017-07-05 15:19:51

标签: r simulation

我想生成两个不相关的随机变量( x1,x2 ),它们显示与现有变量 y 的指定Pearson相关性,例如:

  • COR(的 X1,Y )= 0,4;
  • COR(的 X2,Y )= 0,3;
  • COR(的 X1,X2 )= 0.03。

因此,对于 y (使用空间插值技术),我有正常分布的连续值,现在我想为两个解释变量 x1生成模拟连续值(例如正态分布) x2 使用上面指出的相关系数。 我尝试了mvrnorm(MASS)和copula R包,但我找不到按照我想要的方式。

如果有人能帮助我到达那里,我会非常感激。亲切的问候。

1 个答案:

答案 0 :(得分:2)

MASS包中的mvrnorm函数应该能够执行此操作(copula包,我对它不太熟悉)。

您尝试了什么?结果与您的预期有何不同?

以下是一个快速mvrnorm示例:

> ?MASS::mvrnorm
> library(MASS)
> 
> r <- cbind( c(1, 0.4, 0.3),
+             c(0.4, 1, 0.03),
+             c(0.3, 0.03, 1))
> 
> xy <- mvrnorm(n=100, mu=c(0,0,0), Sigma=r, empirical=TRUE )
> colnames(xy) <- c('y','x1','x2')
> 
> cor(xy)
     y   x1   x2
y  1.0 0.40 0.30
x1 0.4 1.00 0.03
x2 0.3 0.03 1.00
> 

修改

以下是现有y变量的一种方法:

y <- rnorm(100)  # existing y

# generate x1 and x2, make sure y is first column
xy <- cbind( y, x1=rnorm(100), x2=rnorm(100))

# center and scale
mns <- apply(xy, 2, mean)
sds <- apply(xy, 2, sd)

xy2 <- sweep(xy, 2, mns, FUN="-")
xy2 <- sweep(xy2, 2, sds, FUN="/")

# find existing correlations
v.obs <- cor(xy2)

# remove correlation
xy3 <- xy2 %*% solve(chol(v.obs))

# check
zapsmall(cor(xy3))

# new correlation

r <- cbind( c(1, 0.4, 0.3),
            c(0.4, 1, 0.03),
            c(0.3, 0.03, 1))

xy4 <- xy3 %*% chol(r)

# undo center and scale

xy4 <- sweep(xy4, 2, sds, FUN="*")
xy4 <- sweep(xy4, 2, mns, FUN="+")

#check
cor(xy4)
all.equal(y, xy[,1])

mvrnorm函数使用svd和Eigen值而不是chol。您也可以使用您自己的y而不是矩阵的那部分的随机值来跟踪该代码。