ОК, я не знаю, откуда взялся ваш 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
Но строка/столбец перемасштабирования никогда не делается с помощью матричных вычислений, так как это слишком дорого.