library(readr)
data_rlm <- read_csv("Documents/data_rlm.csv")
## Rows: 78 Columns: 7
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (1): municipio
## dbl (6): ing_pc, bach_pct, desem_pct, banda_pct, pobreza_pct, tam_hogar
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
str(data_rlm)
## 'data.frame': 78 obs. of 6 variables:
## $ ing_pc : num 10225 12755 7709 9413 17074 ...
## $ bach_pct : num 15.6 21 21.3 20 28.4 ...
## $ desem_pct : num 9.89 9.25 17.13 9.98 13.04 ...
## $ banda_pct : num 25.7 34.5 28.4 29.7 35.8 ...
## $ pobreza_pct: num 28.9 24.1 30.3 31.5 10.1 ...
## $ tam_hogar : num 3.63 3.02 3.03 3.01 2.63 2.68 3.29 3.08 2.8 3.11 ...
Cargamos los datos utilizando la librería readr, y con la función str() podemos visualizar que la base de datos cuenta con 78 observaciones y 6 variables; ingreso per cápita, porciento de estudios de bachillerato o más, tasa de desempleo, acceso a banda ancha, porciento de pobreza y tamaño de hogar.
library(corrplot)
R <- cor(data_rlm, use = "pairwise.complete.obs")
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)
Utilizando la libreria corrplot junto con la función cor(), el modelo nos tira una correlacion de el ingreso per cápita con todas las otras variables.
Podemos ver que la correlación entre el ingreso per cápita y el porcentaje de bachillerato muestra índice de relación de 0.89,siendo la más alta. Seguido de este mismo, está el índice de 0.78, los municipios con acceso a internet de banda ancha es similar de fuerte. En comparación podemos ver el índice negativo de -0.85 siendo los municipios con mayor porcentaje de pobreza.
# Creamos el modelo saturado
saturado <- ing_pc ~ bach_pct + desem_pct + banda_pct + pobreza_pct + tam_hogar
reg <- lm(saturado, data=data_rlm) # todos los predictores
summary(reg)
##
## Call:
## lm(formula = saturado, data = data_rlm)
##
## 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
library(leaps)
saturado <- ing_pc ~ bach_pct + desem_pct + banda_pct + pobreza_pct + tam_hogar
reg_sub <- regsubsets(saturado, data=data_rlm) # todos los predictores
reg_summary <- (reg_sub)
reg <- regsubsets(saturado, data=data_rlm, nvmax=5) # todos los predictores
reg_summary <- summary(reg)
# Número óptimo de predictores según cada criterio
best_bic <- which.min(reg_summary$bic)
best_r2 <- which.max(reg_summary$adjr2)
# Visualización comparativa
par(mfrow = c(1, 2))
plot(reg_summary$bic, type="b", col="red", pch=19,
xlab="Número de predictores", ylab="BIC",
main="Criterio BIC")
points(best_bic, reg_summary$bic[best_bic], pch=19, cex=1.5, col="blue")
plot(reg_summary$adjr2, type="b", col="darkgreen", pch=19,
xlab="Número de predictores", ylab="R^2-ajustado",
main="Criterio R^2-ajustado")
points(best_r2, reg_summary$adjr2[best_r2], pch=19, cex=1.5, col="blue")
library(stats)
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 = data_rlm) # sin predictores
mF_log <- lm(form_log, data = data_rlm) # todos los predictores
# Hacia adelante
m1_step_log <- step(m0_log,
scope = list(lower = ~1, upper = formula(mF_log)),
direction = "forward",
k = log(nrow(data_rlm)),
trace = TRUE)
## Start: AIC=1328.25
## ing_pc ~ 1
##
## Df Sum of Sq RSS AIC
## + bach_pct 1 1438089133 395800604 1213.0
## + pobreza_pct 1 1331610382 502279355 1231.6
## + banda_pct 1 1121735582 712154155 1258.8
## <none> 1833889736 1328.2
## + desem_pct 1 8354792 1825534944 1332.2
## + tam_hogar 1 5821235 1828068502 1332.4
##
## Step: AIC=1213.01
## ing_pc ~ bach_pct
##
## Df Sum of Sq RSS AIC
## + pobreza_pct 1 77610119 318190485 1200.3
## + banda_pct 1 29535087 366265517 1211.3
## <none> 395800604 1213.0
## + tam_hogar 1 4923053 390877551 1216.4
## + desem_pct 1 2817657 392982947 1216.8
##
## Step: AIC=1200.34
## ing_pc ~ bach_pct + pobreza_pct
##
## Df Sum of Sq RSS AIC
## + banda_pct 1 28478762 289711723 1197.4
## <none> 318190485 1200.3
## + tam_hogar 1 4915101 313275383 1203.5
## + desem_pct 1 672748 317517737 1204.5
##
## Step: AIC=1197.39
## ing_pc ~ bach_pct + pobreza_pct + banda_pct
##
## Df Sum of Sq RSS AIC
## <none> 289711723 1197.4
## + tam_hogar 1 6489907 283221816 1200.0
## + desem_pct 1 17073 289694650 1201.7
# Hacia atras
m2_step_log <- step(mF_log,
direction = "backward",
k = log(nrow(data_rlm)),
trace = TRUE)
## Start: AIC=1204.26
## ing_pc ~ bach_pct + desem_pct + banda_pct + pobreza_pct + tam_hogar
##
## Df Sum of Sq RSS AIC
## - desem_pct 1 282063 283221816 1200.0
## - tam_hogar 1 6754897 289694650 1201.7
## <none> 282939753 1204.3
## - banda_pct 1 30072895 313012647 1207.8
## - bach_pct 1 58048450 340988202 1214.5
## - pobreza_pct 1 76685336 359625088 1218.6
##
## Step: AIC=1199.98
## ing_pc ~ bach_pct + banda_pct + pobreza_pct + tam_hogar
##
## Df Sum of Sq RSS AIC
## - tam_hogar 1 6489907 289711723 1197.4
## <none> 283221816 1200.0
## - banda_pct 1 30053567 313275383 1203.5
## - bach_pct 1 61021640 344243456 1210.8
## - pobreza_pct 1 76514196 359736013 1214.3
##
## Step: AIC=1197.39
## ing_pc ~ bach_pct + banda_pct + pobreza_pct
##
## Df Sum of Sq RSS AIC
## <none> 289711723 1197.4
## - banda_pct 1 28478762 318190485 1200.3
## - bach_pct 1 62624091 352335814 1208.3
## - pobreza_pct 1 76553794 366265517 1211.3
# híbrido
m3_step_log <- step(m0_log,
scope = list(lower = ~1, upper = formula(mF_log)),
direction = "both",
k = log(nrow(data_rlm)),
trace = TRUE)
## Start: AIC=1328.25
## ing_pc ~ 1
##
## Df Sum of Sq RSS AIC
## + bach_pct 1 1438089133 395800604 1213.0
## + pobreza_pct 1 1331610382 502279355 1231.6
## + banda_pct 1 1121735582 712154155 1258.8
## <none> 1833889736 1328.2
## + desem_pct 1 8354792 1825534944 1332.2
## + tam_hogar 1 5821235 1828068502 1332.4
##
## Step: AIC=1213.01
## ing_pc ~ bach_pct
##
## Df Sum of Sq RSS AIC
## + pobreza_pct 1 77610119 318190485 1200.3
## + banda_pct 1 29535087 366265517 1211.3
## <none> 395800604 1213.0
## + tam_hogar 1 4923053 390877551 1216.4
## + desem_pct 1 2817657 392982947 1216.8
## - bach_pct 1 1438089133 1833889736 1328.2
##
## Step: AIC=1200.34
## ing_pc ~ bach_pct + pobreza_pct
##
## Df Sum of Sq RSS AIC
## + banda_pct 1 28478762 289711723 1197.4
## <none> 318190485 1200.3
## + tam_hogar 1 4915101 313275383 1203.5
## + desem_pct 1 672748 317517737 1204.5
## - pobreza_pct 1 77610119 395800604 1213.0
## - bach_pct 1 184088870 502279355 1231.6
##
## Step: AIC=1197.39
## ing_pc ~ bach_pct + pobreza_pct + banda_pct
##
## Df Sum of Sq RSS AIC
## <none> 289711723 1197.4
## + tam_hogar 1 6489907 283221816 1200.0
## - banda_pct 1 28478762 318190485 1200.3
## + desem_pct 1 17073 289694650 1201.7
## - bach_pct 1 62624091 352335814 1208.3
## - pobreza_pct 1 76553794 366265517 1211.3
Al ejecutar modelos por subconjuntos y los modelos paso a paso, podemos ver que los modelos de paso a paso llegan al mismo resultado y modelo final. Esto demuestra que los modelos paso a paso reflejan una consistencia en los resultados, ya que su selección final de variables fueron las mismas en los tres modelos.
summary(m1_step_log)
##
## Call:
## lm(formula = ing_pc ~ bach_pct + pobreza_pct + banda_pct, data = data_rlm)
##
## 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 = data_rlm)
##
## 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 + pobreza_pct + banda_pct, data = data_rlm)
##
## 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
El modelo final muestra que por cada unidad porcentual que aumenta en el porcentaje de nivel de estudio (bach_pct) en un municipio, el ingreso per cápita (ing_pc) aumenta. Sin embargo, por cada unidad porcentual que aumenta el porciento de la pobreza (pobreza_pct) el ingreso per cápita (ing_pc) disminuye. Esto refleja que los municipios con mayor porcentaje de nivel de estudio tienen mejor ingresos, mientras los municipios con más índices de porcentaje de pobreza el ingreso disminuye.
En este trabajo utilizamos diferentes de modelos de regresión lineal múltiple para analizar los municipios de Puerto Rico y correlacionarlas con las variables de la base de datos. Se pudo comprobar que la mayor relación del ingreso per cápita depende de los niveles de estudios y el porcentaje de pobreza en los municipios.