【问题标题】:I want to create hypothetical data based on a correlation matrix我想根据相关矩阵创建假设数据
【发布时间】:2020-07-11 20:42:51
【问题描述】:

我正在尝试编写一个创建假设数据的函数。该函数获取一个相关矩阵 (R) 和一个整数 (n) 作为输入值。它将创建一个具有 n 行的数据框(或矩阵),并且列之间的二元相关性必须与相关性矩阵 (R) 中的相同。

这是我目前所拥有的:

我的功能是:

generate_data = function(R, n) {
r.eigen = eigen(R)
factors = t(t(r.eigen$vectors) * sqrt(r.eigen$values))
data = matrix(rnorm(n * ncol(R)), n)
data = data %*% t(factors)
return(data)}

这是我使用不同 n 得到的输出。

相关矩阵示例:

R = matrix(c(1, .06, -.1, .1, .06, 1, -.51, .14, -.1, -.51, 1, .12, .1,  .14, .12, 1), ncol = 4)

> R
      [,1]  [,2]  [,3] [,4]

[1,]  1.00  0.06 -0.10 0.10

[2,]  0.06  1.00 -0.51 0.14

[3,] -0.10 -0.51  1.00 0.12

[4,]  0.10  0.14  0.12 1.00

这是我可以根据 n(行数)得到的相关矩阵。

>  round(cor(generate_data(R, 100)), 2)

      [,1]  [,2]  [,3] [,4]

[1,]  1.00 -0.23  0.09 0.12

[2,] -0.23  1.00 -0.44 0.23

[3,]  0.09 -0.44  1.00 0.09

[4,]  0.12  0.23  0.09 1.00

 >  round(cor(generate_data(R, 1000)), 2)

      [,1]  [,2]  [,3] [,4]

[1,]  1.00  0.05 -0.11 0.10

[2,]  0.05  1.00 -0.51 0.13

[3,] -0.11 -0.51  1.00 0.17

[4,]  0.10  0.13  0.17 1.00

 >  round(cor(generate_data(R, 10000)), 2)

      [,1]  [,2]  [,3] [,4]

[1,]  1.00  0.05 -0.09 0.10

[2,]  0.05  1.00 -0.50 0.13

[3,] -0.09 -0.50  1.00 0.14

[4,]  0.10  0.13  0.14 1.00

我的函数对于大 n 似乎工作得相当好,但它不适用于小 n。有没有办法让函数也适用于较小的 n?

希望这足够清楚。感谢所有帮助。

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以使用mvtnorm 包中的rmvnorm() 函数。但是,对于较小的n,样本变化不太可能稳定下来,您将获得在您自己的函数中也看到的小样本变化。对此你无能为力——这就是随机性。

    library("mvtnorm")
    R <- matrix(c(1, .06, -.1, .1, .06, 1, -.51, .14, -.1, -.51, 1, .12, .1,  .14, .12, 1), ncol = 4)
    x <- rmvnorm(n=500, mean=c(0,0,0,0), sigma=R)
    

    这会产生

    cor(x)
               [,1]       [,2]        [,3]       [,4]
    [1,]  1.0000000  0.1023989 -0.10946186 0.12230412
    [2,]  0.1023989  1.0000000 -0.53853097 0.15985618
    [3,] -0.1094619 -0.5385310  1.00000000 0.05587178
    [4,]  0.1223041  0.1598562  0.05587178 1.00000000
    

    这似乎与您使用 R 指定的非常接近。如果我将样本数增加到 10000,我会得到

    x <- rmvnorm(n=10000, mean=c(0,0,0,0), sigma=R)
    cor(x)
                [,1]        [,2]        [,3]      [,4]
    [1,]  1.00000000  0.05969971 -0.08121426 0.1121826
    [2,]  0.05969971  1.00000000 -0.51305601 0.1247779
    [3,] -0.08121426 -0.51305601  1.00000000 0.1340828
    [4,]  0.11218257  0.12477793  0.13408277 1.0000000
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多