我有一个相关矩阵
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
函数不能为我工作?
答案 0 :(得分:2)
好的,我不知道你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
是的,它只是一个对称的行&amp;列重新缩放。
我们可以通过使用cov2cor
将此协方差矩阵转换回相关矩阵来验证这一点,这正是您的相关矩阵:
all.equal(cov2cor(cov.mat), cor.mat)
# [1] TRUE
我猜你的cor2cov
如果您阅读How to rescale a matrix by row / column,您会发现有很多不同的重新缩放方式。上面使用的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
必须是向量,否则"*"
会抱怨(请注意,您收到的错误消息确实来自"*"
)。
您的论点&#34;矩阵具有兼容的维度&#34; 是一个虚假的维度。纯粹就线性代数而言,您需要sd
为对角矩阵,以便您可以这样做:
sd %*% cor.mat %*% sd
但是行/列重新缩放永远不会通过矩阵计算来完成,因为这太贵了。
答案 1 :(得分:1)
我想我可能会在另一篇文章中找到答案:Non-conformable arrays error in code
当我将sd矩阵视为vertor时,它可以工作(我希望,这是正确的吗?)
sd = as.vector(sd)
cov.mat <- cor2cov(cor.mat, sd)
谢谢,如果此操作使结果与我最初询问的结果不相符,请告诉我。
答案 2 :(得分:1)
通过定义相关性和协方差矩阵,您可以简单地执行此操作:
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