En esta tarea analizaremos una base de datos del Censo de Puerto Rico que contiene información de los 78 municipios, con el fin de estudiar los factores socioeconómicos que explican las diferencias en el ingreso per cápita (ing_pc). Las variables disponibles incluyen el porcentaje de personas con bachillerato o más (bach_pct), la tasa de desempleo (desem_pct), el porcentaje de hogares con internet de banda ancha (banda_pct), el porcentaje de población bajo pobreza (pobreza_pct) y el tamaño promedio del hogar (tam_hogar). El objetivo es aplicar Regresión Lineal Múltiple (RLM) para identificar los predictores más relevantes y evaluar su relación con el ingreso per cápita. Para lograrlo, utilizaremos dos métodos de selección de variables: análisis por subconjuntos (comparando BIC y R² ajustado) y procedimientos paso a paso (stepwise: forward, backward y both) utilizando BIC como criterio de comparación. Estos métodos nos permitirán determinar el modelo más parsimonioso y explicar, de manera estadísticamente fundamentada, qué factores tienen mayor influencia en el ingreso per cápita de los municipios de Puerto Rico.
Paso 1: Exploracion de datos
datos <- read.csv("data.csv")
Paso 2 Exploracion de Correlaciones
library(corrplot)
## corrplot 0.95 loaded
datos_num <- datos[sapply(datos, is.numeric)]
R <- cor(datos_num, use = "pairwise.complete.obs")
datos<- datos_num
corrplot(R,
method = "color", # colores en lugar de números
type = "lower", # solo triángulo inferior
addCoef.col = "black", # añadir valores en negro
tl.col = "black", # etiquetas de variables en negro
tl.srt = 45, # rotar etiquetas
diag = FALSE) # no mostrar diagonal
La matriz de correlaciones revela que el ingreso per cápita se asocia fuertemente de forma positiva con el porcentaje de personas con bachillerato (0.89) y con el acceso a internet de banda ancha (0.78), mientras que muestra una relación negativa muy marcada con la pobreza (-0.85). Esto significa que los municipios con mayor educación y conectividad tienden a tener mayores ingresos, y aquellos con mayor pobreza tienden a tener menores ingresos. Además, se observa una relación negativa entre educación y pobreza (-0.83) y entre banda ancha y pobreza (-0.67), lo que sugiere que estas variables están interrelacionadas y podrían generar multicolinealidad en los modelos de regresión.
Creamos el modelo saturado para buscar la mejor combinacion de variables.
saturado <- ing_pc ~ bach_pct + desem_pct + banda_pct + pobreza_pct + tam_hogar
reg <- lm(saturado, data=datos) # todos los predictores
summary(reg)
##
## Call:
## lm(formula = saturado, data = datos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -4585.2 -1168.6 -125.4 1208.2 5224.9
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3757.23 3338.95 1.125 0.264211
## bach_pct 264.14 68.73 3.843 0.000259 ***
## desem_pct 20.05 74.85 0.268 0.789533
## banda_pct 125.32 45.30 2.766 0.007198 **
## pobreza_pct -210.64 47.68 -4.417 3.45e-05 ***
## tam_hogar 816.67 622.90 1.311 0.193997
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1982 on 72 degrees of freedom
## Multiple R-squared: 0.8457, Adjusted R-squared: 0.835
## F-statistic: 78.93 on 5 and 72 DF, p-value: < 2.2e-16
El intercepto de 3757.23 representa el ingreso per cápita estimado cuando todas las variables predictoras valen cero, aunque ese escenario no es realista. Por cada 1 punto porcentual adicional de población con bachillerato o más, el ingreso per cápita aumenta en promedio 264 dólares; por cada 1 punto adicional en desempleo aumenta 20 dólares, pero este efecto no es significativo porque su valor p (0.79) es mucho mayor que 0.05, lo que indica que no hay evidencia estadística de una relación real; por cada 1 punto adicional en hogares con banda ancha el ingreso sube 125 dólares; por cada 1 punto adicional de pobreza el ingreso disminuye 211 dólares; y por cada persona adicional en el tamaño promedio del hogar el ingreso aumenta 817 dólares, pero este efecto tampoco es significativo porque su valor p (0.19) también es mayor que 0.05. El R² ajustado de 0.835 significa que el modelo explica alrededor del 83.5 % de la variabilidad del ingreso per cápita entre los municipios de Puerto Rico, considerando el número de predictores incluidos y penalizando aquellas variables que no aportan explicación real.
library(leaps)
ajuste <- regsubsets(
saturado, data = datos,
nvmax = 5, # total de predictores disponibles
method = "exhaustive") # todas las combinaciones
s <- summary(ajuste)
names(s)
## [1] "which" "rsq" "rss" "adjr2" "cp" "bic" "outmat" "obj"
# Número óptimo de predictores según cada criterio
best_bic <- which.min(s$bic)
best_r2 <- which.max(s$adjr2)
# Visualización comparativa
par(mfrow = c(1,2))
plot(s$bic, type="b", col="red", pch=19,
xlab="Número de predictores", ylab="BIC",
main="Criterio BIC")
points(best_bic, s$bic[best_bic], pch=19, cex=1.5, col="blue")
plot(s$adjr2, type="b", col="darkgreen", pch=19,
xlab="Número de predictores", ylab="R^2-ajustado",
main="Criterio R^2-ajustado")
points(best_r2, s$adjr2[best_r2], pch=19, cex=1.5, col="blue")
La gráfica muestra que el modelo con tres predictores es el que presenta el BIC más bajo, por lo que es el preferido según este criterio de parsimonia, mientras que el R² ajustado alcanza su valor máximo con cuatro predictores, indicando que incluir una cuarta variable mejora ligeramente la capacidad explicativa sin penalizar demasiado. En conjunto, el BIC sugiere un modelo más compacto de tres variables, mientras que el R² ajustado permite considerar hasta cuatro si se prioriza el poder explicativo.
En el paso 5 corresponde ajustar el modelo final. Aunque normalmente se elige solo una de las dos opciones, como grupo decidimos aplicar ambos métodos para practicar y comparar sus resultados, de modo que podamos evaluar las diferencias entre el modelo seleccionado por BIC y el modelo que maximiza el R² ajustado.
Opcion 1: Criterio BIC
# extraemos las variables del mejor modelo
coef_best <- coef(ajuste, best_bic)
vars_best <- names(coef_best)[-1] # sin intercepto
# modelo final ajustado
f_final <- as.formula(paste("ing_pc ~", paste(vars_best, collapse = " + ")))
modelo_final <- lm(f_final, data = datos)
summary(modelo_final)
##
## Call:
## lm(formula = f_final, data = datos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -4644.3 -995.6 -35.5 1360.0 5031.6
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 6481.30 2522.94 2.569 0.012215 *
## bach_pct 270.45 67.62 3.999 0.000149 ***
## banda_pct 119.54 44.32 2.697 0.008657 **
## pobreza_pct -209.43 47.36 -4.422 3.3e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1979 on 74 degrees of freedom
## Multiple R-squared: 0.842, Adjusted R-squared: 0.8356
## F-statistic: 131.5 on 3 and 74 DF, p-value: < 2.2e-16
El modelo final seleccionado por el criterio BIC incluye tres predictores: porcentaje con bachillerato, porcentaje de hogares con internet de banda ancha y porcentaje de población bajo pobreza. El intercepto de 6481.30 representa el ingreso per cápita estimado cuando estas tres variables valen cero, aunque ese escenario no sea realista. Por cada 1 punto porcentual adicional de población con bachillerato, el ingreso per cápita aumenta en promedio 270 dólares; por cada 1 punto adicional en hogares con banda ancha aumenta 120 dólares; y por cada 1 punto adicional de pobreza disminuye 209 dólares. Todos estos coeficientes son altamente significativos (p < 0.01), lo que indica que cada variable tiene un efecto estadísticamente confiable en el ingreso per cápita. El R² ajustado de 0.836 muestra que este modelo explica alrededor del 83.6 % de la variabilidad del ingreso per cápita entre los municipios de Puerto Rico, ofreciendo un ajuste sólido con un número reducido de predictores.
Opción 2: Criterio R2 Ajustado
# extraemos las variables del mejor modelo
coef_best <- coef(ajuste, best_r2)
vars_best <- names(coef_best)[-1] # sin intercepto
# modelo final ajustado
f_final <- as.formula(paste("ing_pc ~", paste(vars_best, collapse = " + ")))
modelo_final <- lm(f_final, data = datos)
summary(modelo_final)
##
## Call:
## lm(formula = f_final, data = datos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -4630.0 -1129.5 -83.4 1182.5 5207.2
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 4047.29 3138.40 1.290 0.201259
## bach_pct 267.16 67.36 3.966 0.000169 ***
## banda_pct 123.03 44.21 2.783 0.006848 **
## pobreza_pct -209.38 47.15 -4.441 3.12e-05 ***
## tam_hogar 790.86 611.48 1.293 0.199967
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1970 on 73 degrees of freedom
## Multiple R-squared: 0.8456, Adjusted R-squared: 0.8371
## F-statistic: 99.92 on 4 and 73 DF, p-value: < 2.2e-16
El modelo final según el criterio R² ajustado incluye cuatro predictores: porcentaje con bachillerato, porcentaje de hogares con internet de banda ancha, porcentaje de población bajo pobreza y tamaño promedio del hogar. El intercepto de 4047.29 representa el ingreso per cápita estimado cuando las cuatro variables valen cero, aunque ese escenario no sea realista. Por cada 1 punto porcentual adicional de población con bachillerato el ingreso per cápita aumenta 267 dólares; por cada 1 punto adicional en hogares con banda ancha aumenta 123 dólares; por cada 1 punto adicional de pobreza disminuye 209 dólares; y por cada persona adicional en el tamaño promedio del hogar el ingreso aumenta 791 dólares, aunque este último efecto no es significativo (p ≈ 0.20). El R² ajustado de 0.837 indica que el modelo explica alrededor del 83.7 % de la variabilidad del ingreso per cápita entre los municipios de Puerto Rico, un ajuste prácticamente igual al obtenido con el modelo más parsimonioso basado en BIC.
Al aplicar el método de subconjuntos a la base de datos del Censo de Puerto Rico pudimos evaluar todas las combinaciones posibles de los cinco predictores para explicar el ingreso per cápita. Este procedimiento permitió identificar qué variables aportan mayor poder explicativo y comparar criterios de selección como BIC y R² ajustado. Los resultados mostraron que las variables con mayor influencia son el porcentaje de población con bachillerato, el porcentaje de hogares con internet de banda ancha y el porcentaje de población bajo pobreza, mientras que la tasa de desempleo y el tamaño promedio del hogar apenas contribuyen a mejorar el modelo. En conjunto, el análisis de subconjuntos evidenció que un modelo reducido con las variables clave mantiene un alto nivel de explicación del ingreso per cápita, confirmando que no es necesario incluir todos los predictores para obtener un ajuste sólido.
Paso 1: Exploramos los datos
datos_log <- data.frame(
datos$ing_pc, datos$bach_pct, datos$desem_pct,
datos$banda_pct, datos$pobreza_pct, datos$tam_hogar
)
names(datos_log) <- c("ing_pc","bach_pct","desem_pct","banda_pct","pobreza_pct","tam_hogar")
# Asegurar que sean numéricas
datos_log[] <- lapply(datos_log, function(x) as.numeric(x))
Paso 2: Exploracion de Correlaciones
Rlog <- cor(datos_log, use = "pairwise.complete.obs")
corrplot(Rlog,
method = "color",
type = "lower",
addCoef.col = "black",
tl.col = "black",
tl.srt = 45,
diag = FALSE)
La matriz de correlaciones muestra que el ingreso per cápita tiene una correlación positiva muy fuerte con el porcentaje de personas con bachillerato (0.89) y con el porcentaje de hogares con banda ancha (0.78), mientras que presenta una correlación negativa muy marcada con el porcentaje de población bajo pobreza (-0.85). Esto significa que los municipios con mayor nivel educativo y mayor acceso a internet tienden a tener mayores ingresos, y los que tienen más pobreza presentan ingresos más bajos. Además, bachillerato y pobreza están fuertemente correlacionados de manera negativa (-0.83) y banda ancha también se asocia negativamente con pobreza (-0.67), lo que sugiere posibles problemas de multicolinealidad cuando se usen estas variables juntas en los modelos de selección paso a paso.
Paso 3: Seleccion de variables paso a paso
## Ajusta modelos paso a paso (forward, backward, both) usando AIC
form_log <- ing_pc ~ bach_pct + desem_pct + banda_pct + pobreza_pct + tam_hogar
# Modelos de nulo y saturado
m0_log <- lm(ing_pc ~ 1, data = datos_log) # sin predictores
mF_log <- lm(form_log, data = datos_log) # todos los predictores
# Hacia adelante (forward)
m1_step_log <- step(
m0_log,
scope = list(lower = formula(m0_log), upper = formula(mF_log)),
direction = "forward",
trace = TRUE # AIC por defecto (k = 2)
)
## Start: AIC=1325.89
## ing_pc ~ 1
##
## Df Sum of Sq RSS AIC
## + bach_pct 1 1438089133 395800604 1208.3
## + pobreza_pct 1 1331610382 502279355 1226.9
## + banda_pct 1 1121735582 712154155 1254.1
## <none> 1833889736 1325.9
## + desem_pct 1 8354792 1825534944 1327.5
## + tam_hogar 1 5821235 1828068502 1327.7
##
## Step: AIC=1208.3
## ing_pc ~ bach_pct
##
## Df Sum of Sq RSS AIC
## + pobreza_pct 1 77610119 318190485 1193.3
## + banda_pct 1 29535087 366265517 1204.2
## <none> 395800604 1208.3
## + tam_hogar 1 4923053 390877551 1209.3
## + desem_pct 1 2817657 392982947 1209.7
##
## Step: AIC=1193.27
## ing_pc ~ bach_pct + pobreza_pct
##
## Df Sum of Sq RSS AIC
## + banda_pct 1 28478762 289711723 1188.0
## <none> 318190485 1193.3
## + tam_hogar 1 4915101 313275383 1194.1
## + desem_pct 1 672748 317517737 1195.1
##
## Step: AIC=1187.96
## ing_pc ~ bach_pct + pobreza_pct + banda_pct
##
## Df Sum of Sq RSS AIC
## <none> 289711723 1188.0
## + tam_hogar 1 6489907 283221816 1188.2
## + desem_pct 1 17073 289694650 1190.0
El procedimiento forward comenzó con el modelo sin predictores y fue incorporando las variables que más reducían el AIC. Primero entró el porcentaje con bachillerato, seguido por el porcentaje de población bajo pobreza y finalmente el porcentaje de hogares con banda ancha. A partir de ese punto, agregar desempleo o tamaño del hogar no mejoró el AIC, por lo que el modelo final quedó formado por esas tres variables, las cuales explican la mayor parte de la variabilidad en el ingreso per cápita.
# Hacia atrás (backward)
m2_step_log <- step(
mF_log,
scope = list(lower = formula(m0_log), upper = formula(mF_log)),
direction = "backward",
trace = TRUE
)
## Start: AIC=1190.11
## ing_pc ~ bach_pct + desem_pct + banda_pct + pobreza_pct + tam_hogar
##
## Df Sum of Sq RSS AIC
## - desem_pct 1 282063 283221816 1188.2
## - tam_hogar 1 6754897 289694650 1190.0
## <none> 282939753 1190.1
## - banda_pct 1 30072895 313012647 1196.0
## - bach_pct 1 58048450 340988202 1202.7
## - pobreza_pct 1 76685336 359625088 1206.8
##
## Step: AIC=1188.19
## ing_pc ~ bach_pct + banda_pct + pobreza_pct + tam_hogar
##
## Df Sum of Sq RSS AIC
## - tam_hogar 1 6489907 289711723 1188.0
## <none> 283221816 1188.2
## - banda_pct 1 30053567 313275383 1194.1
## - bach_pct 1 61021640 344243456 1201.4
## - pobreza_pct 1 76514196 359736013 1204.8
##
## Step: AIC=1187.96
## ing_pc ~ bach_pct + banda_pct + pobreza_pct
##
## Df Sum of Sq RSS AIC
## <none> 289711723 1188.0
## - banda_pct 1 28478762 318190485 1193.3
## - bach_pct 1 62624091 352335814 1201.2
## - pobreza_pct 1 76553794 366265517 1204.2
El procedimiento backward comenzó con el modelo saturado que incluía las cinco variables y fue eliminando aquellas que no aportaban mejora según el AIC. Primero salió la tasa de desempleo, luego el tamaño promedio del hogar, y el algoritmo se detuvo cuando quedó el modelo con porcentaje de bachillerato, banda ancha y pobreza, ya que eliminar alguna de esas variables aumentaba el AIC. En resumen, backward llegó al mismo modelo final que forward, confirmando que bachillerato, banda ancha y pobreza son las variables que mejor explican el ingreso per cápita y que las otras dos no aportan valor significativo.
# Híbrido (both)
m3_step_log <- step(
mF_log,
scope = list(lower = formula(m0_log), upper = formula(mF_log)),
direction = "both",
trace = TRUE
)
## Start: AIC=1190.11
## ing_pc ~ bach_pct + desem_pct + banda_pct + pobreza_pct + tam_hogar
##
## Df Sum of Sq RSS AIC
## - desem_pct 1 282063 283221816 1188.2
## - tam_hogar 1 6754897 289694650 1190.0
## <none> 282939753 1190.1
## - banda_pct 1 30072895 313012647 1196.0
## - bach_pct 1 58048450 340988202 1202.7
## - pobreza_pct 1 76685336 359625088 1206.8
##
## Step: AIC=1188.19
## ing_pc ~ bach_pct + banda_pct + pobreza_pct + tam_hogar
##
## Df Sum of Sq RSS AIC
## - tam_hogar 1 6489907 289711723 1188.0
## <none> 283221816 1188.2
## + desem_pct 1 282063 282939753 1190.1
## - banda_pct 1 30053567 313275383 1194.1
## - bach_pct 1 61021640 344243456 1201.4
## - pobreza_pct 1 76514196 359736013 1204.8
##
## Step: AIC=1187.96
## ing_pc ~ bach_pct + banda_pct + pobreza_pct
##
## Df Sum of Sq RSS AIC
## <none> 289711723 1188.0
## + tam_hogar 1 6489907 283221816 1188.2
## + desem_pct 1 17073 289694650 1190.0
## - banda_pct 1 28478762 318190485 1193.3
## - bach_pct 1 62624091 352335814 1201.2
## - pobreza_pct 1 76553794 366265517 1204.2
El procedimiento híbrido (both) comenzó con el modelo completo e hizo pasos hacia atrás y hacia adelante según el AIC. Primero eliminó la tasa de desempleo, luego el tamaño promedio del hogar, y terminó en el mismo punto que los otros métodos: un modelo con porcentaje de bachillerato, porcentaje de hogares con banda ancha y porcentaje de población bajo pobreza. Intentar añadir de nuevo desempleo o tamaño del hogar no redujo el AIC, y quitar alguna de las tres variables principales lo aumentaba. En conclusión, el método both coincide con forward y backward, confirmando que el modelo más eficiente es el que combina educación, internet y pobreza como predictores del ingreso per cápita.
Paso 4: Ajustamos el mejor modelo
# Resúmenes
summary(m1_step_log)
##
## Call:
## lm(formula = ing_pc ~ bach_pct + pobreza_pct + banda_pct, data = datos_log)
##
## Residuals:
## Min 1Q Median 3Q Max
## -4644.3 -995.6 -35.5 1360.0 5031.6
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 6481.30 2522.94 2.569 0.012215 *
## bach_pct 270.45 67.62 3.999 0.000149 ***
## pobreza_pct -209.43 47.36 -4.422 3.3e-05 ***
## banda_pct 119.54 44.32 2.697 0.008657 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1979 on 74 degrees of freedom
## Multiple R-squared: 0.842, Adjusted R-squared: 0.8356
## F-statistic: 131.5 on 3 and 74 DF, p-value: < 2.2e-16
summary(m2_step_log)
##
## Call:
## lm(formula = ing_pc ~ bach_pct + banda_pct + pobreza_pct, data = datos_log)
##
## Residuals:
## Min 1Q Median 3Q Max
## -4644.3 -995.6 -35.5 1360.0 5031.6
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 6481.30 2522.94 2.569 0.012215 *
## bach_pct 270.45 67.62 3.999 0.000149 ***
## banda_pct 119.54 44.32 2.697 0.008657 **
## pobreza_pct -209.43 47.36 -4.422 3.3e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1979 on 74 degrees of freedom
## Multiple R-squared: 0.842, Adjusted R-squared: 0.8356
## F-statistic: 131.5 on 3 and 74 DF, p-value: < 2.2e-16
summary(m3_step_log)
##
## Call:
## lm(formula = ing_pc ~ bach_pct + banda_pct + pobreza_pct, data = datos_log)
##
## Residuals:
## Min 1Q Median 3Q Max
## -4644.3 -995.6 -35.5 1360.0 5031.6
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 6481.30 2522.94 2.569 0.012215 *
## bach_pct 270.45 67.62 3.999 0.000149 ***
## banda_pct 119.54 44.32 2.697 0.008657 **
## pobreza_pct -209.43 47.36 -4.422 3.3e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1979 on 74 degrees of freedom
## Multiple R-squared: 0.842, Adjusted R-squared: 0.8356
## F-statistic: 131.5 on 3 and 74 DF, p-value: < 2.2e-16
Los tres resúmenes corresponden al mismo modelo final porque los métodos forward, backward y both llegaron exactamente a la misma combinación de predictores. El intercepto de 6481.30 representa el ingreso per cápita estimado cuando las tres variables valen cero, aunque ese escenario no sea realista. Por cada 1 punto porcentual adicional de población con bachillerato el ingreso per cápita aumenta en promedio 270 dólares; por cada 1 punto adicional de pobreza disminuye 209 dólares; y por cada 1 punto adicional de hogares con banda ancha aumenta 120 dólares. Todos estos efectos son estadísticamente significativos (p < 0.01). El R² ajustado de 0.836 indica que el modelo explica alrededor del 83.6 % de la variabilidad en el ingreso per cápita de los municipios de Puerto Rico, mostrando un ajuste sólido con un conjunto reducido de predictores.
Después de aplicar el método de selección de variables con los procedimientos forward, backward y both, observamos que en cada paso el algoritmo fue descartando las variables con menor aporte explicativo hasta coincidir en el mismo modelo final. En todos los procesos primero se destacó el porcentaje de población con bachillerato, luego la pobreza y finalmente el acceso a internet de banda ancha, mientras que la tasa de desempleo y el tamaño del hogar fueron eliminados por no mejorar el ajuste. En conclusión, este método confirmó que la educación, la pobreza y la conectividad son los factores clave que explican las diferencias en ingreso per cápita entre los municipios de Puerto Rico, logrando un modelo más simple y eficiente que mantiene un alto nivel de explicación de la variabilidad observada.