Analizar y proyectar el peso al nacer en función de las semanas de gestación y factores maternos/socioeconómicos en Ecuador (ENV 2024).
En Ecuador, el peso al nacer es un tema importante de salud pública, ya que el bajo peso puede causar problemas de salud en los recién nacidos y afectar su desarrollo en el futuro. Por esta razón, es necesario conocer qué factores influyen en el peso de los bebés al momento de nacer.
Según el Registro Estadístico de Nacidos Vivos (2024), existen diferencias en el peso al nacer entre regiones del país, edades de la madre, condiciones socioeconómicas y características del embarazo. Esto indica que el peso del bebé no depende únicamente del tiempo de gestación, sino también de factores relacionados con la madre y su entorno.
Ante esta situación, es importante analizar qué variables influyen en el peso al nacer. Para ello, en este estudio se utilizarán modelos de regresión lineal, regresión múltiple y regresión logística, con el fin de identificar los factores que tienen mayor influencia y realizar proyecciones a futuro que puedan apoyar la toma de decisiones en salud pública
Los factores considerados en este estudio se clasifican en:
A continuación, se presenta el diagrama de Ishikawa que resume estos factores.
Estos factores serán considerados como variables explicativas en los modelos de regresión para analizar su relación con el peso al nacer.
Los datos utilizados en este estudio provienen del Registro Estadístico de Nacidos Vivos del Ecuador correspondiente al año 2024. Esta base de datos es elaborada por el Instituto Nacional de Estadística y Censos (INEC) y contiene información sobre características del recién nacido, de la madre y del embarazo.
La base incluye variables relacionadas con el peso al nacer, semanas de gestación, características maternas, factores reproductivos y condiciones socioeconómicas.
Antes del análisis se realizará un proceso de limpieza y depuración de los datos, eliminando registros incompletos o inconsistentes.
# #Carga y depuración de la base de datos.
# Paquetes
library(readxl)
library(dplyr)
library(stringr)
library(readr)
library(readxl)
library(ggplot2)
library(lmtest)
library(sandwich)
library(broom);
library(pROC);
library(ResourceSelection)
library(glue);
library(dplyr)
library(knitr)
library(kableExtra)
# 1) Carga
ENV_2024 <- read_excel("ENV_2024.xlsx")
# 2) Subset de columnas que usarás ahora
datos_filtrados <- ENV_2024 %>%
select(peso, sem_gest, area_res, edad_mad, con_pren, niv_inst)
datos_filtrados[datos_filtrados == "Sin información"]<-NA
sum(is.na(datos_filtrados)) # Observamos si existen datos perdidos
## [1] 22593
data<-na.omit(datos_filtrados)
# 2) Convierte columnas específicas
data$peso <- suppressWarnings(as.numeric(data$peso))
data$sem_gest <- suppressWarnings(as.numeric(data$sem_gest))
data$con_pren <- suppressWarnings(as.numeric(data$con_pren))
# 3) Factores para categóricas
data$area_res <- factor(data$area_res)
data$niv_inst <- factor(data$niv_inst)
# 5) Mapear educación a ordinal para logística (ajusta etiquetas EXACTAS a tu base)
data <- data %>%
mutate(
niv_inst_ord = recode(as.character(niv_inst),
"Sin instrucción" = "0",
"Primaria" = "1",
"Educación Básica" = "1",
"Educación Media / Bachillerato" = "2",
"Secundaria" = "2",
"Superior no universitario" = "3",
"Superior universitario" = "3",
"Posgrado" = "4",
.default = NA_character_
),
niv_inst_ord = as.numeric(niv_inst_ord)
)
# 6) Filtros clínicos mínimos
data <- data %>%
filter(peso > 400, peso < 6000,
sem_gest >= 22, sem_gest <= 42)
# Resumen numérico
summary(data[, c("peso","sem_gest")])
## peso sem_gest
## Min. : 500 Min. :22.00
## 1st Qu.:2800 1st Qu.:38.00
## Median :3100 Median :39.00
## Mean :3069 Mean :38.35
## 3rd Qu.:3395 3rd Qu.:39.00
## Max. :5500 Max. :42.00
summary(data[, c("peso","sem_gest","edad_mad","con_pren")])
## peso sem_gest edad_mad con_pren
## Min. : 500 Min. :22.00 Min. :10.00 Min. : 0.000
## 1st Qu.:2800 1st Qu.:38.00 1st Qu.:22.00 1st Qu.: 5.000
## Median :3100 Median :39.00 Median :26.00 Median : 6.000
## Mean :3069 Mean :38.35 Mean :26.71 Mean : 6.608
## 3rd Qu.:3395 3rd Qu.:39.00 3rd Qu.:31.00 3rd Qu.: 8.000
## Max. :5500 Max. :42.00 Max. :56.00 Max. :25.000
# Histograma de peso
ggplot(data, aes(peso)) +
geom_histogram(fill="#2E86C1", color="white", bins=40) +
labs(title="Distribución del peso al nacer", x="Peso (g)", y="Frecuencia")
# Boxplot de peso por área (si deseas ver brechas)
ggplot(data, aes(area_res, peso)) +
geom_boxplot(fill="#27AE60") +
labs(title="Peso por área de residencia", x="Área", y="Peso (g)")
Primero, se utilizará regresión lineal simple para analizar la relación entre el peso al nacer (variable dependiente) y las semanas de gestación (variable independiente). Con este modelo se busca observar cómo cambia el peso del bebé a medida que avanza el embarazo y estimar la tendencia de crecimiento fetal.
MODELO LINEAL SIMPLE \[ peso_i = \beta_0 + \beta_1 \, semana\_gestacion_i + \varepsilon_i \]
Después, se incorporarán edad de la madre y controlesprenatales para construir un modelo de regresión múltiple. Este modelo permitirá analizar el efecto conjunto de varias variables sobre el peso al nacer.
MODELO DE REGRESIÓN LINEAL MULTIPLE
\[ peso_i = \beta_0 + \beta_1 \, semana\_gestacion_i + \beta_2 \, edad\_madre_i + \beta_3 \, controles\_prenatales_i + \varepsilon_i \] ** MODELO DE REGRESIÓN LÓGISTICO
Finalmente, se aplicará un modelo de regresión logística para evaluar la probabilidad de bajo peso al nacer (menos de 2500 g) según el nivel de instrucción.
\[ \log\left(\frac{p_i}{1 - p_i}\right) = \beta_0 + \beta_1 \, semanas\_gestacion_i + \beta_2 \, nivel\_instructivo \_ord_i + \beta_3 \, control\_prenatal_i+ \varepsilon_i \] donde \(p_i\) es la probabilidad de bajo peso al nacer. \[ BP_i = \begin{cases} 1 & \text{si } peso < 2500g \\ 0 & \text{si } peso \ge 2500g \end{cases} \]
# Modelo lineal simple: peso ~ sem_gest
m_simple <- lm(peso ~ sem_gest, data = data)
# Resumen con coeficientes, errores estándar, t, p, R², etc.
summary(m_simple)
##
## Call:
## lm(formula = peso ~ sem_gest, data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2950.7 -265.7 -8.6 250.0 4210.5
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -3478.0477 19.2383 -180.8 <2e-16 ***
## sem_gest 170.7007 0.5011 340.7 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 403.4 on 209977 degrees of freedom
## Multiple R-squared: 0.3559, Adjusted R-squared: 0.3559
## F-statistic: 1.16e+05 on 1 and 209977 DF, p-value: < 2.2e-16
Interpretación: el coeficiente de sem_gest \((\beta_1)\) representa cuántos gramos aumenta el peso esperado por cada semana adicional de gestación (manteniendo el resto tal cual, ya que es un modelo simple).
ggplot(data, aes(x = sem_gest, y = peso)) +
geom_point(alpha = 0.3, color = "#2E86C1") +
geom_smooth(method = "lm", se = TRUE, color = "#C0392B", fill = "#F5B7B1") +
labs(title = "Peso al nacer vs. Semanas de gestación",
x = "Semanas de gestación",
y = "Peso al nacer (g)") +
theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'
# Panel de 4 gráficos de diagnóstico
par(mfrow = c(2, 2))
plot(m_simple)
par(mfrow = c(1, 1))
# Semanas a proyectar
esc <- tibble(sem_gest = c(24, 28, 32, 36, 40, 42))
# Predicción con intervalo de PREDICCIÓN (para individuo)
pred_pi <- predict(m_simple, newdata = esc, interval = "prediction", level = 0.95)
# Tabla ordenada y redondeada
tab_proj <- bind_cols(esc, as.data.frame(pred_pi)) %>%
transmute(
`Semanas de gestación` = sem_gest,
`Peso esperado (g)` = round(fit, 0),
`PI95% inferior (g)` = round(lwr, 0),
`PI95% superior (g)` = round(upr, 0)
)
kable(tab_proj, caption = "Proyección del peso por semanas de gestación (modelo lineal simple).") %>%
kable_styling(full_width = FALSE)
| Semanas de gestación | Peso esperado (g) | PI95% inferior (g) | PI95% superior (g) |
|---|---|---|---|
| 24 | 619 | -172 | 1410 |
| 28 | 1302 | 511 | 2092 |
| 32 | 1984 | 1194 | 2775 |
| 36 | 2667 | 1876 | 3458 |
| 40 | 3350 | 2559 | 4141 |
| 42 | 3691 | 2901 | 4482 |
\[ \widehat{Peso} = -3478.0477 + 170.7007 \times sem\_gest \]
# install.packages(c("broom","knitr","kableExtra"))
library(broom); library(knitr); library(kableExtra)
tab_simple <- tidy(m_simple, conf.int = TRUE) %>%
mutate(term = recode(term, "(Intercept)" = "Intercepto",
"sem_gest" = "Semanas de gestación")) %>%
rename(`Coef.`=estimate, `EE`=std.error, `t`=statistic, `p`=p.value,
`IC95% inf`=conf.low, `IC95% sup`=conf.high)
kable(tab_simple, digits = 3, caption = "Regresión lineal simple: peso ~ sem_gest") %>%
kable_styling(full_width = FALSE)
| term | Coef. | EE | t | p | IC95% inf | IC95% sup |
|---|---|---|---|---|---|---|
| Intercepto | -3478.048 | 19.238 | -180.788 | 0 | -3515.754 | -3440.341 |
| Semanas de gestación | 170.701 | 0.501 | 340.653 | 0 | 169.719 | 171.683 |
Resultados (modelo simple) Se encontró una relación lineal positiva y significativa entre las semanas de gestación y el peso al nacer \((\beta_1 =170.701\) g por semana; p < 0.001). El modelo explicó \(R^2 = 0.3559\)de la variabilidad en el peso. Bajo este modelo, el peso esperado a las semanas 24, 28, 32, 36, 40 y 42 fue de 619 g (IC/PI 95% –), respectivamente.
peso = semanas de gestacion + edad de la madre + controles prenatales
m_multi <- lm(peso ~ sem_gest + edad_mad + con_pren, data = data)
summary(m_multi)
##
## Call:
## lm(formula = peso ~ sem_gest + edad_mad + con_pren, data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2975.8 -263.1 -12.1 248.6 4173.8
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -3708.4179 19.6345 -188.872 <2e-16 ***
## sem_gest 171.6016 0.5000 343.223 <2e-16 ***
## edad_mad 6.5217 0.1347 48.403 <2e-16 ***
## con_pren 3.2704 0.3486 9.382 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 400.9 on 209975 degrees of freedom
## Multiple R-squared: 0.3641, Adjusted R-squared: 0.3641
## F-statistic: 4.008e+04 on 3 and 209975 DF, p-value: < 2.2e-16
ECUACIÓN DEL MODELO \[ Peso = -3708.4179 + 171.6016(sem\_gest) + 6.5217(edad\_mad) + 3.2704(con\_pren) \] El modelo muestra que el peso del bebé al nacer aumenta principalmente cuando el embarazo dura más semanas. En promedio, por cada semana adicional de gestación el peso del bebé aumenta alrededor de 171.6 gramos. También se observa que si la madre tiene un año más de edad, el peso del bebé aumenta aproximadamente 6.5 gramos, aunque este cambio es pequeño. Además, cada control prenatal adicional se asocia con un aumento de cerca de 3.27 gramos en el peso del bebé. En resumen, las semanas de gestación son el factor que más influye en el peso al nacer, mientras que la edad de la madre y los controles prenatales tienen un efecto menor.
# Diagnóstico
op <- par(mfrow=c(2,2)); plot(m_multi); par(op)
lmtest::bptest(m_multi) # homocedasticidad
##
## studentized Breusch-Pagan test
##
## data: m_multi
## BP = 452.62, df = 3, p-value < 2.2e-16
car::vif(m_multi) # colinealidad
## sem_gest edad_mad con_pren
## 1.008285 1.039197 1.041143
# Si hay heterocedasticidad, reporta errores robustos:
coeftest(m_multi, vcov = sandwich::vcovHC(m_multi, type = "HC3"))
##
## t test of coefficients:
##
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -3708.41790 20.77008 -178.5462 < 2.2e-16 ***
## sem_gest 171.60159 0.53199 322.5668 < 2.2e-16 ***
## edad_mad 6.52168 0.13720 47.5346 < 2.2e-16 ***
## con_pren 3.27039 0.34955 9.3559 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
La revisión del modelo de regresión múltiple muestra que los gráficos de los residuos no presentan problemas importantes. Sin embargo, la prueba de Breusch–Pagan test detectó heterocedasticidad (BP = 452.62; p < 0.05), lo que significa que la variación de los errores no es constante. Por esta razón, se usaron errores estándar robustos (HC3) para obtener resultados más confiables. Además, los valores del Variance Inflation Factor (VIF) estuvieron entre 1.01 y 1.04, lo que indica que no existe un problema importante de relación entre las variables del modelo.
esc_m <- expand.grid(
sem_gest = c(32, 36, 40),
edad_mad = c(18, 25, 35),
con_pren = c(4, 8, 12)
)
pred_m <- predict(m_multi, newdata = esc_m, interval = "prediction", level = 0.95)
cbind(esc_m, round(as.data.frame(pred_m), 0))
## sem_gest edad_mad con_pren fit lwr upr
## 1 32 18 4 1913 1128 2699
## 2 36 18 4 2600 1814 3385
## 3 40 18 4 3286 2500 4072
## 4 32 25 4 1959 1173 2745
## 5 36 25 4 2645 1860 3431
## 6 40 25 4 3332 2546 4117
## 7 32 35 4 2024 1238 2810
## 8 36 35 4 2711 1925 3496
## 9 40 35 4 3397 2611 4183
## 10 32 18 8 1926 1141 2712
## 11 36 18 8 2613 1827 3398
## 12 40 18 8 3299 2514 4085
## 13 32 25 8 1972 1186 2758
## 14 36 25 8 2658 1873 3444
## 15 40 25 8 3345 2559 4131
## 16 32 35 8 2037 1252 2823
## 17 36 35 8 2724 1938 3509
## 18 40 35 8 3410 2624 4196
## 19 32 18 12 1939 1154 2725
## 20 36 18 12 2626 1840 3412
## 21 40 18 12 3312 2527 4098
## 22 32 25 12 1985 1199 2771
## 23 36 25 12 2672 1886 3457
## 24 40 25 12 3358 2572 4144
## 25 32 35 12 2050 1265 2836
## 26 36 35 12 2737 1951 3522
## 27 40 35 12 3423 2637 4209
Con 40 semanas de gestación, una madre de 35 años y 4 controles prenatales, el peso esperado fue 3397 g (PI95%: 2611–4183). La tabla de escenarios muestra combinaciones de semanas, edad y controles.
En este modelo, las proyecciones a futuro se refieren a estimar cómo cambiaría la probabilidad de bajo peso al nacer si cambian ciertos factores. Por ejemplo, el modelo permite proyectar qué ocurriría con el riesgo de bajo peso si los embarazos duran más semanas, si aumenta el nivel educativo de las madres o si se realizan más controles prenatales. Con esta información se pueden anticipar posibles escenarios y apoyar decisiones en salud pública para reducir el bajo peso al nacer.
# 1. Crear la variable dependiente (BP = bajo peso)
data$BP <- ifelse(data$peso < 2500, 1, 0)
data$BP <- factor(data$BP, levels = c(0,1))
modelo_logit <- glm(BP ~ sem_gest + niv_inst_ord + con_pren,
data = data,
family = binomial)
summary(modelo_logit)
##
## Call:
## glm(formula = BP ~ sem_gest + niv_inst_ord + con_pren, family = binomial,
## data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 35.670957 0.249834 142.779 <2e-16 ***
## sem_gest -0.996122 0.006664 -149.471 <2e-16 ***
## niv_inst_ord -0.119750 0.011283 -10.613 <2e-16 ***
## con_pren -0.033962 0.003741 -9.078 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 132380 on 207837 degrees of freedom
## Residual deviance: 87501 on 207834 degrees of freedom
## (2141 observations deleted due to missingness)
## AIC: 87509
##
## Number of Fisher Scoring iterations: 6
Ecuación del Modelo PESO ~ sem_gest + niv_inst_ord + con_pren \[ \text{logit}\big(P(BP = 1)\big) = 35.670957 - 0.996122\,\text{sem\_gest} - 0.119750\,\text{niv\_inst\_ord} - 0.033962\,\text{con\_pren} \] ## Obtener odds ratios e intervalos 95%
glm(…, family = binomial): indica que se usa un modelo de regresión logística, que sirve para analizar una variable que solo tiene dos resultados (por ejemplo: sí o no).
BP: es la variable que se quiere explicar. Toma valor 1 si el bebé tiene bajo peso (menos de 2500 g) y 0 si no tiene bajo peso.
sem_gest: número de semanas de gestación del embarazo.
niv_inst_ord: nivel de educación de la madre, ordenado de menor a mayor.
con_pren: número de controles prenatales que tuvo la madre durante el embarazo.
En resumen, el modelo calcula la probabilidad de que un bebé nazca con bajo peso usando las semanas de gestación, la educación de la madre y los controles prenatales.
# Odds ratios (OR) e IC95%
or_ci <- exp(cbind(OR = coef(modelo_logit),
confint(modelo_logit)))
## Waiting for profiling to be done...
round(or_ci, 3)
## OR 2.5 % 97.5 %
## (Intercept) 3.102415e+15 1.904418e+15 5.070929e+15
## sem_gest 3.690000e-01 3.640000e-01 3.740000e-01
## niv_inst_ord 8.870000e-01 8.680000e-01 9.070000e-01
## con_pren 9.670000e-01 9.600000e-01 9.740000e-01
Los resultados del modelo muestran que las semanas de gestación, el nivel educativo de la madre y el número de controles prenatales se relacionan con la probabilidad de bajo peso al nacer. En particular, cada semana adicional de gestación reduce de forma importante la probabilidad de bajo peso (OR = 0.37; IC95%: 0.364–0.374), lo que indica que mientras más tiempo dura el embarazo, menor es el riesgo. Además, un mayor nivel educativo de la madre también se asocia con una menor probabilidad de bajo peso (OR = 0.89; IC95%: 0.868–0.907). De igual forma, cada control prenatal adicional reduce ligeramente este riesgo (OR = 0.97; IC95%: 0.96–0.97). En conjunto, estos resultados sugieren que las semanas de gestación tienen el efecto más fuerte en la reducción del bajo peso al nacer, mientras que la educación materna y los controles prenatales también contribuyen a disminuir este riesgo.
# Define escenarios: ej. semanas y educación varían; controles fijos en 8
escenarios <- expand.grid(
sem_gest = c(32, 34, 36, 38, 40, 42),
niv_inst_ord = c(0, 2, 4),
con_pren = 8
)
# 3) Probabilidades predichas (útil para proyecciones)
escenarios$prob_BP <- predict(modelo_logit, newdata = escenarios, type = "response")
knitr::kable(transform(escenarios, prob_BP = round(prob_BP, 3)),
caption = "Proyección de probabilidad de bajo peso por escenario")
| sem_gest | niv_inst_ord | con_pren | prob_BP |
|---|---|---|---|
| 32 | 0 | 8 | 0.971 |
| 34 | 0 | 8 | 0.822 |
| 36 | 0 | 8 | 0.387 |
| 38 | 0 | 8 | 0.079 |
| 40 | 0 | 8 | 0.012 |
| 42 | 0 | 8 | 0.002 |
| 32 | 2 | 8 | 0.964 |
| 34 | 2 | 8 | 0.784 |
| 36 | 2 | 8 | 0.332 |
| 38 | 2 | 8 | 0.063 |
| 40 | 2 | 8 | 0.009 |
| 42 | 2 | 8 | 0.001 |
| 32 | 4 | 8 | 0.955 |
| 34 | 4 | 8 | 0.741 |
| 36 | 4 | 8 | 0.281 |
| 38 | 4 | 8 | 0.051 |
| 40 | 4 | 8 | 0.007 |
| 42 | 4 | 8 | 0.001 |
Los resultados muestran que las semanas de gestación son el factor que más influye en la probabilidad de bajo peso al nacer. Cuando el embarazo tiene pocas semanas, el riesgo es muy alto, pero disminuye rápidamente a medida que el embarazo avanza. Por ejemplo, con 32 semanas la probabilidad es 0.971, en 34 semanas es 0.822 y en 36 semanas baja a 0.387. A partir de 38 semanas el riesgo ya es bajo (0.079) y en 40 y 42 semanas se vuelve muy bajo (0.012 y 0.002). Además, el nivel educativo de la madre también influye, ya que a mayor educación la probabilidad de bajo peso disminuye ligeramente, aunque su efecto es menor que el de las semanas de gestación. Por ejemplo, en 32 semanas la probabilidad baja de 0.971 a 0.964 y 0.955 cuando aumenta la educación de la madre. En este análisis los controles prenatales se mantuvieron en 8, por lo que no se puede observar su efecto; para analizarlo sería necesario comparar diferentes números de controles durante el embarazo.
Cada modelo fue validado de manera independiente, ya que los supuestos estadísticos varían según el tipo de regresión. Para los modelos lineales (simple y múltiple) se evaluaron linealidad, normalidad de residuos, homocedasticidad y colinealidad (en el modelo múltiple). En ambos casos, los gráficos de diagnóstico no mostraron patrones fuertes y la prueba de Breusch–Pagan indicó que la variación de los residuos fue razonablemente constante. En el modelo logístico, se evaluó la bondad de ajuste mediante la prueba de Hosmer–Lemeshow y la capacidad predictiva mediante la curva ROC. Los resultados mostraron que el modelo presenta un ajuste adecuado y una buena discriminación para clasificar bajo peso al nacer.