1 Introducción

En epidemiología muchas veces observamos que dos cosas ocurren juntas.

Por ejemplo:

  • las personas que usan encendedor tienen más cáncer de pulmón,
  • las personas que usan paraguas suelen mojarse más.

Pero eso NO significa necesariamente que:

  • el encendedor cause cáncer,
  • el paraguas cause lluvia.

Entonces surge una pregunta importante:

¿Cómo podemos distinguir una verdadera causa de una simple asociación?

Los Diagramas Acíclicos Dirigidos (DAGs) nos ayudan a responder esa pregunta.

Un DAG es simplemente un dibujo con flechas que representa cómo creemos que las variables se relacionan entre sí.

En este tutorial aprenderemos a:

  • comprender qué es un DAG,
  • reconocer confusión,
  • identificar sesgos,
  • evitar ajustes incorrectos,
  • usar R para construir diagramas causales.

2 ¿Qué es un DAG?

Imagine un mapa de carreteras.

Cada ciudad representa una variable:

  • tabaquismo,
  • edad,
  • obesidad,
  • diabetes.

Las carreteras con flechas muestran hacia dónde viaja la influencia.

Por ejemplo:

\[ Tabaquismo \rightarrow Cáncer \]

significa:

“Fumar puede causar cáncer”.

Las flechas siempre avanzan hacia adelante.

No pueden regresar al mismo punto.

Por eso se llaman:

  • Dirigidos → tienen dirección.
  • Acíclicos → no forman círculos.
  • Grafos → son diagramas.

3 Componentes de un DAG

3.1 Nodos

Los nodos son las variables.

Ejemplos:

  • Edad
  • Tabaquismo
  • Diabetes
  • Mortalidad

3.2 Flechas

Las flechas representan relaciones causales.

\[ Ejercicio \rightarrow Pérdida\ de\ peso \]

Esto significa que el ejercicio puede producir pérdida de peso.


4 Estructuras básicas en DAGs

Existen tres estructuras fundamentales.


5 Cadena causal

\[ A \rightarrow B \rightarrow C \]

Ejemplo:

\[ Obesidad \rightarrow Hipertensión \rightarrow Infarto \]

Aquí:

  • la obesidad aumenta hipertensión,
  • la hipertensión aumenta el riesgo de infarto.

La variable del centro se llama:

mediador.


6 Confusión

\[ A \leftarrow B \rightarrow C \]

6.1 Ejemplo cotidiano

Supongamos que observamos:

  • las personas que usan chaqueta tienen más gripe.

¿La chaqueta produce gripe?

No.

La verdadera explicación es el frío:

\[ Chaqueta \leftarrow Frío \rightarrow Gripe \]

El frío:

  • hace que usemos chaqueta,
  • aumenta el riesgo de gripe.

Entonces el frío es un:

confusor.


7 Colisionador

\[ A \rightarrow B \leftarrow C \]

Los colisionadores son una de las ideas más difíciles en epidemiología.

Pero podemos entenderlos con un ejemplo sencillo.


7.1 Ejemplo

Imagine que un hospital recibe pacientes por dos razones:

  • accidentes,
  • diabetes.

Entonces:

\[ Accidente \rightarrow Hospitalización \leftarrow Diabetes \]

Ahora imagine que estudiamos SOLO personas hospitalizadas.

Dentro del hospital parecerá que:

  • las personas con accidentes tienen menos diabetes,
  • y las personas con diabetes tienen menos accidentes.

Pero esa relación es artificial.

Fue creada porque seleccionamos únicamente personas hospitalizadas.

A esto se le llama:

  • sesgo de selección,
  • sesgo de Berkson,
  • sesgo por colisionador.

8 Instalación de paquetes en R

Estos paquetes permiten crear DAGs en R.

8.1 IMPORTANTE

Ejecute esto UNA SOLA VEZ en la consola de RStudio.

install.packages("dagitty")
install.packages("ggdag")
install.packages("tidyverse")

9 Creando nuestro primer DAG

Supongamos que queremos estudiar:

¿Fumar aumenta el riesgo de cáncer?

Pero sabemos que la edad influye en ambas variables.


9.1 Código en R

dag_conf <- dagify(
  Cancer ~ Smoking + Age,
  Smoking ~ Age,
  exposure = "Smoking",
  outcome = "Cancer",
  labels = c(
    Smoking = "Tabaquismo",
    Cancer = "Cáncer",
    Age = "Edad"
  )
)

ggdag(
  dag_conf,
  text = FALSE,
  use_labels = "label"
) +
  theme_dag() +
  labs(
    title = "Confusión por Edad"
  )


9.2 Interpretación

La edad:

  • aumenta probabilidad de fumar,
  • aumenta riesgo de cáncer.

Entonces existe un camino alternativo:

\[ Tabaquismo \leftarrow Edad \rightarrow Cáncer \]

Ese camino puede engañarnos.

Por eso necesitamos ajustar por edad.


10 Caminos de puerta trasera

Un DAG puede verse como un sistema de caminos.

Algunos caminos representan:

  • efectos reales,
  • otros representan confusión.

Queremos bloquear únicamente los caminos incorrectos.


10.1 Analogía

Imagine que quiere viajar desde “Tabaquismo” hasta “Cáncer”.

Existe:

  • un camino directo,
  • pero también caminos alternativos.

Por ejemplo:

\[ Tabaquismo \leftarrow Edad \rightarrow Cáncer \]

La edad crea un camino alternativo.

Ese es un:

camino de puerta trasera (backdoor path).

Nuestro objetivo es bloquearlo.


11 Ajustar variables: ¿siempre ayuda?

Muchos estudiantes creen que:

“entre más variables ajuste, mejor”.

Pero eso NO siempre es cierto.

A veces ajustar una variable empeora el análisis.

Es parecido a arreglar cables eléctricos:

  • tocar el cable correcto ayuda,
  • tocar el cable incorrecto produce problemas.

En epidemiología:

  • ajustar confusores ayuda,
  • ajustar colisionadores produce sesgo.

12 Ejemplo de colisionador en R

dag_coll <- dagify(
  Hospital ~ Diabetes + Accident,
  
  exposure = "Diabetes",
  outcome = "Hospital",
  
  labels = c(
    Diabetes = "Diabetes",
    Accident = "Accidente",
    Hospital = "Hospitalización"
  ),
  
  coords = list(
    x = c(Diabetes = 1,
          Accident = 3,
          Hospital = 2),
    
    y = c(Diabetes = 1,
          Accident = 1,
          Hospital = 2)
  )
)

ggdag_collider(
  dag_coll,
  text = FALSE,
  use_labels = "label"
) +
  theme_dag() +
  labs(
    title = "Ejemplo de Colisionador"
  )


13 ¿Por qué ajustar un colisionador es peligroso?

Si analizamos únicamente personas hospitalizadas:

  • parecerá que accidentes y diabetes están relacionados,
  • aunque realmente no lo estén.

La asociación fue creada artificialmente.

⚠️ Idea clave:

Ajustar una variable incorrecta puede producir sesgo.


14 Ajuste mínimo suficiente

En epidemiología queremos hacer el menor ajuste necesario.

¿Por qué?

Porque:

  • medir variables cuesta dinero,
  • recolectar datos toma tiempo,
  • algunos ajustes pueden introducir sesgo.

Entonces buscamos:

el conjunto más pequeño de variables que elimina la confusión.


15 15. Encontrando el conjunto mínimo de ajuste

Supongamos que queremos estudiar:

¿El consumo de alcohol aumenta el riesgo cardiovascular?

Pero sabemos que:

  • la edad influye en el consumo de alcohol,
  • la edad también aumenta hipertensión,
  • la hipertensión aumenta el riesgo cardiovascular.

15.1 Construcción del DAG

dag_adjust <- dagify(
  Disease ~ Alcohol + Hypertension,
  Hypertension ~ Age,
  Alcohol ~ Age,
  
  exposure = "Alcohol",
  outcome = "Disease",
  
  labels = c(
    Alcohol = "Alcohol",
    Disease = "Enfermedad Cardiovascular",
    Hypertension = "Hipertensión",
    Age = "Edad"
  )
)

ggdag(
  dag_adjust,
  text = FALSE,
  use_labels = "label"
) +
  theme_dag()


15.2 Encontrando el ajuste mínimo

adjustmentSets(dag_adjust)
## { Hypertension }
## { Age }

15.3 Interpretación

R identifica qué variables debemos ajustar para bloquear los caminos de confusión.

En este caso:

  • ajustar por Edad es suficiente.

15.4 Esto significa que la Edad es un confusor importante en la relación entre alcohol y enfermedad cardiovascular.

15.5 Visualizando el ajuste

El siguiente gráfico muestra qué variable debemos controlar para evitar confusión.

ggdag_adjustment_set(
  dag_adjust,
  text = FALSE,
  use_labels = "label",
  shadow = TRUE
) +
  theme_dag()


15.6 ¿Qué observamos?

La gráfica resalta las variables necesarias para bloquear los caminos de confusión.

En este ejemplo:

  • Edad aparece como variable importante de ajuste,
  • porque influye tanto en la exposición como en el desenlace.

La idea principal es: > no necesitamos ajustar todas las variables, solamente las necesarias. —

16 Variables que NO debemos ajustar


16.1 Mediadores

\[ Ejercicio \rightarrow Peso \rightarrow Diabetes \]

Si queremos estudiar el efecto TOTAL del ejercicio:

  • NO debemos ajustar por peso.

Porque el peso forma parte del mecanismo causal.


16.2 Colisionadores

\[ Accidente \rightarrow Hospitalización \leftarrow Diabetes \]

No debemos ajustar hospitalización.


16.3 Descendientes del desenlace

Supongamos:

\[ Exposición \rightarrow Enfermedad \rightarrow Hospitalización \]

La hospitalización ocurre DESPUÉS de la enfermedad.

En muchos estudios, seleccionar únicamente pacientes hospitalizados puede producir sesgo, porque la hospitalización también puede depender de otras causas:

\[ Exposición \rightarrow Enfermedad \rightarrow Hospitalización \leftarrow Accidente \]

Aquí la hospitalización se convierte en un colisionador. Al analizar solamente hospitalizados podemos crear asociaciones artificiales entre variables que originalmente no estaban relacionadas. —

17 Ejemplo completo aplicado

17.1 Problema

Queremos estudiar:

¿Las bebidas azucaradas aumentan obesidad?

Sabemos además que:

  • la actividad física afecta obesidad,
  • la edad afecta consumo de bebidas,
  • la edad afecta obesidad.

17.2 Construcción del DAG

dag_soda <- dagify(
  Obesity ~ Soda + Exercise + Age,
  Soda ~ Age,
  exposure = "Soda",
  outcome = "Obesity",
  labels = c(
    Soda = "Bebidas Azucaradas",
    Obesity = "Obesidad",
    Exercise = "Actividad Física",
    Age = "Edad"
  )
)

ggdag(
  dag_soda,
  text = FALSE,
  use_labels = "label"
) +
  theme_dag()


17.3 Interpretación

La edad es un confusor porque:

  • afecta consumo de bebidas,
  • afecta obesidad.

Por eso debemos ajustar por edad.


18 Actividades para el estudiante

18.1 Actividad 1

Observe el DAG anterior e identifique:

  1. exposición,
  2. desenlace,
  3. confusor,
  4. posibles mediadores.

18.2 Actividad 2

Construya un DAG para estudiar:

\[ Alcohol \rightarrow Enfermedad\ cardiovascular \]

Considere:

  • edad,
  • sexo,
  • tabaquismo,
  • actividad física.

18.3 Actividad 3

Explique:

¿Por qué ajustar demasiadas variables puede ser peligroso?


19 Errores frecuentes

19.1 Error 1

Creer que asociación significa causalidad.


19.2 Error 2

Ajustar automáticamente todas las variables.


19.3 Error 3

Confundir mediadores con confusores.


19.4 Error 4

Ignorar el tiempo.

La causa debe ocurrir antes del efecto.


20 Idea clave del tutorial

Los DAGs NO reemplazan:

  • el pensamiento crítico,
  • el conocimiento clínico,
  • la teoría epidemiológica.

Un DAG es una herramienta para organizar nuestras ideas.


21 Reflexión final

Greenland, Pearl y Robins mostraron que:

antes de hacer estadística, debemos pensar causalmente.

Los DAGs nos ayudan a:

  • hacer mejores preguntas,
  • reconocer sesgos,
  • decidir qué variables ajustar,
  • evitar errores comunes.

22 Conclusión

Cada nodo en un DAG representa personas reales:

  • pacientes,
  • familias,
  • comunidades.

La epidemiología no trata únicamente de modelos matemáticos.

Su objetivo principal es:

comprender mejor los problemas de salud para ayudar a las personas.


23 Referencias

  • Greenland S, Pearl J, Robins JM. Causal diagrams for epidemiologic research. Epidemiology. 1999;10(1):37-48.
  • Hernán MA, Robins JM. Causal inference: what if. Boca Raton (FL): Chapman & Hall/CRC; 2020.
  • Pearl J. Causality: models, reasoning, and inference. 2nd ed. Cambridge: Cambridge University Press; 2009.
  • Rothman KJ, Greenland S, Lash TL. Modern epidemiology. 3rd ed. Philadelphia: Lippincott Williams & Wilkins; 2008.
  • Textor J, van der Zander B, Gilthorpe MS, Liskiewicz M, Ellison GTH. Robust causal inference using directed acyclic graphs: the R package dagitty. Int J Epidemiol. 2016;45(6):1887-94.
  • Barrett M. ggdag: Analyze and create elegant directed acyclic graphs [Internet]. CRAN; 2024 [cited 2026 May 12]. Available from: https://CRAN.R-project.org/package=ggdag

24 Funciones útiles en R

Función Utilidad
dagify() Crear DAG
ggdag() Dibujar DAG
adjustmentSets() Encontrar ajuste mínimo
ggdag_adjustment_set() Visualizar ajuste
ggdag_collider() Mostrar colisionadores