library(WDI)
library(dplyr)
library(tidyr)
library(ggplot2)
library(knitr)
library(kableExtra)
library(lmtest)
library(car)La esperanza de vida al nacer es uno de los indicadores más comprehensivos del bienestar de una población. Refleja de forma sintética las condiciones sanitarias, económicas y sociales que enfrentan los habitantes de un país a lo largo de su vida. En 2022, las diferencias entre países eran aún profundas: mientras algunos superaban los 85 años, otros no alcanzaban los 60, lo que sugiere que factores estructurales de diversa naturaleza determinan de manera significativa la longevidad de las personas.
El presente trabajo busca responder la siguiente pregunta: ¿Qué factores socioeconómicos y de salud explican las diferencias en esperanza de vida entre países en el año 2022? Para ello, se construye un modelo de regresión lineal múltiple utilizando datos del Banco Mundial, con cinco variables independientes cuantitativas y el grupo de ingreso del país como variable cualitativa.
Los datos provienen de los World Development Indicators
(WDI) del Banco Mundial, descargados mediante el paquete
WDI de R. Se seleccionó el año 2022 para
obtener un corte transversal a nivel de países. Tras eliminar agregados
regionales y observaciones con valores faltantes, la muestra final quedó
compuesta por 165 países.
variables <- data.frame(
Rol = c(
"Dependiente",
"Independiente cuantitativa",
"Independiente cuantitativa",
"Independiente cuantitativa",
"Independiente cuantitativa",
"Independiente cuantitativa",
"Independiente cualitativa"
),
Variable = c(
"Esperanza de vida al nacer (años)",
"PIB per cápita (USD corrientes)",
"Gasto en salud (% del PIB)",
"Mortalidad infantil (por 1.000 nacidos vivos)",
"Acceso a agua potable (% de la población)",
"Tasa de desempleo (%)",
"Grupo de ingreso del país"
),
Codigo_WDI = c(
"SP.DYN.LE00.IN",
"NY.GDP.PCAP.CD",
"SH.XPD.CHEX.GD.ZS",
"SP.DYN.IMRT.IN",
"SH.H2O.BASW.ZS",
"SL.UEM.TOTL.ZS",
"income (WDI extra)"
),
stringsAsFactors = FALSE
)
kable(variables,
col.names = c("Rol", "Variable", "Codigo WDI"),
caption = "Tabla 1. Variables del modelo") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE) %>%
column_spec(1, bold = TRUE)| Rol | Variable | Codigo WDI |
|---|---|---|
| Dependiente | Esperanza de vida al nacer (años) | SP.DYN.LE00.IN |
| Independiente cuantitativa | PIB per cápita (USD corrientes) | NY.GDP.PCAP.CD |
| Independiente cuantitativa | Gasto en salud (% del PIB) | SH.XPD.CHEX.GD.ZS |
| Independiente cuantitativa | Mortalidad infantil (por 1.000 nacidos vivos) | SP.DYN.IMRT.IN |
| Independiente cuantitativa | Acceso a agua potable (% de la población) | SH.H2O.BASW.ZS |
| Independiente cuantitativa | Tasa de desempleo (%) | SL.UEM.TOTL.ZS |
| Independiente cualitativa | Grupo de ingreso del país | income (WDI extra) |
La variable cualitativa income clasifica a los países en
cuatro categorías: Low income, Lower middle income,
Upper middle income y High income. La categoría de
referencia en el modelo es Low income.
\[ \widehat{EV}_i = \beta_0 + \beta_1 PIB_i + \beta_2 GS_i + \beta_3 MI_i + \beta_4 AP_i + \beta_5 DES_i + \beta_6 D_{LM} + \beta_7 D_{UM} + \beta_8 D_{H} + \varepsilon_i \]
Donde \(EV_i\) es la esperanza de vida del país \(i\), y \(D_{LM}\), \(D_{UM}\), \(D_{H}\) son variables dummy para Lower middle, Upper middle y High income respectivamente (referencia: Low income).
datos_raw <- WDI(
country = "all",
indicator = c(
esperanza_vida = "SP.DYN.LE00.IN",
pib_per_capita = "NY.GDP.PCAP.CD",
gasto_salud = "SH.XPD.CHEX.GD.ZS",
mortalidad_inf = "SP.DYN.IMRT.IN",
agua_potable = "SH.H2O.BASW.ZS",
desempleo = "SL.UEM.TOTL.ZS"
),
start = 2022,
end = 2022,
extra = TRUE
)
datos <- datos_raw %>%
filter(region != "Aggregates") %>%
dplyr::select(country, iso2c, income,
esperanza_vida, pib_per_capita, gasto_salud,
mortalidad_inf, agua_potable, desempleo)
datos_modelo <- datos %>%
dplyr::select(-country, -iso2c) %>%
filter(income %in% c("Low income", "Lower middle income",
"Upper middle income", "High income")) %>%
na.omit() %>%
mutate(income = factor(income,
levels = c("Low income",
"Lower middle income",
"Upper middle income",
"High income")))
cat("Observaciones en el modelo:", nrow(datos_modelo))## Observaciones en el modelo: 165
etiquetas <- c(
esperanza_vida = "Esperanza de vida (anos)",
pib_per_capita = "PIB per capita (USD)",
gasto_salud = "Gasto en salud (% PIB)",
mortalidad_inf = "Mortalidad infantil (x1.000)",
agua_potable = "Acceso a agua potable (%)",
desempleo = "Tasa de desempleo (%)"
)
desc <- datos_modelo %>%
dplyr::select(-income) %>%
pivot_longer(everything(), names_to = "Variable", values_to = "Valor") %>%
group_by(Variable) %>%
summarise(
N = n(),
Media = round(mean(Valor, na.rm = TRUE), 2),
Mediana = round(median(Valor, na.rm = TRUE), 2),
DE = round(sd(Valor, na.rm = TRUE), 2),
Min = round(min(Valor, na.rm = TRUE), 2),
Max = round(max(Valor, na.rm = TRUE), 2)
) %>%
mutate(Variable = etiquetas[Variable])
kable(desc,
col.names = c("Variable", "N", "Media", "Mediana", "D.E.", "Min", "Max"),
caption = "Tabla 2. Estadisticas descriptivas") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE)| Variable | N | Media | Mediana | D.E. | Min | Max |
|---|---|---|---|---|---|---|
| Acceso a agua potable (%) | 165 | 89.30 | 95.94 | 14.55 | 35.13 | 100.00 |
| Tasa de desempleo (%) | 165 | 6.94 | 5.05 | 5.83 | 0.13 | 36.47 |
| Esperanza de vida (anos) | 165 | 72.55 | 73.51 | 8.08 | 18.82 | 84.00 |
| Gasto en salud (% PIB) | 165 | 6.64 | 6.53 | 3.04 | 1.77 | 23.09 |
| Mortalidad infantil (x1.000) | 165 | 19.78 | 13.10 | 21.36 | 1.70 | 189.10 |
| PIB per capita (USD) | 165 | 16880.66 | 6515.59 | 23928.87 | 302.99 | 123719.66 |
colores <- c(
"Low income" = "#e74c3c",
"Lower middle income" = "#e67e22",
"Upper middle income" = "#3498db",
"High income" = "#2ecc71"
)
datos_modelo %>%
count(income) %>%
ggplot(aes(x = income, y = n, fill = income)) +
geom_col(width = 0.6, show.legend = FALSE) +
geom_text(aes(label = n), vjust = -0.5, size = 4, fontface = "bold") +
scale_fill_manual(values = colores) +
labs(title = "Paises por grupo de ingreso (2022)",
x = "Grupo de ingreso", y = "Numero de paises") +
theme_minimal(base_size = 13) +
theme(axis.text.x = element_text(angle = 15, hjust = 1))ggplot(datos_modelo, aes(x = income, y = esperanza_vida, fill = income)) +
geom_boxplot(alpha = 0.8, show.legend = FALSE, outlier.shape = 21) +
scale_fill_manual(values = colores) +
labs(title = "Esperanza de vida por grupo de ingreso (2022)",
x = "Grupo de ingreso", y = "Esperanza de vida (anos)") +
theme_minimal(base_size = 13) +
theme(axis.text.x = element_text(angle = 15, hjust = 1))ggplot(datos_modelo, aes(x = mortalidad_inf, y = esperanza_vida, color = income)) +
geom_point(alpha = 0.7, size = 2.5) +
geom_smooth(method = "lm", se = FALSE, color = "black",
linewidth = 0.8, linetype = "dashed") +
scale_color_manual(values = colores) +
labs(title = "Mortalidad infantil vs. Esperanza de vida (2022)",
x = "Mortalidad infantil (por 1.000 nacidos vivos)",
y = "Esperanza de vida (anos)",
color = "Grupo de ingreso") +
theme_minimal(base_size = 13)ggplot(datos_modelo, aes(x = pib_per_capita, y = esperanza_vida, color = income)) +
geom_point(alpha = 0.7, size = 2.5) +
geom_smooth(method = "lm", se = FALSE, color = "black",
linewidth = 0.8, linetype = "dashed") +
scale_x_log10(labels = scales::comma) +
scale_color_manual(values = colores) +
labs(title = "PIB per capita vs. Esperanza de vida (2022)",
x = "PIB per capita (USD, escala logaritmica)",
y = "Esperanza de vida (anos)",
color = "Grupo de ingreso") +
theme_minimal(base_size = 13)modelo <- lm(esperanza_vida ~ pib_per_capita + gasto_salud +
mortalidad_inf + agua_potable + desempleo + income,
data = datos_modelo)
summary(modelo)##
## Call:
## lm(formula = esperanza_vida ~ pib_per_capita + gasto_salud +
## mortalidad_inf + agua_potable + desempleo + income, data = datos_modelo)
##
## Residuals:
## Min 1Q Median 3Q Max
## -5.2827 -1.4041 -0.0475 1.6567 5.2292
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 6.937e+01 1.994e+00 34.784 < 2e-16 ***
## pib_per_capita 6.035e-05 1.184e-05 5.097 9.85e-07 ***
## gasto_salud 4.769e-02 6.614e-02 0.721 0.472009
## mortalidad_inf -2.826e-01 1.361e-02 -20.765 < 2e-16 ***
## agua_potable 9.306e-02 2.433e-02 3.825 0.000189 ***
## desempleo 2.192e-02 3.305e-02 0.663 0.508096
## incomeLower middle income -1.095e+00 7.725e-01 -1.417 0.158370
## incomeUpper middle income -1.689e+00 9.385e-01 -1.800 0.073764 .
## incomeHigh income -8.181e-01 1.079e+00 -0.758 0.449528
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.288 on 156 degrees of freedom
## Multiple R-squared: 0.9238, Adjusted R-squared: 0.9199
## F-statistic: 236.3 on 8 and 156 DF, p-value: < 2.2e-16
nombres <- c(
"(Intercept)" = "Intercepto",
"pib_per_capita" = "PIB per capita",
"gasto_salud" = "Gasto en salud (% PIB)",
"mortalidad_inf" = "Mortalidad infantil",
"agua_potable" = "Acceso a agua potable",
"desempleo" = "Tasa de desempleo",
"incomeLower middle income" = "D: Lower middle income",
"incomeUpper middle income" = "D: Upper middle income",
"incomeHigh income" = "D: High income"
)
coefs <- as.data.frame(summary(modelo)$coefficients)
coefs$Variable <- nombres[rownames(coefs)]
coefs <- coefs %>%
mutate(
Sig = case_when(
`Pr(>|t|)` < 0.001 ~ "***",
`Pr(>|t|)` < 0.01 ~ "**",
`Pr(>|t|)` < 0.05 ~ "*",
`Pr(>|t|)` < 0.1 ~ ".",
TRUE ~ ""
),
Estimate = round(Estimate, 6),
`Std. Error` = round(`Std. Error`, 6),
`t value` = round(`t value`, 3),
`Pr(>|t|)` = formatC(`Pr(>|t|)`, format = "e", digits = 3)
) %>%
dplyr::select(Variable, Estimate, `Std. Error`, `t value`, `Pr(>|t|)`, Sig)
kable(coefs,
col.names = c("Variable", "Estimado", "Error Std.", "t", "Valor p", "Sig."),
caption = "Tabla 3. Coeficientes del modelo") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE) %>%
row_spec(which(coefs$Sig == "***"), bold = TRUE,
color = "#155724", background = "#d4edda")| Variable | Estimado | Error Std. | t | Valor p | Sig. | |
|---|---|---|---|---|---|---|
| (Intercept) | Intercepto | 69.370425 | 1.994306 | 34.784 | 2.141e-75 | *** |
| pib_per_capita | PIB per capita | 0.000060 | 0.000012 | 5.097 | 9.847e-07 | *** |
| gasto_salud | Gasto en salud (% PIB) | 0.047688 | 0.066145 | 0.721 | 4.720e-01 | |
| mortalidad_inf | Mortalidad infantil | -0.282593 | 0.013609 | -20.765 | 9.351e-47 | *** |
| agua_potable | Acceso a agua potable | 0.093055 | 0.024330 | 3.825 | 1.889e-04 | *** |
| desempleo | Tasa de desempleo | 0.021922 | 0.033048 | 0.663 | 5.081e-01 | |
| incomeLower middle income | D: Lower middle income | -1.094953 | 0.772527 | -1.417 | 1.584e-01 | |
| incomeUpper middle income | D: Upper middle income | -1.689410 | 0.938464 | -1.800 | 7.376e-02 | . |
| incomeHigh income | D: High income | -0.818077 | 1.079100 | -0.758 | 4.495e-01 |
Significancia: *** p<0.001 – **
p<0.01 – * p<0.05 – . p<0.1
El modelo presenta un R2 = 0.9238 y un R2 ajustado = 0.9199, lo que indica que el 92% de la variabilidad en la esperanza de vida entre paises queda explicada por las variables del modelo. La prueba F global es altamente significativa (F = 236.3, p < 2.2e-16).
Mortalidad infantil (b = -0.283, p < 0.001): es el predictor mas potente. Por cada aumento de una unidad en la tasa de mortalidad infantil, la esperanza de vida disminuye en promedio 0.28 anos, todo lo demas constante.
PIB per capita (b = 6.03e-5, p < 0.001): por cada USD 1.000 adicionales de PIB per capita, la esperanza de vida aumenta aproximadamente 0.06 anos, reflejando que la riqueza material mejora el acceso a salud, nutricion y servicios basicos.
Acceso a agua potable (b = 0.093, p < 0.001): por cada punto porcentual adicional de poblacion con acceso a agua segura, la esperanza de vida aumenta 0.09 anos, evidenciando el impacto del saneamiento basico.
Gasto en salud, desempleo y las dummies de ingreso no resultan significativos al 5%.
##
## Shapiro-Wilk normality test
##
## data: residuals(modelo)
## W = 0.99401, p-value = 0.7373
W = 0.994, p = 0.737 – No se rechaza H0. Los residuales siguen una distribucion normal. Supuesto cumplido.
##
## studentized Breusch-Pagan test
##
## data: modelo
## BP = 6.3556, df = 8, p-value = 0.6075
BP = 6.356, p = 0.607 – No se rechaza H0. La varianza de los errores es constante. Supuesto cumplido.
vif(modelo) %>%
as.data.frame() %>%
kable(caption = "Tabla 4. Factor de Inflacion de la Varianza") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)| GVIF | Df | GVIF^(1/(2*Df)) | |
|---|---|---|---|
| pib_per_capita | 2.514113 | 1 | 1.585595 |
| gasto_salud | 1.262293 | 1 | 1.123518 |
| mortalidad_inf | 2.646119 | 1 | 1.626689 |
| agua_potable | 3.922664 | 1 | 1.980571 |
| desempleo | 1.163123 | 1 | 1.078482 |
| income | 6.891444 | 3 | 1.379489 |
Todos los GVIF^(1/(2*Df)) estan por debajo de 2. No hay multicolinealidad problematica. Supuesto cumplido.
El modelo de regresion lineal multiple ajustado para 165 paises en 2022 presenta un desempeno sobresaliente (R2 = 0.924), con todos los supuestos del modelo clasico verificados satisfactoriamente.
Los resultados muestran que la mortalidad infantil es el determinante mas critico de la esperanza de vida. El PIB per capita confirma la relacion positiva entre riqueza y salud, mientras que el acceso a agua potable evidencia el impacto del saneamiento basico sobre la mortalidad por enfermedades prevenibles.
El gasto en salud como porcentaje del PIB no resulto significativo, lo que sugiere que no es el volumen del gasto sino su efectividad lo que realmente determina la longevidad. Desde una perspectiva de politica publica, las intervenciones mas efectivas son las orientadas a reducir la mortalidad infantil y garantizar acceso universal al agua potable.
World Bank (2023). World Development Indicators. Recuperado de https://databank.worldbank.org/source/world-development-indicators
Arel-Bundock, V. (2022). WDI: World Development Indicators and Other World Bank Data. R package version 2.7.8. https://CRAN.R-project.org/package=WDI
James, G., Witten, D., Hastie, T., y Tibshirani, R. (2021). An Introduction to Statistical Learning. Springer.
Montgomery, D. C., Peck, E. A., y Vining, G. G. (2021). Introduction to Linear Regression Analysis. Wiley.