2013-09-11 4 views
8

У меня есть корреляционная матрица:Генерация ковариационной матрицы из корреляционной матрицы

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 

Что я делаю неправильно?

+0

http://rss.acs.unt.edu/Rdoc/library/MBESS/html/cor2cov.html – dayne

+0

Код: as.matrix (c, e1.sd, e2.sd, e3.sd) является неправильно. Я думаю, что вы хотите: as.matrix (c (e1.sd, e2.sd, e3.sd)) – S4M

ответ

12

Если вы знаете, стандартные отклонения ваших индивидуальных переменных, вы можете:

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

, скажем, вся переменная должна быть со средним значением = 0 и sd = 20, тогда b <-c (20, 20,20)% *% t (c (20,20,20), a.cov <-b * a – user1984076

+0

[, 1] [, 2] [, 3] [1,] 400 320 320 [2 ,] 320 400 320 [3,] 320 320 400 Это правильная ковариационная матрица? – user1984076

+0

@ user1984076 да, это выглядит нормально, так как ваша разница составляет 400. Я отредактировал свое сообщение, чтобы объяснить, как вы можете ввести вектор stdevs. – S4M

4
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 
1

Опираясь на ответ S4M, в в базе R, я хотел бы написать эту функцию:

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

tcrossprod просчитывает продукт каждой комбинации элементов вектора сд (эквивалентно x %*% t(x)), который мы тогда (скаляр) умножить на ковариационной матрицы

Вот быстрая проверка, что функция является правильным, используя встроенный в mtcars набор данных:

all.equal(
    cor2cov(cor(mtcars), sapply(mtcars, sd)), 
    cov(mtcars) 
) 
Смежные вопросы