Generate covariance matrix from correlation matrix

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

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.


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)
)

Tags:

R