🎯 Este material es reproducible en código R
La Regresión por Mínimos Cuadrados Ordinarios (Ordinary Least Squares Regression, OLSR u OLS) representa una metodología estadística esencial que permite analizar la correlación entre una variable dependiente (también conocida como variable de respuesta) y una o más variables independientes (o predictoras). Este método constituye una herramienta fundamental en el campo del análisis de regresión lineal.
Guía rápida para elegir OLSR | ||
Criterio | Aplica | Detalles |
---|---|---|
Fuente: Elaboración propia |
La Regresión por Mínimos Cuadrados Ordinarios (OLSR
)
busca la línea que mejor se ajusta a los datos. Para lograrlo, reduce al
mínimo la suma de los cuadrados de las diferencias entre los valores
reales y los valores que predice el modelo. Estas diferencias son los
residuos o errores. Al trabajar con
los cuadrados de los errores, este método evita que los errores
positivos y negativos se anulen entre sí, y da más peso a los errores
grandes durante el proceso de minimización.
La metodología de OLSR se basa en los siguientes pasos y principios:
Modelo Lineal: OLSR asume una relación lineal
entre las variables. Para una regresión lineal simple (una variable
independiente), la ecuación es:
\[Y = \beta_0 + \beta_1X +
\epsilon\]
Donde:
Para una regresión lineal múltiple (varias variables independientes),
la ecuación se expande a:
\[Y = \beta_0 + \beta_1X_1 + \beta_2X_2 + ...
+ \beta_kX_k + \epsilon\]
Para lograr esta minimización, se utilizan técnicas de cálculo (derivadas parciales) para encontrar los valores de los coeficientes que hacen que la pendiente de la función de suma de cuadrados sea cero.
Estimación de Coeficientes: Los valores estimados de los coeficientes, denotados como \(\hat{\beta}_0, \hat{\beta}_1\), etc., son aquellos que resultan de la minimización. Estos coeficientes son los que definen la “línea de mejor ajuste”.
Supuestos del OLS: Para que los estimadores de OLS sean los “mejores estimadores lineales insesgados” (según el Teorema de Gauss-Markov), se deben cumplir ciertas suposiciones:
Linealidad: La relación entre las variables es lineal.
Independencia de los errores: Los errores de una observación no están correlacionados con los errores de otra.
Homocedasticidad: La varianza de los errores es constante en todos los niveles de las variables independientes.
Normalidad de los errores: Los errores se distribuyen normalmente (aunque no es estrictamente necesario para la estimación, sí lo es para la inferencia estadística).
No multicolinealidad perfecta: Las variables independientes no están perfectamente correlacionadas entre sí.
La base de datos mtcars
es un conjunto de datos clásico
en R que contiene información sobre 32 automóviles
(modelos de 1973–74), y fue extraído de la revista Motor Trend
US. Incluye variables técnicas del desempeño de
los autos.
Aquí está una descripción de cada columna:
Variable | Significado | Tipo de dato |
---|---|---|
mpg |
Miles per gallon (millas por galón) | Numérica |
cyl |
Número de cilindros | Entero |
disp |
Desplazamiento del motor (en pulgadas cúbicas) | Numérica |
hp |
Caballos de fuerza | Entero |
drat |
Relación del eje trasero (rear axle ratio) | Numérica |
wt |
Peso del auto (en miles de libras) | Numérica |
qsec |
Tiempo en 1/4 de milla (segundos) | Numérica |
vs |
Tipo de motor: 0 = V-shaped, 1 = straight (en línea) | Binaria (factor) |
am |
Tipo de transmisión: 0 = automática, 1 = manual | Binaria (factor) |
gear |
Número de velocidades (marchas) adelante | Entero |
carb |
Número de carburadores | Entero |
mtcars data | ||||||||||
mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb |
---|---|---|---|---|---|---|---|---|---|---|
La división de datos en conjuntos de entrenamiento (train) y prueba (test) es una práctica fundamental en el aprendizaje automático y la modelización predictiva. Su importancia radica en la necesidad de obtener una evaluación realista y no sesgada del rendimiento de un modelo, y de asegurar que el modelo sea capaz de generalizar a datos nuevos y no vistos.
createDataPartition()
del paquete
caret
para dividir los datos.mtcars
, estratificado según la variable
mpg
(la variable objetivo).p = 0.8
significa que el 80% se usará para
entrenamiento y el 20% restante para
prueba.list = FALSE
devuelve los índices como un vector, no
como una lista.# Se quiere predecir `mpg` (millas por galón) usando otras variables
# mpg será la variable dependiente (target)
# 3. Se dividen losdatos en entrenamiento y prueba
set.seed(123) # Para reproducibilidad
train_index <- createDataPartition(mtcars$mpg, p = 0.8, list = FALSE)
train_data <- mtcars[train_index, ]
test_data <- mtcars[-train_index, ]
El entrenamiento de un modelo es el paso más
importante en el aprendizaje automático. Usando un conjunto de datos de
entrenamiento (train_data
), el modelo aprende a reconocer
patrones para hacer predicciones confiables con datos nuevos. Este
proceso es esencial por estas razones:
train_data
, usamos el
conjunto de prueba (test_data
) para medir
el rendimiento. Las métricas (MAE, RMSE, \(R^2\)) nos muestran qué tan bien el modelo
maneja datos nuevos.test_data
que en
train_data
indica que el modelo está sobreajustado.Función de entrenamiento
la función lm()
es la función base
de R para ajustar un modelo de regresión lineal (OLS =
Ordinary Least Squares).
mpg ~ .
es una fórmula que
indica:
mpg
es la variable dependiente (lo que
queremos predecir)..
significa “todas las demás variables” del conjunto de
datos se usarán como variables independientes
(predictoras).data = train_data
especifica que el
modelo debe entrenarse usando el conjunto de
entrenamiento (80% de los datos).# 4. Entrenar el modelo de regresión lineal (OLS)
modelo_ols <- lm(mpg ~ ., data = train_data)
# Revisar resumen del modelo
summary(modelo_ols)
##
## Call:
## lm(formula = mpg ~ ., data = train_data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.2742 -1.3609 -0.2707 1.1921 4.9877
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -2.81069 22.93545 -0.123 0.904
## cyl 0.75593 1.21576 0.622 0.542
## disp 0.01172 0.01674 0.700 0.494
## hp -0.01386 0.02197 -0.631 0.536
## drat 2.24007 1.77251 1.264 0.223
## wt -2.73273 1.87954 -1.454 0.164
## qsec 0.53957 0.71812 0.751 0.463
## vs 1.21640 2.02623 0.600 0.556
## am 1.73662 2.08358 0.833 0.416
## gear 2.95127 1.88459 1.566 0.136
## carb -1.19910 0.98232 -1.221 0.239
##
## Residual standard error: 2.431 on 17 degrees of freedom
## Multiple R-squared: 0.8861, Adjusted R-squared: 0.8191
## F-statistic: 13.23 on 10 and 17 DF, p-value: 3.719e-06
Interpretemos los resultados:
Residuales
```r
Residuals:
Min 1Q Median 3Q Max
-3.2742 -1.3609 -0.2707 1.1921 4.9877
```
Ninguna variable es estadísticamente significativa individualmente (todas tienen p > 0.05).
Métrica | Valor | Significado |
---|---|---|
R-squared | 0.8861 | El modelo explica el 88.6% de la variabilidad de
mpg |
Adjusted R-squared | 0.8191 | Ajusta el R² penalizando el número de predictores |
F-statistic | 13.23 | El modelo como conjunto es significativo |
p-value global | 3.719e-06 | Muy bajo → el modelo es útil en conjunto (aunque variables individuales no lo sean) |
require(ggplot2)
require(reshape2)
tabla <- mtcars %>%
melt(., id = "mpg")
p <- tabla %>%
ggplot(aes(y = mpg, x = value, color = variable)) +
geom_point() +
geom_smooth(method = "lm", se = TRUE, color = "black") +
theme_bw() +
theme(plot.title = element_text(size = 22, hjust = 0.15, family = "Montserrat", face = "bold"),
plot.subtitle = element_text(size = 18, hjust = 0, family = "Montserrat", face = "bold"),
plot.caption = element_text(size = 11, hjust = 0.2, vjust = 1, family = "Montserrat"),
axis.text = element_text(family = "Montserrat"),
axis.title = element_text(family = "Montserrat", size = 15),
legend.position = "none"
) +
scale_color_viridis_d(option = "A") +
facet_wrap(variable~., scales = "free") +
labs(title = "Diagramas de dispersión",
x = "",
y = "")
p
El Criterio de Información de Akaike (AIC, por sus siglas en inglés, Akaike Information Criterion) es una medida de la bondad de ajuste de un modelo estadístico que penaliza la complejidad del modelo. Su objetivo es seleccionar el modelo que mejor se ajusta a los datos con la menor cantidad de parámetros, evitando así el sobreajuste (overfitting).
La fórmula general para calcular el AIC es:
\[AIC = 2k - 2\ln(L)\]
Donde:
* \(k\) es el número de parámetros del
modelo. En un modelo de regresión, esto incluye el intercepto y los
coeficientes de las variables predictoras, más la varianza del error si
se estima (en modelos de mínimos cuadrados ordinarios, esto es a menudo
el caso, por lo que \(k\) a veces se
cuenta como el número de coeficientes + 1 para la varianza del error, o
simplemente el número de coeficientes si la varianza del error se
considera implícita en la función de verosimilitud).
* \(\ln(L)\) es el logaritmo natural
del valor máximo de la función de verosimilitud (log-likelihood) del
modelo. La función de verosimilitud mide qué tan bien el modelo
reproduce los datos observados.
Aunque la fórmula general del AIC es la que se mencionó, para modelos de OLS con residuos normalmente distribuidos, la función de log-verosimilitud tiene una forma específica, lo que permite reescribir el AIC de una manera más práctica.
Para un modelo de regresión lineal con \(n\) observaciones y \(k\) parámetros (incluyendo el intercepto), y asumiendo errores normales con varianza constante, el AIC se puede calcular como:
\[AIC = n \cdot \ln\left(\frac{RSS}{n}\right) + 2k\]
Donde:
* \(n\) es el número de observaciones
(tamaño de la muestra).
* \(RSS\) es la Suma de Cuadrados de
los Residuos (Residual Sum of Squares), que es la suma de los cuadrados
de las diferencias entre los valores observados y los valores predichos
por el modelo.
* \(k\) es el número de parámetros del
modelo (coeficientes de las variables independientes + intercepto).
Es importante recordar:
A medida que \(n\) (tamaño de la muestra) es grande, el término de corrección se vuelve insignificante y el AICc converge al AIC.
Se realiza una selección automática de variables para un modelo de regresión lineal, utilizando el criterio AIC (Criterio de Información de Akaike)
require(MASS)
# Aplicar selección automática con criterio AIC
modelo_step <- stepAIC(modelo_ols, direction = "both")
## Start: AIC=57.77
## mpg ~ cyl + disp + hp + drat + wt + qsec + vs + am + gear + carb
##
## Df Sum of Sq RSS AIC
## - vs 1 2.1293 102.57 56.353
## - cyl 1 2.2841 102.72 56.396
## - hp 1 2.3519 102.79 56.414
## - disp 1 2.8930 103.33 56.561
## - qsec 1 3.3355 103.78 56.681
## - am 1 4.1044 104.54 56.887
## <none> 100.44 57.766
## - carb 1 8.8037 109.24 58.119
## - drat 1 9.4363 109.88 58.280
## - wt 1 12.4896 112.93 59.048
## - gear 1 14.4891 114.93 59.539
##
## Step: AIC=56.35
## mpg ~ cyl + disp + hp + drat + wt + qsec + am + gear + carb
##
## Df Sum of Sq RSS AIC
## - cyl 1 1.1115 103.68 54.655
## - hp 1 1.8380 104.41 54.851
## - disp 1 2.5322 105.10 55.036
## - am 1 3.3695 105.94 55.258
## - qsec 1 5.9080 108.48 55.921
## <none> 102.57 56.353
## - carb 1 7.9599 110.53 56.446
## - drat 1 8.6341 111.20 56.616
## - gear 1 13.1452 115.71 57.730
## + vs 1 2.1293 100.44 57.766
## - wt 1 14.1149 116.68 57.963
##
## Step: AIC=54.66
## mpg ~ disp + hp + drat + wt + qsec + am + gear + carb
##
## Df Sum of Sq RSS AIC
## - hp 1 1.8399 105.52 53.148
## - am 1 2.5589 106.24 53.338
## - disp 1 4.0622 107.74 53.731
## - qsec 1 4.8445 108.53 53.934
## - carb 1 6.9467 110.63 54.471
## <none> 103.68 54.655
## - drat 1 7.6997 111.38 54.661
## - gear 1 13.5980 117.28 56.106
## + cyl 1 1.1115 102.57 56.353
## + vs 1 0.9566 102.72 56.396
## - wt 1 16.2953 119.98 56.742
##
## Step: AIC=53.15
## mpg ~ disp + drat + wt + qsec + am + gear + carb
##
## Df Sum of Sq RSS AIC
## - am 1 2.1329 107.65 51.708
## - disp 1 2.4633 107.98 51.794
## - qsec 1 5.2411 110.76 52.505
## <none> 105.52 53.148
## - drat 1 10.3677 115.89 53.772
## + hp 1 1.8399 103.68 54.655
## - wt 1 14.7087 120.23 54.801
## + cyl 1 1.1133 104.41 54.851
## - gear 1 15.3876 120.91 54.959
## + vs 1 0.6502 104.87 54.975
## - carb 1 20.9480 126.47 56.218
##
## Step: AIC=51.71
## mpg ~ disp + drat + wt + qsec + gear + carb
##
## Df Sum of Sq RSS AIC
## - disp 1 2.2822 109.94 50.295
## - qsec 1 3.5668 111.22 50.621
## <none> 107.65 51.708
## - drat 1 13.6462 121.30 53.050
## + am 1 2.1329 105.52 53.148
## + hp 1 1.4138 106.24 53.338
## - wt 1 15.4367 123.09 53.460
## + vs 1 0.6067 107.05 53.550
## + cyl 1 0.3441 107.31 53.618
## - carb 1 24.7890 132.44 55.510
## - gear 1 26.8793 134.53 55.949
##
## Step: AIC=50.3
## mpg ~ drat + wt + qsec + gear + carb
##
## Df Sum of Sq RSS AIC
## - qsec 1 1.352 111.29 48.638
## <none> 109.94 50.295
## - drat 1 12.013 121.95 51.199
## + disp 1 2.282 107.65 51.708
## + am 1 1.952 107.98 51.794
## + cyl 1 1.134 108.80 52.005
## + vs 1 0.291 109.64 52.221
## + hp 1 0.144 109.79 52.259
## - wt 1 19.969 129.91 52.969
## - gear 1 24.988 134.92 54.030
## - carb 1 33.247 143.18 55.694
##
## Step: AIC=48.64
## mpg ~ drat + wt + gear + carb
##
## Df Sum of Sq RSS AIC
## <none> 111.29 48.638
## + vs 1 1.458 109.83 50.268
## - drat 1 15.450 126.74 50.278
## + qsec 1 1.352 109.94 50.295
## + hp 1 0.832 110.46 50.428
## + am 1 0.523 110.76 50.506
## + disp 1 0.067 111.22 50.621
## + cyl 1 0.004 111.28 50.637
## - wt 1 19.045 130.33 51.061
## - gear 1 28.557 139.84 53.033
## - carb 1 69.469 180.76 60.219
El procedimiento va eliminando o agregando variables al modelo original para reducir el AIC (Criterio de Información de Akaike). El objetivo es encontrar un modelo más parsimonioso (simple) con buena capacidad predictiva.
El proceso empieza con un modelo completo:
mpg ~ cyl + disp + hp + drat + wt + qsec + vs + am + gear + carb
y un AIC inicial, por ejemplo: AIC = 57.77
.
Luego evalúa qué pasa si quita una variable
(- vs
, - cyl
, etc.).
Si al eliminar una variable el AIC baja, se
acepta ese cambio.
Ejemplo:
- vs 1 2.1293 102.57 56.353
Significa que si quitas la variable vs
, el AIC baja de
57.77 a 56.35 → ¡mejor!
También puede intentar agregar variables
previamente eliminadas (+ vs
, + hp
, etc.) si
esto mejora el AIC.
Cuando ya no puede bajar más el AIC quitando o agregando variables. El modelo final es el que tiene el AIC más bajo alcanzado durante el proceso.
##
## Call:
## lm(formula = mpg ~ drat + wt + gear + carb, data = train_data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.357 -1.317 -0.125 1.423 5.519
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 12.1030 7.0506 1.717 0.099494 .
## drat 2.2085 1.2360 1.787 0.087143 .
## wt -1.7992 0.9069 -1.984 0.059323 .
## gear 2.8399 1.1690 2.429 0.023345 *
## carb -1.6345 0.4314 -3.789 0.000948 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.2 on 23 degrees of freedom
## Multiple R-squared: 0.8738, Adjusted R-squared: 0.8518
## F-statistic: 39.81 on 4 and 23 DF, p-value: 5.077e-10
mpg
.Los modelos “forward” (hacia adelante) y “backward” (hacia atrás) son dos enfoques comunes dentro de la regresión stepwise (paso a paso), un método de selección automática de variables para construir modelos de regresión. El objetivo de la regresión stepwise es encontrar un subconjunto óptimo de variables predictoras que expliquen la mayor parte de la varianza en la variable dependiente con la menor complejidad posible, evitando el sobreajuste y mejorando la interpretabilidad del modelo.
Ambos métodos operan de manera iterativa, agregando o eliminando variables basándose en un criterio estadístico (como el p-valor, AIC, BIC, etc.).
La selección hacia adelante comienza con un modelo “nulo”, es decir, un modelo que no contiene ninguna variable predictora (solo el intercepto). Luego, en cada paso, evalúa todas las variables predictoras no incluidas en el modelo y agrega aquella que, al ser incluida, produce la mejora más significativa en el ajuste del modelo. Este proceso continúa hasta que ninguna de las variables restantes cumple con el criterio de entrada preestablecido (por ejemplo, su p-valor es mayor que un umbral determinado).
La eliminación hacia atrás comienza con un modelo “completo”, es decir, un modelo que incluye todas las variables predictoras candidatas. Luego, en cada paso, evalúa la contribución de cada variable predictora en el modelo y elimina aquella que, al ser retirada, tiene el menor impacto negativo en el ajuste del modelo (o la que es menos significativa, por ejemplo, la que tiene el p-valor más alto). Este proceso continúa hasta que todas las variables restantes en el modelo cumplen con un criterio de permanencia preestablecido (por ejemplo, su p-valor es menor que un umbral determinado).
Es importante mencionar que, aunque los métodos forward y backward son populares por su automatización, también tienen sus críticas y desventajas:
require(leaps)
# Use exhaustive search, forward selection, backward selection or sequential replacement to search.
#method=c("exhaustive", "backward", "forward", "seqrep")
# Evaluar todos los subconjuntos posibles
regfit <- regsubsets(mpg ~ ., data = train_data, nvmax = 10)
summary(regfit)
## Subset selection object
## Call: (function(inputFile, encoding) {
## rmarkdown::render(inputFile, encoding = encoding, output_dir = "../../Output/Regression")
## })("C:/Users/dvill/OneDrive/Escritorio/ML_Examples/R/Regression/01_01.OLSR.Rmd",
## encoding = "UTF-8")
## 10 Variables (and intercept)
## Forced in Forced out
## cyl FALSE FALSE
## disp FALSE FALSE
## hp FALSE FALSE
## drat FALSE FALSE
## wt FALSE FALSE
## qsec FALSE FALSE
## vs FALSE FALSE
## am FALSE FALSE
## gear FALSE FALSE
## carb FALSE FALSE
## 1 subsets of each size up to 10
## Selection Algorithm: exhaustive
## cyl disp hp drat wt qsec vs am gear carb
## 1 ( 1 ) " " " " " " " " "*" " " " " " " " " " "
## 2 ( 1 ) "*" " " " " " " "*" " " " " " " " " " "
## 3 ( 1 ) " " " " " " " " "*" " " " " " " "*" "*"
## 4 ( 1 ) " " " " " " "*" "*" " " " " " " "*" "*"
## 5 ( 1 ) " " " " " " "*" "*" " " "*" " " "*" "*"
## 6 ( 1 ) " " "*" " " "*" "*" "*" " " " " "*" "*"
## 7 ( 1 ) " " "*" " " "*" "*" "*" " " "*" "*" "*"
## 8 ( 1 ) " " "*" "*" "*" "*" "*" " " "*" "*" "*"
## 9 ( 1 ) "*" "*" "*" "*" "*" "*" " " "*" "*" "*"
## 10 ( 1 ) "*" "*" "*" "*" "*" "*" "*" "*" "*" "*"
Selection Algorithm: exhaustive
: Esto es
crucial. Significa que el algoritmo probó todas las combinaciones
posibles de variables para cada tamaño de subconjunto hasta
nvmax = 10
y seleccionó el mejor para cada tamaño. Esto
asegura que, para cada número de variables (1, 2, …, 10), el modelo
presentado es el óptimo según el criterio interno de
regsubsets
(generalmente \(R^2\) ajustado, BIC o Cp de Mallows, a
menos que se especifique otro).
# Ver los mejores modelos según el número de variables
plot(regfit, scale = "adjr2") # O usar "bic" o "Cp" para otros criterios
require(ggplot2)
# Crear un data frame con las métricas para ggplot2
reg_summary <- summary(regfit)
models_data <- data.frame(
num_variables = 1:length(reg_summary$adjr2),
adjr2 = reg_summary$adjr2,
cp = reg_summary$cp,
bic = reg_summary$bic
)
ggplot(models_data, aes(x = num_variables, y = adjr2)) +
geom_line(color = "blue") +
geom_point(color = "blue") +
geom_vline(xintercept = which.max(models_data$adjr2), linetype = "dashed", color = "red") +
geom_text(aes(x = which.max(models_data$adjr2) + 0.5, y = max(adjr2) * 0.95,
label = paste("Max R2 Ajustado con", which.max(models_data$adjr2), "vars")),
color = "red", size = 3, hjust = 0) +
theme(plot.title = element_text(size = 22, hjust = 0.15, family = "Montserrat", face = "bold"),
plot.subtitle = element_text(size = 18, hjust = 0, family = "Montserrat", face = "bold"),
plot.caption = element_text(size = 11, hjust = 0.2, vjust = 1, family = "Montserrat"),
axis.text = element_text(family = "Montserrat"),
axis.title = element_text(family = "Montserrat", size = 15),
legend.position = "none"
) +
scale_x_continuous(breaks = 1:10) +
labs(title = "R2 Ajustado vs. Número de Variables",
x = "Número de Variables",
y = "R2 Ajustado") +
theme_minimal()
VIF
)El Factor de Inflación de la Varianza (VIF) es una herramienta estadística fundamental utilizada para detectar y cuantificar la multicolinealidad en modelos de regresión lineal múltiple.
Problemas que causa la multicolinealidad:
El VIF mide cuánto se “infla” la varianza del coeficiente de regresión estimado de una variable predictora debido a su correlación con otras variables predictoras en el modelo.
La fórmula del VIF para una variable \(X_j\) es:
\[VIF_j = \frac{1}{1 - R_j^2}\]
Donde \(R_j^2\) es el coeficiente de determinación (\(R^2\)) de una regresión auxiliar en la que la variable \(X_j\) se predice utilizando todas las demás variables independientes del modelo.
Reglas generales para interpretar los valores de VIF (son reglas de “pulgar” y pueden variar ligeramente según el contexto y el campo de estudio):
## cyl disp hp drat wt qsec vs am
## 21.872305 19.666596 9.306326 4.145180 16.414378 6.828658 4.839460 4.723637
## gear carb
## 8.673629 11.963390
Altísima colinealidad en:
cyl
, disp
, wt
,
carb
Sospechosos comunes:
cyl
, disp
, hp
y
wt
están muy correlacionados entre sí (motores grandes
tienden a pesar más, tener más cilindros y más caballos).## drat wt gear carb
## 2.460997 4.666484 4.075103 2.817151
Todos los VIF están por debajo del umbral de 5, lo que indica:
stepAIC
hizo un buen trabajo al reducir la complejidad
y mejorar la interpretabilidad del modelo.Ahora se va a trabajar con un modelo reducido
(modelo_step
), es importante usar ese
modelo para hacer predicciones en el conjunto de prueba.
Además, como solo algunas variables quedaron en el modelo
(drat
, wt
, gear
,
carb
), el test_data
debe contener esas
columnas.
Verificar qué variables necesita el modelo reducido
## mpg ~ drat + wt + gear + carb
## <environment: 0x0000020083e53900>
Nos aseguramos que las bases de (test / training) tengan esas variables
Con la función predict()
genérica en R
que se utiliza para obtener predicciones de varios tipos de objetos de
modelos (lineales, árboles de decisión, series de tiempo, etc.). Su
comportamiento exacto depende de la clase del objeto que se le pasa como
primer argumento.
Esta operación es un paso clave en el flujo de trabajo de modelado predictivo, ya que permite:
Evaluación del modelo: Una vez que se tienen las
predicciones
para el test_data
, se puede
compararlas con los valores reales (observados) de la variable
dependiente en el test_data
(si se tienen) para
evaluar qué tan bien se desempeña el modelo en datos no
vistos. Esto ayuda a estimar su rendimiento en el mundo real y a
detectar problemas como el sobreajuste
(overfitting).
Uso práctico del modelo: Después de validar que el modelo es bueno, se puede usarlo para predecir la variable dependiente para nuevas observaciones futuras de las que solo se conocen las variables predictoras (por ejemplo, predecir el precio de una casa basándose en sus características, si el modelo fue entrenado para eso).
MAE
)El MAE (Mean Absolute Error), o Error Absoluto Medio en español, es una de las métricas más utilizadas para evaluar la precisión de un modelo de regresión. Mide la magnitud promedio de los errores entre los valores predichos por un modelo y los valores reales observados.
La fórmula para calcular el MAE es la siguiente:
\[MAE = \frac{1}{n} \sum_{i=1}^{n} |y_i - \hat{y}_i|\]
Donde:
## [1] 3.679999
Esto significa que, en promedio, el modelo reducido
predice el consumo de combustible con un error de ±3.68 mpg. Esto es
bueno o malo. Depende del rango de la variable mpg
en
mtcars
.
## [1] 10.4 33.9
El rango de mpg
es de 10.4 a 33.9, es
decir, abarca ~23.5 unidades.
Por tanto:
* Un MAE de **3.68** representa alrededor de un **15% del rango total**. El modelo, en promedio, se equivoca por 3.68 millas por galón en sus predicciones.
* No es un error enorme, pero **tampoco es excelente**.
* Si el modelo completo (`modelo_ols`) tenía un MAE menor, podría predecir mejor, aunque con más colinealidad.
RMSE
)El RMSE (Root Mean Squared Error), o Raíz del Error Cuadrático Medio, es una de las métricas más comunes y ampliamente utilizadas para evaluar la precisión de los modelos de regresión. Mide la magnitud promedio de los errores entre los valores predichos por un modelo y los valores reales observados, pero dando mayor peso a los errores más grandes.
\[RMSE = \sqrt{\frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2}\]
Donde:
Elevar al cuadrado las diferencias tiene dos propósitos principales:
# Cálculo del RMSE (Root Mean Squared Error)
RMSE <- sqrt(mean((predicciones - test_data_reducido$mpg)^2))
RMSE
## [1] 4.866215
mtcars
, pero con espacio para mejora si se
requiere mayor precisión.Compararlo con el MAE
\(R^{2}\) (coeficiente de determinación) mide qué proporción de la variabilidad de la variable dependiente es explicada por el modelo.
La fórmula general del \(R^2\) (coeficiente de determinación) es:
\[R^2 = 1 - \frac{SSE}{SST}\]
Donde:
\[SSE = \sum_{i=1}^{n} (y_i - \hat{y}_i)^2\]
\[SST = \sum_{i=1}^{n} (y_i - \bar{y})^2\]
# R² manual (opcional)
SST <- sum((test_data_reducido$mpg - mean(test_data_reducido$mpg))^2)
SSE <- sum((test_data_reducido$mpg - predicciones)^2)
R2 <- 1 - SSE/SST
R2
## [1] 0.6021664
mpg
(consumo de combustible) en los datos de prueba
es explicada por el modelo.
mpg
en los datos de prueba.Relación lineal entre variable dependiente e independiente:
Se calculan los residuos para cada observación y se representan
(scatterplot
). Si las observaciones siguen la línea del
modelo, los residuos se deben distribuir aleatoriamente entorno al valor
0.
tabla <- data.frame(prediccion = modelo_step$fitted.values,
residuos = modelo_step$residuals)
ggplot(data = tabla, aes(x = prediccion, y = residuos)) +
geom_point(aes(color = residuos)) +
scale_color_gradient2(low = "blue3", mid = "grey", high = "red") +
geom_hline(yintercept = 0) +
geom_segment(aes(xend = prediccion, yend = 0), alpha = 0.2) +
theme_bw() +
theme(plot.title = element_text(size = 22, hjust = 0, family = "Montserrat", face = "bold"),
plot.subtitle = element_text(size = 18, hjust = 0, family = "Montserrat", face = "bold"),
plot.caption = element_text(size = 11, hjust = 0.2, vjust = 1, family = "Montserrat"),
axis.text = element_text(family = "Montserrat"),
axis.title = element_text(family = "Montserrat", size = 15),
legend.position = "none"
) +
labs(title = "Distribución de los residuos",
x = "predicción modelo",
y = "residuo")
Los residuos se distribuyen de forma aleatoria entorno al
0
por lo que se acepta la linealidad.
Los residuos se deben distribuir de forma normal con media 0. Para comprobarlo se recurre a histogramas, a los cuantiles normales o a un test de contraste de normalidad.
ggplot(data = tabla, aes(x = residuos)) +
geom_histogram(aes(y = ..density..)) +
theme_light() +
theme(plot.title = element_text(size = 22, hjust = 0, family = "Montserrat", face = "bold"),
plot.subtitle = element_text(size = 18, hjust = 0, family = "Montserrat", face = "bold"),
plot.caption = element_text(size = 11, hjust = 0.2, vjust = 1, family = "Montserrat"),
axis.text = element_text(family = "Montserrat"),
axis.title = element_text(family = "Montserrat", size = 15),
legend.position = "none"
) +
labs(title = "Histograma de los residuos")
Los gráficos Q-Q normales son esenciales para verificar uno de los supuestos clave en la regresión lineal: la normalidad de los residuos. Si los residuos siguen una distribución normal, los puntos en el gráfico Q-Q deben caer aproximadamente a lo largo de una línea recta.
# Residuos del modelo
residuos <- residuals(modelo_step)
# Calcular los cuantiles teóricos normales
# La función 'qqnorm' internamente calcula estos valores
# Puedes replicarlo manualmente o usar la función 'qqnorm' y luego extraer sus valores
qq_data <- data.frame(teoricos = qqnorm(residuos, plot.it = FALSE)$x,
observados = residuos)
ggplot(qq_data, aes(x = teoricos, y = observados)) +
geom_point(alpha = 0.7, color = "darkblue") + # Puntos de los cuantiles
geom_abline(intercept = 0, slope = 1, linetype = "dashed", color = "red") + # Línea de referencia ideal (y=x)
theme_minimal() +
labs(title = "Gráfico Q-Q Normal de los Residuos del Modelo",
x = "Cuantiles Teóricos Normales",
y = "Residuos del Modelo")
También conocidos como residuos studentizados externamente (o residuos t). Son una versión más refinada de los residuos estandarizados.
Cada residuo se divide por una estimación de su error estándar que excluye la observación actual, lo que los hace más apropiados para la detección de outliers, ya que el outlier no influye en la estimación de su propia varianza.
# Residuos del modelo
residuos <- rstudent(modelo_step)
# Calcular los cuantiles teóricos normales
# La función 'qqnorm' internamente calcula estos valores
# Puedes replicarlo manualmente o usar la función 'qqnorm' y luego extraer sus valores
qq_data <- data.frame(teoricos = qqnorm(residuos, plot.it = FALSE)$x,
observados = residuos)
ggplot(qq_data, aes(x = teoricos, y = observados)) +
geom_point(alpha = 0.7, color = "darkblue") + # Puntos de los cuantiles
geom_abline(intercept = 0, slope = 1, linetype = "dashed", color = "red") + # Línea de referencia ideal (y=x)
theme_minimal() +
labs(title = "Gráfico Q-Q Normal de los Residuos studentized",
x = "Cuantiles Teóricos Normales",
y = "Residuos studentized")
El Test de Normalidad de Shapiro-Wilk es una prueba estadística que se utiliza para determinar si una muestra de datos procede de una población con distribución normal. Es una de las pruebas de normalidad más potentes y ampliamente recomendadas, especialmente para tamaños de muestra pequeños a moderados.
Es una prueba estadística que evalúa si los datos provienen de una distribución normal.
##
## Shapiro-Wilk normality test
##
## data: modelo_step$residuals
## W = 0.96777, p-value = 0.5222
La validación cruzada es una técnica estadística esencial utilizada en el aprendizaje automático y la modelización para evaluar la capacidad de un modelo para generalizar a un conjunto de datos independiente, es decir, a datos que no se han visto durante el entrenamiento. Su objetivo principal es obtener una estimación más robusta y menos sesgada del rendimiento predictivo del modelo, ayudando a evitar el sobreajuste (overfitting).
Cuando se construye un modelo, y se entrena con un conjunto de datos. Se evalúa el rendimiento del modelo en esos mismos datos de entrenamiento, a menudo se obtendrá una métrica de rendimiento inflada (por ejemplo, un \(R^2\) muy alto o un MAE/RMSE muy bajo). Esto se debe a que el modelo ha “memorizado” los datos de entrenamiento, incluyendo el ruido y las particularidades de esa muestra específica. Sin embargo, un modelo sobreajustado no funcionará bien con datos nuevos y reales.
Aunque hay varias variaciones, las más comunes son:
En modelos de regresión lineal OLS (Ordinary Least Squares Regression), la validación cruzada (cross-validation) es clave para estimar la capacidad de generalización del modelo.
```r
trainControl(method = "cv", number = 10)
```
k = 10
es un valor estándar que ofrece buen
balance entre sesgo y varianza.
```r
trainControl(method = "LOOCV")
```
k = n
).La validación cruzada repetida k-fold
(Repeated k-Fold Cross-Validation
) es una extensión del
método k-fold cross-validation y se utiliza para obtener una
estimación más estable y confiable del
desempeño de un modelo, especialmente cuando el conjunto de
datos es pequeño o tiene mucha variabilidad.
```r
trainControl(method = "repeatedcv", number = 10, repeats = 5)
```
# 6. Validación cruzada
control <- trainControl(method = "cv", number = 10)
modelo_cv <- train(mpg ~ .,
data = mtcars,
method = "lm",
trControl = control)
print(modelo_cv)
## Linear Regression
##
## 32 samples
## 10 predictors
##
## No pre-processing
## Resampling: Cross-Validated (10 fold)
## Summary of sample sizes: 29, 28, 29, 29, 28, 30, ...
## Resampling results:
##
## RMSE Rsquared MAE
## 3.400828 0.8447916 2.839717
##
## Tuning parameter 'intercept' was held constant at a value of TRUE
modelo_cv_reducido <- train(mpg ~ drat + wt + gear + carb,
data = mtcars,
method = "lm",
trControl = control
)
print(modelo_cv_reducido)
## Linear Regression
##
## 32 samples
## 4 predictor
##
## No pre-processing
## Resampling: Cross-Validated (10 fold)
## Summary of sample sizes: 29, 28, 28, 28, 28, 30, ...
## Resampling results:
##
## RMSE Rsquared MAE
## 3.142419 0.8931869 2.748877
##
## Tuning parameter 'intercept' was held constant at a value of TRUE
Métrica | Valor | Interpretación |
---|---|---|
RMSE (Root Mean Squared Error) | 3.14 |
El error promedio en las predicciones es de 3.14 millas por galón (mpg). Este valor ha mejorado en comparación con el modelo completo (que tenía ~3.40). |
R² (R-squared) | 0.893 |
El modelo reducido explica el 89.3% de la variación de
mpg , lo cual es mejor que el
84.5% del modelo completo. |
MAE (Mean Absolute Error) | 2.74 |
El error absoluto medio también es menor, lo cual es positivo. |
Se utiliza el modelo ya entrenado para predecir el
consumo de gasolina (variable mpg
) de un nuevo
automóvil simulado, con características específicas.
\[\hat{Y} = 12.1 + 2.20(drat) - 1.8(wt) + 2.84(gear) - 1.63(carb)\]
# 7. Usar el modelo para predecir nuevos datos (simulación)
nuevo_auto <- data.frame(drat = 3.5,
wt = 2.8,
gear = 4,
carb = 2)
predict(modelo_step, newdata = nuevo_auto)
Esto significa que, según el modelo, un auto con esas características tendrá un rendimiento de aproximadamente 22.8 mpg.
## # A tibble: 5 × 5
## term estimate std.error statistic p.value
## <chr> <dbl> <dbl> <dbl> <dbl>
## 1 (Intercept) 12.1 7.05 1.72 0.0995
## 2 drat 2.21 1.24 1.79 0.0871
## 3 wt -1.80 0.907 -1.98 0.0593
## 4 gear 2.84 1.17 2.43 0.0233
## 5 carb -1.63 0.431 -3.79 0.000948
lm()
por modelos más complejos como
randomForest
, xgboost
, etc., manteniendo la
misma estructura.Ventajas:
Simplicidad: Es fácil de entender e implementar.
Interpretabilidad: Los coeficientes estimados tienen una interpretación clara.
Eficiencia: Bajo ciertas condiciones, los estimadores de OLS son los más eficientes.
Limitaciones:
James, G., Witten, D., Hastie, T., & Tibshirani, R. (2021). An introduction to statistical learning: With applications in R (2nd ed.). Springer. https://www.statlearning.com
Fox, J., & Weisberg, S. (2019). An R companion to applied regression (3rd ed.). Sage.
Montgomery, D. C., Peck, E. A., & Vining, G. G. (2012). Introduction to linear regression analysis (5th ed.). Wiley.
Librerias que se usaron en el documento
package | loadedversion | source |
---|---|---|
broom | 1.0.6 | CRAN (R 4.3.3) |
car | 3.1-3 | CRAN (R 4.3.3) |
carData | 3.0-5 | CRAN (R 4.3.1) |
caret | 6.0-94 | CRAN (R 4.3.1) |
dplyr | 1.1.3 | CRAN (R 4.3.2) |
extrafont | 0.19 | CRAN (R 4.3.0) |
forcats | 1.0.0 | CRAN (R 4.3.1) |
ggplot2 | 3.5.1 | CRAN (R 4.3.3) |
gt | 0.10.0 | CRAN (R 4.3.1) |
kableExtra | 1.3.4 | CRAN (R 4.3.1) |
knitr | 1.45 | CRAN (R 4.3.2) |
lattice | 0.22-5 | CRAN (R 4.3.2) |
leaps | 3.2 | CRAN (R 4.3.3) |
lubridate | 1.9.3 | CRAN (R 4.3.2) |
MASS | 7.3-60 | CRAN (R 4.3.1) |
Metrics | 0.1.4 | CRAN (R 4.3.3) |
purrr | 1.0.1 | CRAN (R 4.3.1) |
readr | 2.1.4 | CRAN (R 4.3.1) |
reshape2 | 1.4.4 | CRAN (R 4.3.1) |
showtext | 0.9-6 | CRAN (R 4.3.1) |
showtextdb | 3.0 | CRAN (R 4.3.1) |
stringr | 1.5.0 | CRAN (R 4.3.1) |
sysfonts | 0.8.8 | CRAN (R 4.3.1) |
tibble | 3.2.1 | CRAN (R 4.3.1) |
tidyr | 1.3.1 | CRAN (R 4.3.3) |
tidyverse | 2.0.0 | CRAN (R 4.3.1) |
This
work by Diana Villasana
Ocampo is licensed under a
Creative
Commons Attribution 4.0 International License.