2016-10-04 1 views
1

У меня есть матрица корреляцииПреобразования между ковариационной матрицей и корреляционной матрицей

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 функция работает для меня?

ответ

1

ОК, я не знаю, откуда взялся ваш 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 

Но строка/столбец перемасштабирования никогда не делается с помощью матричных вычислений, так как это слишком дорого.

1

Я думаю, что я мог бы найти ответ на другой пост: Non-conformable arrays error in code

Когда я лечу сд матрицу как vertor, она работает (я надеюсь, что это правильно?)

sd = as.vector(sd) 
cov.mat <- cor2cov(cor.mat, sd) 

Спасибо и, пожалуйста, сообщите мне, если эта операция делает результаты не эквивалентными тому, о чем я изначально спрашивал.

1

По определению корреляции и ковариационной матрицы, вы можете просто сделать это:

cov.mat <- cor.mat * matrix(outer(sd, sd), nrow=5, byrow=TRUE) 

cov.mat 
      [,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 
Смежные вопросы