多元正态分布中的相关变量

correlated variables from a multivariate normal distribution

提问人:Edward 提问时间:11/4/2023 最后编辑:jay.sfEdward 更新时间:11/5/2023 访问量:24

问:

我正在尝试开发一个循环,它将有助于我动态控制两个变量之间的相关性,同时保持其他变量的相关性是静态的。我已经完成了这个任务,但我无法让循环在每个级别的相关性的变量之间执行相关性。换句话说,我得到的唯一相关矩阵是我指定的最后一个级别。我想使用 cor 函数获得每个级别的相关矩阵。这样,我就可以确保 R 正确地执行我的循环,并且可以在不同的统计应用程序中使用数据。所以我很清楚,这不是一个课堂项目,而是一个真正的项目。

这是我目前使用的代码。

require("JWileymisc")
require("MASS")

cor.level <- c(0, .1, .2)
for (j in 1:length(cor.level)) {
  V <- matrix(c(
    1, cor.level[j], .096, .043, .109, 
    cor.level[j], 1, .400, -.016, .297, 
    .096, .400, 1, .092, .382, 
    .043, -.016, .092, 1, .103, 
    .109, .297, .382, .103, 1), 
    5, 5)
  sigma <- c(.4421, 1.0880, 8.5073, .4700, 1.1249)
  Sigma <- cor2cov(V, sigma)
  mu <- c(.7337, 2.7300, 46.9970, 2.6002, 1.7491)
  d <- data.frame(mvrnorm(n=300, mu, Sigma, 5, 5))
  co <- cor(d)
  co
}

我确定我的错误非常简单,但我目前没有看到它。有人会帮我实现 3 个相关矩阵,每个矩阵对应上面指定的 cor.level 的每个级别,使用 cor 函数吗?

R for 循环 变量 相关性

评论

0赞 Ben Bolker 11/4/2023
您是否需要使获得的相关性与指定值完全相同empirical=TRUE
1赞 Andrew Gustar 11/4/2023
您正在通过循环覆盖每次迭代。也许您需要将它们保存在列表中coco[[j]] <- cor(d)
0赞 Edward 11/6/2023
这太棒了,而且很有效!谢谢本和安德鲁。

答:

0赞 jay.sf 11/5/2023 #1

using 循环。for

library("JWileymisc"); library("MASS")
cor.level <- c(0, .1, .2)

co <- vector('list', length(cor.level))
for (j in 1:length(cor.level)) {
  V <- matrix(c(
    1, cor.level[j], .096, .043, .109, 
    cor.level[j], 1, .400, -.016, .297, 
    .096, .400, 1, .092, .382, 
    .043, -.016, .092, 1, .103, 
    .109, .297, .382, .103, 1), 
    5, 5)
  sigma <- c(.4421, 1.0880, 8.5073, .4700, 1.1249)
  Sigma <- cor2cov(V, sigma)
  mu <- c(.7337, 2.7300, 46.9970, 2.6002, 1.7491)
  co[[j]] <- cor(mvrnorm(n=300, mu, Sigma, 5, 5))
}
co

不过最好使用。lapply

library("JWileymisc"); library("MASS")
cor.level <- c(0, .1, .2)

lapply(cor.level, \(x) {
  V <- matrix(c(
    1, x, .096, .043, .109, 
    x, 1, .400, -.016, .297, 
    .096, .400, 1, .092, .382, 
    .043, -.016, .092, 1, .103, 
    .109, .297, .382, .103, 1), 
    5, 5)
  sigma <- c(.4421, 1.0880, 8.5073, .4700, 1.1249)
  Sigma <- cor2cov(V, sigma)
  mu <- c(.7337, 2.7300, 46.9970, 2.6002, 1.7491)
  m <- mvrnorm(n=300, mu, Sigma, 5, 5)
  cor(m)
})

两者的输出:

[[1]]
              [,1]          [,2]  [,3]   [,4]  [,5]
[1,]  1.000000e+00 -6.645591e-16 0.096  0.043 0.109
[2,] -6.645591e-16  1.000000e+00 0.400 -0.016 0.297
[3,]  9.600000e-02  4.000000e-01 1.000  0.092 0.382
[4,]  4.300000e-02 -1.600000e-02 0.092  1.000 0.103
[5,]  1.090000e-01  2.970000e-01 0.382  0.103 1.000

[[2]]
      [,1]   [,2]  [,3]   [,4]  [,5]
[1,] 1.000  0.100 0.096  0.043 0.109
[2,] 0.100  1.000 0.400 -0.016 0.297
[3,] 0.096  0.400 1.000  0.092 0.382
[4,] 0.043 -0.016 0.092  1.000 0.103
[5,] 0.109  0.297 0.382  0.103 1.000

[[3]]
      [,1]   [,2]  [,3]   [,4]  [,5]
[1,] 1.000  0.200 0.096  0.043 0.109
[2,] 0.200  1.000 0.400 -0.016 0.297
[3,] 0.096  0.400 1.000  0.092 0.382
[4,] 0.043 -0.016 0.092  1.000 0.103
[5,] 0.109  0.297 0.382  0.103 1.000

评论

0赞 Edward 11/6/2023
随着我获得更多的经验,我会考虑这种方法。谢谢你的贡献,Jay。