协方差矩阵与相关矩阵之间的转换

3

我有一个相关矩阵

cor.mat <- structure(c(1, -0.25, 0.11, 0.25, 0.18, -0.25, 1, -0.14, -0.22, 
-0.15, 0.11, -0.14, 1, 0.21, 0.19, 0.25, -0.22, 0.21, 1, 0.53, 
0.18, -0.15, 0.19, 0.53, 1), .Dim = c(5L, 5L))

我也有一个标准误差矩阵。
sd <- structure(c(0.33, 0.62, 1, 0.54, 0.47), .Dim = c(1L, 5L))

dim(cor.mat)
#[1] 5 5
dim(sd)
#[1] 1 5
is.matrix(cor.mat)
#[1] TRUE
is.matrix(sd)
#[1] TRUE

cov.mat <-cor2cov(cor.mat, sd)
# Error in sds * R : non-conformable arrays

那么,矩阵的尺寸是兼容的,为什么cor2cov函数对我无效?
3个回答

3

好的,我不知道你的cor2cov是从哪里来的。但是,从相关矩阵和标准误差中获得协方差矩阵实际上非常简单:

cov.mat <- sweep(sweep(cor.mat, 1L, sd, "*"), 2L, sd, "*")

#          [,1]      [,2]    [,3]      [,4]      [,5]
#[1,]  0.108900 -0.051150  0.0363  0.044550  0.027918
#[2,] -0.051150  0.384400 -0.0868 -0.073656 -0.043710
#[3,]  0.036300 -0.086800  1.0000  0.113400  0.089300
#[4,]  0.044550 -0.073656  0.1134  0.291600  0.134514
#[5,]  0.027918 -0.043710  0.0893  0.134514  0.220900

是的,它只是对称行和列重新缩放。

我们可以使用 cov2cor 将此协方差矩阵转换回相关矩阵来验证这一点,这正是您的相关矩阵:

all.equal(cov2cor(cov.mat), cor.mat)
# [1] TRUE

关于你的 cor2cov 的猜测

如果你阅读了如何按行/列重新缩放矩阵,你会发现有很多不同的缩放方法。上述使用的sweep只是其中一种选择。

R基础函数cov2cor(V)使用的是:

Is <- sqrt(1/diag(V))    ## inverse of square root diagonal (inverse of sd)
Is * V * rep(Is, each = p)

我认为您的cor2cov(R, sds)也是以同样的方式编写的:

sds * R * rep(sds, each = p)    ## `sd` must be a vector

如果是这样,sd必须是一个向量,否则"*"将会报错(注意,你得到的错误信息确实来自"*")。
你所说的"矩阵具有相容的维度"这个论点是错误的。纯粹从线性代数角度来看,你需要让sd成为一个对角矩阵,以便你可以执行:
sd %*% cor.mat %*% sd

但是行/列重新缩放从来没有通过矩阵计算完成,因为这样太昂贵了。

3
按照相关性和协方差矩阵的定义,您可以简单地执行以下操作:
cov.mat <-  cor.mat * matrix(outer(sd, sd), nrow=5, byrow=TRUE)   

cov.mat
          [,1]      [,2]    [,3]      [,4]      [,5]
[1,]  0.108900 -0.051150  0.0363  0.044550  0.027918
[2,] -0.051150  0.384400 -0.0868 -0.073656 -0.043710
[3,]  0.036300 -0.086800  1.0000  0.113400  0.089300
[4,]  0.044550 -0.073656  0.1134  0.291600  0.134514
[5,]  0.027918 -0.043710  0.0893  0.134514  0.220900

1
我想我可能在另一篇帖子上找到了答案:代码中的非可兼容数组错误
当我将sd矩阵视为向量时,它可以正常工作(我希望这是正确的?)。
sd = as.vector(sd)
cov.mat <- cor2cov(cor.mat, sd)

谢谢,如果此操作使结果与我最初询问的不相等,请告诉我。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接