Este documento presenta, desde cero, los fundamentos del calculo matricial en R: creacion de matrices, operaciones basicas, determinante, rango, matriz inversa, sistemas de ecuaciones lineales, autovalores y autovectores, y finalmente su aplicacion central en Econometria: la estimacion del modelo de Minimos Cuadrados Ordinarios (MCO) en notacion matricial.
Cada seccion incluye un ejemplo resuelto y una tarea dirigida para que el alumno complete en clase. Al final se incluye el solucionario oficial para el docente.
# Se crea una matriz de 3 filas x 3 columnas a partir de un vector de 1 a 9
# Por defecto, R llena la matriz por columnas (byrow = FALSE)
A <- matrix(1:9, nrow = 3, ncol = 3)
cat("Matriz A (llenado por columnas):\n")
## Matriz A (llenado por columnas):
print(A)
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
# Si se necesita llenar por filas, se usa byrow = TRUE
B <- matrix(1:9, nrow = 3, ncol = 3, byrow = TRUE)
cat("\nMatriz B (llenado por filas):\n")
##
## Matriz B (llenado por filas):
print(B)
## [,1] [,2] [,3]
## [1,] 1 2 3
## [2,] 4 5 6
## [3,] 7 8 9
# Matriz identidad de orden 3
I3 <- diag(3)
cat("Matriz Identidad I3:\n")
## Matriz Identidad I3:
print(I3)
## [,1] [,2] [,3]
## [1,] 1 0 0
## [2,] 0 1 0
## [3,] 0 0 1
# Matriz diagonal con valores especificos
D <- diag(c(2, 5, 7))
cat("\nMatriz Diagonal D:\n")
##
## Matriz Diagonal D:
print(D)
## [,1] [,2] [,3]
## [1,] 2 0 0
## [2,] 0 5 0
## [3,] 0 0 7
# Matriz nula (de ceros) de 2x4
N <- matrix(0, nrow = 2, ncol = 4)
cat("\nMatriz Nula N:\n")
##
## Matriz Nula N:
print(N)
## [,1] [,2] [,3] [,4]
## [1,] 0 0 0 0
## [2,] 0 0 0 0
# Vector fila y vector columna
vector_fila <- matrix(c(4, 8, 15), nrow = 1)
vector_columna <- matrix(c(4, 8, 15), ncol = 1)
cat("\nVector Fila:\n")
##
## Vector Fila:
print(vector_fila)
## [,1] [,2] [,3]
## [1,] 4 8 15
cat("\nVector Columna:\n")
##
## Vector Columna:
print(vector_columna)
## [,1]
## [1,] 4
## [2,] 8
## [3,] 15
cat("Dimensiones de A:", dim(A), "\n")
## Dimensiones de A: 3 3
cat("Numero de filas de A:", nrow(A), "\n")
## Numero de filas de A: 3
cat("Numero de columnas de A:", ncol(A), "\n")
## Numero de columnas de A: 3
Instruccion al alumno: Crea una matriz llamada matriz_C
de 4 filas por 2 columnas, con los numeros del 1 al 8, llenada por filas
(byrow = TRUE). Luego imprime la matriz y muestra sus
dimensiones usando dim().
# Tu codigo aqui abajo:
M1 <- matrix(c(2, 4, 6, 8), nrow = 2, ncol = 2)
M2 <- matrix(c(1, 1, 1, 1), nrow = 2, ncol = 2)
cat("Matriz M1:\n")
## Matriz M1:
print(M1)
## [,1] [,2]
## [1,] 2 6
## [2,] 4 8
cat("\nMatriz M2:\n")
##
## Matriz M2:
print(M2)
## [,1] [,2]
## [1,] 1 1
## [2,] 1 1
# Suma de matrices (deben tener la misma dimension)
suma <- M1 + M2
cat("\nSuma (M1 + M2):\n")
##
## Suma (M1 + M2):
print(suma)
## [,1] [,2]
## [1,] 3 7
## [2,] 5 9
# Resta de matrices
resta <- M1 - M2
cat("\nResta (M1 - M2):\n")
##
## Resta (M1 - M2):
print(resta)
## [,1] [,2]
## [1,] 1 5
## [2,] 3 7
# Multiplicacion por un escalar
escalar <- M1 * 3
cat("\nMultiplicacion por escalar (M1 * 3):\n")
##
## Multiplicacion por escalar (M1 * 3):
print(escalar)
## [,1] [,2]
## [1,] 6 18
## [2,] 12 24
# IMPORTANTE: el operador %*% es la multiplicacion matricial real
# El operador * hace multiplicacion elemento por elemento, NO es lo mismo
X <- matrix(c(1, 2, 3, 4, 5, 6), nrow = 2, ncol = 3) # 2x3
Y <- matrix(c(7, 8, 9, 10, 11, 12), nrow = 3, ncol = 2) # 3x2
cat("Matriz X (2x3):\n")
## Matriz X (2x3):
print(X)
## [,1] [,2] [,3]
## [1,] 1 3 5
## [2,] 2 4 6
cat("\nMatriz Y (3x2):\n")
##
## Matriz Y (3x2):
print(Y)
## [,1] [,2]
## [1,] 7 10
## [2,] 8 11
## [3,] 9 12
# Multiplicacion matricial: (2x3) %*% (3x2) = resultado (2x2)
producto <- X %*% Y
cat("\nProducto (X %*% Y):\n")
##
## Producto (X %*% Y):
print(producto)
## [,1] [,2]
## [1,] 76 103
## [2,] 100 136
# Transpuesta de una matriz: intercambia filas por columnas
X_transpuesta <- t(X)
cat("\nTranspuesta de X:\n")
##
## Transpuesta de X:
print(X_transpuesta)
## [,1] [,2]
## [1,] 1 2
## [2,] 3 4
## [3,] 5 6
Una matriz puede interpretarse como una transformacion que mueve vectores en el espacio. A continuacion se grafica como los vectores base (1,0) y (0,1) cambian de posicion al ser multiplicados por una matriz de transformacion.
transformacion <- matrix(c(2, 0, 1, 1.5), nrow = 2, byrow = TRUE)
e1 <- c(1, 0)
e2 <- c(0, 1)
Te1 <- transformacion %*% e1
Te2 <- transformacion %*% e2
plot(NULL, xlim = c(-1, 3), ylim = c(-1, 3),
xlab = "Eje X", ylab = "Eje Y",
main = "Transformacion lineal aplicada por una matriz", asp = 1)
abline(h = 0, v = 0, col = "gray70")
arrows(0, 0, e1[1], e1[2], col = "blue", lwd = 2, length = 0.15)
arrows(0, 0, e2[1], e2[2], col = "blue", lwd = 2, length = 0.15)
arrows(0, 0, Te1[1], Te1[2], col = "red", lwd = 2, length = 0.15)
arrows(0, 0, Te2[1], Te2[2], col = "red", lwd = 2, length = 0.15)
legend("topleft", legend = c("Vectores originales", "Vectores transformados"),
col = c("blue", "red"), lwd = 2, bty = "n")
Se observa que los vectores originales (en azul) cambian de direccion y magnitud al ser multiplicados por la matriz de transformacion, resultando en los vectores en rojo.
Instruccion al alumno: Con las matrices M1 y
M2 de la seccion anterior:
M1 %*% M2 empleando el
operador correcto.M1 usando
t().M1 * M2 y
M1 %*% M2.# Tu codigo aqui abajo:
Cuadrada <- matrix(c(4, 3, 6, 3), nrow = 2, ncol = 2)
cat("Matriz Cuadrada:\n")
## Matriz Cuadrada:
print(Cuadrada)
## [,1] [,2]
## [1,] 4 6
## [2,] 3 3
det_Cuadrada <- det(Cuadrada)
cat("\nDeterminante de la matriz:", det_Cuadrada, "\n")
##
## Determinante de la matriz: -6
if (!require(Matrix)) install.packages("Matrix")
library(Matrix)
rango_Cuadrada <- rankMatrix(Cuadrada)[1]
cat("Rango de la matriz:", rango_Cuadrada, "\n")
## Rango de la matriz: 2
# Una matriz solo tiene inversa si su determinante es distinto de cero
if (det(Cuadrada) != 0) {
Inversa <- solve(Cuadrada)
cat("Matriz Inversa:\n")
print(Inversa)
# Comprobacion: una matriz multiplicada por su inversa da la identidad
comprobacion <- Cuadrada %*% Inversa
cat("\nComprobacion (Cuadrada %*% Inversa) = Identidad:\n")
print(round(comprobacion, 4))
} else {
cat("La matriz no tiene inversa (determinante = 0).\n")
}
## Matriz Inversa:
## [,1] [,2]
## [1,] -0.5 1.0000000
## [2,] 0.5 -0.6666667
##
## Comprobacion (Cuadrada %*% Inversa) = Identidad:
## [,1] [,2]
## [1,] 1 0
## [2,] 0 1
Instruccion al alumno: Dada la matriz:
## [,1] [,2]
## [1,] 5 1
## [2,] 2 4
det().solve(), si esta
existe.# Tu codigo aqui abajo:
Un sistema de ecuaciones lineales puede escribirse en forma matricial como A x = b, donde A es la matriz de coeficientes, x es el vector de incognitas y b es el vector de resultados.
Considere el sistema:
2x + y = 11
x + 3y = 18
A_sistema <- matrix(c(2, 1, 1, 3), nrow = 2, ncol = 2, byrow = TRUE)
b_sistema <- matrix(c(11, 18), nrow = 2, ncol = 1)
cat("Matriz de coeficientes A:\n")
## Matriz de coeficientes A:
print(A_sistema)
## [,1] [,2]
## [1,] 2 1
## [2,] 1 3
cat("\nVector de resultados b:\n")
##
## Vector de resultados b:
print(b_sistema)
## [,1]
## [1,] 11
## [2,] 18
# La solucion es x = A^(-1) * b, calculada directamente con solve(A, b)
solucion <- solve(A_sistema, b_sistema)
cat("\nSolucion del sistema (x, y):\n")
##
## Solucion del sistema (x, y):
print(solucion)
## [,1]
## [1,] 3
## [2,] 5
Un sistema de dos ecuaciones con dos incognitas puede representarse como dos rectas en el plano. La solucion del sistema corresponde al punto donde ambas rectas se intersectan.
x_vals <- seq(-5, 15, by = 0.1)
y1 <- 11 - 2 * x_vals # despejando y de: 2x + y = 11
y2 <- (18 - x_vals) / 3 # despejando y de: x + 3y = 18
plot(x_vals, y1, type = "l", col = "blue", lwd = 2,
ylim = c(-5, 15), xlab = "x", ylab = "y",
main = "Interseccion de rectas: solucion del sistema")
lines(x_vals, y2, col = "red", lwd = 2)
points(solucion[1], solucion[2], pch = 19, col = "black", cex = 1.5)
text(solucion[1], solucion[2],
labels = paste0("(", round(solucion[1], 2), ", ", round(solucion[2], 2), ")"),
pos = 4)
legend("topright", legend = c("2x + y = 11", "x + 3y = 18"),
col = c("blue", "red"), lwd = 2, bty = "n")
El punto donde se cruzan ambas rectas es exactamente la solucion
obtenida con solve().
Instruccion al alumno: Resuelve el siguiente sistema de ecuaciones
utilizando notacion matricial y la funcion solve():
3x + 2y = 16
x - y = 2
Imprime la matriz de coeficientes, el vector de resultados y la solucion final. Ademas, elabora un grafico con ambas rectas y marca el punto de la solucion, siguiendo el ejemplo anterior.
# Tu codigo aqui abajo:
Los autovalores (valores propios) y autovectores (vectores propios) de una matriz cuadrada A son escalares y vectores que cumplen la relacion A v = lambda v.
Matriz_AV <- matrix(c(2, 1, 1, 2), nrow = 2, ncol = 2)
cat("Matriz:\n")
## Matriz:
print(Matriz_AV)
## [,1] [,2]
## [1,] 2 1
## [2,] 1 2
resultado_eigen <- eigen(Matriz_AV)
cat("\nAutovalores:\n")
##
## Autovalores:
print(resultado_eigen$values)
## [1] 3 1
cat("\nAutovectores (uno por columna):\n")
##
## Autovectores (uno por columna):
print(resultado_eigen$vectors)
## [,1] [,2]
## [1,] 0.7071068 -0.7071068
## [2,] 0.7071068 0.7071068
La propiedad clave de un autovector es que, al multiplicarlo por su matriz, el resultado apunta en la misma direccion (o la opuesta), solo cambia su magnitud segun el autovalor correspondiente.
v1 <- resultado_eigen$vectors[, 1]
Av1 <- Matriz_AV %*% v1
plot(NULL, xlim = c(-2, 2), ylim = c(-2, 2),
xlab = "Eje X", ylab = "Eje Y",
main = "Autovector y su transformacion (misma direccion)", asp = 1)
abline(h = 0, v = 0, col = "gray70")
arrows(0, 0, v1[1], v1[2], col = "blue", lwd = 2, length = 0.15)
arrows(0, 0, Av1[1], Av1[2], col = "red", lwd = 2, length = 0.15, lty = 2)
legend("topleft", legend = c("Autovector v", "A %*% v"),
col = c("blue", "red"), lwd = 2, bty = "n")
Ambas flechas quedan sobre la misma linea, lo cual confirma visualmente que v es un autovector de la matriz A.
Instruccion al alumno: Calcula los autovalores y autovectores de la matriz:
## [,1] [,2]
## [1,] 4 1
## [2,] 2 3
Utiliza la funcion eigen() e imprime por separado los
autovalores y los autovectores.
# Tu codigo aqui abajo:
El modelo de regresion lineal multiple se expresa en forma matricial como:
y = X beta + u
donde y es el vector de la variable dependiente, X es la matriz de variables explicativas (incluyendo una columna de unos para el intercepto), beta es el vector de parametros a estimar y u es el vector de errores.
El estimador de Minimos Cuadrados Ordinarios (MCO) se obtiene mediante la formula:
beta_gorro = (X’ X)^(-1) X’ y
# Datos de ejemplo: relacion entre gasto en publicidad (X) y ventas (Y)
gasto_publicidad <- c(1, 2, 3, 4, 5)
ventas <- c(3, 5, 6, 8, 9)
n <- length(ventas)
# Se construye la matriz X con una columna de unos (intercepto) y la variable explicativa
X <- matrix(c(rep(1, n), gasto_publicidad), nrow = n, ncol = 2)
y <- matrix(ventas, nrow = n, ncol = 1)
cat("Matriz X (columna de unos + variable explicativa):\n")
## Matriz X (columna de unos + variable explicativa):
print(X)
## [,1] [,2]
## [1,] 1 1
## [2,] 1 2
## [3,] 1 3
## [4,] 1 4
## [5,] 1 5
cat("\nVector y (variable dependiente):\n")
##
## Vector y (variable dependiente):
print(y)
## [,1]
## [1,] 3
## [2,] 5
## [3,] 6
## [4,] 8
## [5,] 9
# Aplicacion directa de la formula matricial de MCO
XtX <- t(X) %*% X
XtX_inv <- solve(XtX)
Xty <- t(X) %*% y
beta_gorro <- XtX_inv %*% Xty
cat("\nVector de coeficientes estimados (Beta):\n")
##
## Vector de coeficientes estimados (Beta):
print(beta_gorro)
## [,1]
## [1,] 1.7
## [2,] 1.5
# Comprobacion con la funcion lm() de R
modelo <- lm(ventas ~ gasto_publicidad)
cat("\nComprobacion con la funcion lm():\n")
##
## Comprobacion con la funcion lm():
print(coef(modelo))
## (Intercept) gasto_publicidad
## 1.7 1.5
Como se observa, el calculo manual mediante algebra matricial
coincide con el resultado que entrega la funcion lm() de R,
lo cual confirma que la estimacion por Minimos Cuadrados Ordinarios es,
en esencia, un problema de calculo matricial.
plot(gasto_publicidad, ventas, pch = 19, col = "blue",
xlab = "Gasto en Publicidad", ylab = "Ventas",
main = "Regresion Lineal: Ventas vs Gasto en Publicidad")
abline(a = beta_gorro[1], b = beta_gorro[2], col = "red", lwd = 2)
legend("topleft", legend = "Recta ajustada (MCO)", col = "red", lwd = 2, bty = "n")
valores_predichos <- X %*% beta_gorro
residuos <- y - valores_predichos
plot(gasto_publicidad, ventas, pch = 19, col = "blue",
xlab = "Gasto en Publicidad", ylab = "Ventas",
main = "Valores observados, predichos y residuos")
abline(a = beta_gorro[1], b = beta_gorro[2], col = "red", lwd = 2)
segments(gasto_publicidad, ventas, gasto_publicidad, valores_predichos,
col = "darkgreen", lty = 2)
points(gasto_publicidad, valores_predichos, pch = 17, col = "darkgreen")
legend("topleft",
legend = c("Valor observado", "Valor predicho", "Residuo"),
col = c("blue", "darkgreen", "darkgreen"), pch = c(19, 17, NA),
lty = c(NA, NA, 2), bty = "n")
Las lineas verdes punteadas representan los residuos, es decir, la distancia entre el valor observado de ventas y el valor que predice el modelo para cada nivel de gasto en publicidad.
En la practica econometrica es habitual presentar los resultados de
una regresion en una tabla resumen estandarizada, similar a la que
entregan programas como Stata o la libreria statsmodels de
Python. A continuacion se construye una funcion en R, llamada
resumen_ols, que genera una tabla con ese mismo formato:
coeficientes, errores estandar, estadistico t, valores p, intervalos de
confianza, bondad de ajuste (R-cuadrado, F-estadistico) y pruebas de
diagnostico (Durbin-Watson, Jarque-Bera, asimetria, curtosis y numero de
condicion).
if (!require(lmtest)) install.packages("lmtest")
if (!require(tseries)) install.packages("tseries")
if (!require(moments)) install.packages("moments")
library(lmtest)
library(tseries)
library(moments)
resumen_ols <- function(modelo) {
s <- summary(modelo)
n <- length(residuals(modelo))
k <- length(coef(modelo)) - 1 # numero de regresores, sin el intercepto
gl_residual <- df.residual(modelo)
r2 <- s$r.squared
r2_ajustado <- s$adj.r.squared
f_stat <- s$fstatistic[1]
f_p <- pf(s$fstatistic[1], s$fstatistic[2], s$fstatistic[3], lower.tail = FALSE)
log_lik <- as.numeric(logLik(modelo))
aic_val <- AIC(modelo)
bic_val <- BIC(modelo)
# --- Encabezado ---
cat(strrep("=", 82), "\n")
cat(sprintf("%-38s%-44s\n", "Variable Dependiente:", as.character(formula(modelo))[2]))
cat(sprintf("%-38s%-44s\n", "Modelo:", "MCO (OLS)"))
cat(sprintf("%-38s%-44s\n", "Metodo:", "Minimos Cuadrados Ordinarios"))
cat(sprintf("%-38s%-44d\n", "No. de Observaciones:", n))
cat(sprintf("%-38s%-44d\n", "Grados de Libertad (Residual):", gl_residual))
cat(sprintf("%-38s%-44d\n", "Grados de Libertad (Modelo):", k))
cat(strrep("=", 82), "\n")
# --- Bondad de ajuste ---
cat(sprintf("%-38s%-15.3f R-cuadrado Ajustado: %8.3f\n", "R-cuadrado:", r2, r2_ajustado))
cat(sprintf("%-38s%-15.3f Prob (F-estadistico): %8.3g\n", "F-estadistico:", f_stat, f_p))
cat(sprintf("%-38s%-15.3f BIC: %8.3f\n", "Log-Verosimilitud:", log_lik, bic_val))
cat(sprintf("%-38s%-15.3f\n", "AIC:", aic_val))
cat(strrep("=", 82), "\n")
# --- Tabla de coeficientes ---
coefs <- s$coefficients
ci <- confint(modelo)
cat(sprintf("%-14s%12s%12s%10s%10s%12s%12s\n",
"", "coef", "std err", "t", "P>|t|", "[0.025", "0.975]"))
cat(strrep("-", 82), "\n")
for (i in 1:nrow(coefs)) {
cat(sprintf("%-14s%12.4f%12.3f%10.3f%10.3f%12.3f%12.3f\n",
rownames(coefs)[i], coefs[i, 1], coefs[i, 2],
coefs[i, 3], coefs[i, 4], ci[i, 1], ci[i, 2]))
}
cat(strrep("=", 82), "\n")
# --- Pruebas de diagnostico ---
dw <- lmtest::dwtest(modelo)
jb <- tseries::jarque.bera.test(residuals(modelo))
asimetria <- moments::skewness(residuals(modelo))
curtosis <- moments::kurtosis(residuals(modelo))
num_condicion <- kappa(model.matrix(modelo))
cat(sprintf("%-38s%-15.3f Durbin-Watson: %8.3f\n", "Asimetria (Skew):", asimetria, dw$statistic))
cat(sprintf("%-38s%-15.3f Jarque-Bera (JB): %8.3f\n", "Curtosis:", curtosis, jb$statistic))
cat(sprintf("%-38s%-15.3g Prob(JB): %8.3f\n", "Numero de Condicion:", num_condicion, jb$p.value))
cat(strrep("=", 82), "\n")
}
Se simula un ejemplo de tipo macroeconomico, con el logaritmo del PBI como variable dependiente y tres variables explicativas (ejemplo: gasto tributario, gasto en educacion y gasto en transporte, en logaritmos).
set.seed(123)
n_obs <- 17
Log_GTR <- rnorm(n_obs, mean = 5, sd = 1.0) # Log Gasto Tributario
Log_GE <- rnorm(n_obs, mean = 4, sd = 0.8) # Log Gasto en Educacion
Log_GT <- rnorm(n_obs, mean = 3, sd = 1.2) # Log Gasto en Transporte
Log_PBI <- 13.03 + 0.24 * Log_GTR - 0.05 * Log_GE + 0.0004 * Log_GT +
rnorm(n_obs, mean = 0, sd = 0.15)
datos_macro <- data.frame(Log_PBI, Log_GTR, Log_GE, Log_GT)
modelo_multiple <- lm(Log_PBI ~ Log_GTR + Log_GE + Log_GT, data = datos_macro)
resumen_ols(modelo_multiple)
## ==================================================================================
## Variable Dependiente: Log_PBI
## Modelo: MCO (OLS)
## Metodo: Minimos Cuadrados Ordinarios
## No. de Observaciones: 17
## Grados de Libertad (Residual): 13
## Grados de Libertad (Modelo): 3
## ==================================================================================
## R-cuadrado: 0.743 R-cuadrado Ajustado: 0.683
## F-estadistico: 12.508 Prob (F-estadistico): 0.000394
## Log-Verosimilitud: 13.036 BIC: -11.907
## AIC: -16.073
## ==================================================================================
## coef std err t P>|t| [0.025 0.975]
## ----------------------------------------------------------------------------------
## (Intercept) 13.0749 0.235 55.564 0.000 12.567 13.583
## Log_GTR 0.2306 0.038 6.122 0.000 0.149 0.312
## Log_GE -0.0669 0.046 -1.458 0.168 -0.166 0.032
## Log_GT 0.0232 0.033 0.702 0.495 -0.048 0.095
## ==================================================================================
## Asimetria (Skew): 0.292 Durbin-Watson: 2.643
## Curtosis: 2.884 Jarque-Bera (JB): 0.251
## Numero de Condicion: 32.8 Prob(JB): 0.882
## ==================================================================================
La tabla generada replica el formato estandar de reporte de resultados en econometria: en la parte superior se muestran los indicadores globales del modelo (R-cuadrado, F-estadistico, AIC, BIC), en el centro la tabla de coeficientes con sus errores estandar, estadistico t, valor p e intervalos de confianza, y en la parte inferior las pruebas de diagnostico sobre los residuos (normalidad con Jarque-Bera, autocorrelacion con Durbin-Watson y multicolinealidad aproximada con el numero de condicion).
Instruccion al alumno: Con los siguientes datos de una relacion entre horas de estudio (variable explicativa) y nota obtenida (variable dependiente):
horas_estudio <- c(2, 3, 5, 6, 8)
nota_obtenida <- c(10, 12, 15, 17, 19)
lm().resumen_ols() creada anteriormente.# Tu codigo aqui abajo:
Use estos bloques para comprobar resultados o resolverlos en la
pizarra. Los chunks estan configurados con eval=FALSE para
que no se ejecuten automaticamente y el docente decida cuando
mostrarlos.
La matriz debe tener 4 filas y 2 columnas, llenada por filas.
matriz_C <- matrix(1:8, nrow = 4, ncol = 2, byrow = TRUE)
cat("SOLUCION TAREA 1:\n")
cat("Matriz C:\n")
print(matriz_C)
cat("Dimensiones de matriz_C:", dim(matriz_C), "\n\n")
M1 %*% M2 es una verdadera multiplicacion matricial
(fila por columna). M1 * M2 multiplica elemento a elemento
y no representa una operacion matricial valida en algebra lineal.
M1 <- matrix(c(2, 4, 6, 8), nrow = 2, ncol = 2)
M2 <- matrix(c(1, 1, 1, 1), nrow = 2, ncol = 2)
producto_matricial <- M1 %*% M2
M1_transpuesta <- t(M1)
cat("SOLUCION TAREA 2:\n")
cat("Producto matricial M1 %*% M2:\n")
print(producto_matricial)
cat("\nTranspuesta de M1:\n")
print(M1_transpuesta)
cat("\nDiferencia: M1 * M2 multiplica elemento por elemento (misma dimension),")
cat(" mientras que M1 %*% M2 realiza el producto matricial fila por columna.\n\n")
matriz_enunciado <- matrix(c(5, 2, 1, 4), nrow = 2, ncol = 2)
det_enunciado <- det(matriz_enunciado)
inversa_enunciado <- solve(matriz_enunciado)
comprobacion3 <- matriz_enunciado %*% inversa_enunciado
cat("SOLUCION TAREA 3:\n")
cat("Determinante:", det_enunciado, "\n")
cat("Matriz Inversa:\n")
print(inversa_enunciado)
cat("\nComprobacion (matriz %*% inversa):\n")
print(round(comprobacion3, 4))
La solucion del sistema es x = 4, y = 2.
A_sol4 <- matrix(c(3, 2, 1, -1), nrow = 2, ncol = 2, byrow = TRUE)
b_sol4 <- matrix(c(16, 2), nrow = 2, ncol = 1)
solucion4 <- solve(A_sol4, b_sol4)
cat("SOLUCION TAREA 4:\n")
cat("Matriz A:\n")
print(A_sol4)
cat("\nVector b:\n")
print(b_sol4)
cat("\nSolucion (x, y):\n")
print(solucion4)
x_vals4 <- seq(-5, 15, by = 0.1)
y1_sol4 <- (16 - 3 * x_vals4) / 2 # despejando y de: 3x + 2y = 16
y2_sol4 <- x_vals4 - 2 # despejando y de: x - y = 2
plot(x_vals4, y1_sol4, type = "l", col = "blue", lwd = 2,
ylim = c(-5, 15), xlab = "x", ylab = "y",
main = "Interseccion de rectas: solucion del sistema")
lines(x_vals4, y2_sol4, col = "red", lwd = 2)
points(solucion4[1], solucion4[2], pch = 19, col = "black", cex = 1.5)
text(solucion4[1], solucion4[2],
labels = paste0("(", round(solucion4[1], 2), ", ", round(solucion4[2], 2), ")"),
pos = 4)
legend("topright", legend = c("3x + 2y = 16", "x - y = 2"),
col = c("blue", "red"), lwd = 2, bty = "n")
matriz_enunciado5 <- matrix(c(4, 2, 1, 3), nrow = 2, ncol = 2)
resultado_eigen5 <- eigen(matriz_enunciado5)
cat("SOLUCION TAREA 5:\n")
cat("Autovalores:\n")
print(resultado_eigen5$values)
cat("\nAutovectores:\n")
print(resultado_eigen5$vectors)
v1_sol5 <- resultado_eigen5$vectors[, 1]
Av1_sol5 <- matriz_enunciado5 %*% v1_sol5
plot(NULL, xlim = c(-2, 2), ylim = c(-2, 2),
xlab = "Eje X", ylab = "Eje Y",
main = "Autovector y su transformacion (misma direccion)", asp = 1)
abline(h = 0, v = 0, col = "gray70")
arrows(0, 0, v1_sol5[1], v1_sol5[2], col = "blue", lwd = 2, length = 0.15)
arrows(0, 0, Av1_sol5[1], Av1_sol5[2], col = "red", lwd = 2, length = 0.15, lty = 2)
legend("topleft", legend = c("Autovector v", "A %*% v"),
col = c("blue", "red"), lwd = 2, bty = "n")
horas_estudio <- c(2, 3, 5, 6, 8)
nota_obtenida <- c(10, 12, 15, 17, 19)
n6 <- length(nota_obtenida)
X6 <- matrix(c(rep(1, n6), horas_estudio), nrow = n6, ncol = 2)
y6 <- matrix(nota_obtenida, nrow = n6, ncol = 1)
beta_gorro6 <- solve(t(X6) %*% X6) %*% (t(X6) %*% y6)
modelo6 <- lm(nota_obtenida ~ horas_estudio)
cat("SOLUCION TAREA 6:\n")
cat("Vector de coeficientes Beta (calculo matricial):\n")
print(beta_gorro6)
cat("\nComprobacion con lm():\n")
print(coef(modelo6))
plot(horas_estudio, nota_obtenida, pch = 19, col = "blue",
xlab = "Horas de Estudio", ylab = "Nota Obtenida",
main = "Regresion Lineal: Nota vs Horas de Estudio")
abline(a = beta_gorro6[1], b = beta_gorro6[2], col = "red", lwd = 2)
legend("topleft", legend = "Recta ajustada (MCO)", col = "red", lwd = 2, bty = "n")
resumen_ols(modelo6)