El uso de matrices es muy importante para resolver problemas de optimización estática y dinámica. Pero si se tiene un perfil estadístico su uso es menor, ya que la mayoría de procedimientos estadísticos ya están desarrollados en “packages”. En mi experiencia (corta por cierto), el principal uso que se da es en la manera que se selecciona filas y columnas, así mismo, el cómo construir matrices, ya que estos se aplican a los data frame.
Al igual que un curso de álgebra lineal en R la construcción de matrices se hace a través de vectores. Primero generaremos una matriz sólo desde un vector, para luego usar más vectores.
Las matrices tiene la siguiente sintaxis:
matrix("Vector", nrow="#", ncol="#", byrow="T o F")
Donde matrix
es el comando para generar la matriz, vector
es el vector desde donde se generará la matriz, nrow
tomará un valor numérico que especifica el número de filas, así mismo, ncol
especificará el número de columas, por último byrow
tomará TRUE o FALSE que indica si se ordenará los elementos de la matriz a través de filas o columas respectivamente.
Para empezar a comprenderlo, a continuación un ejemplo:
# Generamos la matriz a:
a<-matrix(1:12, nrow=3) # Especificando el número de filas.
a
## [,1] [,2] [,3] [,4]
## [1,] 1 4 7 10
## [2,] 2 5 8 11
## [3,] 3 6 9 12
Lo que se hizo es especificar el vector que convertiremos en matriz éste tiene 12 elementos (del 1 al 12), y por último, especificamos que la matriz tenga 3 filas. Como no hemos especificado el comando byrow
, R considera el valor de defecto FALSE, por tanto, ordena los elementos a través de columnas.
Y en efecto, una vez creado la matriz los 12 elementos del vector se ordenaron a través de columnas (la primera columna empieza con 1, 2 y 3 y así sucesivamente) en 3 filas. ¿Lo entendió? Lo más probable es que no.
Para que quede claro, se muestra un nuevo ejemplo, pero ahora especificaremos el número de columnas:
b<-matrix(1:12, ncol=3) # Especificando el número de columnas.
b
## [,1] [,2] [,3]
## [1,] 1 5 9
## [2,] 2 6 10
## [3,] 3 7 11
## [4,] 4 8 12
Como se puede ver, en este caso la matriz tiene 3 columnas y se ordenó los elementos a través de columas.
En el siguiente ejemplo se ordenarán los elementos a través de filas. Esto se consigue con byrow=TRUE
:
c<-matrix(1:12, nrow = 3, byrow = TRUE) # Para ordenarlo por filas.
c
## [,1] [,2] [,3] [,4]
## [1,] 1 2 3 4
## [2,] 5 6 7 8
## [3,] 9 10 11 12
En efecto, la matriz c tiene 3 filas y se ordenó los elementos a través de filas.
Por último, un ejemplo especificando el número de columnas y de filas:
d<-matrix(1:12, nrow = 4, ncol = 4, byrow = TRUE)
d
## [,1] [,2] [,3] [,4]
## [1,] 1 2 3 4
## [2,] 5 6 7 8
## [3,] 9 10 11 12
## [4,] 1 2 3 4
Como puede ver se crea la matriz d con 4 filas y con 4 columnas y los elementos ordenados por filas. Pero, sucede que la dimensión de la matriz es de 4x4 (16 elementos), y nosotros sólo especificamos un vector con 12 elementos. Como faltan elementos para completar la matriz, R recicla los elementos del vector y los completa hasta que se alcance la dimensión deseada.
¿Qué pasa si especificamos un vector de mayor dimensión que la matriz deseada?
Lo que hará R es usar los elementos hasta que se complete la dimensión deseada de la matriz, y omitir los restantes.
# Se crea un vector con 20 elementos.
x<-seq(1,40, by=2)
# Y luego se le agrega dos elementos.
x1<-c(x,20,20)
# Dando un total de 22 elementos.
x1
## [1] 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 20 20
# Creamos una matriz especifiando que tenga 4 filas y 5 columnas.
z<-matrix(x1, nrow=4, ncol = 5)
## Warning in matrix(x1, nrow = 4, ncol = 5): la longitud de los datos [22] no
## es un submúltiplo o múltiplo del número de filas [4] en la matriz
Como se puede ver si especificamos una matriz de 4 filas y 5 columnas esta matriz contendrá 20 elementos y se tiene que omitir 2. Esto es lo que sucedió. R nos señala aquello en el mensaje de error.
Observemos como quedo nuestra matriz:
z
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 9 17 25 33
## [2,] 3 11 19 27 35
## [3,] 5 13 21 29 37
## [4,] 7 15 23 31 39
En efecto, omitió los 2 últimos elementos (20, 20).
Para poder crear una matriz con varios vectores se usarán los comandos cbind
y rbind
que unen los vectores a través de columnas y filas respectivamente.
A continuación se muestran unos ejemplos:
# Creamos 4 vectores.
x2<-1:10
x3<-rep(2,10)
x4<-seq(2,5, length.out = 10)
x5<-seq(10,12, length.out = 10)
x2; x3; x4; x5
## [1] 1 2 3 4 5 6 7 8 9 10
## [1] 2 2 2 2 2 2 2 2 2 2
## [1] 2.000000 2.333333 2.666667 3.000000 3.333333 3.666667 4.000000
## [8] 4.333333 4.666667 5.000000
## [1] 10.00000 10.22222 10.44444 10.66667 10.88889 11.11111 11.33333
## [8] 11.55556 11.77778 12.00000
Los 4 vectores tienen la misma dimensión (10 elementos).
Ahora construiremos una matriz en donde se unirán los vectores por filas, para esto se usa el comando rbind
.
m1<-rbind(x2,x3) # Para ordenarlos por filas.
m1
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
## x2 1 2 3 4 5 6 7 8 9 10
## x3 2 2 2 2 2 2 2 2 2 2
Como se usó rbind
se crea la matriz con 2 filas y 10 columnas (porque tienen 10 elementos).
Para que quede claro, se realizará el mismo ejemplo pero ahora unido por columnas para esto se usa cbind
.
m2<-cbind(x2,x3) # Para ordenarlos por columnas.
m2
## x2 x3
## [1,] 1 2
## [2,] 2 2
## [3,] 3 2
## [4,] 4 2
## [5,] 5 2
## [6,] 6 2
## [7,] 7 2
## [8,] 8 2
## [9,] 9 2
## [10,] 10 2
En efecto ahora vemos que el vector tiene 2 columnas y 10 filas.
A continuación 2 ejemplos más para que quede claro.
m3<-rbind(x2,x3,x4,x5)
m3
## [,1] [,2] [,3] [,4] [,5] [,6] [,7]
## x2 1 2.000000 3.000000 4.00000 5.000000 6.000000 7.00000
## x3 2 2.000000 2.000000 2.00000 2.000000 2.000000 2.00000
## x4 2 2.333333 2.666667 3.00000 3.333333 3.666667 4.00000
## x5 10 10.222222 10.444444 10.66667 10.888889 11.111111 11.33333
## [,8] [,9] [,10]
## x2 8.000000 9.000000 10
## x3 2.000000 2.000000 2
## x4 4.333333 4.666667 5
## x5 11.555556 11.777778 12
m4<-cbind(x2,x3,x4)
m4
## x2 x3 x4
## [1,] 1 2 2.000000
## [2,] 2 2 2.333333
## [3,] 3 2 2.666667
## [4,] 4 2 3.000000
## [5,] 5 2 3.333333
## [6,] 6 2 3.666667
## [7,] 7 2 4.000000
## [8,] 8 2 4.333333
## [9,] 9 2 4.666667
## [10,] 10 2 5.000000
Para poder hacerlo se usará el comando dimnames()
. Que sirve para colocar nombres a los objetos. La sintaxis que se usará será la siguiente:
dimnames("matriz")=list("nomb_de las filas","nomb_de las columnas")
En matriz
irá el nombre de la matriz, el comando list()
sirva para generar una lista, en nomb_de las filas
irá el vector de los nombres de las filas, al igual, en nomb_de las columnas
irá el vector de los nombres de las columnas.
A continuación un ejemplo:
# Para crear la matriz t.
t<-rbind(c(2,3,4),c(4,4,4))
t
## [,1] [,2] [,3]
## [1,] 2 3 4
## [2,] 4 4 4
Una vez creada la matriz cambiaremos los nombres a las filas (“Periodo 1 y 2”) y las columnas (“Persona A, B y C”).
dimnames(t)=list(c("Periodo 1", "Periodo 2"),
c("Persona A", "Persona B", "Persona C"))
t
## Persona A Persona B Persona C
## Periodo 1 2 3 4
## Periodo 2 4 4 4
Como se puede observar, el nombre de las filas y columnas de la matriz t han dejado de ser números para convertirse en los nombres especificados.
Si se desea sólo colocar el nombre a una de ellas. Se utilizará la indicación NULL
en el vector de nombres de filas o columnas. Como se muestra a continuación:
# Creamos la matriz p.
p<-cbind(seq(1, 5, by=2), seq(2, 6, by=2))
#Cambiamos los nombres a las columnas.
dimnames(p)=list(NULL,
c("Colegio A", "Colegio B")) # Sólo para las columnas.
p
## Colegio A Colegio B
## [1,] 1 2
## [2,] 3 4
## [3,] 5 6
En efecto, ahora las columas se llaman “Colegio A” y “Colegio B” y las filas carecen de nombres.
Si se desea sólo colocar nombres a las filas.
dimnames(p)=list(c("2010","2011","2012"),
NULL) # Sólo para las filas.
p
## [,1] [,2]
## 2010 1 2
## 2011 3 4
## 2012 5 6
En efecto, ahora sólo las filas poseen nombres.
Es seguro que estas alturas usted se habrá dado cuenta que primero puede crear el vector de nombres y posteriormente colocarlos en el comando list()
. Si no se ha dado cuenta, aquí una ayuda.
# Llamamos al vector "n1" el que contenga los nombres de las columnas.
n1<-c("Edad","Sexo")
# Llamamos al vector "n2" el que contenga los nombres de las filas.
n2<-c("2018","2019","2020")
# Ahora lo reemplazamos en el comando list.
dimnames(p)=list(n2,n1) # Los nombres a través de vectores definidos.
p
## Edad Sexo
## 2018 1 2
## 2019 3 4
## 2020 5 6
En Efecto, los resultados son los esperados.
Usemos como ejemplo la matriz H
H<-cbind(x2,x3,x5)
H
## x2 x3 x5
## [1,] 1 2 10.00000
## [2,] 2 2 10.22222
## [3,] 3 2 10.44444
## [4,] 4 2 10.66667
## [5,] 5 2 10.88889
## [6,] 6 2 11.11111
## [7,] 7 2 11.33333
## [8,] 8 2 11.55556
## [9,] 9 2 11.77778
## [10,] 10 2 12.00000
Para poder seleccionar elementos de la matriz, se tiene que tener en cuenta la siguiente composición de la matriz.
Matriz["filas","columnas"]
En donde, matriz
es la matriz que se desea analizar, [filas,]
el número de fila que se desea y por último, [,columnas]
que indica el número de columas que se desea.
Veamos algunos ejemplos.
Si queremos obtener sólo la primera fila de la matriz:
H[1,] # Para escoger la primera fila de la matriz H.
## x2 x3 x5
## 1 2 10
Si deseamos extraer sólo la fila 3 de la matriz:
H[3,] # Para obtener la tercera fila de la matriz H.
## x2 x3 x5
## 3.00000 2.00000 10.44444
Si sólo nos interesa la columna 2:
H[,2] # Para obtener la segunda columna de la matriz H.
## [1] 2 2 2 2 2 2 2 2 2 2
Como se puede dar cuenta los resultados se muestran en una fila, para obtenerlo en forma de columna se usa la siguiente sintaxis:
H[,2, drop=FALSE] # En forma de columna y mostrar el nombre de la columna seleccionada.
## x3
## [1,] 2
## [2,] 2
## [3,] 2
## [4,] 2
## [5,] 2
## [6,] 2
## [7,] 2
## [8,] 2
## [9,] 2
## [10,] 2
Si queremos seleccionar un sólo elemento tenemos que especificar el número de fila y el número de columna.
H[1,2] # El elemento de la primera fila y la segunda columna.
## x3
## 2
Si deseamos seleccionar varias columnas o filas, tendremos que especificar a través de vectores.
H[c(1,2,3,4),] # Para seleccionar las primeras 4 filas.
## x2 x3 x5
## [1,] 1 2 10.00000
## [2,] 2 2 10.22222
## [3,] 3 2 10.44444
## [4,] 4 2 10.66667
Para Seleccionar las filas 3, 7 y 10.
H[c(3,7,10),] # Para seleccionar las filas 3, 7 y 10.
## x2 x3 x5
## [1,] 3 2 10.44444
## [2,] 7 2 11.33333
## [3,] 10 2 12.00000
Es seguro que usted ya se dió cuenta que puede usar un vector secuencial.
H[,1:3] # Para seleccionar las tres columnas.
## x2 x3 x5
## [1,] 1 2 10.00000
## [2,] 2 2 10.22222
## [3,] 3 2 10.44444
## [4,] 4 2 10.66667
## [5,] 5 2 10.88889
## [6,] 6 2 11.11111
## [7,] 7 2 11.33333
## [8,] 8 2 11.55556
## [9,] 9 2 11.77778
## [10,] 10 2 12.00000
Es demasiado importante conocer la dimensión de los objetos, ya que esto nos permitirá desarrollar los problemas de optimización.
Recuerde que en vectores para conocer la dimensión se usó el comando lenght()
, en matrices también se puede usar este comando pero nos indicará el número total de elementos. En matrices es preferible usar el comando dim()
que nos muestra el número de filas y el número de columnas.
# Usando el comando length.
length(H)
## [1] 30
# Usando el comando dim.
dim(H)
## [1] 10 3
En efecto, si usamos dim()
nos resulta que la matriz tienen 10 filas y 3 columnas. Si usamos lenght
nos resulta 30 (10 filas por 3 columnas).
Pero si sólo queremos conocer el número de filas de matriz, tendríamos que seguir la siguiente sintaxis:
dim(H)[1] # Dimensión de las filas de la matriz H.
## [1] 10
Es seguro que usted se ha dado cuenta que si colocamos [2]
en vez de [1]
se conseguirán el número de columnas.
dim(H)[2] # Dimensión de las columnas de la matriz H.
## [1] 3
En efecto, así resultó.
Como se dijo al inicio, lo más importante, si se tiene un enfoque estadístico, será conocer como se selecciona elementos, la creación de matrices y el cálculo de las dimensiones.
En la próxima guía se desarrollará las operaciones con matrices. Un tema demasiado importante para los temas de econometría.