Taller 3 - k-NN

1 Introducción

En el Taller 2 se construyó un modelo de regresión lineal múltiple con el objetivo de explicar la esperanza de vida al nacer (exp_vida_nacer) en función de variables relacionadas con la salud materno-infantil y el gasto en salud, utilizando información del Banco Mundial a nivel de país.

En el presente taller se retoma el mismo contexto, la misma base de datos y la misma variable dependiente; sin embargo, el enfoque cambia de uno explicativo a uno predictivo. En particular, se busca comparar el desempeño del modelo de regresión lineal frente a un modelo no paramétrico de regresión basado en k vecinos más cercanos (k-NN).

La comparación entre modelos se realiza en términos de su capacidad de generalización, evaluando el desempeño fuera de muestra mediante un esquema de partición entrenamiento/prueba y el uso de métricas como RMSE y MAE.

Este análisis permite responder a la Pregunta orientadora: ¿El modelo que mejor explicaba el fenómeno en el Taller 2 también es el que mejor predice en nuevos datos?

2 Librerías y datos

Para el desarrollo del análisis se utilizaron las siguientes librerías en R, las cuales permiten la manipulación de datos, partición de muestras y ajuste de modelos predictivos:

library(readxl)
library(tidyverse)
library(rsample)
library(yardstick)
library(caret)
library(ggplot2)

La variable dependiente del estudio es exp_vida_nacer, la cual representa la esperanza de vida al nacer.

Como variables predictoras se emplean las mismas definidas en el Taller 2, con el fin de garantizar la comparabilidad entre modelos. Estas son:

  • parto_Profesional_salud
  • anemia_madre
  • mort_materna
  • gasto_salud

Esta consistencia en la selección de variables permite evaluar de manera adecuada las diferencias en el desempeño predictivo entre la regresión lineal y el modelo k-NN, sin introducir sesgos derivados de cambios en la especificación del modelo.

3 Descripción de la Partición train / test

Se fijó una semilla para garantizar la reproducibilidad de los resultados y se realizó una partición de los datos en proporción 80/20.

set.seed(123)
split_test <- initial_split(base_modelo2, prop = 0.80)
train <- training(split_test)
test  <- testing(split_test)

tibble(
  conjunto   = c("train", "test"),
  n          = c(nrow(train), nrow(test)),
  porcentaje = round(c(nrow(train), nrow(test)) / nrow(base_modelo2) * 100, 1)
)
## # A tibble: 2 × 3
##   conjunto     n porcentaje
##   <chr>    <int>      <dbl>
## 1 train       42       79.2
## 2 test        11       20.8

El conjunto de entrenamiento quedó conformado por 42 observaciones (79,2%), mientras que el conjunto de prueba incluyó 11 observaciones (20,8%), manteniendo la proporción establecida en la partición 80/20.

4 Ajuste del Modelo de regresión lineal

Se mantienen las mismas variables explicativas seleccionadas en el Taller 2 (parto_Profesional_salud, anemia_madre, mort_materna y gasto_salud), dado que previamente se verificó su significancia estadística y su relevancia teórica en la explicación de la esperanza de vida al nacer.

Esta decisión permite realizar una comparación directa entre el modelo de regresión lineal y el modelo k-NN, evitando introducir cambios en la especificación que puedan sesgar la evaluación del desempeño predictivo.

modelo_lm <- lm(
  exp_vida_nacer ~ parto_Profesional_salud + anemia_madre + mort_materna + gasto_salud,
  data = train
)
summary(modelo_lm)
## 
## Call:
## lm(formula = exp_vida_nacer ~ parto_Profesional_salud + anemia_madre + 
##     mort_materna + gasto_salud, data = train)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -5.8085 -1.1956  0.1072  1.5077  4.1145 
## 
## Coefficients:
##                           Estimate Std. Error t value Pr(>|t|)    
## (Intercept)             69.8331338  5.7716170  12.099    2e-14 ***
## parto_Profesional_salud  0.1397219  0.0572279   2.441 0.019529 *  
## anemia_madre            -0.2888084  0.0718641  -4.019 0.000276 ***
## mort_materna            -1.8691006  1.3346269  -1.400 0.169704    
## gasto_salud              0.0006173  0.0002405   2.567 0.014451 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.231 on 37 degrees of freedom
## Multiple R-squared:  0.8773, Adjusted R-squared:  0.864 
## F-statistic: 66.14 on 4 and 37 DF,  p-value: 2.397e-16

El modelo ajustado presenta un buen nivel de ajuste, con un R² = 0.8773 y un R² ajustado = 0.864, lo que indica que una proporción importante de la variabilidad en la esperanza de vida es explicada por las variables incluidas.

En términos de significancia estadística, los resultados del modelo:

  • parto_Profesional_salud y gasto_salud presentan efectos positivos y significativos (p < 0.05).
  • anemia_madre muestra un efecto negativo y altamente significativo (p < 0.01).
  • mort_materna tiene el signo esperado (negativo), pero no resulta estadísticamente significativa al 5%.

Estos resultados permiten concluir:

  • Un mayor porcentaje de partos atendidos por profesionales de la salud se asocia con un incremento en la esperanza de vida.
  • Mayores niveles de anemia materna se relacionan con una disminución significativa en la esperanza de vida.
  • La mortalidad materna presenta una relación negativa, consistente con la teoría, aunque con menor evidencia estadística en este modelo.
  • El gasto en salud muestra una relación positiva, lo que sugiere que mayores inversiones en salud contribuyen a mejorar las condiciones de vida.
  • Son consistentes con el análisis previo y refuerzan la interpretación del modelo como herramienta explicativa.

5 Ajuste Modelo k-NN

Dado que k-NN se basa en distancias euclidianas, es necesario estandarizar las variables numéricas (centrado y escalado). En este caso todos los predictores son cuantitativos, por lo que no se requiere codificación dummy. El preprocesamiento se hace dentro de caret para que los parámetros de escalado se estimen solo con los datos de entrenamiento y se apliquen al test (evitando fuga de información).

5.1 Selección de k por validación cruzada

Para la selección del hiperparámetro k, se implementa un esquema de validación cruzada de 5 folds sobre el conjunto de entrenamiento. Este procedimiento permite estimar de manera robusta el error de predicción y reducir la dependencia de una única partición de los datos.

Se evalúan valores de k en el rango 1,2,…,25, seleccionando aquel que minimiza el error cuadrático medio (RMSE) promedio en validación cruzada.

set.seed(123)
control_cv <- trainControl(method = "cv", number = 5)

set.seed(123)
modelo_knn <- train(
  exp_vida_nacer ~ parto_Profesional_salud + anemia_madre + mort_materna + gasto_salud,
  data       = train,
  method     = "knn",
  trControl  = control_cv,
  tuneGrid   = data.frame(k = 1:25),
  preProcess = c("center", "scale"),
  metric     = "RMSE"
)

modelo_knn
## k-Nearest Neighbors 
## 
## 42 samples
##  4 predictor
## 
## Pre-processing: centered (4), scaled (4) 
## Resampling: Cross-Validated (5 fold) 
## Summary of sample sizes: 33, 34, 33, 34, 34 
## Resampling results across tuning parameters:
## 
##   k   RMSE      Rsquared   MAE     
##    1  2.474845  0.7876812  1.945990
##    2  2.191073  0.8296757  1.678448
##    3  2.108448  0.8548408  1.627141
##    4  2.355878  0.8514014  1.875605
##    5  2.633424  0.8400084  2.095982
##    6  2.857947  0.8235043  2.206803
##    7  3.040969  0.8243582  2.298689
##    8  3.175154  0.8221814  2.379760
##    9  3.307823  0.8073322  2.464234
##   10  3.453376  0.8029037  2.519086
##   11  3.566605  0.7907404  2.608369
##   12  3.639571  0.7922942  2.666296
##   13  3.767255  0.7815581  2.785481
##   14  3.831306  0.7930800  2.876187
##   15  3.859493  0.8054427  2.911582
##   16  3.981314  0.8030547  3.003973
##   17  4.052387  0.8149915  3.075048
##   18  4.159279  0.8145268  3.147689
##   19  4.291906  0.7813119  3.240265
##   20  4.434278  0.7707633  3.356948
##   21  4.502335  0.7881743  3.421586
##   22  4.543811  0.8084697  3.485732
##   23  4.665051  0.8108029  3.594207
##   24  4.715230  0.8215879  3.664928
##   25  4.819851  0.8130758  3.761314
## 
## RMSE was used to select the optimal model using the smallest value.
## The final value used for the model was k = 3.

Con el fin de visualizar el comportamiento del error en función de k, se presenta la siguiente gráfica:

plot(modelo_knn)

El valor óptimo de k corresponde a aquel que minimiza el RMSE promedio en validación cruzada:

modelo_knn$bestTune
##   k
## 3 3

6 Evaluación en el conjunto de prueba

Con el fin de comparar el desempeño predictivo de los modelos, se generan predicciones sobre el conjunto de prueba (test). Esto permite obtener una estimación no sesgada del error de generalización.

Se emplean como métricas el RMSE y el MAE, que cuantifican la magnitud del error de predicción en las mismas unidades de la variable respuesta.

pred_lm  <- predict(modelo_lm,  newdata = test)
pred_knn <- predict(modelo_knn, newdata = test)

comparacion <- tibble(
  Modelo = c("Regresión lineal", "k-NN"),
  RMSE   = c(rmse_vec(test$exp_vida_nacer, pred_lm),
             rmse_vec(test$exp_vida_nacer, pred_knn)),
  MAE    = c(mae_vec(test$exp_vida_nacer, pred_lm),
             mae_vec(test$exp_vida_nacer, pred_knn))
)
comparacion
## # A tibble: 2 × 3
##   Modelo            RMSE   MAE
##   <chr>            <dbl> <dbl>
## 1 Regresión lineal  3.02  2.13
## 2 k-NN              2.69  2.09

Para complementar la comparación numérica, se construye un gráfico de dispersión entre los valores observados y predichos para cada modelo:

df_plot <- tibble(
  obs    = rep(test$exp_vida_nacer, 2),
  pred   = c(pred_lm, pred_knn),
  Modelo = rep(c("Regresión lineal", "k-NN"), each = nrow(test))
)

ggplot(df_plot, aes(obs, pred, color = Modelo, fill = Modelo)) +
  geom_abline(slope = 1, intercept = 0, linetype = "dashed") +
  geom_smooth(
    data   = filter(df_plot, Modelo == "Regresión lineal"),
    method = "lm", se = TRUE, level = 0.95, alpha = 0.2
  ) +
  geom_point(size = 2, alpha = 0.9) +
  facet_wrap(~ Modelo) +
  labs(x = "Esperanza de vida observada",
       y = "Esperanza de vida predicha",
       title = "Predicho vs observado en el conjunto de prueba",
       subtitle = "Banda sombreada: IC 95% del ajuste lineal predicho vs observado") +
  theme_minimal() +
  theme(legend.position = "none")

Este tipo de visualización permite evaluar de manera intuitiva la calidad de las predicciones de cada modelo:

  • Cuanto más próximos se encuentren los puntos a la línea diagonal (y=x), mayor es la concordancia entre los valores observados y predichos, indicando un mejor ajuste.
  • La dispersión de los puntos alrededor de esta línea refleja la magnitud del error de predicción.
  • La presencia de patrones sistemáticos o desviaciones respecto a la diagonal puede evidenciar posibles sesgos o problemas de especificación del modelo.

En conjunto, la combinación del análisis numérico (RMSE y MAE) y la evaluación gráfica proporciona una visión más completa y robusta del desempeño predictivo de los modelos.

7 Discusión

A partir de las métricas fuera de muestra se discuten las preguntas guía:

  • ¿Cuál modelo predijo mejor en los datos de prueba? El modelo k-NN obtuvo mejor desempeño predictivo que la regresión lineal en ambas métricas: RMSE de 2.69 frente a 3.02 (≈11% más bajo) y MAE de 2.09 frente a 2.13. La diferencia es mayor en RMSE que en MAE, lo que sugiere que k-NN reduce especialmente los errores grandes en algunos países. Esto indica que existen relaciones no estrictamente lineales entre los predictores de salud materno-infantil y la esperanza de vida, que k-NN logra aprovechar al apoyarse en los vecinos más cercanos en el espacio estandarizado de variables.

  • ¿El modelo con mejor capacidad predictiva fue también el más fácil de interpretar? No. Aquí aparece un trade-off clásico entre capacidad predictiva e interpretabilidad: k-NN predice mejor pero no entrega coeficientes ni efectos marginales, mientras que la regresión lineal —aunque con mayor error— permite cuantificar el efecto de cada predictor sobre la esperanza de vida y realizar inferencia clásica.

  • ¿Las conclusiones obtenidas en el Taller 2 cambian al usar esta nueva aproximación? Parcialmente. Las conclusiones explicativas del Taller 2 siguen siendo válidas: el modelo lineal identifica qué variables están asociadas con la esperanza de vida y en qué magnitud. Sin embargo, si el objetivo es predecir en nuevos países, k-NN resulta más adecuado, lo que muestra que “explicar bien” y “predecir bien” no siempre coinciden.

  • ¿Qué ventajas y limitaciones encontraron en la regresión lineal y en k-NN?

    • Regresión lineal: Alta interpretabilidad, inferencia clásica (IC, pruebas t/F), estable con pocas observaciones. Limitación: asume linealidad y puede perder patrones no lineales.
    • k-NN: Flexible y no paramétrico, capta relaciones no lineales e interacciones sin especificarlas. Limitaciones: no entrega coeficientes interpretables, es sensible a la escala (por eso fue necesario estandarizar), requiere elegir k por validación cruzada, y con n = 53 su desempeño puede ser inestable frente a cambios en la partición.

8 Conclusiones

El hecho de que el valor óptimo de k sea relativamente bajo (k=3) indica que la estructura de los datos presenta patrones locales importantes, los cuales son capturados adecuadamente por el modelo k-NN. Esto sugiere la posible existencia de relaciones no lineales entre las variables explicativas y la esperanza de vida al nacer.

Esta evidencia es consistente con los resultados obtenidos en el conjunto de prueba, donde el modelo k-NN presenta un menor RMSE y MAE en comparación con la regresión lineal. En consecuencia, el mejor desempeño predictivo de k-NN puede atribuirse a su capacidad para adaptarse a estructuras complejas en los datos, a diferencia del modelo lineal que impone una relación funcional fija.

No obstante, el hecho de que el mejor k sea pequeño también implica un mayor riesgo de sobreajuste, lo cual resalta la importancia del uso de validación cruzada para garantizar que el modelo seleccionado generalice adecuadamente a nuevos datos.

En este contexto, el modelo de k-NN de regresión logró un menor RMSE en el conjunto de prueba que la regresión lineal múltiple, lo que indica que captura relaciones no lineales entre las variables de salud materno-infantil y la esperanza de vida al nacer. La respuesta a la pregunta orientadora es negativa: el modelo que mejor explicaba el fenómeno en el Taller 2 (regresión lineal) no es el que mejor predice en datos nuevos.

Finalmente, la elección del modelo depende del objetivo: si se busca interpretación y comunicación de efectos, la regresión lineal sigue siendo la herramienta adecuada; si se busca máxima capacidad predictiva, k-NN es preferible en este caso. Este taller ilustra claramente el trade-off entre interpretabilidad y capacidad predictiva.

9 Bibliografía

  • James, G., Witten, D., Hastie, T., & Tibshirani, R. (2021). An Introduction to Statistical Learning with Applications in R (2nd ed.). Springer.
  • Kuhn, M. (2008). Building Predictive Models in R Using the caret Package. Journal of Statistical Software, 28(5).
  • Banco Mundial. World Development Indicators. https://databank.worldbank.org/