2016-06-29 2 views
-1

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.

+0

[Ce] (http://stackoverflow.com/questions/18547330/defining-a-function-that-calculates-the-covariance-matrix-of-a-correlation -matri) pourrait aider – Sotos

Répondre

3

Qu'en est-:

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

oui, c'est tout. Merci, beaucoup plus simple que je pensais! – Ben