Please cite the 'maxLik' package as:
Henningsen, Arne and Toomet, Ott (2011). maxLik: A package for maximum likelihood estimation in R. Computational Statistics 26(3), 443-458. DOI 10.1007/s00180-010-0217-1.
If you have questions, suggestions, or comments regarding the 'maxLik' package, please use a forum or 'tracker' at maxLik's R-Forge site:
https://r-forge.r-project.org/projects/maxlik/
library(msm)library(car)
Cargando paquete requerido: carData
Adjuntando el paquete: 'car'
The following object is masked from 'package:VGAM':
logit
# Leer los datos (ajustar la ruta del archivo)data <-read_dta("Data1_R.dta")# Ver distribución de la variable dependientetable(data$intensidad_dpp) # variable ordinal
1 2 3
12828 1790 1833
2 Ejemplo 1: Modelo Probit Ordenado
# Estimación del modelo probit ordenadoprobitord <-Rchoice(intensidad_dpp ~ lingrl + anios_esc + edad + t_hijos + etnia + area, data = data, na.action = na.omit, family =ordinal("probit"))summary(probitord)
Model: ordinal
Model estimated on: sáb jun 07 11:23:36 2025
Call:
Rchoice(formula = intensidad_dpp ~ lingrl + anios_esc + edad +
t_hijos + etnia + area, data = data, na.action = na.omit,
family = ordinal("probit"), method = "bfgs")
Frequencies of categories:
y
1 2 3
0.7798 0.1088 0.1114
The estimation took: 0h:0m:1s
Coefficients:
Estimate Std. Error z-value Pr(>|z|)
kappa.1 0.454873 0.010062 45.205 < 2e-16 ***
constant -1.404867 0.057158 -24.579 < 2e-16 ***
lingrl 0.001106 0.004054 0.273 0.7850
anios_esc -0.006361 0.002774 -2.293 0.0218 *
edad 0.020295 0.001839 11.037 < 2e-16 ***
t_hijos 0.023193 0.010864 2.135 0.0328 *
etnia 0.196005 0.034697 5.649 1.61e-08 ***
area 0.071133 0.023881 2.979 0.0029 **
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Optimization of log-likelihood by BFGS maximization
Log Likelihood: -11050
Number of observations: 16451
Number of iterations: 82
Exit of MLE: successful convergence
# Exportar resumen del modelomodelsummary(probitord,output ="modelo_probit_ord.docx",statistic ="{statistic}",stars =TRUE)
# Criterios de informaciónAIC(probitord)
[1] 22109.98
BIC(probitord)
[1] 22171.64
El modelo probitord tiene un AIC de 22109.98 y un BIC de 22171.64, lo que sirve como referencia para comparar con modelos alternativos. El modelo más adecuado será aquel con los valores de AIC y BIC más bajos entre todos los modelos considerados.
3 Efectos marginales promedio (AME)
# Preparar X y coeficientesX <-model.matrix(probitord)[, -1]coeficientes <-coef(probitord)coeficientes_1 <- coeficientes[1:ncol(X)]ai <-as.vector(X %*% coeficientes_1)deriv1 <-mean(dnorm(ai))# Función de AMEcalc_marginal <-function(pos) { gamma <- coeficientes_1[pos] ame <-round(deriv1 * gamma, 3) formula_str <-paste0("~", deriv1, "*x", pos) se <-tryCatch(round(deltamethod(as.formula(formula_str), coeficientes_1, vcov(probitord)[1:length(coeficientes_1), 1:length(coeficientes_1)]), 3),error =function(e) NA ) cil <-round(ame -1.96* se, 3) ciu <-round(ame +1.96* se, 3) pval <-round(2*pnorm(-abs(ame / se)), 3) sig <-ifelse(pval <0.001, "***", ifelse(pval <0.01, "**", ifelse(pval <0.05, "*", " ")))cbind(AME = ame, Sig = sig, SE = se, p = pval, CI_Low = cil, CI_Up = ciu)}# Calcular AMEnvars <-length(coeficientes_1)resultados_ame <-do.call(rbind, lapply(1:nvars, calc_marginal))rownames(resultados_ame) <-colnames(X)# Mostrar y guardarprint(resultados_ame)
AME Sig SE p CI_Low CI_Up
lingrl "0.002" "***" "0" "0" "0.002" "0.002"
anios_esc "-0.005" "***" "0" "0" "-0.005" "-0.005"
edad "0" NA "0" "NaN" "0" "0"
t_hijos "0" NA "0" "NaN" "0" "0"
etnia "0" NA "0" "NaN" "0" "0"
area "0" NA "0" "NaN" "0" "0"
El modelo probit ordenado muestra que solo lingrl (AME = 0.002) y anios_esc (AME = -0.005) tienen efectos marginales significativos (p < 0.001), mientras que las demás variables no presentan efectos detectables.
4 Predicción y matriz de confusión
# Definir pred_probit_ord antes de usarlopred_probit_ord <-as.vector(X %*% coeficientes_1)# Extraer umbralesumbrales <-coef(probitord)[grepl("^tau", names(coef(probitord)))]umbrales <-sort(umbrales)# Clasificar prediccionespred_clases <-cut(pred_probit_ord,breaks =c(-Inf, umbrales, Inf),labels =1:(length(umbrales) +1),right =TRUE)# Realreal_clases <-as.numeric(as.character(data$intensidad_dpp))# Matriz de confusión y exactitudconf_matrix <-table(Predicho = pred_clases, Real = real_clases)print(conf_matrix)
Real
Predicho 1 2 3
1 12828 1790 1833
exactitud <-sum(diag(conf_matrix)) /sum(conf_matrix)cat("Exactitud del modelo Probit Ordenado:", round(exactitud, 3), "\n")
Exactitud del modelo Probit Ordenado: 0.78
La matriz de confusión muestra que el modelo predice correctamente los casos de menor intensidad de depresión postparto, pero tiende a confundir los de categorías superiores. La exactitud general del modelo es del 78%, aunque se recomienda revisar otras métricas como precisión o sensibilidad debido al posible desbalance en las clases.