2016-10-04 3 views
1

Ich habe eine KorrelationsmatrixKonvertierung zwischen Kovarianzmatrix und Korrelationsmatrix

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

Ich habe auch eine Matrix von Standardfehler

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 

also die Matrizen kompatibel Dimensionen haben, funktioniert, warum nicht cor2cov Funktion für mich arbeiten?

Antwort

1

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.

1

ich glaube, ich hätte eine Antwort auf eine andere Stelle gefunden: Non-conformable arrays error in code

Wenn ich sd Matrix als Vertor behandeln, es funktioniert (ich hoffe, es ist richtig?)

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

Danke und bitte lassen Sie mich wissen, ob diese Operation die Ergebnisse nicht dem entspricht, nach dem ich ursprünglich gefragt habe.

1

Nach Definition von Korrelation und Kovarianzmatrix, können Sie dies einfach tun:

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 
Verwandte Themen