2016-06-29 15 views
-1

Wie kann ich eine Kovarianzmatrix berechnen, ohne eine for-Schleife zu verwenden?Kovarianzmatrix ohne For-Schleife berechnen

Hier ist eine Matrix:

ts <- structure(c(-0.63, NaN, -0.3, 0.48, 1.24, 1.39, 0.13, -0.03, 
-0.03, 0.32, 0.38, 0.32, -0.05, 0.22, 0.02, -0.04, -0.38, -0.05, 
0.57, -0.14, 0.05, 0.59, -1.07, NaN), .Dim = c(6L, 4L)) 

ts 
     [,1] [,2] [,3] [,4] 
[1,] -0.63 0.13 -0.05 0.57 
[2,] NaN -0.03 0.22 -0.14 
[3,] -0.30 -0.03 0.02 0.05 
[4,] 0.48 0.32 -0.04 0.59 
[5,] 1.24 0.38 -0.38 -1.07 
[6,] 1.39 0.32 -0.05 NaN 

ich eine Kovarianzmatrix berechnen möchten, die die Kovarianzen für alle möglichen Paare der vier cols meiner Matrix gibt, wobei der Ausgang in diesem Format:

    c11, c12, c13, c14,  
        c21, c22, c23, c24,  
        c31, c32, c33, c34,  
        c41, c42, c43, c44 

ich kann dies für Schleifen wie diese mit zwei tun:

csst <- matrix(0, nrow = 4, ncol = 4) # create empty covariance matrix to store the output of the loop 

for(q in 1:4){ # loop over rows 

    for(r in q:4){ # loop over columns with r>=q 

     i <- which(!is.nan(ts[, q])) 
     j <- which(!is.nan(ts[, r])) 
     k <- intersect(i, j) 
     nk <- length(k) 

    # store value in matrix 
    csst[q, r] <- sum((((ts[k, q] - mean(ts[k, q])) * (ts[k, r] - mean(ts[k, r])))/(nk-1))) 

    # make matrix symmetrical 
    csst[r, q] <- csst[q, r] 
    } 
} 

Und das Ergebnis i s:

csst 
      [,1]  [,2]  [,3]  [,4] 
[1,] 0.8091300 0.12709500 -0.07910000 -0.4817833 
[2,] 0.1270950 0.03397667 -0.02720667 -0.0352500 
[3,] -0.0791000 -0.02720667 0.03734667 0.0811750 
[4,] -0.4817833 -0.03525000 0.08117500 0.4600000 

Ich habe experimentiert mit expand.grid, combn und lapply kann aber nicht das gleiche Ergebnis. Das Ziel ist es, diese Operation mit effizienterem Code und weniger Tipparbeit durchzuführen.

+0

[Dies] (http://stackoverflow.com/questions/18547330/defining-a-function-that-calculates-the-covariance-matrix-of-a-correlation -matri) könnte helfen – Sotos

Antwort

3

Was:

cov(ts, use = "pairwise.complete") 
      [,1]  [,2]  [,3]  [,4] 
[1,] 0.8091300 0.12709500 -0.07910000 -0.4817833 
[2,] 0.1270950 0.03397667 -0.02720667 -0.0352500 
[3,] -0.0791000 -0.02720667 0.03734667 0.0811750 
[4,] -0.4817833 -0.03525000 0.08117500 0.4600000 
+1

yep, das ist es. Danke, viel einfacher als ich dachte! – Ben