从相关矩阵获得协方差矩阵

机器算法验证 r 相关性 模拟 协方差
2022-04-09 21:38:11

我试图弄清楚如何将相关矩阵(R)转换为协方差矩阵(S)以输入到仅接受 S(rmvnorm("mvtnorm")在 R 中)的随机数生成器中

library("mvtnorm") 

TRUTH= 0.8 # target correlation value between X1 and X2
R <- as.matrix(data.frame(c(1, TRUTH), c(TRUTH, 1)))
V <- diag(c(sqrt(1), sqrt(1))) # diagonal matrix of sqrt(variances)
S <- V %*% R %*% V
cor(rmvnorm(100, sigma=S) )

# repeat this to get an idea of the variance around Pearson's estimator

方差不等于 1 的实例

V <- diag(c(sqrt(3), sqrt(2))) 
S <- V %*% R %*% V
cor(rmvnorm(100, sigma=S) )

这似乎是正确的,但我希望专家批评。

1个回答

R是相关矩阵和S标准差的向量,因此SS(在哪里是分量乘积)是方差向量。然后

diag(S)Rdiag(S)
是协方差矩阵。在这里得到了充分的解释

这可以实现R

cor2cov_1 <- function(R,S){
    diag(S) %*% R %*% diag(S)
}

但效率低下。一个有效的实现是

cor2cov <- function(R, S) {
 sweep(sweep(R, 1, S, "*"), 2, S, "*")
 }

你可以测试自己,他们给出相同的结果。