为什么我不能模拟负相关的变量?我该如何解决?

机器算法验证 r 相关性 胆汁分解
2022-03-19 09:15:28

我想用这种方法模拟具有不同相关矩阵的数据:

M = matrix(c(1.0,  0.6,  0.6, 0.6, 
             0.6,  1.0, -0.2, 0.0,
             0.6, -0.2,  1.0, 0.0, 
             0.6,  0.0,  0.0, 1.0 ),
           nrow=4, ncol=4)

Cholesky 分解

L = chol(M)
nvars = dim(L)[1]

随机变量:

r = t(L) %*% matrix(rnorm(nvars * megf), nrow=nvars, ncol=megf)
r = t(r)

它适用于正相关,但我也需要负相关。为什么它不起作用?我怎样才能做到这一点?

代码来源

2个回答

您的相关矩阵不是正定的。这意味着真实的数据集不可能生成它。

> det(M)
[1] -0.2496

这有效并且具有负相关性:

> M=matrix(c(1.0,  0.6,  0.6, 0.6, 
             0.6,  1.0, -0.2, 0.3,
             0.6, -0.2,  1.0, 0.3, 
             0.6,  0.3,  0.3, 1.0)
            ,nrow=4, ncol=4)
> 
> det(M)
[1] 0.0528

您的代码没有运行,因为megf没有被定义。

mvrnorm()您可以通过使用MASS 包中的函数来节省一点精力。

> library(MASS)
> set.seed(1234)  #Set seed for replicability
> r <- mvrnorm(n=1000, Sigma=M, mu=rep(0, 4) )
> cor(r)
          [,1]       [,2]       [,3]      [,4]
[1,] 1.0000000  0.5748690  0.6330390 0.5950443
[2,] 0.5748690  1.0000000 -0.1879727 0.2915380
[3,] 0.6330390 -0.1879727  1.0000000 0.3048610
[4,] 0.5950443  0.2915380  0.3048610 1.0000000

Cholesky 方法适用于负相关。当然,它确实需要正定矩阵,但矩阵中可以包含负元素,请参阅此示例