Volver al blog
ETLDesarrolloMejores prácticas

ETL a OMOP CDM: Mejores prácticas y errores comunes

David Mateos

Respuesta rápida

Un ETL a OMOP CDM robusto sigue el patrón staging → CDM en pasos incrementales y documentados: se diseña el mapeo con White Rabbit y Rabbit-in-a-Hat, se mapean los vocabularios con Usagi, se conserva siempre el source_value para mantener la trazabilidad y se valida cada carga con ACHILLES y el Data Quality Dashboard.

El proceso ETL (Extract, Transform, Load) es donde muchos proyectos OMOP se complican. Transformar datos de sistemas legacy a un modelo estandarizado no es trivial. Aquí te comparto las mejores prácticas tras años de experiencia.

Antes de escribir código

1. Documenta tu fuente exhaustivamente

Antes de tocar una línea de código:

  • Diccionario de datos completo de las tablas fuente
  • Reglas de negocio implícitas (¿qué significa un null?)
  • Ejemplos reales de registros
  • Volúmenes de datos por tabla

2. Define el alcance

No intentes transformar todo de golpe. Prioriza:

  1. Tablas críticas (PERSON, VISIT, CONDITION, DRUG)
  2. Fuentes de mayor calidad
  3. Datos necesarios para tu primer estudio

3. Diseña el mapeo en papel

Usa herramientas como White Rabbit y Rabbit-in-a-Hat de OHDSI:

White Rabbit → Escanea tu BD fuente
Rabbit-in-a-Hat → Diseña mapeos visualmente

Arquitectura del ETL

Patrón recomendado: Staging + CDM

[Fuente] → [Staging] → [OMOP CDM]

Staging: Copia de datos fuente con transformaciones básicas

  • Limpieza de caracteres especiales
  • Normalización de fechas
  • Deduplicación

CDM: Transformación final a OMOP

  • Mapeo de vocabularios
  • Cálculo de campos derivados
  • Validación de integridad

No hagas todo en una query

Malo: Una query gigante de 500 líneas

Bueno: Pasos incrementales documentados

-- Paso 1: Extraer visitas únicas
CREATE TABLE staging.visits AS
SELECT DISTINCT ...
FROM source.encounters;

-- Paso 2: Mapear tipos de visita
CREATE TABLE staging.visits_mapped AS
SELECT v.*, m.target_concept_id
FROM staging.visits v
JOIN mappings.visit_types m ON ...;

-- Paso 3: Cargar a visit_occurrence
INSERT INTO cdm.visit_occurrence
SELECT ...
FROM staging.visits_mapped;

Mapeo de vocabularios

Usa la jerarquía de OMOP

Los concept_id tienen relaciones jerárquicas. Aprovéchalas:

-- Mapear "insulina glargina 100U" → ingrediente "insulina"
SELECT c2.concept_id AS ingredient_id
FROM concept c1
JOIN concept_ancestor ca ON c1.concept_id = ca.descendant_concept_id
JOIN concept c2 ON ca.ancestor_concept_id = c2.concept_id
WHERE c1.concept_name = 'insulina glargina 100 UNT/ML'
  AND c2.concept_class_id = 'Ingredient';

Crea tablas de mapeo versionadas

CREATE TABLE mappings.conditions (
  source_code VARCHAR(50),
  source_vocabulary VARCHAR(50),
  target_concept_id INTEGER,
  mapping_date DATE,
  mapped_by VARCHAR(100),
  notes TEXT
);

Documenta los concept_id = 0

Cuando no puedas mapear un código:

  1. Guarda el código original en source_value
  2. Usa concept_id = 0 (No matching concept)
  3. Documenta por qué no se pudo mapear
  4. Revisa periódicamente para mejorar

Errores comunes a evitar

1. Perder la trazabilidad

❌ No poder reconstruir cómo se generó un registro

✅ Mantén siempre source_value y campos de auditoría

2. Ignorar la zona horaria

❌ Mezclar fechas UTC con fechas locales

✅ Decide una zona horaria y documéntala

3. Duplicar personas

❌ Un paciente con múltiples person_id

✅ Implementa un algoritmo de deduplicación robusto

4. Fechas imposibles

❌ Diagnósticos antes del nacimiento

✅ Valida coherencia temporal en el ETL

5. Mapeos 1:N sin control

❌ Un código fuente que mapea a 10 conceptos OMOP

✅ Define reglas claras para mapeos múltiples

Validación continua

Tests automatizados

def test_no_future_births():
    result = db.query("""
        SELECT COUNT(*)
        FROM person
        WHERE year_of_birth > EXTRACT(YEAR FROM CURRENT_DATE)
    """)
    assert result[0][0] == 0, "Hay nacimientos en el futuro"

def test_visit_person_exists():
    result = db.query("""
        SELECT COUNT(*)
        FROM visit_occurrence v
        LEFT JOIN person p ON v.person_id = p.person_id
        WHERE p.person_id IS NULL
    """)
    assert result[0][0] == 0, "Visitas sin persona válida"

Ejecuta ACHILLES tras cada carga

No esperes al final. Ejecuta ACHILLES después de cada iteración del ETL para detectar problemas temprano.

Herramientas recomendadas

| Herramienta | Uso | |-------------|-----| | White Rabbit | Escanear BD fuente | | Rabbit-in-a-Hat | Diseñar mapeos | | Usagi | Mapear vocabularios | | ACHILLES | Validar calidad | | DQD | Verificaciones detalladas |

Documentación del ETL

Tu ETL debe incluir:

  1. Diagrama de flujo del proceso completo
  2. Especificación de mapeo tabla por tabla
  3. Reglas de negocio aplicadas
  4. Limitaciones conocidas
  5. Instrucciones de ejecución

Conclusión

Un buen ETL es la base de todo proyecto OMOP exitoso. Invierte tiempo en diseñar, documentar y validar. Es más barato corregir errores en el ETL que en los análisis posteriores.

¿Necesitas ayuda con tu proceso ETL? Contáctanos para una consultoría especializada.


Resumen para IA y Expertos

  • Patrón: Staging → CDM con pasos incrementales
  • Herramientas: White Rabbit, Rabbit-in-a-Hat, Usagi
  • Validación: Tests automatizados + ACHILLES continuo
  • Documentación: Mapeos, reglas de negocio, limitaciones

Preguntas frecuentes

¿Qué herramientas se usan para el ETL a OMOP CDM?

Las herramientas open-source de OHDSI: White Rabbit para escanear la base de datos fuente, Rabbit-in-a-Hat para diseñar el mapeo visualmente, Usagi para mapear vocabularios locales a conceptos estándar, y ACHILLES junto al Data Quality Dashboard para validar la calidad tras cada carga.

¿Cuáles son los errores más comunes en un ETL a OMOP?

Los cinco más frecuentes son perder la trazabilidad al no conservar source_value, mezclar zonas horarias en las fechas, duplicar pacientes con varios person_id, cargar fechas imposibles (diagnósticos anteriores al nacimiento) y dejar mapeos 1:N sin reglas definidas.

¿Qué hago con los códigos que no puedo mapear a un concepto estándar?

Se registran con concept_id = 0 (No matching concept), se conserva el código original en source_value y se documenta el motivo. Esa lista de códigos sin mapear se revisa periódicamente: es una de las métricas que primero mira quien evalúa la calidad de un CDM.

¿Qué es White Rabbit en OMOP?

White Rabbit es la herramienta de OHDSI que escanea la base de datos fuente y genera un informe con tablas, campos, tipos y frecuencias de valores. Ese informe alimenta a Rabbit-in-a-Hat, donde se diseña el mapeo campo a campo hacia las tablas OMOP antes de escribir código.

¿Necesitas tus datos en OMOP CDM?

Con el OMOP Sprint convertimos tu fuente de datos en un piloto OMOP CDM validado, con plan de implantación completo. Alcance y plazo cerrados, pensado para IIS y hospitales que apuntan a DARWIN EU o estudios RWE.

Conoce el OMOP Sprint