3.2 Marices y arreglos.

Las matrices y arreglos no suelen aparecer como estructuras en el análisis de datos. Pero debido a que las tablas de contingencia oara multiples variables categoricas presentan multidimensionalidad como las matrices y arreglos, estas se describirán de forma breve y por completitud.

3.2.1 Matrices.

Las matrices en R se construyen a partir de vectores usando la función matrix, y especificando atributos de esta clase de objetos que determinan las dimensiones de la matriz. Para crear vectores columna, de orden \(k\times1\) se usa:

matrix(1:5)
##      [,1]
## [1,]    1
## [2,]    2
## [3,]    3
## [4,]    4
## [5,]    5

Por omisión, si no se especifica los atributos de dimension, la matriz creada es un vector columna (en un sentido matematico, y no un objeto vector como los vistos antes). Un vector fila se puede crear especificando el argumento ncol como la longitud del vector que se pasa como argumento:

matrix(1:5, ncol=5)
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    2    3    4    5

Para crear matrices rectangulares o cuadradas se usan los argumentos ncol o nrow o ambos:

matrix(1:6, nrow=2)
##      [,1] [,2] [,3]
## [1,]    1    3    5
## [2,]    2    4    6

Deben notar que la matriz es generada colocando los elementos columna a columna. Si se quiere generar una matriz cuyos elementos se coloquen fila a fila, se debe usar el argumento byrow como sigue:

my_matrix <- matrix(1:6, nrow=2, byrow=TRUE)
my_matrix
##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]    4    5    6

Otra forma de crear matices a partir de vectores es usando las funciones rbind y cbind, las cuales unen dos vectores usándolos como filas o columnas, respectivamente.

rbind(1:6, 10:16)
cbind(1:6, 10:16)

Notamos que, si es necesario, se realiza el reciclado de elementos para obtener un resultado consistente, dejando una advertencia que nos dice tengamos cuidado.

Es posible realizar operaciones aritméticas en matrices de la misma forma que con los vectores, siempre y cuando los operandos sean del mismo orden (igual dimensión):

my_matrix + my_matrix
my_matrix - my_matrix
my_matrix * my_matrix
my_matrix / my_matrix

Al correr las expresiones anteriores, notara que al igual que en los vectores, las operaciones aritméticas se realizan elemento a elemento. En matemática, el producto de matrices no se hace elemento a elemento. Es por eso que existe un operador de producto matricial %*% que se encarga de llevar a cabo la operación producto de la forma usual:

my_matrix %*% my_matrix

El numero de columnas de la matriz de la izquierda debe ser igual al numero de fila de la matriz de la derecha.

Las operaciones aritméticas usando como operandos una matriz y un vector son posibles llevarlas a cabo, debido a un proceso llamado coerción. La coerción se refiere al intento de transformar un objeto de una clase a un objeto de otra clase para que la operación pueda llevarse a cabo. Solo se debe tener cuidado con la forma en la que las operaciones se llevan a cabo.

matrix(1:6, nrow=2) * 1:4
## Warning in matrix(1:6, nrow = 2) * 1:4: longitud de objeto mayor no es
## múltiplo de la longitud de uno menor
##      [,1] [,2] [,3]
## [1,]    1    9    5
## [2,]    4   16   12

Como se observa, el vector es coercionado a un objeto de clase matriz, y luego, la operación se hace por columnas, en este caso, multiplicando los elementos de la primera columna de la matriz con los elementos del vector, luego la segunda columna, luego la tercera, y asi sucesivamente, reciclando el vector si es necesario hasta que todos los elementos de la matriz hayan sido operados. Si la longitud del vector no es divisor de \(m\times n\) (\(m\) son el numero de filas, y \(n\) el numero de columnas de la matriz), se lanza una advertencia.

Nota sobre Coerción de objetos. La coerción de objetos es algo inocuo en R. Por ejemplo, cuando realizamos la operación 1L + 3.5, se esta realizando la suma de un objeto de clase integer y uno de clase numeric. De forma implicita, el interprete de R se encarga de coercionar el integer a un objeto de clase numeric para realizar la suma, y devuelve un objeto de la clase apropiada. Esto ya se ha visto antes al usar valores lógicos para contar el numero de elementos que cumplen una condicion. sum funciona, por que es capaz de coercionar los valores logical a numeric, de tal forma que la suma tenga sentido. Es por eso que expresiones de la forma TRUE + TRUE no generan problemas (aunque no es algo que vayas a encontrar en un programa).

También es posible construir expresiones lógicas usando matrices al igual que antes, de forma que se obtienen matrices lógicas. Ademas, las expresiones lógicas se pueden utilizar para indexar las matrices. El indexado de matrices se puede hacer especificando la posicion en la fila y la columna.

my_matrix[2, 3] # elemento de la segunda fila y tercera columna
my_matrix[2, ] # toda la segunda fila. vector
my_matrix[, 1] # toda la primera columna. vector
my_matrix[, 1, drop=FALSE] # toda la primera columna. En forma de matrix

Varias funciones pueden aplicarse sobre la matriz para conocer atributos de la misma:

  • nrow: devuelve el numero de filas de la matriz que recibe como argumento.
  • ncol: devuelve el numero de filas de la matriz que recibe como argumento.
  • dim: devuelve un vector cuyos elementos son el numero de filas y columnas de la matriz

Otras funciones permiten realizar cálculos usuales realizados en álgebra lineal como la traspuestas, t; el determinante, det, si la matriz es cuadrada; o si la matriz es cuadrada e invertible, se puede obtener la inversa usando solve(my_matrix). La función solve también recibe como segundo argumento un vector, de forma que permite resolver un sistema de ecuaciones lineales usando descomposición de valor singular.

3.2.2 Arreglos.

Los arreglos son útiles cuando se necesitan estructuras de mas de dos dimensiones. Estos pueden aparecer al construir tablas de contingencia a partir de tres o mas variables nominales u ordinales.

Para construir un arreglo de dimensiones \(n\times m\times k\), solo se debe usar la función array, pasando un vector cuya longitud sea prod(dim(array)), y un vector que especifique las dimensiones. Por ejemplo:

array(c(my_sample, 5), c(2, 3, 2))

genera un arreglo de 2 matrices (el tercer elemento de la dimensión), cada una con dos filas y tres columnas.