Tarea 31 de mayo de 2025

Author

Alex Brito Sánchez

# Cargar paquetes necesarios
library(haven)
library(dplyr)

Adjuntando el paquete: 'dplyr'
The following objects are masked from 'package:stats':

    filter, lag
The following objects are masked from 'package:base':

    intersect, setdiff, setequal, union
library(MASS)

Adjuntando el paquete: 'MASS'
The following object is masked from 'package:dplyr':

    select
library(car)
Cargando paquete requerido: carData

Adjuntando el paquete: 'car'
The following object is masked from 'package:dplyr':

    recode
library(margins)
library(pROC)
Type 'citation("pROC")' for a citation.

Adjuntando el paquete: 'pROC'
The following objects are masked from 'package:stats':

    cov, smooth, var
library(caret)
Cargando paquete requerido: ggplot2
Cargando paquete requerido: lattice

1. Cargar los datos

# Establecer directorio (ajusta si es necesario)
setwd("C:/Users/alexd/Desktop/MAESTRIA/BUSINESS/CLASE 25 DE MAYO/31/05/2025")

# Leer la base de datos
datos <- read_dta("Data1_R.dta")

2. Crear variables binarias adicionales

datos <- datos %>%
  mutate(
    depresion_pp = ifelse(depresion_pp %in% c("Sí", "Si", 1), 1,
                          ifelse(depresion_pp %in% c("No", 0), 0, NA)),
    depresion_pp = as.factor(depresion_pp),
    medico = ifelse(f2_s5_504c_1 == 3, 1, 0)
  )

# Confirmar que hay dos niveles en la variable dependiente
print(table(datos$depresion_pp, useNA = "always"))

    0     1  <NA> 
12828  3623     0 

3. Modelo Logit Robusto

modelo_final <- glm(depresion_pp ~ lingrl + anios_esc + edad + t_hijos + medico,
                    data = datos, family = binomial(link = "logit"))
summary(modelo_final)

Call:
glm(formula = depresion_pp ~ lingrl + anios_esc + edad + t_hijos + 
    medico, family = binomial(link = "logit"), data = datos)

Coefficients:
             Estimate Std. Error z value Pr(>|z|)    
(Intercept) -2.072883   0.107131 -19.349  < 2e-16 ***
lingrl       0.001690   0.007154   0.236 0.813269    
anios_esc   -0.007664   0.004803  -1.596 0.110542    
edad         0.032996   0.003212  10.273  < 2e-16 ***
t_hijos      0.045775   0.018880   2.425 0.015329 *  
medico      -0.191655   0.051822  -3.698 0.000217 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 17346  on 16450  degrees of freedom
Residual deviance: 17126  on 16445  degrees of freedom
AIC: 17138

Number of Fisher Scoring iterations: 4

Análisis: El modelo muestra qué variables influyen significativamente en la probabilidad de tener depresión postparto. Los coeficientes nos permiten identificar si aumentan o disminuyen dicha probabilidad, y la significancia estadística se refleja en los valores-p asociados.

4. Efectos marginales

margenes <- margins(modelo_final)
summary(margenes)
    factor     AME     SE       z      p   lower   upper
 anios_esc -0.0013 0.0008 -1.5961 0.1105 -0.0029  0.0003
      edad  0.0056 0.0005 10.3517 0.0000  0.0045  0.0066
    lingrl  0.0003 0.0012  0.2362 0.8133 -0.0021  0.0027
    medico -0.0325 0.0088 -3.7021 0.0002 -0.0496 -0.0153
   t_hijos  0.0078 0.0032  2.4256 0.0153  0.0015  0.0140

Análisis: Los efectos marginales muestran el cambio promedio en la probabilidad de depresión por cada unidad adicional de una variable, manteniendo las demás constantes. Es recomendable multiplicar los resultados por 100 para expresarlos en términos porcentuales.

5. Matriz de confusión y exactitud

predicciones <- ifelse(predict(modelo_final, type = "response") > 0.5, 1, 0)
conf_matrix <- table(Predicho = predicciones, Real = as.numeric(as.character(datos$depresion_pp)))
conf_matrix
        Real
Predicho     0     1
       0 12828  3623
exactitud <- sum(diag(conf_matrix)) / sum(conf_matrix)
cat("Exactitud del modelo:", round(exactitud, 4))
Exactitud del modelo: 0.7798

Análisis: La matriz de confusión permite evaluar cuántas predicciones fueron correctas. La exactitud general del modelo indica qué porcentaje del total fue clasificado correctamente.

6. Curva ROC y AUC

library(pROC)

# Convertir a valores binarios explícitos
roc_logit <- roc(as.numeric(as.character(datos$depresion_pp)), predict(modelo_final, type = "response"))
Setting levels: control = 0, case = 1
Setting direction: controls < cases
auc_valor <- auc(roc_logit)
cat("AUC del modelo logit robusto:", round(auc_valor, 4))
AUC del modelo logit robusto: 0.58
# Gráfico de la curva ROC
plot(roc_logit, col = "blue", lwd = 2, main = "Curva ROC - Modelo Logit Robustecido")
abline(a = 0, b = 1, lty = 2, col = "red")

Análisis: El AUC (Área Bajo la Curva) mide la capacidad predictiva del modelo. Valores cercanos a 1 indican excelente discriminación entre los casos con y sin depresión; valores cercanos a 0.5 indican que el modelo no predice mejor que el azar.

7. Comparar AIC y BIC entre modelos logit y probit

# Modelo Probit (con las mismas variables)
modelo_probit <- glm(depresion_pp ~ lingrl + anios_esc + edad + t_hijos + medico,
                     data = datos, family = binomial(link = "probit"))

# Comparar AIC
aic_logit <- AIC(modelo_final)
aic_probit <- AIC(modelo_probit)

# Comparar BIC
bic_logit <- BIC(modelo_final)
bic_probit <- BIC(modelo_probit)

# Mostrar resultados
cat("AIC Logit:", aic_logit, " | AIC Probit:", aic_probit, "\n")
AIC Logit: 17138.04  | AIC Probit: 17136.79 
cat("BIC Logit:", bic_logit, " | BIC Probit:", bic_probit, "\n")
BIC Logit: 17184.29  | BIC Probit: 17183.04 
# Conclusión de comparación
if (aic_probit < aic_logit) {
  cat("El criterio más bajo es del modelo probit\n")
} else {
  cat("El criterio más bajo es del modelo logit\n")
}
El criterio más bajo es del modelo probit
if (bic_probit < bic_logit) {
  cat("Conclusión: El modelo con menor AIC/BIC es el preferido, es decir el modelo probit")
} else {
  cat("Conclusión: El modelo con menor AIC/BIC es el preferido, es decir el modelo logit")
}
Conclusión: El modelo con menor AIC/BIC es el preferido, es decir el modelo probit

Análisis: Tanto AIC como BIC penalizan la complejidad del modelo. Si un modelo tiene menor AIC y BIC, indica que se ajusta mejor a los datos sin sobreajustar. Esta comparación permite elegir entre modelos que tienen diferente estructura pero explican el mismo fenómeno.

8. Efectos marginales y matriz para Probit (comparativo)

# Efectos marginales para modelo logit
marg_logit <- margins(modelo_final)
summary(marg_logit)
    factor     AME     SE       z      p   lower   upper
 anios_esc -0.0013 0.0008 -1.5961 0.1105 -0.0029  0.0003
      edad  0.0056 0.0005 10.3517 0.0000  0.0045  0.0066
    lingrl  0.0003 0.0012  0.2362 0.8133 -0.0021  0.0027
    medico -0.0325 0.0088 -3.7021 0.0002 -0.0496 -0.0153
   t_hijos  0.0078 0.0032  2.4256 0.0153  0.0015  0.0140
# Efectos marginales para modelo probit
marg_probit <- margins(modelo_probit)
summary(marg_probit)
    factor     AME     SE       z      p   lower   upper
 anios_esc -0.0013 0.0008 -1.5827 0.1135 -0.0029  0.0003
      edad  0.0057 0.0005 10.3586 0.0000  0.0046  0.0067
    lingrl  0.0002 0.0012  0.1688 0.8660 -0.0022  0.0026
    medico -0.0326 0.0089 -3.6726 0.0002 -0.0500 -0.0152
   t_hijos  0.0078 0.0033  2.4006 0.0164  0.0014  0.0142
# Matriz de confusión para modelo logit
pred_logit <- ifelse(predict(modelo_final, type = "response") > 0.5, 1, 0)
conf_matrix_logit <- table(Predicho = pred_logit, Real = as.numeric(as.character(datos$depresion_pp)))
print(conf_matrix_logit)
        Real
Predicho     0     1
       0 12828  3623

Análisis: Al comparar los efectos marginales de logit y probit podemos evaluar si las estimaciones son consistentes entre ambos. Aunque sus magnitudes cambian por la escala del modelo, las direcciones y significancia suelen coincidir si los modelos están bien especificados.

9. Conclusión

El modelo logit incluye variables relevantes como ingresos, escolaridad, edad, número de hijos y acceso a servicios de salud. Se eliminaron variables constantes que generaban colinealidad. Se validó la presencia de dos niveles en la variable dependiente antes de aplicar la curva ROC. El AUC y la exactitud indican si este modelo es predictivamente robusto. Además, se compararon los modelos logit y probit con base en criterios de información (AIC y BIC), eligiendo el que presente menor valor como el de mejor ajuste. Finalmente, se calcularon los efectos marginales de ambos modelos y se evaluó la capacidad predictiva del logit mediante matriz de confusión.