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