3.2 — DAGs — R Practice

Author

Answer Key

Published

October 24, 2022

Required Packages

Load all the required packages we will use by running (clicking the green play button) the chunk below:

library(tidyverse) # your friend and mine
library(dagitty) # for working with DAGs
library(ggdag) # for drawing DAGs in R
set.seed(20) # using this number means all "random" generated objects will be identical for all of us!

For each of the following examples:

  1. Write out all of the causal pathways from X (treatment of interest) to Y (outcome of interest).
  2. Identify which variable(s) need to be controlled to estimate the causal effect of X on Y. You can use dagitty.net to help you, but you should start trying to recognize these on your own!
  3. Draw the DAGs in r using ggdag. After setting up the dag with dagify() (and specifying exposure and outcome inside dagify), pipe that into ggdag(). Try again piping it instead into ggdag_status() (to highlight what is X and what is Y). Try again piping it instead into ggdag_adjustment_set() to show what needs to be controlled.

Don’t forget to install ggdag and dagitty!

Question 1

Part I

Pathways:

  1. XY (causal, front door)
  2. XZY (not causal, back door)

Part II

Z needs to be controlled for, since it is opening a backdoor path.

Part III

dag1 <- dagify(Y ~ X + Z,
       X ~ Z,
       exposure = "X",
       outcome = "Y")

dag1 %>%
  ggdag_status(seed = 1)+
  theme_dag_blank()

dag1 %>%
  ggdag_paths(seed = 1)+
  theme_dag_blank()

dag1 %>%
  ggdag_adjustment_set()+
  theme_dag_blank()

Question 2

Part I

Pathways:

  1. XY (causal, front door)
  2. XMY (causal, front door)

Part II

Nothing should be controlled for, since M is a mediator, and part of the effect of X on Y

Part III

dag2 <- dagify(Y ~ X + M,
       M ~ X,
       exposure = "X",
       outcome = "Y")

dag2 %>%
  ggdag_status(seed = 1)+
  theme_dag_blank()

dag2 %>%
  ggdag_paths(seed = 1)+
  theme_dag_blank()

dag2 %>%
  ggdag_adjustment_set()+
  theme_dag_blank()

Question 3

Part I

Pathways:

  1. XY (causal, front door)
  2. XAZY (not causal, back door)
  3. XAZBY (not causal, back door)

Part II

Backdoor path 3 is closed by the collider at Z. Backdoor path 2 remains open, so we need to control for A. (If we blocked Z to close path 2, that would open up backdoor path 3!) Only A should be controlled for.

Alternatively, we could control for B and Z.

Part III

dag3 <- dagify(Y ~ X + Z + B,
       Z ~ B + A,
       X ~ A,
       exposure = "X",
       outcome = "Y")

dag3 %>%
  ggdag_status(seed = 1)+
  theme_dag_blank()

dag3 %>%
  ggdag_paths(seed = 1)+
  theme_dag_blank()

dag3 %>%
  ggdag_adjustment_set()+
  theme_dag_blank()

Question 4

Part I

Pathways:

  1. XY (causal, front door)
  2. XCY (causal, front door)
  3. XAZBY (not causal, back door)

Part II

Path 2 is a front door path we want to leave open. Backdoor path 3 is closed by the collider at Z. Nothing needs to be controlled for!

Part III

dag4 <- dagify(Y ~ X + B + C,
       Z ~ B + A,
       X ~ A,
       C ~ X,
       exposure = "X",
       outcome = "Y")

dag4 %>%
  ggdag_status(seed = 1)+
  theme_dag_blank()

dag4 %>%
  ggdag_paths(seed = 1)+
  theme_dag_blank()

dag4 %>%
  ggdag_adjustment_set()+
  theme_dag_blank()

Question 5

Part I

Pathways:

  1. XY (causal, front door)
  2. XZY (causal, front door)
  3. XZAY (not causal, back door)
  4. XZBAY (not causal, back door)

Part II

Path 2 is a front door path we want to leave open. Backdoor path 3 is closed by the collider at Z. Backdoor path 4 is closed by the collider at Z. We don’t want to control for anything!

Part III

dag5 <- dagify(Y ~ X + Z + A,
       Z ~ X + A + B,
       B ~ A,
       exposure = "X",
       outcome = "Y")

dag5 %>%
  ggdag_status(seed = 1)+
  theme_dag_blank()

dag5 %>%
  ggdag_paths(seed = 1)+
  theme_dag_blank()

dag5 %>%
  ggdag_adjustment_set()+
  theme_dag_blank()