Création d'une matrice symétrique dans R

J'ai une matrice R qui est censé être symétrique, toutefois, en raison de la précision machine la matrice n'est jamais symétrique (les valeurs diffèrent d'environ 10^-16). Car je sais que la matrice est symétrique, je l'ai fait jusqu'à présent pour contourner le problème:

s.diag = diag(s)
s[lower.tri(s,diag=T)] = 0
s = s + t(s) + diag(s.diag,S)

Y a-t-il une meilleure commande d'une ligne pour cela?

21
demandé sur Peyton 2013-08-10 22:54:12

4 réponses

La solution de contournement est-elle vraiment nécessaire si les valeurs ne diffèrent que par autant?

Quelqu'un a fait remarquer que ma réponse précédente était fausse. J'aime mieux certains des autres, mais comme je ne peux pas supprimer celui-ci (accepté par un utilisateur qui est parti), voici encore une autre solution en utilisant le paquet micEcon:

symMatrix(s[upper.tri(s, TRUE)], nrow=nrow(s), byrow=TRUE)
9
répondu Peyton 2014-02-25 15:01:40
s<-matrix(1:25,5)
s[lower.tri(s)] = t(s)[lower.tri(s)]
45
répondu user3318600 2014-02-17 10:03:07

Vous pouvez forcer la matrice à être symétrique en utilisant la fonction forceSymmetric dans le paquet Matrix dans R:

library(Matrix)
x<-Matrix(rnorm(9), 3)
> x
3 x 3 Matrix of class "dgeMatrix"
           [,1]       [,2]       [,3]
[1,] -1.3484514 -0.4460452 -0.2828216
[2,]  0.7076883 -1.0411563  0.4324291
[3,] -0.4108909 -0.3292247 -0.3076071

A <- forceSymmetric(x)
> A
3 x 3 Matrix of class "dsyMatrix"
           [,1]       [,2]       [,3]
[1,] -1.3484514 -0.4460452 -0.2828216
[2,] -0.4460452 -1.0411563  0.4324291
[3,] -0.2828216  0.4324291 -0.3076071
12
répondu Metrics 2013-08-10 19:20:59
 s<-matrix(1:25,5)
 pmean <- function(x,y) (x+y)/2
 s[] <- pmean(s, matrix(s, nrow(s), byrow=TRUE))
 s
#-------
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    4    7   10   13
[2,]    4    7   10   13   16
[3,]    7   10   13   16   19
[4,]   10   13   16   19   22
[5,]   13   16   19   22   25
7
répondu 42- 2013-08-10 19:08:08