En R, toda la información se almacena en objetos. Dependiendo de cómo estén organizados los datos, estos objetos pueden adoptar distintas estructuras. Existen cuatro estructuras principales en R:
Continuamos con nuestro estudio de las matrices.
Una matriz en R es una estructura de datos bidimensional para almacenar objetos del mismo tipo.
Para crear una matriz se utiliza la función matrix()
cuyos argumentos son:
A <- matrix(1:10, nrow= 5)
A
## [,1] [,2]
## [1,] 1 6
## [2,] 2 7
## [3,] 3 8
## [4,] 4 9
## [5,] 5 10
B <- matrix(21:40, nrow=2)
length(21:40)
## [1] 20
B
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
## [1,] 21 23 25 27 29 31 33 35 37 39
## [2,] 22 24 26 28 30 32 34 36 38 40
C <- matrix(14:25, nrow= 5)
## Warning in matrix(14:25, nrow = 5): data length [12] is not a sub-multiple or
## multiple of the number of rows [5]
C
## [,1] [,2] [,3]
## [1,] 14 19 24
## [2,] 15 20 25
## [3,] 16 21 14
## [4,] 17 22 15
## [5,] 18 23 16
nrow(A)
## [1] 5
nrow(B)
## [1] 2
nrow(C)
## [1] 5
ncol(A)
## [1] 2
ncol(B)
## [1] 10
ncol(C)
## [1] 3
dim(A)
## [1] 5 2
dim(B)
## [1] 2 10
dim(C)
## [1] 5 3
is.vector(dim(C))
## [1] TRUE
secuencia <- seq(1,12,2)
secuencia
## [1] 1 3 5 7 9 11
length(secuencia)
## [1] 6
matriz1 <- matrix(secuencia, ncol= 2)
matriz1
## [,1] [,2]
## [1,] 1 7
## [2,] 3 9
## [3,] 5 11
matriz2 <- matrix(secuencia, ncol = 3)
matriz1; matriz2
## [,1] [,2]
## [1,] 1 7
## [2,] 3 9
## [3,] 5 11
## [,1] [,2] [,3]
## [1,] 1 5 9
## [2,] 3 7 11
matriz3 <- matrix(secuencia, ncol = 3, byrow = TRUE)
matriz2; matriz3
## [,1] [,2] [,3]
## [1,] 1 5 9
## [2,] 3 7 11
## [,1] [,2] [,3]
## [1,] 1 3 5
## [2,] 7 9 11
matriz4 <- matrix(secuencia,
ncol = 3,
byrow = T,
dimnames = list(c("F1","F2"),c("C1","C2","C3"))
)
matriz4
## C1 C2 C3
## F1 1 3 5
## F2 7 9 11
| Operación | Código en R |
|---|---|
| Sumar dos matrices | matriz_a + matriz_b |
| Restar dos matrices | matriz_a - matriz_b |
| Multiplicar una matriz por un escalar | matriz_a * 2 |
| Multiplicar dos matrices | matriz_a %*% matriz_b |
| Transponer una matriz | t(matriz_a) |
| Determinante de una matriz cuadrada | det(matriz_a) |
| Inversa de una matriz | solve(matriz_a) |
| Diagonal principal de una matriz | diag(matriz_a) |
| Operación t(matriz_a) % matriz_b | crossprod(matriz_a, matriz_b) |
| Media de filas o columnas | rowMeans(matriz_a) /
colMeans(matriz_a) |
| Extraer fila o columna | matriz_a[1, ] / matriz_a[, 2] |
| Calcular los eigenvalores de una matriz simétrica | eigen(matriz_a) |
Nota: Los eigenvalores indican cuánto escala la matriz en determinadas direcciones privilegiadas (sus eigenvectores). Por ejemplo, en PCA, los eigenvalores de la matriz de covarianzas representan la cantidad de varianza explicada por cada componente principal.
matrizA <- matrix(1:4, 2, 2)
matrizB <- matrix(5:8, 2, 2)
matrizA; matrizB
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
## [,1] [,2]
## [1,] 5 7
## [2,] 6 8
# Suma de matrices
matriz_suma <- matrizA + matrizB
matriz_suma
## [,1] [,2]
## [1,] 6 10
## [2,] 8 12
# Resta de matrices
matriz_resta <- matrizB - matrizA
matriz_resta
## [,1] [,2]
## [1,] 4 4
## [2,] 4 4
Producto de matrices: Diferencia entre multiplicación elemento a elemento y multiplicación matricial.
matrizA; matrizB
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
## [,1] [,2]
## [1,] 5 7
## [2,] 6 8
multiplicacion_elemento <- matrizA * matrizB
multiplicacion_elemento
## [,1] [,2]
## [1,] 5 21
## [2,] 12 32
multiplicacion_matricial <- matrizA %*% matrizB
multiplicacion_matricial
## [,1] [,2]
## [1,] 23 31
## [2,] 34 46
Transpuesta, Determinante e Inversa de una Matriz
matrizA
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
# Transpuesta
# La transpuesta de una matriz se obtiene intercambiando sus filas por columnas.
matriz_transpuesta <- t(matrizA)
matriz_transpuesta
## [,1] [,2]
## [1,] 1 2
## [2,] 3 4
# Determinante de la matriz
# Solo para matrices cuadradas (mismo num de rows y col)
# Indica si una matriz tiene inversa
# Más adelante, servirá para medir la dispersión conjunta de variables aleatorias.
det_A <- det(matrizA)
det_A
## [1] -2
# Inversa de la matriz
# Si det(A) ≠ 0, la inversa es la matriz que, al multiplicarse
# por la matriz original resulta en la identidad
inversa_A <- solve(matrizA)
inversa_A
## [,1] [,2]
## [1,] -2 1.5
## [2,] 1 -0.5
Uso de las funciones rowSums(), colSums(), rowMeans() y colMeans() para obtener estadísticas de filas y columnas.
matrizA
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
suma_filas <- rowSums(matrizA)
matrizA; suma_filas
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
## [1] 4 6
suma_columnas <- colSums(matrizA)
suma_columnas
## [1] 3 7
promedio_filas <- rowMeans(matrizA)
promedio_filas
## [1] 2 3
promedio_columnas <- colMeans(matrizA)
promedio_columnas
## [1] 1.5 3.5
Eres un analista en una compañía de seguros y debes evaluar la rentabilidad de dos productos de inversión.
Productos:
Producto A: Tasa de interés anual del 1.5%, 2% y 2.5% para los años 1, 3 y 5 respectivamente. Producto B: Tasa de interés anual fija del 3%, 3.5% y 4% para los años 1, 3 y 5 respectivamente.
Plazos de Inversión:
1 año, 3 años y 5 años.
Objetivo:
tasas_interes <- matrix(c(1.5,2,2.5,3,3.5,4),
nrow = 3,
ncol = 2,
byrow = FALSE,
dimnames = list(c("1 año","3 años","5 años"),c("Producto A","Producto B"))
)
tasas_interes
## Producto A Producto B
## 1 año 1.5 3.0
## 3 años 2.0 3.5
## 5 años 2.5 4.0
capital_inicial <- 10000
valor_futuro <- capital_inicial * (1 + tasas_interes/100)^c(1,3,5)
tasas_interes; valor_futuro
## Producto A Producto B
## 1 año 1.5 3.0
## 3 años 2.0 3.5
## 5 años 2.5 4.0
## Producto A Producto B
## 1 año 10150.00 10300.00
## 3 años 10612.08 11087.18
## 5 años 11314.08 12166.53
Otra propuesta de solución es:
tasas_interes <- matrix(c(1.5,2,2.5,3,3.5,4),
nrow = 2,
ncol = 3,
byrow = TRUE,
dimnames = list(c("Producto A","Producto B"),c("1 año","3 años","5 años"))
)
tasas_interes
## 1 año 3 años 5 años
## Producto A 1.5 2.0 2.5
## Producto B 3.0 3.5 4.0
capital_inicial <- 10000
plazos <- matrix(rep(c(1,3,5),2), nrow = 2, byrow = TRUE)
tasas_interes; plazos
## 1 año 3 años 5 años
## Producto A 1.5 2.0 2.5
## Producto B 3.0 3.5 4.0
## [,1] [,2] [,3]
## [1,] 1 3 5
## [2,] 1 3 5
valor_futuro <- capital_inicial * (1 + tasas_interes/100) ^ plazos
tasas_interes; plazos; valor_futuro
## 1 año 3 años 5 años
## Producto A 1.5 2.0 2.5
## Producto B 3.0 3.5 4.0
## [,1] [,2] [,3]
## [1,] 1 3 5
## [2,] 1 3 5
## 1 año 3 años 5 años
## Producto A 10150 10612.08 11314.08
## Producto B 10300 11087.18 12166.53
Eres un analista financiero de una concesionaria de autos y te han solicitado realizar un análisis detallado de los pagos mensuales de diferentes modelos de autos bajo diversos planes de financiamiento. La concesionaria ofrece financiamientos a plazos de 36, 48, 60 y 72 meses, con tasas de interés anuales que varían según el modelo de auto.
Se tiene tres modelos con los siguientes precios: * Modelo A $250,000 * Modelo B $350,000 * Modelo C $450,000
Tasas de interés anual nominal (capitalizables mensualmente) por modelo: * Modelo A 7.5% * Modelo B 6.5% * Modelo C 5.5%
Plazos de financiamiento * 36 meses * 48 meses * 60 meses * 72 meses
Objetivos:
| Modelo A | Modelo B | Modelo C | |
|---|---|---|---|
| 36 m | |||
| 48 m | |||
| 60 m | |||
| 72 m |
tasas_nom <- c(7.5,6.5,5.5)
precios <- c(250000,350000,450000)
plazos <- c(36,48,60,72)
tasas_mensuales <- round(tasas_nom/100/12,6)
tasas_matriz <- matrix(rep(tasas_mensuales,4),nrow = 4, byrow = T)
tasas_matriz
## [,1] [,2] [,3]
## [1,] 0.00625 0.005417 0.004583
## [2,] 0.00625 0.005417 0.004583
## [3,] 0.00625 0.005417 0.004583
## [4,] 0.00625 0.005417 0.004583
dim(tasas_matriz)
## [1] 4 3
precios_matriz <- matrix(rep(precios,4), nrow = 4, byrow = T)
precios_matriz
## [,1] [,2] [,3]
## [1,] 250000 350000 450000
## [2,] 250000 350000 450000
## [3,] 250000 350000 450000
## [4,] 250000 350000 450000
dim(precios_matriz)
## [1] 4 3
plazos_matriz <- matrix(rep(plazos,3), nrow = 4, byrow = F)
plazos_matriz
## [,1] [,2] [,3]
## [1,] 36 36 36
## [2,] 48 48 48
## [3,] 60 60 60
## [4,] 72 72 72
dim(plazos_matriz)
## [1] 4 3
Nota: La fórmula del valor presente de una anualidad vencida es:
\[ VP = R \cdot \frac{1 - (1+i)^{-n}}{i} \]
donde:
- \(VP\) : valor presente de la anualidad
- \(R\) : pago periódico
- \(i\) : tasa de interés por periodo
- \(n\) : número de periodosEn una anualidad vencida, los pagos se realizan al final de cada periodo.
pagos_mensuales <- precios_matriz * tasas_matriz / (1-(1+tasas_matriz)^(-plazos_matriz))
pagos_mensuales
## [,1] [,2] [,3]
## [1,] 7776.555 10727.215 13588.075
## [2,] 6044.725 8300.298 10465.332
## [3,] 5009.487 6848.217 8595.440
## [4,] 4322.528 5883.542 7351.965
rownames(pagos_mensuales) <- c("36 m","48 m","60 m","72 m")
colnames(pagos_mensuales) <- c("Modelo A","Modelo B","Modelo C")
pagos_mensuales
## Modelo A Modelo B Modelo C
## 36 m 7776.555 10727.215 13588.075
## 48 m 6044.725 8300.298 10465.332
## 60 m 5009.487 6848.217 8595.440
## 72 m 4322.528 5883.542 7351.965
dimnames(pagos_mensuales) <- list(1:4,1:3)
pagos_mensuales
## 1 2 3
## 1 7776.555 10727.215 13588.075
## 2 6044.725 8300.298 10465.332
## 3 5009.487 6848.217 8595.440
## 4 4322.528 5883.542 7351.965
dimnames(pagos_mensuales) <- list(c("36 m","48 m","60 m","72 m"),
c("Modelo A","Modelo B","Modelo C"))
pagos_mensuales; t(pagos_mensuales)
## Modelo A Modelo B Modelo C
## 36 m 7776.555 10727.215 13588.075
## 48 m 6044.725 8300.298 10465.332
## 60 m 5009.487 6848.217 8595.440
## 72 m 4322.528 5883.542 7351.965
## 36 m 48 m 60 m 72 m
## Modelo A 7776.555 6044.725 5009.487 4322.528
## Modelo B 10727.215 8300.298 6848.217 5883.542
## Modelo C 13588.075 10465.332 8595.440 7351.965
Aprovechamos esta actividad para presentar un par de gráficos interesantes:
Emplearemos matplot(), función diseñada para graficar
todas las columnas de una matriz al mismo tiempo. En R, cuando pasas una
matriz a matplot() cada columna se convierte en una línea
distinta. El eje X usa automáticamente los índices de fila: 1, 2, 3, 4.
El eje Y usa los valores numéricos. Estos son los elementos que vamos a
configurar:
matplot(pagos_mensuales,
type = "b", # líneas y puntos
pch = 1:3, # símbolo de los puntos para cada serie
lty = 1:3, # tipo de línea para cada serie
col = 1:3, # color de cada serie
xaxt = "n", # oculta el eje X por defecto
xlab = "Plazo",# etiqueta del eje X
ylab = "Monto de pago", # etiqueta del eje Y
main = "Comparación de pagos por modelo" # título del gráfico
)
axis(1,
at = 1:4, # posiciones de las marcas en el eje X
labels = rownames(pagos_mensuales)) # etiquetas personalizadas
legend("topright", # ubicación de la leyenda
legend = colnames(pagos_mensuales), # nombres de las series
col = 1:3, # colores de la leyenda
lty = 1:3, # tipos de línea de la leyenda
pch = 1:3) # símbolos de puntos de la leyenda
La gráfica de líneas resulta más adecuada cuando se desea analizar la tendencia de los pagos en función del plazo, ya que permite observar con mayor claridad la evolución entre 36, 48, 60 y 72 meses.
* Gráfico de barras
Cuando le pasamos una matriz a barplot(), cada columna
se convierte en un grupo en el eje X y cada fila se convierte en una
barra dentro del grupo.
barplot(t(pagos_mensuales),
beside = TRUE,
col = c("skyblue", "salmon", "lightgreen" ),
legend = colnames(pagos_mensuales),
main = " Pagos por modelo y plazo",
xlab = "Plazos",
ylab = "Monto de pago")
La gráfica de barras facilita la comparación directa de los montos específicos entre los distintos modelos en cada plazo, permitiendo identificar diferencias puntuales de manera más visual.