Problemática de investigación

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.

Planteamiento del problema

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.


Momento 0. Configuración e importación de datos

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)

Momento 1. Selección y construcción de variables

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

Momento 2. Estadísticos descriptivos

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

Momento 4. Modelo matemático recomendado

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


Momento 5. Validación del modelo y evaluación de supuestos

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)

Linealidad y homocedasticidad

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

Normalidad

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.


6. Exportar tablas, residuos y outliers a CSV

Con el fin de contenerlos en una carpeta junto a los anexos generados por RStudio.

6.1 Tabla resumen del modelo final

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

6.2 Residuos del modelo final

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

6.3 Outliers por residuo estandarizado

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

Exportación de resultados y reporte automático

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"

Interpretación de resultados

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.

Conclusiones

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.