Comment puis-je calculer une matrice de covariance sans utiliser une boucle for
?Matrice de covariance de calcul sans pour la boucle
est ici une matrice:
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
Je veux calculer une matrice de covariance qui donne les covariances pour toutes les paires possibles des quatre cols de ma matrice, avec la sortie dans ce format:
c11, c12, c13, c14,
c21, c22, c23, c24,
c31, c32, c33, c34,
c41, c42, c43, c44
Je peux le faire avec deux pour les boucles comme ceci:
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]
}
}
Et le résultat 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
J'ai expérimenté avec expand.grid
, combn
et lapply
mais ne peut pas obtenir le même résultat. Le but est d'effectuer cette opération avec un code plus efficace et moins de frappe.
[Ce] (http://stackoverflow.com/questions/18547330/defining-a-function-that-calculates-the-covariance-matrix-of-a-correlation -matri) pourrait aider – Sotos