Inversa de la matriz en R

90

Me preguntaba cuál es su forma recomendada de calcular la inversa de una matriz.

Las formas que encontré no parecen satisfactorias. Por ejemplo,

> c=rbind(c(1, -1/4), c(-1/4, 1))  
> c  
      [,1]  [,2]  
[1,]  1.00 -0.25  
[2,] -0.25  1.00  
> inv(c)  
Error: could not find function "inv"  
> solve(c)    
          [,1]      [,2]  
[1,] 1.0666667 0.2666667  
[2,] 0.2666667 1.0666667  
> solve(c)*c  
            [,1]        [,2]  
[1,]  1.06666667 -0.06666667  
[2,] -0.06666667  1.06666667  
> qr.solve(c)*c  
            [,1]        [,2]  
[1,]  1.06666667 -0.06666667  
[2,] -0.06666667  1.06666667  

¡Gracias!

Tim
fuente
9
Un consejo general: evite dar a los objetos (como matrices) un nombre que ya se usa (aquí c).
Qaswed

Respuestas:

153

solve(c)da la inversa correcta. El problema con su código es que está utilizando el operador incorrecto para la multiplicación de matrices. Deberías usarsolve(c) %*% c para invocar la multiplicación de matrices en R.

R realiza la multiplicación elemento por elemento cuando invoca solve(c) * c.


fuente
22

Puede usar la función ginv () (inversa generalizada de Moore-Penrose) en el paquete MASS

doug
fuente
@xeon no está seguro de cómo se lo puede perder; consulte la pág. 60 del Manual para el paquete mencionado en mi respuesta anterior
doug
Gracias por su respuesta. Recibí este error al ejecutar la función fem () del paquete FisherEM. Ejecutando Mavericks Mac OS X.
Vladislavs Dovgalecs
9

Tenga en cuenta que si le importa la velocidad y no necesita preocuparse por las singularidades, solve()debería preferirlo ginv()porque es mucho más rápido, como puede comprobar:

require(MASS)
mat <- matrix(rnorm(1e6),nrow=1e3,ncol=1e3)

t0 <- proc.time()
inv0 <- ginv(mat)
proc.time() - t0 

t1 <- proc.time()
inv1 <- solve(mat)
proc.time() - t1 
Matthias Schmidtblaicher
fuente