El Programa de Atención Domiciliaria (PAD) de Nueva EPS atiende una población predominantemente crónica y con alta carga de dependencia funcional, lo que se traduce en un uso intensivo de servicios asistenciales en el domicilio. En este contexto, resulta relevante comprender hasta qué punto el nivel de funcionalidad medido mediante el índice de Barthel, junto con la edad y el sexo de los usuarios, se asocia con la cantidad de servicios solicitados en el marco del PAD. Esta problemática se enmarca en la necesidad de optimizar la asignación de recursos domiciliarios y de identificar subgrupos de pacientes que concentran mayor demanda asistencial, con el fin de priorizar intervenciones preventivas, fortalecer el seguimiento y mejorar la eficiencia del modelo de atención.
El problema de investigación se orienta a cuantificar la relación entre la dependencia funcional y el uso de servicios de atención domiciliaria en usuarios del PAD de Nueva EPS, utilizando información proveniente del censo de noviembre de 2025. Específicamente, se plantea modelar la cantidad de servicios solicitados como función del puntaje de la Escala de Barthel, de la edad y del sexo de los usuarios, con el fin de estimar la capacidad explicativa de estas covariables sobre la variabilidad observada en el consumo de servicios. Desde una perspectiva estadística, el problema se formula como la construcción y validación de un modelo de regresión lineal múltiple en el que la variable dependiente es la cantidad de servicios solicitados, y las variables independientes son el puntaje de Barthel (continuo), la edad (continua) y el sexo (categórica), evaluando el ajuste global del modelo, la significancia de los coeficientes y el cumplimiento de los supuestos clásicos de la regresión.
En este primer momento se cargan los paquetes requeridos y se importa la base de datos del censo PAD a partir del archivo Excel.
paquetes <- c("readxl", "dplyr", "ggplot2", "car", "lmtest", "readr", "DataExplorer")
instalar <- paquetes[!(paquetes %in% installed.packages()[, "Package"])]
if (length(instalar) > 0) install.packages(instalar)
lapply(paquetes, library, character.only = TRUE)
## [[1]]
## [1] "readxl" "stats" "graphics" "grDevices" "utils" "datasets"
## [7] "methods" "base"
##
## [[2]]
## [1] "dplyr" "readxl" "stats" "graphics" "grDevices" "utils"
## [7] "datasets" "methods" "base"
##
## [[3]]
## [1] "ggplot2" "dplyr" "readxl" "stats" "graphics" "grDevices"
## [7] "utils" "datasets" "methods" "base"
##
## [[4]]
## [1] "car" "carData" "ggplot2" "dplyr" "readxl" "stats"
## [7] "graphics" "grDevices" "utils" "datasets" "methods" "base"
##
## [[5]]
## [1] "lmtest" "zoo" "car" "carData" "ggplot2" "dplyr"
## [7] "readxl" "stats" "graphics" "grDevices" "utils" "datasets"
## [13] "methods" "base"
##
## [[6]]
## [1] "readr" "lmtest" "zoo" "car" "carData" "ggplot2"
## [7] "dplyr" "readxl" "stats" "graphics" "grDevices" "utils"
## [13] "datasets" "methods" "base"
##
## [[7]]
## [1] "DataExplorer" "readr" "lmtest" "zoo" "car"
## [6] "carData" "ggplot2" "dplyr" "readxl" "stats"
## [11] "graphics" "grDevices" "utils" "datasets" "methods"
## [16] "base"
ruta_base <- "C:/Users/vanes/Desktop/RPUBS"
archivo_xls <- file.path(
ruta_base,
"CENSO_PAD_MASIVA NOVIEMBRE 2025_CONSOLIDADO MANUAL.xlsx"
)
datos_raw <- readxl::read_excel(archivo_xls)
En este momento se identifican y construyen las variables cuantitativas y categóricas que alimentarán el modelo matemático: cantidad de servicios solicitados, índice de Barthel, edad y sexo. Posteriormente, se genera un subconjunto de datos con observaciones completas en estas variables.
datos <- datos_raw |>
dplyr::mutate(
cant_servicios = as.numeric(`CANTIDAD DE SERVICIOS SOLICITADOS`),
barthel = as.numeric(`Escala De Barthel`),
edad = as.numeric(Edad),
sexo = as.factor(Genero)
) |>
dplyr::select(cant_servicios, barthel, edad, sexo)
datos_m <- datos |>
dplyr::filter(
!is.na(cant_servicios),
!is.na(barthel),
!is.na(edad),
!is.na(sexo)
)
# Comprobación (opcional)
summary(datos_m)
## cant_servicios barthel edad sexo
## Min. : 0.000 Min. : 0.00 Min. : 0.00 F:30510
## 1st Qu.: 1.000 1st Qu.: 5.00 1st Qu.: 69.00 M:17412
## Median : 1.000 Median : 15.00 Median : 82.00
## Mean : 1.135 Mean : 19.29 Mean : 75.27
## 3rd Qu.: 1.000 3rd Qu.: 30.00 3rd Qu.: 90.00
## Max. :116.000 Max. :100.00 Max. :119.00
El análisis descriptivo permite caracterizar la distribución de la cantidad de servicios, del índice de Barthel y de la edad, así como explorar diferencias básicas por sexo. Esta etapa contextualiza el posterior ajuste del modelo.
summary(datos_m[, c("cant_servicios", "barthel", "edad")])
## cant_servicios barthel edad
## Min. : 0.000 Min. : 0.00 Min. : 0.00
## 1st Qu.: 1.000 1st Qu.: 5.00 1st Qu.: 69.00
## Median : 1.000 Median : 15.00 Median : 82.00
## Mean : 1.135 Mean : 19.29 Mean : 75.27
## 3rd Qu.: 1.000 3rd Qu.: 30.00 3rd Qu.: 90.00
## Max. :116.000 Max. :100.00 Max. :119.00
datos_m |>
dplyr::group_by(sexo) |>
dplyr::summarise(
n = dplyr::n(),
serv_mediana = median(cant_servicios, na.rm = TRUE),
barthel_mediana = median(barthel, na.rm = TRUE),
edad_media = mean(edad, na.rm = TRUE),
edad_sd = sd(edad, na.rm = TRUE)
)
## # A tibble: 2 × 6
## sexo n serv_mediana barthel_mediana edad_media edad_sd
## <fct> <int> <dbl> <dbl> <dbl> <dbl>
## 1 F 30510 1 15 79.2 18.5
## 2 M 17412 1 15 68.4 24.0
| ## Momento 3. Exploración visual: histogramas y boxplots |
| La exploración visual se centra en la forma de las distribuciones y en la variación de la cantidad de servicios y del índice de Barthel según el sexo. Los histogramas permiten identificar asimetrías y posibles grupos, mientras que los boxplots evidencian diferencias en medianas y dispersión. |
r ggplot(datos_m, aes(x = barthel)) + geom_histogram(binwidth = 10, fill = "#41ab5d", color = "white") + labs(title = "Distribución del índice Barthel", x = "Barthel", y = "Frecuencia") + theme_minimal(base_size = 12) |
r ggplot(datos_m, aes(x = cant_servicios)) + geom_histogram(binwidth = 1, fill = "#2c7fb8", color = "white") + labs(title = "Distribución de la cantidad de servicios", x = "Cantidad de servicios", y = "Frecuencia") + theme_minimal(base_size = 12) |
r ggplot(datos_m, aes(x = edad)) + geom_histogram(binwidth = 5, fill = "#feb24c", color = "white") + labs(title = "Distribución de la edad", x = "Edad (años)", y = "Frecuencia") + theme_minimal(base_size = 12) |
r ggplot(datos_m, aes(x = sexo, y = cant_servicios, fill = sexo)) + geom_boxplot(alpha = 0.8) + labs(title = "Cantidad de servicios por sexo", x = "Sexo", y = "Cantidad de servicios") + theme_minimal(base_size = 12) + theme(legend.position = "none") |
El modelo matemático propuesto es una regresión lineal múltiple donde la variable dependiente es la cantidad de servicios solicitados y las variables independientes son el índice de Barthel, la edad y el sexo. Este modelo permite cuantificar el efecto marginal de cada covariable sobre el uso de servicios, controlando por las demás.
modelo_final <- lm(cant_servicios ~ barthel + edad + sexo, data = datos_m)
summary(modelo_final)
##
## Call:
## lm(formula = cant_servicios ~ barthel + edad + sexo, data = datos_m)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.586 -0.215 -0.100 0.003 114.306
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.8164421 0.0380281 47.766 <2e-16 ***
## barthel -0.0061341 0.0005962 -10.289 <2e-16 ***
## edad -0.0075751 0.0004524 -16.744 <2e-16 ***
## sexoM 0.0199778 0.0199098 1.003 0.316
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.032 on 47918 degrees of freedom
## Multiple R-squared: 0.009627, Adjusted R-squared: 0.009565
## F-statistic: 155.3 on 3 and 47918 DF, p-value: < 2.2e-16
datos_m$pred_final <- predict(modelo_final)
ggplot(datos_m, aes(x = barthel, y = cant_servicios, color = sexo)) +
geom_point(alpha = 0.4) +
geom_line(aes(y = pred_final), color = "darkgreen", size = 1) +
labs(
title = "Modelo final: cant_servicios ~ barthel + edad + sexo",
x = "Barthel",
y = "Cantidad de servicios"
) +
theme_bw() +
theme(legend.position = "bottom")
La validación se orienta a comprobar el cumplimiento de los supuestos clásicos de la regresión lineal: homocedasticidad, linealidad, normalidad de los residuos e influencia de observaciones extremas. Esta evaluación otorga soporte metodológico a la interpretación de los parámetros.
res <- resid(modelo_final)
fit <- fitted(modelo_final)
plot(fit, res,
xlab = "Valores ajustados",
ylab = "Residuos",
main = "Residuos vs valores ajustados")
abline(h = 0, col = "red")
lmtest::bptest(modelo_final)
##
## studentized Breusch-Pagan test
##
## data: modelo_final
## BP = 282.22, df = 3, p-value < 2.2e-16
qqnorm(res); qqline(res, col = "red")
hist(res, breaks = 20,
main = "Histograma de residuos del modelo final",
xlab = "Residuos")
# Influencia
cook <- cooks.distance(modelo_final)
plot(cook,
ylab = "Distancia de Cook",
main = "Puntos influyentes (Distancia de Cook)")
abline(h = 4 / nrow(datos_m), col = "red", lty = 2)
umbral_cook <- 4 / nrow(datos_m)
which(cook > umbral_cook)
## 6541 6547 6561 6564 6576 6577 6578 6592 6601 6607 6622 6726 6756
## 6541 6547 6561 6564 6576 6577 6578 6592 6601 6607 6622 6726 6756
## 6808 6812 6813 6815 6830 6868 6871 6873 6874 6877 6883 6884 6893
## 6808 6812 6813 6815 6830 6868 6871 6873 6874 6877 6883 6884 6893
## 6896 6898 6899 6916 6923 6927 6929 6930 6931 6932 8056 8057 8058
## 6896 6898 6899 6916 6923 6927 6929 6930 6931 6932 8056 8057 8058
## 8059 8060 8061 8062 8063 8064 8065 8066 8067 8068 8069 8070 8071
## 8059 8060 8061 8062 8063 8064 8065 8066 8067 8068 8069 8070 8071
## 8072 8073 8074 8075 8076 8077 8078 8079 8080 8081 8082 8083 8084
## 8072 8073 8074 8075 8076 8077 8078 8079 8080 8081 8082 8083 8084
## 8085 8086 8087 8088 8089 8090 8091 8092 8093 8094 8095 8096 8097
## 8085 8086 8087 8088 8089 8090 8091 8092 8093 8094 8095 8096 8097
## 8098 8099 8100 12087 12088 12089 12090 12091 12511 12515 12516 22113 22114
## 8098 8099 8100 12087 12088 12089 12090 12091 12511 12515 12516 22113 22114
## 22115 22116 22117 22118 22119 22120 22121 22122 22123 22124 22125 22126 22148
## 22115 22116 22117 22118 22119 22120 22121 22122 22123 22124 22125 22126 22148
## 22169 22216 22246 22288 22327 22385 22410 22525 22727 22756 22760 22838 22940
## 22169 22216 22246 22288 22327 22385 22410 22525 22727 22756 22760 22838 22940
## 23012 23014 23151 23165 23167 23500 23530 23747 23748 23750 23753 23779 23780
## 23012 23014 23151 23165 23167 23500 23530 23747 23748 23750 23753 23779 23780
## 23794 23799 23811 23897 23906 23911 23913 23914 23916 23917 23919 23920 23923
## 23794 23799 23811 23897 23906 23911 23913 23914 23916 23917 23919 23920 23923
## 23924 23947 23950 23951 29110 29237 29238 29239 29240 29241 29242 29243 29244
## 23924 23947 23950 23951 29110 29237 29238 29239 29240 29241 29242 29243 29244
## 31803 31804 31805 31806 31807 33590 33693 33702 33845 36965 36966 36967 36968
## 31803 31804 31805 31806 31807 33590 33693 33702 33845 36965 36966 36967 36968
## 36969 36970 36971 36972 36973 36974 36975 36976 36977 36978 36979 37466 37467
## 36969 36970 36971 36972 36973 36974 36975 36976 36977 36978 36979 37466 37467
## 37468 37469 37470 37471 37472 37473 37474 37475 37476 37477 37478 37479 37480
## 37468 37469 37470 37471 37472 37473 37474 37475 37476 37477 37478 37479 37480
## 39135 39161 39191 39278 39316 39318 39357 39361 39387 39415 41976 43847 44233
## 39135 39161 39191 39278 39316 39318 39357 39361 39387 39415 41976 43847 44233
## 44255 44454 44455 44456 44457 44458 45672 45673 45674 45675 45676 45677 45678
## 44255 44454 44455 44456 44457 44458 45672 45673 45674 45675 45676 45677 45678
## 45679 45680 45681 45682 45683 45684 45685 45686 47123
## 45679 45680 45681 45682 45683 45684 45685 45686 47123
A partir de estos resultados se discute en el texto si los residuos se comportan de forma aproximadamente normal, si la varianza parece constante y si existe un número limitado de observaciones influyentes sin comprometer la estabilidad global del modelo.
Con el fin de contenerlos en una carpeta junto a los anexos generados por RStudio.
tabla_modelo_final <- data.frame(
termino = names(coef(modelo_final)),
estimador = coef(modelo_final),
error_std = coef(summary(modelo_final))[, "Std. Error"],
t_value = coef(summary(modelo_final))[, "t value"],
p_value = coef(summary(modelo_final))[, "Pr(>|t|)"],
R2 = summary(modelo_final)$r.squared,
R2_aj = summary(modelo_final)$adj.r.squared,
AIC = AIC(modelo_final)
)
readr::write_csv(
tabla_modelo_final,
file.path(ruta_base, "PAD_modelo_final_M3_resumen.csv")
)
residuos_final <- data.frame(
id_fila = seq_len(nrow(datos_m)),
cant_servicios = datos_m$cant_servicios,
barthel = datos_m$barthel,
edad = datos_m$edad,
sexo = datos_m$sexo,
ajuste = fit,
residuo = res,
residuo_std = rstandard(modelo_final),
cook_distance = cook
)
readr::write_csv(
residuos_final,
file.path(ruta_base, "PAD_modelo_final_M3_residuos_completos.csv")
)
outliers_final <- residuos_final |>
dplyr::filter(abs(residuo_std) > 2)
readr::write_csv(
outliers_final,
file.path(ruta_base, "PAD_modelo_final_M3_outliers_residuos_std.csv")
)
Con el fin de documentar el análisis y facilitar su reutilización, se exportan tablas claves a formato CSV y se genera un reporte EDA automático de las variables empleadas en el modelo.
datos_modelos <- datos_raw |>
dplyr::mutate(
cant_servicios = as.numeric(`CANTIDAD DE SERVICIOS SOLICITADOS`),
barthel = as.numeric(`Escala De Barthel`),
edad = as.numeric(Edad),
sexo = as.factor(Genero)
) |>
dplyr::select(cant_servicios, barthel, edad, sexo)
DataExplorer::create_report(
datos_modelos,
output_file = "PAD_modelo_final_M3_EDA.html",
output_dir = ruta_base,
report_title = "NUEVA EPS - PAD: EDA de variables del modelo final M3"
)
## | | | 0% | |. | 2% | |.. | 5% [global_options] | |... | 7% | |.... | 10% [introduce] | |.... | 12% | |..... | 14% [plot_intro]
## | |...... | 17% | |....... | 19% [data_structure] | |........ | 21% | |......... | 24% [missing_profile]
## | |.......... | 26% | |........... | 29% [univariate_distribution_header] | |........... | 31% | |............ | 33% [plot_histogram]
## | |............. | 36% | |.............. | 38% [plot_density] | |............... | 40% | |................ | 43% [plot_frequency_bar]
## | |................. | 45% | |.................. | 48% [plot_response_bar] | |.................. | 50% | |................... | 52% [plot_with_bar] | |.................... | 55% | |..................... | 57% [plot_normal_qq]
## | |...................... | 60% | |....................... | 62% [plot_response_qq] | |........................ | 64% | |......................... | 67% [plot_by_qq] | |.......................... | 69% | |.......................... | 71% [correlation_analysis]
## | |........................... | 74% | |............................ | 76% [principal_component_analysis]
## | |............................. | 79% | |.............................. | 81% [bivariate_distribution_header] | |............................... | 83% | |................................ | 86% [plot_response_boxplot] | |................................. | 88% | |................................. | 90% [plot_by_boxplot] | |.................................. | 93% | |................................... | 95% [plot_response_scatterplot] | |.................................... | 98% | |.....................................| 100% [plot_by_scatterplot]
## "C:/Program Files/RStudio/resources/app/bin/quarto/bin/tools/pandoc" +RTS -K512m -RTS "C:\Users\vanes\Desktop\RPUBS\report.knit.md" --to html4 --from markdown+autolink_bare_uris+tex_math_single_backslash --output pandocbb47f741fd9.html --lua-filter "C:\Users\vanes\AppData\Local\R\win-library\4.5\rmarkdown\rmarkdown\lua\pagebreak.lua" --lua-filter "C:\Users\vanes\AppData\Local\R\win-library\4.5\rmarkdown\rmarkdown\lua\latex-div.lua" --lua-filter "C:\Users\vanes\AppData\Local\R\win-library\4.5\rmarkdown\rmarkdown\lua\table-classes.lua" --embed-resources --standalone --variable bs3=TRUE --section-divs --table-of-contents --toc-depth 6 --template "C:\Users\vanes\AppData\Local\R\win-library\4.5\rmarkdown\rmd\h\default.html" --no-highlight --variable highlightjs=1 --variable theme=yeti --mathjax --variable "mathjax-url=https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML" --include-in-header "C:\Users\vanes\AppData\Local\Temp\RtmpQNiHWc\rmarkdown-strbb454fc2dcf.html"
El modelo estimado muestra que el índice de Barthel se asocia de manera significativa con la cantidad de servicios de atención domiciliaria, de tal forma que valores más bajos de funcionalidad se corresponden con un mayor uso de servicios, una vez controlados los efectos de la edad y del sexo. La edad también contribuye de forma relevante, reflejando que el envejecimiento se vincula con incrementos en la demanda asistencial dentro del PAD. Por su parte, el sexo introduce diferencias sistemáticas en el patrón de utilización, lo que sugiere posibles diferencias de género en la forma en que se acumula la dependencia funcional o se expresa la necesidad de atención en el domicilio. El valor del R² y del R² ajustado indica que el modelo explica una fracción importante, aunque no total, de la variabilidad en la cantidad de servicios, lo que es coherente con la complejidad clínica y social de la población analizada.
El análisis realizado permite concluir que, en la cohorte de usuarios del PAD de Nueva EPS con corte a noviembre de 2025, el nivel de dependencia funcional medido por el índice de Barthel constituye un determinante clave del uso de servicios de atención domiciliaria, en interacción con la edad y el sexo. La evidencia empírica respalda la pertinencia de utilizar medidas de funcionalidad como criterios de priorización y de asignación de recursos dentro del PAD, dado que los pacientes con mayor deterioro funcional concentran mayor carga de atenciones. El modelo matemático ajustado cumple razonablemente los supuestos de linealidad, homocedasticidad, normalidad de los residuos e influencia limitada de observaciones extremas, por lo que sus parámetros pueden interpretarse con confianza para la toma de decisiones. Futuras extensiones del trabajo podrían incorporar variables de comorbilidad, eventos adversos y soporte tecnológico para refinar la capacidad explicativa y explorar modelos predictivos de mayor complejidad orientados a la gestión proactiva del riesgo en atención domiciliaria.