【问题标题】:Generate covariance matrix from correlation matrix从相关矩阵生成协方差矩阵
【发布时间】:2013-09-11 12:08:42
【问题描述】:

我有一个相关矩阵:

a <- matrix(c(1, .8, .8, .8, 1, .8, .8, .8, 1), 3)

##      [,1] [,2] [,3]
## [1,]  1.0  0.8  0.8
## [2,]  0.8  1.0  0.8
## [3,]  0.8  0.8  1.0

我现在想从相关矩阵创建一个协方差矩阵。这怎么能在 R 中完成?

我试过了:

e1.sd <- 3
e2.sd <- 10
e3.sd <- 3
e.cov <- a * as.matrix(c, e1.sd, e2.sd, e3.sd) %*% t(as.matrix(c(e1.sd, e2.sd, e3.sd)))

但我得到了错误:

Error in a * as.matrix(c, e1.sd, e2.sd, e3.sd) %*% t(as.matrix(c(e1.sd,  : 
  non-conformable arrays

我做错了什么?

【问题讨论】:

标签: r


【解决方案1】:

如果您知道各个变量的标准差,您可以:

stdevs <- c(e1.sd, e2.sd, e3.sd)
#stdevs is the vector that contains the standard deviations of your variables
b <- stdevs %*% t(stdevs)  
# b is an n*n matrix whose generic term is stdev[i]*stdev[j] (n is your number of variables)
a_covariance <- b * a  #your covariance matrix

另一方面,如果你不知道标准差,那是不可能的。

【讨论】:

  • 假设所有变量的均值 = 0 和 sd = 20,然后 b
  • [,1] [,2] [,3] [1,] 400 320 320 [2,] 320 400 320 [3,] 320 320 400 这是正确的协方差矩阵吗?跨度>
  • @user1984076 是的,看起来没问题,因为你的方差是 400。我编辑了我的帖子来解释如何输入向量标准差。
【解决方案2】:
require(MBESS)
a <- matrix(c(1,.8,.8,.8,1,.8,.8,.8,1),3)
> cor2cov(a,c(3,10,3))
    [,1] [,2] [,3]
[1,]  9.0   24  7.2
[2,] 24.0  100 24.0
[3,]  7.2   24  9.0

【讨论】:

    【解决方案3】:

    基于 S4M 的回答,在基础 R 中,我将编写此函数:

    cor2cov <- function(V, sd) {
      V * tcrossprod(sd)
    }
    

    tcrossprod 将计算 sd 向量的每个元素组合的乘积(相当于x %*% t(x)),然后我们(标量)乘以方差-协方差矩阵

    这里使用内置的 mtcars 数据集快速检查函数是否正确:

    all.equal(
      cor2cov(cor(mtcars), sapply(mtcars, sd)), 
      cov(mtcars)
    )
    

    【讨论】:

      【解决方案4】:

      标记为正确的答案是错误的。

      正确的解决方案似乎是MBESS包提供的解决方案,请参阅dayne的帖子。

      > a
           [,1] [,2] [,3]
      [1,]  1.0  0.8  0.8
      [2,]  0.8  1.0  0.8
      [3,]  0.8  0.8  1.0
      > b <- c(3,10,3)
      > b %*% t(b)
           [,1] [,2] [,3]
      [1,]    9   30    9
      [2,]   30  100   30
      [3,]    9   30    9
      > c <- b %*% t(b)
      > c %*% a
            [,1]  [,2]  [,3]
      [1,]  40.2  44.4  40.2
      [2,] 134.0 148.0 134.0
      [3,]  40.2  44.4  40.2
      > cor2cov(cor.mat=a, b )
           [,1] [,2] [,3]
      [1,]  9.0   24  7.2
      [2,] 24.0  100 24.0
      [3,]  7.2   24  9.0
      > a %*% c
           [,1] [,2] [,3]
      [1,] 40.2  134 40.2
      [2,] 44.4  148 44.4
      [3,] 40.2  134 40.2
      > 
      

      【讨论】:

        猜你喜欢
        • 2019-04-15
        • 2019-04-10
        • 2017-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-09
        • 1970-01-01
        相关资源
        最近更新 更多