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

Machine Learning Steps

Guía rápida para elegir OLSR
Criterio Aplica Detalles
🔍 Tipo de modelo Supervisado Se entrena con datos X → y
🎯 Variable respuesta Numérica continua Ej. mpg, precio, ingresos
🔢 Variables predictoras Numéricas y/o categóricas Categorías convertidas a dummies
📈 Relación entre variables Lineal (supuesto clave) Se asume una relación lineal entre X e Y
🧪 Normalidad de residuos Deseable Importante para intervalos de confianza válidos
🔁 Independencia de errores Necesaria Errores deben ser independientes
⚖️ Homoscedasticidad Necesaria Varianza de errores debe ser constante
❗ Sensible a outliers Outliers pueden influir mucho en el modelo
🔗 Multicolinealidad entre predictores Problema común Usar VIF para detectar problemas
🧠 Interpretabilidad Alta Modelo fácil de explicar
🚀 Velocidad y eficiencia Muy alta Rápido incluso con datos grandes
🧪 Validación cruzada Compatible Ayuda a prevenir overfitting
❌ No funciona bien si... Relaciones no lineales, outliers severos, colinealidad Evitar si no hay linealidad o hay muchos outliers
Fuente: Elaboración propia

Objetivo

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.

Metodología

La metodología de OLSR se basa en los siguientes pasos y principios:

  1. 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:

    • \(Y\) es la variable dependiente.
  • \(X\) es la variable independiente.
  • \(\beta_0\) es el intercepto (el valor de \(Y\) cuando \(X\) es 0).
  • \(\beta_1\) es la pendiente (el cambio en \(Y\) por cada unidad de cambio en \(X\)).
  • \(\epsilon\) es el término de error o residual, que representa la parte de \(Y\) que no puede ser explicada por \(X\).

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\]

  1. Minimización de la Suma de Cuadrados de Residuos (SSR): El corazón de OLS es encontrar los valores de los coeficientes (\(\beta_0, \beta_1\), etc.) que minimicen la siguiente función:
    \[\text{Minimizar } \sum_{i=1}^{n} (y_i - \hat{y}_i)^2\]
    Donde:
    • \(y_i\) es el valor observado de la variable dependiente para la observación \(i\).
  • \(\hat{y}_i\) es el valor predicho de la variable dependiente por el modelo para la observación \(i\).
  • \((y_i - \hat{y}_i)\) es el residual para la observación \(i\).

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.

  1. 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”.

  2. 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í.

Pasos generales del Machine Learning supervisado

  1. Importar y explorar los datos
  2. Preprocesamiento
  3. División de los datos (train/test)
  4. Entrenamiento del modelo
  5. Evaluación del modelo
  6. Ajustes o validación cruzada (si aplica)
  7. Predicción con nuevos datos
  8. Interpretación de resultados

Machine Learning Steps


Base de datos

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
# 2. Cargar y se exploran los datos
data("mtcars")
mtcars data
mpg cyl disp hp drat wt qsec vs am gear carb
21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4
16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2
15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2
13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4
19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6
15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8
21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2

Entrenamiento de los datos (train/test)

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.

  • Se usa la función createDataPartition() del paquete caret para dividir los datos.
  • Se crea un índice con el 80% de las filas del mtcars, estratificado según la variable mpg (la variable objetivo).
  • El argumento 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, ]
  • Particionar los datos, evita el overfitting (cuando el modelo memoriza los datos de entrenamiento).
  • Permite una evaluación honesta del modelo al probarlo en datos que no vio durante el entrenamiento.
  • Es una práctica estándar en cualquier pipeline de aprendizaje automático.

Entrenamiento del modelo

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:

  • Durante el entrenamiento, el modelo identifica patrones específicos en los datos.
  • Separamos los datos en grupos de entrenamiento y prueba para asegurar que el modelo funcione bien no solo con datos conocidos, sino también con datos nuevos y no vistos.
  • Después del entrenamiento con 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.
  • Un rendimiento peor en test_data que en train_data indica que el modelo está sobreajustado.
  • Con estos resultados, podemos decidir si el modelo está listo para usar o necesita ajustes.

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 
```
  • Indica la distribución de los errores de predicción (diferencia entre valor real y valor predicho).
  • Lo ideal es que estén centrados en 0 y sean simétricos, lo que parece cumplirse aquí.
  • El valor máximo del error es aproximadamente ±5 millas por galón.

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)

📌 Observaciones generales

  • El modelo es bueno en conjunto, pero ninguna variable individual es altamente significativa.
  • Esto puede ser por colinealidad (las variables están correlacionadas entre sí).
  • Se podría:
    • Usar un modelo más simple (quitar predictores no útiles).
    • Aplicar selección de variables (ej. stepAIC, regsubsets).
    • Verificar colinealidad con el VIF (Variance Inflation Factor).
    • Visualizar los residuos para ver si el modelo cumple los supuestos.
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

Selección de variables

Criterio de Información de Akaike

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.

Cómo se interpreta:

  • Valores más bajos de AIC indican un mejor modelo. El AIC busca un equilibrio entre la bondad de ajuste del modelo a los datos (representada por \(\ln(L)\)) y la complejidad del modelo (representada por \(2k\)).
  • El término \(2k\) es una penalización por la complejidad. Cada parámetro adicional en el modelo aumenta el valor de AIC, lo que desincentiva la inclusión de variables innecesarias que podrían sobreajustar los datos.

Para modelos de Regresión por Mínimos Cuadrados Ordinarios (OLS):

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:

  • El AIC no es una prueba de hipótesis en el sentido tradicional; no te dice si un modelo es “bueno” o “malo” en un sentido absoluto.
  • Es una herramienta para la selección de modelos entre un conjunto de modelos candidatos. Siempre se compara el AIC de diferentes modelos ajustados a los mismos datos. El modelo con el AIC más bajo es el preferido.
  • Cuando la muestra es pequeña, a veces se prefiere el AIC corregido (AICc), que añade una penalización adicional por el tamaño de la muestra:
    \[AICc = AIC + \frac{2k(k+1)}{n-k-1}\]

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!

    • Se acepta esa modificación y se repite el procedimiento, ahora con el nuevo modelo.
  • 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.

# Ver resumen del modelo seleccionado
summary(modelo_step)
## 
## 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
  • Error estándar residual: En promedio, el error de predicción es de ±2.2 mpg.
  • R² = 0.8738: El modelo explica el 87.4% de la variabilidad en mpg.
  • R² ajustado = 0.8518: Ajusta por el número de predictores; aún muy bueno.
  • F-statistic = 39.81, p-value muy bajo (≈0): El modelo global es altamente significativo.

Forward or backward stepwise

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

Forward Selection (Selección Hacia Adelante)

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

Backward Elimination (Eliminación Hacia Atrás)

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

Consideraciones Generales sobre la Regresión Stepwise

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:

  • Sobreajuste (Overfitting): Los modelos resultantes pueden ajustarse muy bien a los datos de entrenamiento, pero no generalizar bien a nuevos datos. Esto se debe a que el proceso de selección de variables se basa en los datos observados, lo que puede llevar a incluir variables que parecen importantes por puro azar en esa muestra particular.
  • P-valores y Coeficientes Sesgados: Los p-valores y los coeficientes de regresión obtenidos de un modelo stepwise pueden ser sesgados. Los p-valores tienden a ser más pequeños de lo que realmente son, lo que lleva a una falsa confianza en la significancia de las variables.
  • No considera la teoría: El proceso es puramente estadístico y no incorpora el conocimiento del dominio o la teoría subyacente sobre las relaciones entre las variables. Un modelo estadísticamente “óptimo” podría carecer de sentido teórico o práctico.
  • Dependencia del orden: La selección de variables puede ser sensible al orden en que se añaden o eliminan, especialmente en la selección hacia adelante.
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()

Variance Inflation Factor (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:

  • Coeficientes de regresión inestables y difíciles de interpretar: Cuando las variables predictoras están altamente correlacionadas, es difícil para el modelo determinar la contribución única de cada variable a la variable dependiente. Pequeños cambios en los datos pueden llevar a grandes cambios en los coeficientes estimados, haciendo que sean poco fiables.
  • Errores estándar inflados: La multicolinealidad aumenta los errores estándar de los coeficientes de regresión, lo que a su vez disminuye los valores de las estadísticas t y aumenta los p-valores. Esto puede llevar a la conclusión errónea de que una variable no es estadísticamente significativa cuando en realidad sí lo es.
  • Poder predictivo reducido: Aunque la multicolinealidad no necesariamente afecta la capacidad predictiva global del modelo (el \(R^2\) ajustado puede seguir siendo alto), sí afecta la precisión de las estimaciones de los coeficientes individuales, lo que hace difícil comprender la relación real entre cada predictor y la variable de respuesta.

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.

¿Cómo se interpreta el VIF?

  • VIF = 1: Indica que la variable predictora no está correlacionada con ninguna de las otras variables predictoras en el modelo. No hay multicolinealidad.
  • VIF > 1: Indica que existe algún grado de multicolinealidad. Cuanto mayor sea el valor del VIF, mayor es el grado de multicolinealidad.

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

  • VIF ≤ 5: Generalmente se considera que no hay problemas graves de multicolinealidad.
  • 5 < VIF ≤ 10: Puede indicar un nivel moderado a alto de multicolinealidad que podría justificar una investigación.
  • VIF > 10: A menudo se considera una indicación clara de multicolinealidad grave y problemática. Es un umbral comúnmente aceptado para señalar que una variable está fuertemente correlacionada con otras, lo que podría afectar la estabilidad y fiabilidad del modelo.
require(car)

# Calcular VIF para el modelo original
vif(modelo_ols)
##       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).
# Calcular VIF para el modelo reducido 
vif(modelo_step)
##     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:

  • No hay colinealidad preocupante entre las variables.
  • El modelo es estable y los coeficientes son interpretables con confianza.
  • stepAIC hizo un buen trabajo al reducir la complejidad y mejorar la interpretabilidad del modelo.

Evaluación 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

# Ver fórmulas del modelo reducido
formula(modelo_step)
## mpg ~ drat + wt + gear + carb
## <environment: 0x0000020083e53900>

Nos aseguramos que las bases de (test / training) tengan esas variables

test_data_reducido <- test_data[, c("mpg", "drat", "wt", "gear", "carb")]

Modelo predictivo

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:

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

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

# 5. Se evalua el modelo en los datos de prueba
predicciones <- predict(modelo_step, newdata = test_data_reducido)
# Comparar valores reales vs. predichos
resultados <- tibble(Real = test_data_reducido$mpg,
                     Pred = predicciones
)

Evaluar el desempeño predictivo

Mean Absolute Error (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.

Fórmula del MAE

La fórmula para calcular el MAE es la siguiente:

\[MAE = \frac{1}{n} \sum_{i=1}^{n} |y_i - \hat{y}_i|\]

Donde:

  • \(n\): Es el número total de observaciones (o puntos de datos) en el conjunto de datos.
  • \(y_i\): Es el valor real u observado de la variable dependiente para la observación \(i\).
  • \(\hat{y}_i\): Es el valor predicho por el modelo para la observación \(i\).
  • \(|y_i - \hat{y}_i|\): Es el valor absoluto de la diferencia entre el valor real y el valor predicho para la observación \(i\). Tomar el valor absoluto es crucial porque evita que los errores positivos y negativos se cancelen entre sí, lo que daría una falsa impresión de precisión.
  • \(\sum_{i=1}^{n}\): Indica la suma de todos los errores absolutos para todas las \(n\) observaciones.
# Cálculo del MAE (Mean Absolute Error)
MAE <- mean(abs(predicciones - test_data_reducido$mpg))
MAE
## [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.

range(mtcars$mpg)
## [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.

Root Mean Squared Error (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.

Fórmula del RMSE

\[RMSE = \sqrt{\frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2}\]

Donde:

  • \(n\): Es el número total de observaciones (o puntos de datos).
  • \(y_i\): Es el valor real u observado de la variable dependiente para la observación \(i\).
  • \(\hat{y}_i\): Es el valor predicho por el modelo para la observación \(i\).
  • \((y_i - \hat{y}_i)^2\): Es el cuadrado de la diferencia entre el valor real y el valor predicho para la observación \(i\).

Elevar al cuadrado las diferencias tiene dos propósitos principales:

  • Eliminar los signos negativos: Asegura que los errores positivos y negativos no se cancelen entre sí.
  • Penalizar más los errores grandes: Los errores más grandes tienen un impacto desproporcionadamente mayor en el resultado final del RMSE que los errores pequeños, debido a la operación al cuadrado.
  • \(\sum_{i=1}^{n}\): Indica la suma de todos los errores al cuadrado para todas las \(n\) observaciones.
Interpretación del RMSE:
  • El RMSE se expresa en las mismas unidades que la variable dependiente original. Esto facilita su interpretación. Por ejemplo, si estás prediciendo la altura en metros y el RMSE es 0.5, significa que, en promedio, las predicciones del modelo se desvían aproximadamente 0.5 metros de la altura real.
  • Un RMSE de 0 (cero) indica un modelo perfecto, donde todas las predicciones son exactamente iguales a los valores reales.
  • Valores más bajos de RMSE indican un mejor rendimiento del modelo.
    • Sensibilidad a valores atípicos: Debido al término al cuadrado, el RMSE penaliza más fuertemente los errores grandes (valores atípicos) que el MAE. Esto significa que si tu modelo tiene algunos errores de predicción muy grandes, el RMSE será significativamente más alto que el MAE. Esta característica puede ser una ventaja o desventaja dependiendo del contexto:
    • Ventaja: Si los errores grandes son particularmente indeseables en tu aplicación, el RMSE es una buena métrica porque los destaca.
  • Desventaja: Si tu conjunto de datos contiene muchos valores atípicos reales o errores de medición que no son representativos del rendimiento general del modelo, el RMSE podría dar una visión pesimista.
# Cálculo del RMSE (Root Mean Squared Error)
RMSE <- sqrt(mean((predicciones - test_data_reducido$mpg)^2))
RMSE
## [1] 4.866215
  • Un RMSE de 4.87 significa que, en promedio, las predicciones difieren de los valores reales por ±4.87 millas por galón.
    • Como los errores grandes tienen más peso (al ser elevados al cuadrado), el RMSE será siempre igual o mayor al MAE. Penaliza más los errores grandes que el MAE.
    • Es aceptable para predicción en mtcars, pero con espacio para mejora si se requiere mayor precisión.

Compararlo con el MAE

  • Si RMSE está mucho más alto que el MAE, el modelo está cometiendo errores grandes con frecuencia (outliers, mala especificación).
  • Si RMSE ≈ MAE, los errores están bien distribuidos.

Coeficiente de determinación \(R^2\)

\(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 of Squared Errors) o \(RSS\) (Residual Sum of Squares): Es la Suma de Cuadrados de los Errores (o Suma de Cuadrados de los Residuos). Mide la variación no explicada por el modelo. Se calcula como la suma de los cuadrados de las diferencias entre los valores observados (\(y_i\)) y los valores predichos por el modelo (\(\hat{y}_i\)):

\[SSE = \sum_{i=1}^{n} (y_i - \hat{y}_i)^2\]

  • \(SST\) (Total Sum of Squares): Es la Suma Total de Cuadrados. Mide la variación total de la variable dependiente respecto a su media. Representa la variabilidad total en los datos que el modelo intenta explicar. Se calcula como la suma de los cuadrados de las diferencias entre los valores observados (\(y_i\)) y la media de la variable dependiente (\(\bar{y}\)):

\[SST = \sum_{i=1}^{n} (y_i - \bar{y})^2\]

Interpretación del \(R^2\):
  • El \(R^2\) es una métrica que varía entre 0 y 1 (o 0% y 100%).
  • \(R^2 = 0\): Indica que el modelo no explica ninguna de la variabilidad en la variable dependiente. Es tan bueno como simplemente usar la media de la variable dependiente para la predicción.
  • \(R^2 = 1\): Indica que el modelo explica el 100% de la variabilidad en la variable dependiente. Esto rara vez ocurre en la práctica con datos del mundo real, y a menudo sugiere sobreajuste si sucede en un conjunto de entrenamiento.
  • Valores más altos de \(R^2\) indican un mejor ajuste del modelo a los datos observados, lo que significa que las variables predictoras del modelo explican una mayor proporción de la variabilidad en la variable dependiente.
# 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
  • Esto significa que el 60.2% de la variabilidad de mpg (consumo de combustible) en los datos de prueba es explicada por el modelo.
    • El 39.8% restante es variabilidad no explicada (error, factores no incluidos, ruido).
    • El modelo predice más de la mitad de la variabilidad de mpg en los datos de prueba.

Distribución de los residuos

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.

Distribución normal de los residuos

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

Q-Q Plot

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

Interpretación del gráfico Q-Q Normal:
  • Si los puntos caen aproximadamente sobre la línea roja diagonal, indica que los residuos siguen una distribución normal. Esto es lo que idealmente buscas.
  • Si los puntos se desvían de la línea, puede indicar una violación del supuesto de normalidad:
    • Forma de “S”: Los residuos pueden tener colas más pesadas o más ligeras de lo esperado (ej. distribución con curtosis).
  • Curvatura en un extremo o ambos: Los residuos pueden estar sesgados (skewed) hacia la izquierda o la derecha.

Residuos Studentizados (Studentized Residuals)

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

Shapiro-Wilk normality test

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.

  • Hipótesis nula (H₀): los datos siguen una distribución normal.
  • Hipótesis alternativa (H₁): los datos no siguen una distribución normal.
shapiro.test(modelo_step$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  modelo_step$residuals
## W = 0.96777, p-value = 0.5222
  • p = 0.5222 > 0.05no se rechaza H₀
    • Conclusión: los residuos del modelo pueden considerarse normalmente distribuidos.
Evaluación de los residuos de un modelo lineal
par(mfrow = c(1,2))
plot(modelo_step)

Validación cruzada

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.

Tipos Comunes de Validación Cruzada:

Aunque hay varias variaciones, las más comunes son:

Beneficios de la Validación Cruzada:

  • Estimación Robusta del Rendimiento: Proporciona una métrica de rendimiento más fiable y menos sesgada de cómo se comportará el modelo con datos nuevos.
  • Detección de Sobreajuste: Ayuda a identificar si un modelo está sobreajustado, ya que un modelo sobreajustado tendrá un rendimiento mucho peor en los folds de validación que en los de entrenamiento.
  • Selección de Modelos y Ajuste de Hiperparámetros: Es fundamental para comparar y seleccionar entre diferentes modelos (ej., regresión lineal vs. árboles de decisión) o para encontrar los mejores hiperparámetros para un modelo (ej., la profundidad máxima de un árbol de decisión). Esto se logra a menudo mediante técnicas como la búsqueda de rejilla (Grid Search) o la búsqueda aleatoria (Random Search) combinadas con validación cruzada.
Validaciones cruzadas recomendadas para OLSR

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.

Validación Cruzada K-Fold (K-Fold Cross-Validation):
  • Es el tipo más popular. El conjunto de datos se divide en \(k\) folds. .
  • Elección de \(k\): Los valores comunes para \(k\) son 5 o 10. Un \(k\) más alto (por ejemplo, 10) proporciona una estimación más precisa del rendimiento pero es computacionalmente más costoso. Un \(k\) más bajo (por ejemplo, 5) es más rápido pero la estimación puede ser más variable.

Machine Learning Steps

```r
trainControl(method = "cv", number = 10)
```
  • Más usada y recomendada para regresión lineal.
  • Divide los datos en k grupos (folds), entrena el modelo en k-1 y valida en el restante, repitiendo k veces.
  • k = 10 es un valor estándar que ofrece buen balance entre sesgo y varianza.
  • Muy útil para evaluar errores como RMSE o MAE.
Validación Cruzada de Dejar Uno Fuera (Leave-One-Out Cross-Validation - LOOCV):
  • Es un caso especial de K-Fold donde \(k\) es igual al número de observaciones (\(n\)) en el conjunto de datos.
  • En cada iteración, una sola observación se usa como conjunto de validación, y las \(n-1\) observaciones restantes se usan para entrenar el modelo.
  • Ventaja: Proporciona una estimación casi insesgada del rendimiento.
  • Desventaja: Es computacionalmente muy costoso, especialmente para grandes conjuntos de datos, ya que se ajusta el modelo \(n\) veces.

Machine Learning Steps

```r
trainControl(method = "LOOCV")
```
  • Cada observación se deja fuera una vez (es como k = n).
  • Proporciona una evaluación menos sesgada, pero puede ser computacionalmente costosa.
  • En modelos lineales como OLS, es factible y a veces preferido si tienes pocos datos.
Validación Cruzada de Repeated k-fold cross-validation

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.

Machine Learning Steps

```r
trainControl(method = "repeatedcv", number = 10, repeats = 5)
```
  • Repite el proceso de k-fold varias veces con diferentes particiones aleatorias.
  • Ofrece una estimación más estable del error de generalización.
  • Útil si los datos tienen mucha variabilidad o ruido.
# 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-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.

Nuevos datos

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.

# 8. Interpretación del modelo (con broom)
tidy(modelo_step)
## # 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

📌 Notas

  • Este modelo es considerado supervisado porque se entrena con pares de entrada y salida.
  • Aunque la regresión lineal es simple, sigue siendo un algoritmo de machine learning supervisado y útil como línea base (baseline).
  • Puedes reemplazar lm() por modelos más complejos como randomForest, xgboost, etc., manteniendo la misma estructura.

Ventajas y Limitaciones

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:

  • Sensibilidad a valores atípicos: Los valores extremos pueden influir mucho en la línea de regresión.
  • Sensibilidad a violaciones de supuestos: Si los supuestos no se cumplen, las estimaciones pueden ser sesgadas o ineficientes, y la inferencia estadística puede ser inválida.
  • Solo relaciones lineales: No puede capturar relaciones no lineales a menos que se transformen las variables adecuadamente.

Referencias

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)

Creative Commons Licence
This work by Diana Villasana Ocampo is licensed under a Creative Commons Attribution 4.0 International License.