gpt4 book ai didi

r - 协方差矩阵和相关矩阵之间的转换

转载 作者:行者123 更新时间:2023-12-05 01:19:28 25 4
gpt4 key购买 nike

我有一个相关矩阵

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 函数对我不起作用?

最佳答案

好的,我不知道你的 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 的猜测

如果您阅读 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必须是向量,否则"*"会报错(注意,你得到的错误信息确实是从"*"报告的)。


您的论点“矩阵具有兼容的维度” 是伪造的。纯粹就线性代数而言,您需要sd 是一个对角矩阵,这样您就可以:

sd %*% cor.mat %*% sd

但是行/列重新缩放永远不会通过矩阵计算来完成,因为这太昂贵了。

关于r - 协方差矩阵和相关矩阵之间的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39843162/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com