Learn R Programming

⚠️There's a newer version (0.2.13) of this package.Take me there.

ggdag: An R Package for visualizing and analyzing causal directed acyclic graphs

Tidy, analyze, and plot causal 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.

Installation

You can install ggdag with:

install.packages("ggdag")

Or you can install the development version from GitHub with:

# install.packages("devtools")
devtools::install_github("r-causal/ggdag")

Example

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)
library(ggplot2)

#  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 DAG with 7 nodes and 12 edges
#> #
#> # Exposure: x
#> # Outcome: y
#> #
#> # A tibble: 13 × 8
#>    name       x      y direction to       xend   yend circular
#>    <chr>  <dbl>  <dbl> <fct>     <chr>   <dbl>  <dbl> <lgl>   
#>  1 v     0.496  -3.40  ->        z1     1.83   -2.92  FALSE   
#>  2 v     0.496  -3.40  ->        z2     0.0188 -2.08  FALSE   
#>  3 w1    1.73   -1.94  ->        x      2.07   -1.42  FALSE   
#>  4 w1    1.73   -1.94  ->        y      1.00   -0.944 FALSE   
#>  5 w1    1.73   -1.94  ->        z1     1.83   -2.92  FALSE   
#>  6 w1    1.73   -1.94  <->       w2     0.873  -1.56  FALSE   
#>  7 w2    0.873  -1.56  ->        x      2.07   -1.42  FALSE   
#>  8 w2    0.873  -1.56  ->        y      1.00   -0.944 FALSE   
#>  9 w2    0.873  -1.56  ->        z2     0.0188 -2.08  FALSE   
#> 10 x     2.07   -1.42  ->        y      1.00   -0.944 FALSE   
#> 11 y     1.00   -0.944 <NA>      <NA>  NA      NA     FALSE   
#> 12 z1    1.83   -2.92  ->        x      2.07   -1.42  FALSE   
#> 13 z2    0.0188 -2.08  ->        y      1.00   -0.944 FALSE

#  using more R-like syntax to create the same DAG
tidy_ggdag <- dagify(
  y ~ x + z2 + w2 + w1,
  x ~ z1 + w1 + w2,
  z1 ~ w1 + v,
  z2 ~ w2 + v,
  w1 ~ ~w2, # bidirected path
  exposure = "x",
  outcome = "y"
) %>%
  tidy_dagitty()

tidy_ggdag
#> # A DAG with 7 nodes and 12 edges
#> #
#> # Exposure: x
#> # Outcome: y
#> #
#> # A tibble: 13 × 8
#>    name      x     y direction to     xend  yend circular
#>    <chr> <dbl> <dbl> <fct>     <chr> <dbl> <dbl> <lgl>   
#>  1 v     -3.58  3.30 ->        z1    -4.05  4.63 FALSE   
#>  2 v     -3.58  3.30 ->        z2    -2.23  3.74 FALSE   
#>  3 w1    -3.03  5.74 ->        x     -3.20  5.14 FALSE   
#>  4 w1    -3.03  5.74 ->        y     -1.98  5.22 FALSE   
#>  5 w1    -3.03  5.74 ->        z1    -4.05  4.63 FALSE   
#>  6 w1    -3.03  5.74 <->       w2    -2.35  4.72 FALSE   
#>  7 w2    -2.35  4.72 ->        x     -3.20  5.14 FALSE   
#>  8 w2    -2.35  4.72 ->        y     -1.98  5.22 FALSE   
#>  9 w2    -2.35  4.72 ->        z2    -2.23  3.74 FALSE   
#> 10 x     -3.20  5.14 ->        y     -1.98  5.22 FALSE   
#> 11 y     -1.98  5.22 <NA>      <NA>  NA    NA    FALSE   
#> 12 z1    -4.05  4.63 ->        x     -3.20  5.14 FALSE   
#> 13 z2    -2.23  3.74 ->        y     -1.98  5.22 FALSE

ggdag also provides functionality for analyzing DAGs and plotting them in ggplot2:

ggdag(tidy_ggdag) +
  theme_dag()
ggdag_adjustment_set(tidy_ggdag, node_size = 14) +
  theme(legend.position = "bottom")

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(end_cap = ggraph::circle(10, "mm")) +
  geom_dag_collider_edges() +
  geom_dag_point() +
  geom_dag_text(col = "white") +
  theme_dag() +
  scale_adjusted() +
  expand_plot(expand_y = expansion(c(0.2, 0.2))) +
  scale_color_viridis_d(
    name = "d-relationship",
    na.value = "grey85",
    begin = .35
  )

And common structures of bias:

ggdag_equivalent_dags(confounder_triangle())

ggdag_butterfly_bias(edge_type = "diagonal")

Copy Link

Version

Install

install.packages('ggdag')

Monthly Downloads

4,115

Version

0.2.12

License

MIT + file LICENSE

Issues

Pull Requests

Stars

Forks

Maintainer

Malcolm Barrett

Last Published

March 8th, 2024

Functions in ggdag (0.2.12)

expand_plot

Quickly scale the size of a ggplot
Assess d-separation between variables

D-relationship between variables
Equivalent DAGs and Classes

Generating Equivalent Models
fortify

Fortify a tidy_dagitty object for ggplot2
geom_dag_collider_edges

Edges for paths activated by stratification on colliders
dag

Create a dagitty DAG
dagify

Create a dagitty DAG using R-like syntax
dplyr

Dplyr verb methods for tidy_dagitty objects
geom_dag_edges

Directed and bidirected DAG edges
DAG Edges

Directed DAG edges
Exogenous Variables

Find Exogenous Variables
is.tidy_dagitty

Test for object class for tidy_dagitty
Test if Variable Is Collider

Detecting colliders in DAGs
ggdag

Quickly plot a DAG in ggplot2
ggplot.tidy_dagitty

Create a new ggplot
Instrumental Variables

Find Instrumental Variables
print.tidy_dagitty

Print a tidy_dagitty
%>%

Pipe operator
ggdag_classic

Quickly plot a DAG in ggplot2
pull_dag

Pull components from DAG objects
geom_dag_label

Node text labels
DAG Labels

DAG labels
Quick Plots for Common DAGs

Quickly create a DAGs with common structures of bias
reexports

Objects exported from other packages
Nodes

DAG Nodes
time_ordered_coords

Create a time-ordered coordinate data frame
is_confounder

Assess if a variable confounds a relationship
Assess familial relationships between variables

Familial relationships between variables
simulate_data

Simulate Data from Structural Equation Model
ggrepel functions

Repulsive textual annotations
geom_dag_text

Node text
ggdag-package

ggdag: Analyze and Create Elegant Directed Acyclic Graphs
Variable Status

Find variable status
theme_dag_blank

Minimalist DAG themes
tbl_df.tidy_daggity

Convert a tidy_dagitty object to tbl_df
scale_adjusted

Common scale adjustments for DAGs
Pathways

Find Open Paths Between Variables
theme_dag_grey

Simple grey themes for DAGs
remove_axes

Quickly remove plot axes and grids
tidy_dagitty

Tidy a dagitty object
as_tidy_dagitty

Convert objects into tidy_dagitty objects
as.data.frame.tidy_dagitty

Convert a tidy_dagitty object to data.frame
Covariate Adjustment Sets

Covariate Adjustment Sets
as_tbl_graph

Convert DAGS to tidygraph
activate_collider_paths

Activate paths opened by stratifying on a collider
Colliders

Find colliders
as.tbl.tidy_daggity

Convert a tidy_dagitty object to tbl
Canonicalize DAGs

Canonicalize a DAG
Adjust for variables

Adjust for variables and activate any biasing paths that result
coordinates

Manipulate DAG coordinates