Generate covariance matrix from correlation matrix

前端 未结 4 1574
孤独总比滥情好
孤独总比滥情好 2021-02-05 20:36

I have a correlation matrix:

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,]          


        
相关标签:
4条回答
  • 2021-02-05 21:12
    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
    
    0 讨论(0)
  • 2021-02-05 21:17

    The answer marked as correct is wrong.

    The correct solution seems to be the one provided by MBESS package, so see the post from 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
    > 
    
    0 讨论(0)
  • 2021-02-05 21:22

    If you know the standard deviations of your individual variables, you can:

    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
    

    On the other hand, if you don't know the standard deviations, it's impossible.

    0 讨论(0)
  • 2021-02-05 21:29

    Building on S4M's answer, in base R, I would write this function:

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

    tcrossprod will calculate the product of each combination of elements of the sd vector (equivalent to x %*% t(x)), which we then (scalar) multiply by the variance-covariance matrix

    Here's a quick check that the function is correct using the built in mtcars data set:

    all.equal(
      cor2cov(cor(mtcars), sapply(mtcars, sd)), 
      cov(mtcars)
    )
    
    0 讨论(0)
提交回复
热议问题