OK, ich weiß nicht, wo Ihre cor2cov
herkommt. Aber eigentlich ist es wirklich einfach Kovarianzmatrix aus Korrelationsmatrix und Standardfehler zu erhalten:
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
Ja, es ist nur eine symmetrische Reihe & Spalte Umskalierungs.
Wir diese zurück zur Korrelationsmatrix durch die Umwandlung dieser Kovarianzmatrix cov2cor
mit verifizieren kann, was genau Matrix Ihre Korrelation:
all.equal(cov2cor(cov.mat), cor.mat)
# [1] TRUE
Meine Vermutung auf cor2cov
Wenn Sie lesen How to rescale a matrix by row/column, Sie werden sehen, es gibt viele verschiedene Möglichkeiten für die Neuskalierung. Die oben verwendete sweep
ist nur eine Option.
R Basisfunktion cov2cor(V)
verwendet:
Is <- sqrt(1/diag(V)) ## inverse of square root diagonal (inverse of sd)
Is * V * rep(Is, each = p)
Ich denke, Ihr cor2cov(R, sds)
ist im gleichen Stil geschrieben:
sds * R * rep(sds, each = p) ## `sd` must be a vector
Wenn ja, sd
muss ein Vektor sein, sonst "*"
wird sich beschweren (Beachten Sie, dass die Fehlermeldung, die Sie erhalten haben, tatsächlich von "*"
gemeldet wird.
Ihr Argument "die Matrizen kompatible Dimensionen" ist eine gefälschte ein. Rein in Bezug auf die lineare Algebra, müssen Sie sd
eine Diagonalmatrix sein, so dass Sie tun können:
sd %*% cor.mat %*% sd
Aber Zeile/Spalte Reskalierung wird nie durch Matrixberechnungen durchgeführt, da dies zu teuer ist.