---
title: "Introducción a ciecl: CIE-10 Chile en R"
author: "Rodolfo Tasso Suazo"
date: "`r Sys.Date()`"
output: rmarkdown::html_vignette
vignette: >
%\VignetteIndexEntry{Introducción a ciecl: CIE-10 Chile en R}
%\VignetteEngine{knitr::rmarkdown}
%\VignetteEncoding{UTF-8}
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(
collapse = TRUE,
comment = "#>",
fig.width = 7,
fig.height = 5
)
library(ciecl)
```
> **Versión 0.9.8**: Disponible en CRAN con optimizaciones SQLite, soporte XLSX y argumentos estandarizados en inglés.
## El problema: codificar diagnósticos en Chile
Los sistemas de información sanitaria chilenos —DEIS, GRD, REM— almacenan diagnósticos usando la clasificación CIE-10 en su versión oficial MINSAL/DEIS v2018. Trabajar con estos datos en R sin una referencia local obliga al analista a consultar PDFs, tablas Excel o sitios web, interrumpiendo el flujo de análisis.
`ciecl` resuelve este problema: incorpora los **39.877 códigos CIE-10** del catálogo oficial directamente en R, con funciones de búsqueda rápida, expansión jerárquica y cálculo de índices de comorbilidad.
## Instalación
El paquete está disponible en CRAN. Para instalar la versión estable:
```{r eval=FALSE}
install.packages("ciecl")
```
Para la versión de desarrollo, que incluye las funcionalidades más recientes antes de su paso a CRAN:
```{r eval=FALSE}
# Requiere el paquete pak para una gestión eficiente de dependencias
pak::pak("ropensci/ciecl")
```
## Consultas SQL directas al catálogo
La función `cie10_sql()` permite interactuar directamente con la base de datos
SQLite interna. Esto otorga una gran flexibilidad para realizar filtros
complejos que no están cubiertos por las funciones predefinidas, utilizando
toda la potencia del lenguaje SQL.
El siguiente ejemplo extrae los primeros cinco códigos de diabetes tipo 2 (categoría E11):
```{r}
cie10_sql("SELECT codigo, descripcion FROM cie10 WHERE codigo LIKE 'E11%' LIMIT 5")
```
Por razones de seguridad y para preservar la integridad del estándar, la
función solo permite consultas de tipo `SELECT`. Esto asegura que el catálogo
permanezca como una fuente de verdad inmutable durante el análisis.
## Búsqueda por código conocido
Cuando el analista ya dispone de los códigos —como ocurre habitualmente en los
registros de egreso hospitalario—, `cie_lookup()` permite recuperar la
descripción oficial de forma instantánea. Esta función actúa como el puente
necesario entre la codificación técnica y la interpretación clínica.
```{r}
# Recuperar un código único
cie_lookup("E11.0")
```
La función es totalmente vectorizada, lo que facilita su integración en
pipelines de procesamiento masivo. Devuelve un objeto `tibble` con una
estructura consistente:
```{r}
# Múltiples códigos de distintos capítulos en una sola llamada
cie_lookup(c("E11.0", "I10", "Z00", "J44.0"))
```
En investigaciones que operan a nivel de categoría (los primeros tres
dígitos), el argumento `expand = TRUE` resulta fundamental, ya que desglosa
la jerarquía completa de una familia de códigos:
```{r}
cie_lookup("E11", expand = TRUE)
```
## Obtener descripciones para reportes
Si el objetivo es simplemente enriquecer una tabla existente con glosas
descriptivas (por ejemplo, para leyendas de gráficos o reportes rápidos),
`cie_describe()` es la opción más eficiente. Retorna un vector de caracteres
que mantiene el orden original de la entrada.
```{r}
cie_describe(c("E11.0", "I10"))
```
Este enfoque optimiza el uso de memoria al evitar joins complejos, permitiendo
operaciones fluidas dentro de un flujo `dplyr`:
```{r}
library(dplyr)
egresos <- data.frame(
id = 1:4,
codigo_diag = c("E11.0", "I10", "J44.0", "E11.0")
)
egresos |>
mutate(descripcion = cie_describe(codigo_diag))
```
## Búsqueda por texto con tolerancia a errores
Los datos clínicos de texto libre suelen presentar variaciones ortográficas,
omisión de tildes o abreviaturas que dificultan la unión exacta. `cie_search()`
utiliza el algoritmo Jaro-Winkler para encontrar la correspondencia más cercana
en el catálogo oficial.
El parámetro `threshold` (umbral) permite ajustar la sensibilidad de la
búsqueda. Un valor de `0.75` suele ser un buen compromiso para el idioma
español, permitiendo capturar errores comunes sin introducir demasiado ruido:
```{r}
# Búsqueda tolerante: "diabetis" en lugar de "diabetes"
cie_search("diabetis con coma", threshold = 0.75)
```
El resultado incluye un `score` de similitud, lo que permite al analista
evaluar la confiabilidad de la coincidencia de forma cuantitativa.
## Comorbilidades de Charlson y Elixhauser
Para la investigación epidemiológica, la estratificación del riesgo es un paso
crítico. `cie_comorbid()` simplifica el cálculo de los índices de Charlson y
Elixhauser, mapeando automáticamente los códigos CIE-10 a sus respectivas
categorías clínicas.
```{r eval=rlang::is_installed("comorbidity")}
# Requiere el paquete externo 'comorbidity'
df_pacientes <- data.frame(
id_pac = c(1, 1, 2, 2, 3),
diagnostico = c("E11.0", "I50.9", "C50.9", "N18.5", "J44.0")
)
cie_comorbid(df_pacientes, id = "id_pac", code = "diagnostico", map = "charlson")
```
El objeto resultante es una matriz de indicadores lista para ser incorporada
en modelos de regresión o análisis de supervivencia.
## Tablas formateadas para publicación
Finalmente, para la comunicación de resultados, `cie_table()` genera tablas
en formato HTML con un diseño profesional utilizando el motor de `gt`. La
función ajusta el contenido dinámicamente según la información disponible
en el catálogo (como notas de inclusión o exclusión).
```{r eval=rlang::is_installed("gt")}
# Requiere el paquete 'gt' instalado
cie_table("E11")
```
## Fuente de datos oficial
Los datos de `ciecl` son un fiel reflejo del catálogo CIE-10 para Chile,
mantenido por el Departamento de Estadísticas e Información de Salud (DEIS)
del Ministerio de Salud:
- Centro FIC Chile:
- Repositorio de Datos DEIS:
## Colaboración y Soporte
- Reporte de errores o sugerencias:
- Código fuente y documentación: