Objetivo general

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).

Objetivos específicos

  1. Estimar el aumento promedio de peso por semana de gestación (modelo lineal simple).
  2. Cuantificar el efecto adicional de edad materna y controles prenatales sobre el peso (modelo lineal múltiple).
  3. Estimar la probabilidad de bajo peso (< 2500 g) y sus factores asociados (modelo logístico).
  4. Generar proyecciones de peso y de probabilidad de bajo peso bajo escenarios plausibles.

Descripción del problema

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

Identificación de los factores importantes

Los factores considerados en este estudio se clasifican en:

A continuación, se presenta el diagrama de Ishikawa que resume estos factores.

Diagrama de Ishikawa del peso al nacer

Estos factores serán considerados como variables explicativas en los modelos de regresión para analizar su relación con el peso al nacer.

Recolección y descripción de los datos

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)

Análisis descriptivo (medias, frecuencias, histogramas).

# 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)")

Propuesta y refinamiento del modelo

Analisis de la relación entre el peso al nacer, las semanas de gestación y sus factores

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} \]

Ajuste del modelo líneal simple

# 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).

Gráfico con recta de regresión.

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'

Diagnóstico básico de supuestos.

# Panel de 4 gráficos de diagnóstico
par(mfrow = c(2, 2))
plot(m_simple)

par(mfrow = c(1, 1))

Proyecciones por semana de gestación (predicciones)

# 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)
Proyección del peso por semanas de gestación (modelo lineal simple).
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)
Regresión lineal simple: peso ~ sem_gest
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.

Ajuste del modelo lineal multiple

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.

Validación

# 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.

Proyecciones

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.

Modelo logistico

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))

Ajustar el modelo logístico

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.

Proyecciones

# 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")
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.

VALIDACIÓN

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.

Conclusiones