Analyze and Create Elegant Directed Acyclic Graphs

Tidy, analyze, and plot directed acyclic graphs (DAGs). 'ggdag' is built on top of 'dagitty', an R package that uses the 'DAGitty' web tool (< http://dagitty.net>) for creating and analyzing DAGs. 'ggdag' makes it easy to tidy and plot 'dagitty' objects using 'ggplot2' and 'ggraph', as well as common analytic and graphical functions, such as determining adjustment sets and node relationships.


Travis-CI BuildStatus AppVeyor Buildstatus

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.

Installation

You can install ggdag from GitHub with:

# install.packages("devtools")
devtools::install_github("malcolmbarrett/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)
 
#  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")

News

Reference manual

It appears you don't have a PDF plugin for this browser. You can click here to download the reference manual.

install.packages("ggdag")

0.1.0 by Malcolm Barrett, a year ago


https://ggdag.netlify.com https://github.com/malcolmbarrett/ggdag


Report a bug at https://github.com/malcolmbarrett/ggdag/issues


Browse source code at https://github.com/cran/ggdag


Authors: Malcolm Barrett [aut, cre]


Documentation:   PDF Manual  


MIT + file LICENSE license


Imports dagitty, ggraph, dplyr, purrr, stringr, tibble, forcats, ggrepel, igraph, magrittr, ggforce, plyr, tidygraph

Depends on ggplot2

Suggests spelling, testthat, knitr, rmarkdown


See at CRAN