--- title: "Caso de uso: Egresos hospitalarios con ciecl" author: "Rodolfo Tasso Suazo" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Caso de uso: Egresos hospitalarios con ciecl} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include=FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) library(ciecl) library(dplyr) ``` Los registros de egresos hospitalarios en Chile (fuente DEIS) almacenan diagnosticos en formato CIE-10 sin punto (`J189`, `O800`) y en algunos casos con sufijo `X` (`I10X`, `N40X`) para indicar categorias sin subcategoria adicional. Esta convencion de codificacion dificulta unir los datos con catalogos externos que usan el formato normalizado con punto (`J18.9`, `O80.0`). Esta vignette reproduce el flujo utilizado en investigacion con datos DEIS: obtener descripciones CIE-10 para toda la base, unirlas con los registros originales, y generar perfiles de diagnostico. ## Datos de ejemplo Simulamos una base con la estructura tipica de los egresos hospitalarios DEIS. Las columnas `DIAG1` y `ANO` imitan el formato original: ```{r datos} set.seed(42) egresos <- data.frame( ID_EGRESO = 1:200, ANO = sample(2018:2022, 200, replace = TRUE), DIAG1 = sample( c( # Codigos frecuentes en egresos DEIS (sin punto, formato original) "J189", "O800", "Z380", "K359", "N390", "I10X", "J449", "E119", "O829", "J069", "K922", "N185", "I509", "C509", "A099", # Algunos con sufijo X (convencion DEIS) "N40X", "K800", "I259", "J180", "E149" ), size = 200, replace = TRUE, prob = c( 0.12, 0.10, 0.09, 0.07, 0.06, 0.08, 0.06, 0.07, 0.05, 0.04, 0.04, 0.03, 0.05, 0.03, 0.03, 0.03, 0.03, 0.04, 0.03, 0.05 ) ), stringsAsFactors = FALSE ) cat("Registros totales:", nrow(egresos), "\n") cat("Codigos unicos:", length(unique(egresos$DIAG1)), "\n") cat("Periodo:", min(egresos$ANO), "-", max(egresos$ANO), "\n\n") head(egresos) ``` ## 1. Obtener descripciones CIE-10 Filtramos registros validos y usamos `cie_lookup()` con `normalizar = TRUE` para procesar todos los codigos unicos en una sola llamada vectorizada. El argumento `normalizar = TRUE` acepta los codigos tal como vienen del sistema: sin punto, con sufijo `X`, en cualquier capitalizacion. ```{r lookup} # Filtrar registros validos (sin NA en diagnostico) datos_filtrados <- egresos %>% filter(!is.na(DIAG1)) # Codigos unicos a procesar codigos_unicos <- unique(datos_filtrados$DIAG1) cat("Codigos unicos a procesar:", length(codigos_unicos), "\n") # Busqueda vectorizada con cie_lookup inicio <- Sys.time() resultado_ciecl <- cie_lookup( codigo = codigos_unicos, normalizar = TRUE, descripcion_completa = TRUE ) tiempo <- round(as.numeric(difftime(Sys.time(), inicio, units = "secs")), 2) cat("Codigos encontrados:", nrow(resultado_ciecl), "de", length(codigos_unicos), "\n") cat("Tiempo de busqueda:", tiempo, "segundos\n") cat("Tasa de exito:", round(nrow(resultado_ciecl) / length(codigos_unicos) * 100, 1), "%\n\n") # Muestra de resultados head(resultado_ciecl[, c("codigo", "descripcion")], 5) ``` ## 2. Unir descripciones con la base de egresos Los codigos en la base DEIS no tienen punto (`J189`), pero `cie_lookup()` devuelve los codigos en formato normalizado (`J18.9`). Para el join es necesario quitar el punto y ademas eliminar el sufijo `X` que algunos codigos tienen en la base original: ```{r unir} # Tabla de lookup: codigo sin punto -> descripcion completa # cie_lookup() devuelve con punto (J18.9), la BBDD tiene sin punto (J189) tabla_lookup <- resultado_ciecl %>% mutate( codigo_sin_punto = gsub("\\.", "", codigo), DIAG_COMPLETO = paste0(codigo, " - ", descripcion) ) %>% select(codigo_sin_punto, DIAG_COMPLETO) # Funcion para normalizar el codigo de la BBDD antes del join: # 1. Quitar puntos si los hubiera # 2. Quitar sufijo X final (I10X -> I10, N40X -> N40) normalizar_codigo_bbdd <- function(codigo) { codigo <- gsub("\\.", "", codigo) codigo <- gsub("X$", "", codigo) return(codigo) } # Unir con los datos originales datos_con_desc <- datos_filtrados %>% mutate(codigo_busqueda = normalizar_codigo_bbdd(DIAG1)) %>% left_join(tabla_lookup, by = c("codigo_busqueda" = "codigo_sin_punto")) %>% mutate( DIAG_COMPLETO = if_else(is.na(DIAG_COMPLETO), DIAG1, DIAG_COMPLETO) ) %>% select(-codigo_busqueda) # Verificar resultado n_con_desc <- sum(grepl(" - ", datos_con_desc$DIAG_COMPLETO), na.rm = TRUE) pct_exito <- round(n_con_desc / nrow(datos_con_desc) * 100, 1) cat("Registros con descripcion CIE-10:", n_con_desc, "de", nrow(datos_con_desc), "\n") cat("Tasa de exito:", pct_exito, "%\n\n") # Ejemplos de diagnosticos procesados datos_con_desc %>% select(DIAG1, DIAG_COMPLETO) %>% distinct() %>% head(10) ``` ## 3. Perfil de diagnosticos Con las descripciones incorporadas calculamos la distribucion de diagnosticos y la proporcion que representa cada uno sobre el total de egresos: ```{r perfil} perfil_diag <- datos_con_desc %>% filter(grepl(" - ", DIAG_COMPLETO)) %>% count(DIAG_COMPLETO, sort = TRUE) %>% mutate( pct = round(n / sum(n) * 100, 1), pct_acum = cumsum(pct) ) cat("Top 10 diagnosticos:\n\n") head(perfil_diag, 10) ``` ```{r cobertura} top10_pct <- sum(head(perfil_diag, 10)$pct) cat("Los 10 diagnosticos mas frecuentes representan el", top10_pct, "% del total de egresos\n") ``` ## 4. Busqueda por texto Cuando no se conoce el codigo exacto, `cie_search()` encuentra diagnosticos por descripcion textual con tolerancia a errores tipograficos: ```{r busqueda_fuzzy} # Terminos clinicos comunes en egresos (con y sin typos) terminos <- c("neumonia", "diabetis", "hipertension") for (termino in terminos) { cat("Buscando:", termino, "\n") res <- cie_search(termino, threshold = 0.70, max_results = 3) if (nrow(res) > 0) { print(res[, c("codigo", "descripcion")]) } cat("\n") } ``` ## 5. Validacion de codigos Antes de procesar una base conviene identificar codigos que no corresponden a ningun diagnostico valido en el catalogo CIE-10: ```{r validacion} validos <- cie_validate_vector(codigos_unicos) cat("Codigos validos: ", sum(validos), "\n") cat("Codigos invalidos:", sum(!validos), "\n") if (any(!validos)) { cat("\nCodigos no reconocidos:\n") print(codigos_unicos[!validos]) } ``` ## Fuente de datos - Catalogo CIE-10 Chile: Centro FIC DEIS - Repositorio: