提问人:Edward 提问时间:11/4/2023 最后编辑:jay.sfEdward 更新时间:11/5/2023 访问量:24
多元正态分布中的相关变量
correlated variables from a multivariate normal distribution
问:
我正在尝试开发一个循环,它将有助于我动态控制两个变量之间的相关性,同时保持其他变量的相关性是静态的。我已经完成了这个任务,但我无法让循环在每个级别的相关性的变量之间执行相关性。换句话说,我得到的唯一相关矩阵是我指定的最后一个级别。我想使用 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 函数吗?
答:
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。
评论
empirical=TRUE
co
co[[j]] <- cor(d)