library(tidyverse) # your friend and mine
library(dagitty) # for working with DAGs
library(ggdag) # for drawing DAGs in R
3.2 — DAGs — R Practice
Required Packages
Load all the required packages we will use by running (clicking the green play button) the chunk below:
set.seed(20) # using this number means all "random" generated objects will be identical for all of us!
For each of the following examples:
- Write out all of the causal pathways from
X
(treatment of interest) toY
(outcome of interest). - Identify which variable(s) need to be controlled to estimate the causal effect of
X
onY
. You can usedagitty.net
to help you, but you should start trying to recognize these on your own! - Draw the DAGs in
r
usingggdag
. After setting up the dag withdagify()
(and specifyingexposure
andoutcome
insidedagify
), pipe that intoggdag()
. Try again piping it instead intoggdag_status()
(to highlight what is X and what is Y). Try again piping it instead intoggdag_adjustment_set()
to show what needs to be controlled.
Don’t forget to install ggdag
and dagitty
!
Question 1
Part I
Pathways:
- \(X \rightarrow Y\) (causal, front door)
- \(X \leftarrow Z \rightarrow Y\) (not causal, back door)
Part II
\(Z\) needs to be controlled for, since it is opening a backdoor path.
Part III
<- dagify(Y ~ X + Z,
dag1 ~ Z,
X 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:
- \(X \rightarrow Y\) (causal, front door)
- \(X \rightarrow M \rightarrow Y\) (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
<- dagify(Y ~ X + M,
dag2 ~ X,
M 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:
- \(X \rightarrow Y\) (causal, front door)
- \(X \leftarrow A \rightarrow Z \rightarrow Y\) (not causal, back door)
- \(X \leftarrow A \rightarrow Z \leftarrow B \rightarrow Y\) (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
<- dagify(Y ~ X + Z + B,
dag3 ~ B + A,
Z ~ A,
X 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:
- \(X \rightarrow Y\) (causal, front door)
- \(X \rightarrow C \rightarrow Y\) (causal, front door)
- \(X \leftarrow A \rightarrow Z \rightarrow B \rightarrow Y\) (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
<- dagify(Y ~ X + B + C,
dag4 ~ B + A,
Z ~ A,
X ~ X,
C 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:
- \(X \rightarrow Y\) (causal, front door)
- \(X \rightarrow Z \rightarrow Y\) (causal, front door)
- \(X \rightarrow Z \leftarrow A \rightarrow Y\) (not causal, back door)
- \(X \rightarrow Z \leftarrow B \rightarrow A \rightarrow Y\) (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
<- dagify(Y ~ X + Z + A,
dag5 ~ X + A + B,
Z ~ A,
B 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()