R:我如何模拟第一个不相关的变量并将它们“关联”起来?

时间:2018-05-28 11:35:16

标签: r simulation correlation

假设我想用三个变量进行两次模拟。在第一个模拟中(让我们称之为sima)我想生成三个统一或正态的分布式变量,这些变量是不相关的。然后我想要一些分析的东西。 之后我想重复分析,但我现在想要的是,我从第一次模拟(sima)生成的变量是相关的:

我知道,我可以使用mvrnorm函数,但我不知道如何“关联”我从第一次模拟生成的数据

例如

a <- rnorm(1000)
b <- rnorm(1000)
c <- rnorm(1000)

x <- matrix(c(a,b,c), ncol=3)

然后我想将矩阵x与例如:

的相关性相关联
cor(a,b)=0.4

cor(a,c)=0.3

cor(b,c)=0.5

2 个答案:

答案 0 :(得分:1)

如果我理解正确,您可以使用MASS::mvrnorm

功能
samples <- 200
rab <- 0.4
rac <- 0.3
rbc <- 0.5

data <-  MASS::mvrnorm(n=samples,
                     mu=c(0, 0, 0),
                     Sigma=matrix(c(1, rab, rac,
                                    rab, 1, rbc, 
                                    rac, rbc, 1),
                                  nrow=3),
                     empirical=TRUE)
A <- data[, 1]  
B <- data[, 2] 
C <- data[, 3]

cor(data)
cor(A, B)
cor(A, C)
cor(B, C)


> cor(data)
     [,1] [,2] [,3]
[1,]  1.0  0.4  0.3
[2,]  0.4  1.0  0.5
[3,]  0.3  0.5  1.0
> cor(A, B)
[1] 0.4
> cor(A, C)
[1] 0.3
> cor(B, C)
[1] 0.5

答案 1 :(得分:0)

你可以切换它。首先创建相关数据,如上面DJV的帖子。然后通过随机洗牌去相关。这并不能保证样本中的零相关性 - 但对于独立采样数据也是如此。

# first create `data` as in DJV's post. Then:

data_indep <- apply(data, 2, sample)
cor(data2)
            [,1]        [,2]        [,3]
[1,]  1.00000000  0.07503708 -0.13515778
[2,]  0.07503708  1.00000000 -0.02912137
[3,] -0.13515778 -0.02912137  1.00000000

为了显示平均而言,重新洗牌的数据是不相关的(这在分析上是正确的,但让我们检查一下):

replicate(10000, {data2 <- apply(data, 2, sample); cor(data2)}) -> cors
apply(cors, 1:2, mean)
              [,1]          [,2]         [,3]
[1,]  1.0000000000 -0.0009533055 0.0014867635
[2,] -0.0009533055  1.0000000000 0.0002847576
[3,]  0.0014867635  0.0002847576 1.0000000000

我觉得还不错。