Tidy, analyze, and plot directed acyclic graphs (DAGs). ggdag
uses the
powerful dagitty
package to create and analyze structural causal
models and plot them using ggplot2
and ggraph
in a consistent and
easy manner.
You can install ggdag
with:
install.packages("ggdag")
Or you can install the development version from GitHub with:
# install.packages("devtools")
devtools::install_github("malcolmbarrett/ggdag")
ggdag
makes it easy to use dagitty
in the context of the tidyverse.
You can directly tidy dagitty
objects or use convenience functions to
create DAGs using a more R-like syntax:
library(ggdag)
# example from the dagitty package
dag <- dagitty::dagitty( "dag {
y <- x <- z1 <- v -> z2 -> y
z1 <- w1 <-> w2 -> z2
x <- w1 -> y
x <- w2 -> y
x [exposure]
y [outcome]
}")
tidy_dag <- tidy_dagitty(dag)
tidy_dag
#> # A tibble: 13 x 8
#> name x y direction to xend yend circular
#> <chr> <dbl> <dbl> <fct> <chr> <dbl> <dbl> <lgl>
#> 1 v 11.8 8.03 -> z1 10.4 7.77 FALSE
#> 2 v 11.8 8.03 -> z2 12.1 6.66 FALSE
#> 3 w1 10.2 6.85 -> x 9.95 6.28 FALSE
#> 4 w1 10.2 6.85 -> y 11.1 6.39 FALSE
#> 5 w1 10.2 6.85 -> z1 10.4 7.77 FALSE
#> 6 w1 10.2 6.85 <-> w2 10.9 5.75 FALSE
#> 7 w2 10.9 5.75 -> x 9.95 6.28 FALSE
#> 8 w2 10.9 5.75 -> y 11.1 6.39 FALSE
#> 9 w2 10.9 5.75 -> z2 12.1 6.66 FALSE
#> 10 x 9.95 6.28 -> y 11.1 6.39 FALSE
#> 11 z1 10.4 7.77 -> x 9.95 6.28 FALSE
#> 12 z2 12.1 6.66 -> y 11.1 6.39 FALSE
#> 13 y 11.1 6.39 <NA> <NA> NA NA FALSE
# using more R-like syntax to create the same DAG
tidy_ggdag <- dagify(y ~ x + z2 + w2 + w1,
x ~ z1 + w1,
z1 ~ w1 + v,
z2 ~ w2 + v,
w1 ~~ w2, # bidirected path
exposure = "x",
outcome = "y") %>% tidy_dagitty()
tidy_ggdag
#> # A tibble: 12 x 8
#> name x y direction to xend yend circular
#> <chr> <dbl> <dbl> <fct> <chr> <dbl> <dbl> <lgl>
#> 1 v 7.25 17.2 -> z1 7.59 18.5 FALSE
#> 2 v 7.25 17.2 -> z2 8.57 16.8 FALSE
#> 3 w1 9.03 18.7 -> x 8.35 19.3 FALSE
#> 4 w1 9.03 18.7 -> y 8.93 18.0 FALSE
#> 5 w1 9.03 18.7 -> z1 7.59 18.5 FALSE
#> 6 w1 9.03 18.7 <-> w2 9.68 17.5 FALSE
#> 7 w2 9.68 17.5 -> y 8.93 18.0 FALSE
#> 8 w2 9.68 17.5 -> z2 8.57 16.8 FALSE
#> 9 x 8.35 19.3 -> y 8.93 18.0 FALSE
#> 10 z1 7.59 18.5 -> x 8.35 19.3 FALSE
#> 11 z2 8.57 16.8 -> y 8.93 18.0 FALSE
#> 12 y 8.93 18.0 <NA> <NA> NA NA FALSE
ggdag
also provides functionality for analyzing DAGs and plotting them
in ggplot2
:
ggdag(tidy_ggdag)
ggdag_adjustment_set(tidy_ggdag)
As well as geoms and other functions for plotting them directly in
ggplot2
:
dagify(m ~ x + y) %>%
tidy_dagitty() %>%
node_dconnected("x", "y", controlling_for = "m") %>%
ggplot(aes(x = x, y = y, xend = xend, yend = yend, shape = adjusted, col = d_relationship)) +
geom_dag_edges(aes(end_cap = ggraph::circle(10, "mm"))) +
geom_dag_collider_edges() +
geom_dag_node() +
geom_dag_text(col = "white") +
theme_dag() +
scale_dag(expand_y = expand_scale(c(0.2, 0.2)))
And common structures of bias:
ggdag_equivalent_dags(confounder_triangle())
ggdag_butterfly_bias(edge_type = "diagonal")