1 Introduccion

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.

2 Parte 1: Creacion de matrices en R

2.1 Ejemplo A: Matriz a partir de un vector

# 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

2.2 Ejemplo B: Matrices especiales

# 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

2.3 Ejemplo C: Dimensiones de una matriz

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

2.4 Tarea en clase 1: Creacion de matrices

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:

3 Parte 2: Operaciones basicas con matrices

3.1 Ejemplo A: Suma, resta y multiplicacion por un escalar

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

3.2 Ejemplo B: Multiplicacion matricial y transpuesta

# 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

3.3 Ejemplo C: Interpretacion geometrica de la multiplicacion matricial

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.

3.4 Tarea en clase 2: Operaciones basicas

Instruccion al alumno: Con las matrices M1 y M2 de la seccion anterior:

  1. Calcula el producto matricial M1 %*% M2 empleando el operador correcto.
  2. Calcula la transpuesta de M1 usando t().
  3. Explica en un comentario la diferencia entre M1 * M2 y M1 %*% M2.
# Tu codigo aqui abajo:

4 Parte 3: Determinante, rango y matriz inversa

4.1 Ejemplo A: Determinante de una matriz cuadrada

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

4.2 Ejemplo B: Rango de una matriz

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

4.3 Ejemplo C: Matriz inversa

# 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

4.4 Tarea en clase 3: Determinante e inversa

Instruccion al alumno: Dada la matriz:

##      [,1] [,2]
## [1,]    5    1
## [2,]    2    4
  1. Calcula su determinante con det().
  2. Calcula su matriz inversa con solve(), si esta existe.
  3. Comprueba el resultado multiplicando la matriz original por su inversa.
# Tu codigo aqui abajo:

5 Parte 4: Sistemas de ecuaciones lineales

5.1 Ejemplo: Resolver un sistema Ax = b

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

5.2 Grafico del sistema de ecuaciones

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().

5.3 Tarea en clase 4: Sistemas de ecuaciones

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:

6 Parte 5: Autovalores y autovectores

6.1 Ejemplo: Calculo de autovalores y autovectores

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

6.2 Grafico: un autovector no cambia de direccion al ser transformado

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.

6.3 Tarea en clase 5: Autovalores y autovectores

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:

7 Parte 6: Aplicacion en Econometria - Estimador MCO en forma matricial

7.1 Fundamento teorico

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

7.2 Ejemplo: Estimacion manual de MCO con matrices

# 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.

7.3 Grafico: dispersion de datos y recta de regresion ajustada

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")

7.4 Grafico: valores observados vs valores predichos y residuos

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.

7.5 Tabla de resumen del modelo econometrico

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")
}

7.6 Ejemplo de aplicacion: modelo con tres variables explicativas

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).

7.7 Tarea en clase 6: Estimacion MCO con matrices

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)

  1. Construye la matriz X (con columna de unos) y el vector y.
  2. Calcula el vector de coeficientes Beta aplicando la formula matricial beta_gorro = (X’ X)^(-1) X’ y.
  3. Comprueba tu resultado utilizando la funcion lm().
  4. Elabora un grafico de dispersion con la recta de regresion ajustada, siguiendo el ejemplo anterior.
  5. Genera la tabla de resumen profesional del modelo aplicando la funcion resumen_ols() creada anteriormente.
# Tu codigo aqui abajo:

8 Solucionario

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.

8.1 Solucion tarea 1: Creacion de matrices

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")

8.2 Solucion tarea 2: Operaciones basicas

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")

8.3 Solucion tarea 3: Determinante e inversa

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))

8.4 Solucion tarea 4: Sistemas de ecuaciones

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")

8.5 Solucion tarea 5: Autovalores y autovectores

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")

8.6 Solucion tarea 6: Estimacion MCO con matrices

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)