Un poco de álgebra matricial en R (parte 1)

En días recientes me he puesto a (re)aprender un poco de álgebra matricial -útil, por ejemplo, si uno tiene que aprender econometría haciendo uso del “horrible” libro de William H. Greene. Más allá de la utilidad del álgebra matricial, las matemáticas siempre me han llamado la atención y -como me gusta hacer todo al revés- ahora que no tengo mucho tiempo quiero aprender lo que no aprendí en la universidad por andar leyendo libros de historia y política comparada de autores que jamás usaron un sólo número en sus escritos (por cierto, debo decir que estos autores son GRANDES y que cuando crezca me gustaría ser como ellos: Charles Tilly, Sam Huntington, Greg Luebbert, etc., etc.).

Resulta que puedo matar dos pájaros de un tiro: aprendo a usar R y al mismo tiempo aprendo algo de álgebra matricial… ¡¡yupi!!  Por el momento usemos un ejemplo sencillo para aprender a crear matrices en R. Supongamos que queremos la siguiente matriz como un objeto en R:

M = \begin{bmatrix} 15 & -22 & 64\\30 & 18 & 93 \end{bmatrix}

 Al parecer hay tres métodos para crear matrices en R (si conocen algún otro no estaría por demás que me dieran el tip), el primero y el segundo creando vectores y posteriormente apilándolos (con las funciones rbind y cbind), y el tercero usando la función matrix. Veamos los primeros dos métodos:

#Método 1: Apilando vectores fila

fila1 = c(15, -22, 64); fila1
fila2 = c(30, 18, 93); fila2

#Usamos función rbind para apilar las dos filas
Matriz1 = rbind(fila1, fila2); Matriz1

#Podemos añadir nombres a las columnas usando la función dimnames (por cierto, como estamos usando rbind las filas ya incluyen los nombres del objeto original, en este caso fila1 y fila2).

dimnames(Matriz1)[[2]] = c('columna1', 'columna2', 'columna3') #Usamos el índice [[2]] para indicar a R que queremos nombrar las columnas.
Matriz1

#Método 2: Apilando vectores columna.
columnaA = c(15, 30)
columnaB = c(-22, 18)
columnaC = c(64, 93)

#Usamos la funcion cbind para apilar las tres columnas
Matriz2 = cbind(columnaA, columnaB, columnaC)

#E igualmente podemos añadir nombres a las filas con la función dimnames y el subíndice [[1]]
dimnames(Matriz2)[[1]] = c('filaA', 'filaB')
Matriz2

El resultado es el siguiente:


> fila1 = c(15, -22, 64); fila1
[1] 15 -22 64
> fila2 = c(30, 18, 93); fila2
[1] 30 18 93
>
> Matriz1 = rbind(fila1, fila2); Matriz1
      [,1] [,2] [,3]
fila1  15   -22  64
fila2  30    18  93
>
> dimnames(Matriz1)[[2]] = c('columna1', 'columna2', 'columna3')
> Matriz1
    columna1 columna2 columna3
fila1     15      -22      64
fila2     30       18      93
>
> columnaA = c(15, 30)
> columnaB = c(-22, 18)
> columnaC = c(64, 93)
>
> Matriz2 = cbind(columnaA, columnaB, columnaC)
>
> dimnames(Matriz2)[[1]] = c('filaA', 'filaB')
> Matriz2
    columnaA columnaB columnaC
filaA    15      -22      64
filaB    30       18      93

El tercer método es tal vez el más sencillo pues no requiere de tantos pasos. Este método requiere de la función matrix. Únicamente debemos saber 1) que la función ordena los números por columna (al menos que le digamos que no lo haga así con el argumento byrow=TRUE en cuyo caso ordenaría los números por fila) y 2) que debemos especificar cuántas filas (usando el argumento nrow) y columnas (usando el argumento ncol) queremos. Veamos:

#Método 3: Usando función matrix

Matriz3 = matrix(c(15, 30, -22, 18, 64, 93), nrow=2, ncol=3)
Matriz3

#Ordenando a R que ponga los números por fila (observen que el orden de los datos en el primer argumento de la función, por ende, debe cambiar)
Matriz4 = matrix(c(15, -22, 64, 30, 18, 93), nrow=2, ncol=3, byrow=TRUE)
Matriz4

Como pueden ver esta función simplifica los pasos para crear matrices en R así que recomiendo que la usen (en vez de rbind o cbind). Igualmente pueden darle nombres a las filas y columnas con la función dimnames. Aquí el resultado del script anterior:


> Matriz3 = matrix(c(15, 30, -22, 18, 64, 93), nrow=2, ncol=3)
> Matriz3
    [,1] [,2] [,3]
[1,] 15 -22 64
[2,] 30 18 93
>
> Matriz4 = matrix(c(15, -22, 64, 30, 18, 93), nrow=2, ncol=3, byrow=TRUE)
> Matriz4
    [,1] [,2] [,3]
[1,] 15 -22 64
[2,] 30 18 93

En una edición posterior de este post trataré de mostrar cómo R puede ser útil para sacar la inversa de la matriz, la transpuesta, determinantes, el producto punto de dos vectores y todas esas cosas divertidas del álgebra de matrices.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: