Title: | Analyze and Create Elegant Directed Acyclic Graphs |
---|---|
Description: | Tidy, analyze, and plot directed acyclic graphs (DAGs). 'ggdag' is built on top of 'dagitty', an R package that uses the 'DAGitty' web tool (<https://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. |
Authors: | Malcolm Barrett [aut, cre] |
Maintainer: | Malcolm Barrett <[email protected]> |
License: | MIT + file LICENSE |
Version: | 0.2.13 |
Built: | 2024-10-21 06:54:37 UTC |
Source: | CRAN |
Stratifying on colliders can open biasing pathways between variables.
activate_collider_paths
activates any such pathways given a variable
or set of variables to adjust for and adds them to the tidy_dagitty
.
activate_collider_paths(.tdy_dag, adjust_for, ...)
activate_collider_paths(.tdy_dag, adjust_for, ...)
.tdy_dag |
input graph, an object of class |
adjust_for |
a character vector, the variable(s) to adjust for. |
... |
additional arguments passed to |
a tidy_dagitty
with additional rows for collider-activated
pathways
control_for()
, ggdag_adjust()
,
geom_dag_collider_edges()
dag <- dagify(m ~ x + y, x ~ y) collided_dag <- activate_collider_paths(dag, adjust_for = "m") collided_dag
dag <- dagify(m ~ x + y, x ~ y) collided_dag <- activate_collider_paths(dag, adjust_for = "m") collided_dag
Adjust for variables and activate any biasing paths that result
control_for(.tdy_dag, var, as_factor = TRUE, activate_colliders = TRUE, ...) adjust_for(.tdy_dag, var, as_factor = TRUE, activate_colliders = TRUE, ...) ggdag_adjust( .tdy_dag, var = NULL, ..., node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL, collider_lines = TRUE )
control_for(.tdy_dag, var, as_factor = TRUE, activate_colliders = TRUE, ...) adjust_for(.tdy_dag, var, as_factor = TRUE, activate_colliders = TRUE, ...) ggdag_adjust( .tdy_dag, var = NULL, ..., node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL, collider_lines = TRUE )
.tdy_dag |
input graph, an object of class |
var |
a character vector, the variable(s) to adjust for. |
as_factor |
logical. Should the |
activate_colliders |
logical. Include colliders activated by adjustment? |
... |
additional arguments passed to |
node_size |
size of DAG node |
text_size |
size of DAG text |
label_size |
size of label text |
text_col |
color of DAG text |
label_col |
color of label text |
node |
logical. Should nodes be included in the DAG? |
stylized |
logical. Should DAG nodes be stylized? If so, use
|
text |
logical. Should text be included in the DAG? |
use_labels |
a string. Variable to use for
|
collider_lines |
logical. Should the plot show paths activated by adjusting for a collider? |
a tidy_dagitty
with a adjusted
column for adjusted
variables, as well as any biasing paths that arise, or a ggplot
dag <- dagify(m ~ a + b, x ~ a, y ~ b) control_for(dag, var = "m") ggdag_adjust(dag, var = "m")
dag <- dagify(m ~ a + b, x ~ a, y ~ b) control_for(dag, var = "m") ggdag_adjust(dag, var = "m")
A thin wrapper to convert tidy_dagitty
and dagitty
objects to
tbl_graph
, which can then be used to work in tidygraph
and
ggraph
directly. See tidygraph::as_tbl_graph()
.
## S3 method for class 'tidy_dagitty' as_tbl_graph(x, directed = TRUE, ...) ## S3 method for class 'dagitty' as_tbl_graph(x, directed = TRUE, ...)
## S3 method for class 'tidy_dagitty' as_tbl_graph(x, directed = TRUE, ...) ## S3 method for class 'dagitty' as_tbl_graph(x, directed = TRUE, ...)
x |
an object of class |
directed |
logical. Should the constructed graph be directed? Default
is |
... |
other arguments passed to |
a tbl_graph
library(ggraph) library(tidygraph) butterfly_bias() %>% as_tbl_graph() %>% ggraph() + geom_edge_diagonal() + geom_node_point()
library(ggraph) library(tidygraph) butterfly_bias() %>% as_tbl_graph() %>% ggraph() + geom_edge_diagonal() + geom_node_point()
tidy_dagitty
objectsAn alternative API and specification to tidy_dagitty()
, as_tidy_dagitty()
allows you to create tidy_dagitty
objects from data frames. There is also a
method for dagitty
objects, which is a thin wrapper for tidy_dagitty()
.
To create a DAG from a data frame, it must contain name
and to
columns,
representing the nodes and any edges leading from the nodes. If there are
x
, y
, xend
, and yend
columns, they will be used as coordinates.
Otherwise, layout
will be used. See tidy_dagitty for more information
about layouts. Additionally, you can specify status (one of exposure
,
outcome
, or latent
) by including a status
column. Any other columns in
the data set will also be joined to the tidy_dagitty
data.
as_tidy_dagitty(x, ...) ## S3 method for class 'dagitty' as_tidy_dagitty(x, seed = NULL, layout = "nicely", ...) ## S3 method for class 'data.frame' as_tidy_dagitty(x, seed = NULL, layout = "nicely", ...)
as_tidy_dagitty(x, ...) ## S3 method for class 'dagitty' as_tidy_dagitty(x, seed = NULL, layout = "nicely", ...) ## S3 method for class 'data.frame' as_tidy_dagitty(x, seed = NULL, layout = "nicely", ...)
x |
An object to convert into a |
... |
optional arguments passed to |
seed |
a numeric seed for reproducible layout generation |
layout |
a layout available in |
a tidy_dagitty
object
data.frame(name = c("c", "c", "x"), to = c("x", "y", "y")) %>% as_tidy_dagitty()
data.frame(name = c("c", "c", "x"), to = c("x", "y", "y")) %>% as_tidy_dagitty()
tidy_dagitty
object to data.frameConvert a tidy_dagitty
object to data.frame
## S3 method for class 'tidy_dagitty' as.data.frame(x, row.names = NULL, optional = FALSE, ...)
## S3 method for class 'tidy_dagitty' as.data.frame(x, row.names = NULL, optional = FALSE, ...)
x |
an object of class |
row.names |
NULL or a character vector giving the row names for the data frame. Missing values are not allowed. |
optional |
logical. If TRUE, setting row names and converting column
names (to syntactic names: see make.names) is optional. Note that all of
R's base package |
... |
optional arguments passed to |
tidy_dagitty
object to tblConvert a tidy_dagitty
object to tbl
## S3 method for class 'tidy_daggity' as.tbl(x, row.names = NULL, optional = FALSE, ...) ## S3 method for class 'tidy_daggity' as_tibble(x, row.names = NULL, optional = FALSE, ...)
## S3 method for class 'tidy_daggity' as.tbl(x, row.names = NULL, optional = FALSE, ...) ## S3 method for class 'tidy_daggity' as_tibble(x, row.names = NULL, optional = FALSE, ...)
x |
an object of class |
row.names |
NULL or a character vector giving the row names for the data frame. Missing values are not allowed. |
optional |
logical. If TRUE, setting row names and converting column
names (to syntactic names: see make.names) is optional. Note that all of
R's base package |
... |
optional arguments passed to |
D-separation is a key concept in causal structural models. Variables are
d-separated if there are no open paths between them. The node_d*()
functions label variables as d-connected or d-separated. The
ggdag_d*()
functions plot the results. The *_dconnected()
,
*_dseparated()
, and *_drelationship()
functions essentially
produce the same output and are just different ways of thinking about the
relationship. See dagitty::dseparated()
for details.
node_dconnected( .tdy_dag, from = NULL, to = NULL, controlling_for = NULL, as_factor = TRUE, ... ) node_dseparated( .tdy_dag, from = NULL, to = NULL, controlling_for = NULL, as_factor = TRUE ) node_drelationship( .tdy_dag, from = NULL, to = NULL, controlling_for = NULL, as_factor = TRUE ) ggdag_drelationship( .tdy_dag, from = NULL, to = NULL, controlling_for = NULL, ..., edge_type = "link_arc", node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL, collider_lines = TRUE ) ggdag_dseparated( .tdy_dag, from = NULL, to = NULL, controlling_for = NULL, ..., edge_type = "link_arc", node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL, collider_lines = TRUE ) ggdag_dconnected( .tdy_dag, from = NULL, to = NULL, controlling_for = NULL, ..., edge_type = "link_arc", node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL, collider_lines = TRUE )
node_dconnected( .tdy_dag, from = NULL, to = NULL, controlling_for = NULL, as_factor = TRUE, ... ) node_dseparated( .tdy_dag, from = NULL, to = NULL, controlling_for = NULL, as_factor = TRUE ) node_drelationship( .tdy_dag, from = NULL, to = NULL, controlling_for = NULL, as_factor = TRUE ) ggdag_drelationship( .tdy_dag, from = NULL, to = NULL, controlling_for = NULL, ..., edge_type = "link_arc", node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL, collider_lines = TRUE ) ggdag_dseparated( .tdy_dag, from = NULL, to = NULL, controlling_for = NULL, ..., edge_type = "link_arc", node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL, collider_lines = TRUE ) ggdag_dconnected( .tdy_dag, from = NULL, to = NULL, controlling_for = NULL, ..., edge_type = "link_arc", node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL, collider_lines = TRUE )
.tdy_dag |
input graph, an object of class |
from |
a character vector, the starting variable (must by in DAG). If
|
to |
a character vector, the ending variable (must by in DAG). If
|
controlling_for |
a character vector, variables in the DAG to control for. |
as_factor |
logical. Should the |
... |
additional arguments passed to |
edge_type |
a character vector, the edge geom to use. One of: "link_arc", which accounts for directed and bidirected edges, "link", "arc", or "diagonal" |
node_size |
size of DAG node |
text_size |
size of DAG text |
label_size |
size of label text |
text_col |
color of DAG text |
label_col |
color of label text |
node |
logical. Should nodes be included in the DAG? |
stylized |
logical. Should DAG nodes be stylized? If so, use
|
text |
logical. Should text be included in the DAG? |
use_labels |
a string. Variable to use for |
collider_lines |
logical. Should the plot show paths activated by adjusting for a collider? |
a tidy_dagitty
with a d_relationship
column for
variable D relationship or a ggplot
library(ggplot2) dag <- dagify(m ~ x + y) dag %>% ggdag_drelationship("x", "y") dag %>% ggdag_drelationship("x", "y", controlling_for = "m") dag %>% node_dseparated("x", "y") %>% ggplot(aes(x = x, y = y, xend = xend, yend = yend, shape = adjusted, col = d_relationship)) + geom_dag_edges() + geom_dag_collider_edges() + geom_dag_node() + geom_dag_text(col = "white") + theme_dag() + scale_adjusted() dag %>% 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() + geom_dag_collider_edges() + geom_dag_node() + geom_dag_text(col = "white") + theme_dag() + scale_adjusted() dagify(m ~ x + y, m_jr ~ m) %>% tidy_dagitty(layout = "nicely") %>% node_dconnected("x", "y", controlling_for = "m_jr") %>% ggplot(aes(x = x, y = y, xend = xend, yend = yend, shape = adjusted, col = d_relationship)) + geom_dag_edges() + geom_dag_collider_edges() + geom_dag_node() + geom_dag_text(col = "white") + theme_dag() + scale_adjusted()
library(ggplot2) dag <- dagify(m ~ x + y) dag %>% ggdag_drelationship("x", "y") dag %>% ggdag_drelationship("x", "y", controlling_for = "m") dag %>% node_dseparated("x", "y") %>% ggplot(aes(x = x, y = y, xend = xend, yend = yend, shape = adjusted, col = d_relationship)) + geom_dag_edges() + geom_dag_collider_edges() + geom_dag_node() + geom_dag_text(col = "white") + theme_dag() + scale_adjusted() dag %>% 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() + geom_dag_collider_edges() + geom_dag_node() + geom_dag_text(col = "white") + theme_dag() + scale_adjusted() dagify(m ~ x + y, m_jr ~ m) %>% tidy_dagitty(layout = "nicely") %>% node_dconnected("x", "y", controlling_for = "m_jr") %>% ggplot(aes(x = x, y = y, xend = xend, yend = yend, shape = adjusted, col = d_relationship)) + geom_dag_edges() + geom_dag_collider_edges() + geom_dag_node() + geom_dag_text(col = "white") + theme_dag() + scale_adjusted()
Parents and children are those nodes that either directly cause or are caused
by the variable, respectively. Ancestors and descendants are those nodes that
are on the path to or descend from the variable. The node_*()
functions label variables depending on their relationship. The
ggdag_*()
functions plot the results. See
dagitty::children for details.
node_children(.tdy_dag, .var, as_factor = TRUE) node_parents(.tdy_dag, .var, as_factor = TRUE) node_ancestors(.tdy_dag, .var, as_factor = TRUE) node_descendants(.tdy_dag, .var, as_factor = TRUE) node_markov_blanket(.tdy_dag, .var, as_factor = TRUE) node_adjacent(.tdy_dag, .var, as_factor = TRUE) ggdag_children( .tdy_dag, .var, ..., edge_type = "link_arc", node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL ) ggdag_parents( .tdy_dag, .var, ..., edge_type = "link_arc", node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL ) ggdag_ancestors( .tdy_dag, .var, ..., edge_type = "link_arc", node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL ) ggdag_descendants( .tdy_dag, .var, ..., edge_type = "link_arc", node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL ) ggdag_markov_blanket( .tdy_dag, .var, ..., edge_type = "link_arc", node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL ) ggdag_adjacent( .tdy_dag, .var, ..., edge_type = "link_arc", node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL )
node_children(.tdy_dag, .var, as_factor = TRUE) node_parents(.tdy_dag, .var, as_factor = TRUE) node_ancestors(.tdy_dag, .var, as_factor = TRUE) node_descendants(.tdy_dag, .var, as_factor = TRUE) node_markov_blanket(.tdy_dag, .var, as_factor = TRUE) node_adjacent(.tdy_dag, .var, as_factor = TRUE) ggdag_children( .tdy_dag, .var, ..., edge_type = "link_arc", node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL ) ggdag_parents( .tdy_dag, .var, ..., edge_type = "link_arc", node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL ) ggdag_ancestors( .tdy_dag, .var, ..., edge_type = "link_arc", node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL ) ggdag_descendants( .tdy_dag, .var, ..., edge_type = "link_arc", node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL ) ggdag_markov_blanket( .tdy_dag, .var, ..., edge_type = "link_arc", node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL ) ggdag_adjacent( .tdy_dag, .var, ..., edge_type = "link_arc", node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL )
.tdy_dag |
input graph, an object of class |
.var |
a character vector, the variable to be assessed (must by in DAG) |
as_factor |
logical. Should the relationship variable be a factor? |
... |
additional arguments passed to |
edge_type |
a character vector, the edge geom to use. One of: "link_arc", which accounts for directed and bidirected edges, "link", "arc", or "diagonal" |
node_size |
size of DAG node |
text_size |
size of DAG text |
label_size |
size of label text |
text_col |
color of DAG text |
label_col |
color of label text |
node |
logical. Should nodes be included in the DAG? |
stylized |
logical. Should DAG nodes be stylized? If so, use
|
text |
logical. Should text be included in the DAG? |
use_labels |
a string. Variable to use for
|
a tidy_dagitty
with an column related to the given
relationship for variable D relationship or a ggplot
library(ggplot2) dag <- dagify( y ~ x + z2 + w2 + w1, x ~ z1 + w1, z1 ~ w1 + v, z2 ~ w2 + v, w1 ~ ~w2 ) ggdag_children(dag, "w1") dag %>% node_children("w1") %>% ggplot(aes(x = x, y = y, xend = xend, yend = yend, color = children)) + geom_dag_edges() + geom_dag_node() + geom_dag_text(col = "white") + geom_dag_label_repel(aes(label = children, fill = children), col = "white", show.legend = FALSE) + theme_dag() + scale_adjusted() + scale_color_hue(breaks = c("parent", "child")) ggdag_parents(dag, "y") ggdag_ancestors(dag, "x") ggdag_descendants(dag, "w1") dag %>% node_parents("y") %>% ggplot(aes(x = x, y = y, xend = xend, yend = yend, color = parent)) + geom_dag_edges() + geom_dag_point() + geom_dag_text(col = "white") + geom_dag_label_repel(aes(label = parent, fill = parent), col = "white", show.legend = FALSE) + theme_dag() + scale_adjusted() + scale_color_hue(breaks = c("parent", "child"))
library(ggplot2) dag <- dagify( y ~ x + z2 + w2 + w1, x ~ z1 + w1, z1 ~ w1 + v, z2 ~ w2 + v, w1 ~ ~w2 ) ggdag_children(dag, "w1") dag %>% node_children("w1") %>% ggplot(aes(x = x, y = y, xend = xend, yend = yend, color = children)) + geom_dag_edges() + geom_dag_node() + geom_dag_text(col = "white") + geom_dag_label_repel(aes(label = children, fill = children), col = "white", show.legend = FALSE) + theme_dag() + scale_adjusted() + scale_color_hue(breaks = c("parent", "child")) ggdag_parents(dag, "y") ggdag_ancestors(dag, "x") ggdag_descendants(dag, "w1") dag %>% node_parents("y") %>% ggplot(aes(x = x, y = y, xend = xend, yend = yend, color = parent)) + geom_dag_edges() + geom_dag_point() + geom_dag_text(col = "white") + geom_dag_label_repel(aes(label = parent, fill = parent), col = "white", show.legend = FALSE) + theme_dag() + scale_adjusted() + scale_color_hue(breaks = c("parent", "child"))
Takes an input graph with bidirected edges and replaces every bidirected edge
x <-> y with a substructure x <- L -> y, where L is a latent variable. See
dagitty::canonicalize()
for details. Undirected edges
are not currently supported in ggdag
.
node_canonical(.dag, ...) ggdag_canonical( .tdy_dag, ..., edge_type = "link_arc", node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL )
node_canonical(.dag, ...) ggdag_canonical( .tdy_dag, ..., edge_type = "link_arc", node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL )
.dag , .tdy_dag
|
input graph, an object of class |
... |
additional arguments passed to |
edge_type |
a character vector, the edge geom to use. One of: "link_arc", which accounts for directed and bidirected edges, "link", "arc", or "diagonal" |
node_size |
size of DAG node |
text_size |
size of DAG text |
label_size |
size of label text |
text_col |
color of DAG text |
label_col |
color of label text |
node |
logical. Should nodes be included in the DAG? |
stylized |
logical. Should DAG nodes be stylized? If so, use
|
text |
logical. Should text be included in the DAG? |
use_labels |
a string. Variable to use for |
a tidy_dagitty
that includes L or a ggplot
dag <- dagify(y ~ x + z, x ~ ~z) ggdag(dag) node_canonical(dag) ggdag_canonical(dag)
dag <- dagify(y ~ x + z, x ~ ~z) ggdag(dag) node_canonical(dag) ggdag_canonical(dag)
Detects any colliders given a DAG.
node_collider
tags colliders and ggdag_collider
plots all
exogenous variables.
node_collider(.dag, as_factor = TRUE, ...) ggdag_collider( .tdy_dag, ..., edge_type = "link_arc", node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL )
node_collider(.dag, as_factor = TRUE, ...) ggdag_collider( .tdy_dag, ..., edge_type = "link_arc", node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL )
.dag , .tdy_dag
|
input graph, an object of class |
as_factor |
treat |
... |
additional arguments passed to |
edge_type |
a character vector, the edge geom to use. One of: "link_arc", which accounts for directed and bidirected edges, "link", "arc", or "diagonal" |
node_size |
size of DAG node |
text_size |
size of DAG text |
label_size |
size of label text |
text_col |
color of DAG text |
label_col |
color of label text |
node |
logical. Should nodes be included in the DAG? |
stylized |
logical. Should DAG nodes be stylized? If so, use
|
text |
logical. Should text be included in the DAG? |
use_labels |
a string. Variable to use for |
a tidy_dagitty
with a collider
column for
colliders or a ggplot
dag <- dagify(m ~ x + y, y ~ x) node_collider(dag) ggdag_collider(dag)
dag <- dagify(m ~ x + y, y ~ x) node_collider(dag) ggdag_collider(dag)
Manipulate DAG coordinates
coords2df(coord_list) coords2list(coord_df)
coords2df(coord_list) coords2list(coord_df)
coord_list |
a named list of coordinates |
coord_df |
a data.frame with columns x, y, and name |
either a list or a data.frame with DAG node coordinates
library(dagitty) coords <- list( x = c(A = 1, B = 2, D = 3, C = 3, F = 3, E = 4, G = 5, H = 5, I = 5), y = c(A = 0, B = 0, D = 1, C = 0, F = -1, E = 0, G = 1, H = 0, I = -1) ) coord_df <- coords2df(coords) coords2list(coord_df) x <- dagitty("dag{ G <-> H <-> I <-> G D <- B -> C -> I <- F <- B <- A H <- E <- C -> G <- D }") coordinates(x) <- coords2list(coord_df)
library(dagitty) coords <- list( x = c(A = 1, B = 2, D = 3, C = 3, F = 3, E = 4, G = 5, H = 5, I = 5), y = c(A = 0, B = 0, D = 1, C = 0, F = -1, E = 0, G = 1, H = 0, I = -1) ) coord_df <- coords2df(coords) coords2list(coord_df) x <- dagitty("dag{ G <-> H <-> I <-> G D <- B -> C -> I <- F <- B <- A H <- E <- C -> G <- D }") coordinates(x) <- coords2list(coord_df)
See dagitty::adjustmentSets()
for details.
dag_adjustment_sets(.tdy_dag, exposure = NULL, outcome = NULL, ...) ggdag_adjustment_set( .tdy_dag, exposure = NULL, outcome = NULL, ..., shadow = FALSE, node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL, expand_x = expansion(c(0.25, 0.25)), expand_y = expansion(c(0.2, 0.2)) )
dag_adjustment_sets(.tdy_dag, exposure = NULL, outcome = NULL, ...) ggdag_adjustment_set( .tdy_dag, exposure = NULL, outcome = NULL, ..., shadow = FALSE, node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL, expand_x = expansion(c(0.25, 0.25)), expand_y = expansion(c(0.2, 0.2)) )
.tdy_dag |
input graph, an object of class |
exposure |
a character vector, the exposure variable. Default is
|
outcome |
a character vector, the outcome variable. Default is
|
... |
additional arguments to |
shadow |
logical. Show paths blocked by adjustment? |
node_size |
size of DAG node |
text_size |
size of DAG text |
label_size |
size of label text |
text_col |
color of DAG text |
label_col |
color of label text |
node |
logical. Should nodes be included in the DAG? |
stylized |
logical. Should DAG nodes be stylized? If so, use
|
text |
logical. Should text be included in the DAG? |
use_labels |
a string. Variable to use for |
expand_x , expand_y
|
Vector of range expansion constants used to add some
padding around the data, to ensure that they are placed some distance away
from the axes. Use the convenience function |
a tidy_dagitty
with an adjusted
column and set
column, indicating adjustment status and DAG ID, respectively, for the
adjustment sets or a ggplot
dag <- dagify(y ~ x + z2 + w2 + w1, x ~ z1 + w1, z1 ~ w1 + v, z2 ~ w2 + v, w1 ~ ~w2, exposure = "x", outcome = "y" ) tidy_dagitty(dag) %>% dag_adjustment_sets() ggdag_adjustment_set(dag) ggdag_adjustment_set(dagitty::randomDAG(10, .5), exposure = "x3", outcome = "x5" )
dag <- dagify(y ~ x + z2 + w2 + w1, x ~ z1 + w1, z1 ~ w1 + v, z2 ~ w2 + v, w1 ~ ~w2, exposure = "x", outcome = "y" ) tidy_dagitty(dag) %>% dag_adjustment_sets() ggdag_adjustment_set(dag) ggdag_adjustment_set(dagitty::randomDAG(10, .5), exposure = "x3", outcome = "x5" )
A convenience wrapper for dagitty::dagitty()
.
dag(...)
dag(...)
... |
a character vector in the style of dagitty. See
|
a dagitty
dag("{x m} -> y")
dag("{x m} -> y")
Directed DAG edges
geom_dag_edges_link( mapping = NULL, data = NULL, arrow = grid::arrow(length = grid::unit(5, "pt"), type = "closed"), position = "identity", na.rm = TRUE, show.legend = NA, inherit.aes = TRUE, ... ) geom_dag_edges_arc( mapping = NULL, data = NULL, curvature = 0.5, arrow = grid::arrow(length = grid::unit(5, "pt"), type = "closed"), position = "identity", na.rm = TRUE, show.legend = NA, inherit.aes = TRUE, fold = FALSE, n = 100, lineend = "butt", linejoin = "round", linemitre = 1, label_colour = "black", label_alpha = 1, label_parse = FALSE, check_overlap = FALSE, angle_calc = "rot", force_flip = TRUE, label_dodge = NULL, label_push = NULL, ... ) geom_dag_edges_diagonal( mapping = NULL, data = NULL, position = "identity", arrow = grid::arrow(length = grid::unit(5, "pt"), type = "closed"), na.rm = TRUE, show.legend = NA, inherit.aes = TRUE, curvature = 1, n = 100, lineend = "butt", linejoin = "round", linemitre = 1, label_colour = "black", label_alpha = 1, label_parse = FALSE, check_overlap = FALSE, angle_calc = "rot", force_flip = TRUE, label_dodge = NULL, label_push = NULL, ... ) geom_dag_edges_fan( mapping = NULL, data = NULL, position = "identity", arrow = grid::arrow(length = grid::unit(5, "pt"), type = "closed"), na.rm = TRUE, show.legend = NA, inherit.aes = TRUE, spread = 0.7, n = 100, lineend = "butt", linejoin = "round", linemitre = 1, label_colour = "black", label_alpha = 1, label_parse = FALSE, check_overlap = FALSE, angle_calc = "rot", force_flip = TRUE, label_dodge = NULL, label_push = NULL, ... )
geom_dag_edges_link( mapping = NULL, data = NULL, arrow = grid::arrow(length = grid::unit(5, "pt"), type = "closed"), position = "identity", na.rm = TRUE, show.legend = NA, inherit.aes = TRUE, ... ) geom_dag_edges_arc( mapping = NULL, data = NULL, curvature = 0.5, arrow = grid::arrow(length = grid::unit(5, "pt"), type = "closed"), position = "identity", na.rm = TRUE, show.legend = NA, inherit.aes = TRUE, fold = FALSE, n = 100, lineend = "butt", linejoin = "round", linemitre = 1, label_colour = "black", label_alpha = 1, label_parse = FALSE, check_overlap = FALSE, angle_calc = "rot", force_flip = TRUE, label_dodge = NULL, label_push = NULL, ... ) geom_dag_edges_diagonal( mapping = NULL, data = NULL, position = "identity", arrow = grid::arrow(length = grid::unit(5, "pt"), type = "closed"), na.rm = TRUE, show.legend = NA, inherit.aes = TRUE, curvature = 1, n = 100, lineend = "butt", linejoin = "round", linemitre = 1, label_colour = "black", label_alpha = 1, label_parse = FALSE, check_overlap = FALSE, angle_calc = "rot", force_flip = TRUE, label_dodge = NULL, label_push = NULL, ... ) geom_dag_edges_fan( mapping = NULL, data = NULL, position = "identity", arrow = grid::arrow(length = grid::unit(5, "pt"), type = "closed"), na.rm = TRUE, show.legend = NA, inherit.aes = TRUE, spread = 0.7, n = 100, lineend = "butt", linejoin = "round", linemitre = 1, label_colour = "black", label_alpha = 1, label_parse = FALSE, check_overlap = FALSE, angle_calc = "rot", force_flip = TRUE, label_dodge = NULL, label_push = NULL, ... )
mapping |
Set of aesthetic mappings created by aes() or aes_(). If specified and inherit.aes = TRUE (the default), it is combined with the default mapping at the top level of the plot. You must supply mapping if there is no plot mapping. |
data |
The data to be displayed in this layer. There are three options: If NULL, the default, the data is inherited from the plot data as specified in the call to ggplot(). A data.frame, or other object, will override the plot data. All objects will be fortified to produce a data frame. See fortify() for which variables will be created. A function will be called with a single argument, the plot data. The return value must be a data.frame., and will be used as the layer data. |
arrow |
specification for arrow heads, as created by arrow() |
position |
Position adjustment, either as a string, or the result of a call to a position adjustment function. |
na.rm |
If FALSE (the default), removes missing values with a warning. If TRUE silently removes missing values |
show.legend |
logical. Should this layer be included in the legends? NA, the default, includes if any aesthetics are mapped. FALSE never includes, and TRUE always includes. It can also be a named logical vector to finely select the aesthetics to display. |
inherit.aes |
If FALSE, overrides the default aesthetics, rather than combining with them. This is most useful for helper functions that define both data and aesthetics and shouldn't inherit behaviour from the default plot specification, e.g. borders(). |
... |
Other arguments passed to ggraph::geom_edge_*() |
curvature |
The bend of the curve. 1 approximates a halfcircle while 0 will give a straight line. Negative number will change the direction of the curve. Only used if layout circular = FALSE. |
fold |
Logical. Should arcs appear on the same side of the nodes despite different directions. Default to FALSE. |
n |
The number of points to create along the path. |
lineend |
Line end style (round, butt, square). |
linejoin |
Line join style (round, mitre, bevel). |
linemitre |
Line mitre limit (number greater than 1). |
label_colour |
The colour of the edge label. If |
label_alpha |
The opacity of the edge label. If |
label_parse |
If |
check_overlap |
If |
angle_calc |
Either 'none', 'along', or 'across'. If 'none' the label will use the angle aesthetic of the geom. If 'along' The label will be written along the edge direction. If 'across' the label will be written across the edge direction. |
force_flip |
Logical. If |
label_dodge |
A |
label_push |
A |
spread |
Deprecated. Use |
geom_dag_edges_link
, geom_dag_edges_arc
, geom_dag_edges_diagonal
, and
geom_dag_edges_fan
understand the following aesthetics. Bold aesthetics are
required.
x
y
xend
yend
edge_colour
edge_width
edge_linetype
edge_alpha
start_cap
end_cap
label
label_pos
label_size
angle
hjust
vjust
family
fontface
lineheight
geom_dag_edges_arc
and geom_dag_edges_diagonal
also require
circular, but this is automatically set.
geom_dag_edges_fan
requires to and from, but these are also
automatically set.
library(ggplot2) p <- dagify( y ~ x + z2 + w2 + w1, x ~ z1 + w1, z1 ~ w1 + v, z2 ~ w2 + v, L ~ w1 + w2 ) %>% ggplot(aes(x = x, y = y, xend = xend, yend = yend)) + geom_dag_point() + geom_dag_text() + theme_dag() p + geom_dag_edges_link() p + geom_dag_edges_arc() p + geom_dag_edges_diagonal() p + geom_dag_edges_fan()
library(ggplot2) p <- dagify( y ~ x + z2 + w2 + w1, x ~ z1 + w1, z1 ~ w1 + v, z2 ~ w2 + v, L ~ w1 + w2 ) %>% ggplot(aes(x = x, y = y, xend = xend, yend = yend)) + geom_dag_point() + geom_dag_text() + theme_dag() p + geom_dag_edges_link() p + geom_dag_edges_arc() p + geom_dag_edges_diagonal() p + geom_dag_edges_fan()
Label or otherwise retrieve labels from objects of either class
tidy_dagitty
or dagitty
label(x) <- value ## S3 replacement method for class 'dagitty' label(x) <- value ## S3 replacement method for class 'tidy_dagitty' label(x) <- value dag_label(.tdy_dag, labels = NULL) label(.tdy_dag) has_labels(.tdy_dag)
label(x) <- value ## S3 replacement method for class 'dagitty' label(x) <- value ## S3 replacement method for class 'tidy_dagitty' label(x) <- value dag_label(.tdy_dag, labels = NULL) label(.tdy_dag) has_labels(.tdy_dag)
x |
an object of either class |
value |
a character vector |
.tdy_dag |
an object of class |
labels |
a character vector |
label
returns the label attribute of x
labelled_dag <- dagify(y ~ z, x ~ z) %>% tidy_dagitty() %>% dag_label(labels = c("x" = "exposure", "y" = "outcome", "z" = "confounder")) has_labels(labelled_dag)
labelled_dag <- dagify(y ~ z, x ~ z) %>% tidy_dagitty() %>% dag_label(labels = c("x" = "exposure", "y" = "outcome", "z" = "confounder")) has_labels(labelled_dag)
dagify()
creates dagitty DAGs using a more R-like syntax. It currently
accepts formulas in the usual R style, e.g. y ~ x + z
, which gets
translated to y <- {x z}
, as well as using a double tilde (~~
) to
graph bidirected variables, e.g. x1 ~~ x2
is translated to x1 <-> x2
.
dagify( ..., exposure = NULL, outcome = NULL, latent = NULL, labels = NULL, coords = NULL )
dagify( ..., exposure = NULL, outcome = NULL, latent = NULL, labels = NULL, coords = NULL )
... |
formulas, which are converted to |
exposure |
a character vector for the exposure (must be a variable name in the DAG) |
outcome |
a character vector for the outcome (must be a variable name in the DAG) |
latent |
a character vector for any latent variables (must be a variable name in the DAG) |
labels |
a named character vector, labels for variables in the DAG |
coords |
coordinates for the DAG nodes. Can be a named list or a
|
a dagitty
DAG
dag()
, coords2df()
, coords2list()
dagify(y ~ x + z, x ~ z) coords <- list( x = c(A = 1, B = 2, D = 3, C = 3, F = 3, E = 4, G = 5, H = 5, I = 5), y = c(A = 0, B = 0, D = 1, C = 0, F = -1, E = 0, G = 1, H = 0, I = -1) ) dag <- dagify(G ~ ~H, G ~ ~I, I ~ ~G, H ~ ~I, D ~ B, C ~ B, I ~ C + F, F ~ B, B ~ A, H ~ E, C ~ E + G, G ~ D, coords = coords ) dagitty::is.dagitty(dag) ggdag(dag) dag2 <- dagify(y ~ x + z2 + w2 + w1, x ~ z1 + w1, z1 ~ w1 + v, z2 ~ w2 + v, w1 ~ ~w2, exposure = "x", outcome = "y" ) ggdag(dag2)
dagify(y ~ x + z, x ~ z) coords <- list( x = c(A = 1, B = 2, D = 3, C = 3, F = 3, E = 4, G = 5, H = 5, I = 5), y = c(A = 0, B = 0, D = 1, C = 0, F = -1, E = 0, G = 1, H = 0, I = -1) ) dag <- dagify(G ~ ~H, G ~ ~I, I ~ ~G, H ~ ~I, D ~ B, C ~ B, I ~ C + F, F ~ B, B ~ A, H ~ E, C ~ E + G, G ~ D, coords = coords ) dagitty::is.dagitty(dag) ggdag(dag) dag2 <- dagify(y ~ x + z2 + w2 + w1, x ~ z1 + w1, z1 ~ w1 + v, z2 ~ w2 + v, w1 ~ ~w2, exposure = "x", outcome = "y" ) ggdag(dag2)
tidy_dagitty
objectsDplyr verb methods for tidy_dagitty
objects.
## S3 method for class 'tidy_dagitty' select(.data, ...) ## S3 method for class 'tidy_dagitty' filter(.data, ...) ## S3 method for class 'tidy_dagitty' mutate(.data, ...) ## S3 method for class 'tidy_dagitty' summarise(.data, ...) ## S3 method for class 'tidy_dagitty' distinct(.data, ..., .keep_all = FALSE) ## S3 method for class 'tidy_dagitty' arrange(.data, ...) ## S3 method for class 'tidy_dagitty' group_by(.data, ...) ## S3 method for class 'tidy_dagitty' ungroup(x, ...) ## S3 method for class 'tidy_dagitty' transmute(.data, ...) ## S3 method for class 'tidy_dagitty' distinct(.data, ..., .keep_all = FALSE) ## S3 method for class 'tidy_dagitty' full_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...) ## S3 method for class 'tidy_dagitty' inner_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...) ## S3 method for class 'tidy_dagitty' left_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...) ## S3 method for class 'tidy_dagitty' right_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...) ## S3 method for class 'tidy_dagitty' anti_join(x, y, by = NULL, copy = FALSE, ...) ## S3 method for class 'tidy_dagitty' semi_join(x, y, by = NULL, copy = FALSE, ...) ## S3 method for class 'tidy_dagitty' slice(.data, ..., .dots = list()) ## S3 method for class 'tidy_dagitty' select_(.data, ..., .dots = list()) ## S3 method for class 'tidy_dagitty' filter_(.data, ..., .dots = list()) ## S3 method for class 'tidy_dagitty' mutate_(.data, ..., .dots = list()) ## S3 method for class 'tidy_dagitty' summarise_(.data, ..., .dots = list()) ## S3 method for class 'tidy_dagitty' arrange_(.data, ..., .dots = list()) ## S3 method for class 'tidy_dagitty' slice_(.data, ..., .dots = list())
## S3 method for class 'tidy_dagitty' select(.data, ...) ## S3 method for class 'tidy_dagitty' filter(.data, ...) ## S3 method for class 'tidy_dagitty' mutate(.data, ...) ## S3 method for class 'tidy_dagitty' summarise(.data, ...) ## S3 method for class 'tidy_dagitty' distinct(.data, ..., .keep_all = FALSE) ## S3 method for class 'tidy_dagitty' arrange(.data, ...) ## S3 method for class 'tidy_dagitty' group_by(.data, ...) ## S3 method for class 'tidy_dagitty' ungroup(x, ...) ## S3 method for class 'tidy_dagitty' transmute(.data, ...) ## S3 method for class 'tidy_dagitty' distinct(.data, ..., .keep_all = FALSE) ## S3 method for class 'tidy_dagitty' full_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...) ## S3 method for class 'tidy_dagitty' inner_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...) ## S3 method for class 'tidy_dagitty' left_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...) ## S3 method for class 'tidy_dagitty' right_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...) ## S3 method for class 'tidy_dagitty' anti_join(x, y, by = NULL, copy = FALSE, ...) ## S3 method for class 'tidy_dagitty' semi_join(x, y, by = NULL, copy = FALSE, ...) ## S3 method for class 'tidy_dagitty' slice(.data, ..., .dots = list()) ## S3 method for class 'tidy_dagitty' select_(.data, ..., .dots = list()) ## S3 method for class 'tidy_dagitty' filter_(.data, ..., .dots = list()) ## S3 method for class 'tidy_dagitty' mutate_(.data, ..., .dots = list()) ## S3 method for class 'tidy_dagitty' summarise_(.data, ..., .dots = list()) ## S3 method for class 'tidy_dagitty' arrange_(.data, ..., .dots = list()) ## S3 method for class 'tidy_dagitty' slice_(.data, ..., .dots = list())
.data |
data object of class |
... |
other arguments passed to the |
.dots , x , y , by , copy , suffix , .keep_all
|
see corresponding function in
package |
library(dplyr) tidy_dagitty(m_bias()) %>% group_by(name) %>% summarize(n = n())
library(dplyr) tidy_dagitty(m_bias()) %>% group_by(name) %>% summarize(n = n())
Returns a set of complete partially directed acyclic graphs (CPDAGs) given an
input DAG. CPDAGs are Markov equivalent to the input graph. See
dagitty::equivalentDAGs()
for details.
node_equivalent_dags()
returns a set of DAGs, while
node_equivalent_class()
tags reversable edges.
ggdag_equivalent_dags()
plots all equivalent DAGs, while
ggdag_equivalent_class()
plots all reversable edges as undirected.
node_equivalent_dags(.dag, n = 100, layout = "auto", ...) ggdag_equivalent_dags( .tdy_dag, ..., node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = "black", node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL ) node_equivalent_class(.dag, layout = "auto") ggdag_equivalent_class( .tdy_dag, expand_x = expansion(c(0.1, 0.1)), expand_y = expansion(c(0.1, 0.1)), breaks = ggplot2::waiver(), ..., node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL )
node_equivalent_dags(.dag, n = 100, layout = "auto", ...) ggdag_equivalent_dags( .tdy_dag, ..., node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = "black", node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL ) node_equivalent_class(.dag, layout = "auto") ggdag_equivalent_class( .tdy_dag, expand_x = expansion(c(0.1, 0.1)), expand_y = expansion(c(0.1, 0.1)), breaks = ggplot2::waiver(), ..., node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL )
.dag |
input graph, an object of class |
n |
maximal number of returned graphs. |
layout |
a layout available in |
... |
optional arguments passed to |
.tdy_dag |
an object of class |
node_size |
size of DAG node |
text_size |
size of DAG text |
label_size |
size of label text |
text_col |
color of DAG text |
label_col |
color of label text |
node |
logical. Should nodes be included in the DAG? |
stylized |
logical. Should DAG nodes be stylized? If so, use
|
text |
logical. Should text be included in the DAG? |
use_labels |
a string. Variable to use for |
expand_x , expand_y
|
Vector of range expansion constants used to add some
padding around the data, to ensure that they are placed some distance away
from the axes. Use the convenience function |
breaks |
One of:
|
a tidy_dagitty
with at least one DAG, including a dag
column to identify graph set for equivalent DAGs or a reversable
column for equivalent classes, or a ggplot
g_ex <- dagify(y ~ x + z, x ~ z) g_ex %>% node_equivalent_class() g_ex %>% ggdag_equivalent_dags()
g_ex <- dagify(y ~ x + z, x ~ z) g_ex %>% node_equivalent_class() g_ex %>% ggdag_equivalent_dags()
node_exogenous
tags exogenous variables given an exposure and
outcome. ggdag_exogenous
plots all exogenous variables. See
dagitty::exogenousVariables()
for details.
node_exogenous(.dag, ...) ggdag_exogenous( .tdy_dag, ..., node_size = 16, text_size = 3.88, edge_type = "link_arc", label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL )
node_exogenous(.dag, ...) ggdag_exogenous( .tdy_dag, ..., node_size = 16, text_size = 3.88, edge_type = "link_arc", label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL )
.dag , .tdy_dag
|
input graph, an object of class |
... |
additional arguments passed to |
node_size |
size of DAG node |
text_size |
size of DAG text |
edge_type |
a character vector, the edge geom to use. One of: "link_arc", which accounts for directed and bidirected edges, "link", "arc", or "diagonal" |
label_size |
size of label text |
text_col |
color of DAG text |
label_col |
color of label text |
node |
logical. Should nodes be included in the DAG? |
stylized |
logical. Should DAG nodes be stylized? If so, use
|
text |
logical. Should text be included in the DAG? |
use_labels |
a string. Variable to use for |
a tidy_dagitty
with an exogenous
column for
exogenous variables or a ggplot
dag <- dagify(y ~ x1 + x2 + x3, b ~ x1 + x2) ggdag_exogenous(dag) node_exogenous(dag)
dag <- dagify(y ~ x1 + x2 + x3, b ~ x1 + x2) ggdag_exogenous(dag) node_exogenous(dag)
expand_plot()
is a convenience function that expands the scales of a
ggplot, as the large node sizes in a DAG will often get clipped in themes
that don't have DAGs in mind.
expand_plot( expand_x = expansion(c(0.1, 0.1)), expand_y = expansion(c(0.1, 0.1)) )
expand_plot( expand_x = expansion(c(0.1, 0.1)), expand_y = expansion(c(0.1, 0.1)) )
expand_x , expand_y
|
Vector of range expansion constants used to add some
padding around the data, to ensure that they are placed some distance away
from the axes. Use the convenience function |
tidy_dagitty
object for ggplot2
Fortify a tidy_dagitty
object for ggplot2
## S3 method for class 'tidy_dagitty' fortify(model, data = NULL, ...) ## S3 method for class 'dagitty' fortify(model, data = NULL, ...)
## S3 method for class 'tidy_dagitty' fortify(model, data = NULL, ...) ## S3 method for class 'dagitty' fortify(model, data = NULL, ...)
model |
an object of class |
data |
(not used) |
... |
(not used) |
Adjusting for a collider activates pathways between the parent of the collider. This geom adds a curved edge between any such parent nodes.
geom_dag_collider_edges( mapping = NULL, data = NULL, stat = "identity", position = "identity", ..., linewidth = 0.6, size = NULL, curvature = 0.5, angle = 90, ncp = 5, arrow = NULL, lineend = "butt", na.rm = FALSE, show.legend = NA, inherit.aes = TRUE )
geom_dag_collider_edges( mapping = NULL, data = NULL, stat = "identity", position = "identity", ..., linewidth = 0.6, size = NULL, curvature = 0.5, angle = 90, ncp = 5, arrow = NULL, lineend = "butt", na.rm = FALSE, show.legend = NA, inherit.aes = TRUE )
mapping |
Set of aesthetic mappings created by |
data |
The data to be displayed in this layer. There are three options: If A A |
stat |
The statistical transformation to use on the data for this
layer, either as a |
position |
Position adjustment, either as a string naming the adjustment
(e.g. |
... |
Other arguments passed on to |
linewidth |
a numeric vector of length 1. Edge width |
size |
deprecated. Please use |
curvature |
A numeric value giving the amount of curvature. Negative values produce left-hand curves, positive values produce right-hand curves, and zero produces a straight line. |
angle |
A numeric value between 0 and 180, giving an amount to skew the control points of the curve. Values less than 90 skew the curve towards the start point and values greater than 90 skew the curve towards the end point. |
ncp |
The number of control points used to draw the curve. More control points creates a smoother curve. |
arrow |
specification for arrow heads, as created by |
lineend |
Line end style (round, butt, square). |
na.rm |
If |
show.legend |
logical. Should this layer be included in the legends?
|
inherit.aes |
If |
library(dagitty) library(ggplot2) dagify(m ~ a + b, x ~ a, y ~ b) %>% tidy_dagitty() %>% control_for("m") %>% ggplot(aes(x = x, y = y, xend = xend, yend = yend, shape = adjusted)) + geom_dag_edges() + geom_dag_collider_edges() + geom_dag_point() + geom_dag_text() + theme_dag() + scale_adjusted()
library(dagitty) library(ggplot2) dagify(m ~ a + b, x ~ a, y ~ b) %>% tidy_dagitty() %>% control_for("m") %>% ggplot(aes(x = x, y = y, xend = xend, yend = yend, shape = adjusted)) + geom_dag_edges() + geom_dag_collider_edges() + geom_dag_point() + geom_dag_text() + theme_dag() + scale_adjusted()
Directed and bidirected DAG edges
geom_dag_edges( mapping = NULL, data_directed = filter_direction("->"), data_bidirected = filter_direction("<->"), curvature = 0.3, arrow_directed = grid::arrow(length = grid::unit(5, "pt"), type = "closed"), arrow_bidirected = grid::arrow(length = grid::unit(5, "pt"), ends = "both", type = "closed"), position = "identity", na.rm = TRUE, show.legend = NA, inherit.aes = TRUE, fold = FALSE, ... )
geom_dag_edges( mapping = NULL, data_directed = filter_direction("->"), data_bidirected = filter_direction("<->"), curvature = 0.3, arrow_directed = grid::arrow(length = grid::unit(5, "pt"), type = "closed"), arrow_bidirected = grid::arrow(length = grid::unit(5, "pt"), ends = "both", type = "closed"), position = "identity", na.rm = TRUE, show.legend = NA, inherit.aes = TRUE, fold = FALSE, ... )
mapping |
Set of aesthetic mappings created by aes() or aes_(). If specified and inherit.aes = TRUE (the default), it is combined with the default mapping at the top level of the plot. You must supply mapping if there is no plot mapping. |
data_directed , data_bidirected
|
The data to be displayed in this layer. There are three options: If NULL, the default, the data is inherited from the plot data as specified in the call to ggplot(). A data.frame, or other object, will override the plot data. All objects will be fortified to produce a data frame. See fortify() for which variables will be created. A function will be called with a single argument, the plot data. The return value must be a data.frame., and will be used as the layer data. |
curvature |
The bend of the curve. 1 approximates a halfcircle while 0 will give a straight line. Negative number will change the direction of the curve. Only used if layout circular = FALSE. |
arrow_directed , arrow_bidirected
|
specification for arrow heads, as created by arrow() |
position |
Position adjustment, either as a string, or the result of a call to a position adjustment function. |
na.rm |
If FALSE (the default), removes missing values with a warning. If TRUE silently removes missing values |
show.legend |
logical. Should this layer be included in the legends? NA, the default, includes if any aesthetics are mapped. FALSE never includes, and TRUE always includes. It can also be a named logical vector to finely select the aesthetics to display. |
inherit.aes |
If FALSE, overrides the default aesthetics, rather than combining with them. This is most useful for helper functions that define both data and aesthetics and shouldn't inherit behaviour from the default plot specification, e.g. borders(). |
fold |
Logical. Should arcs appear on the same side of the nodes despite different directions. Default to FALSE. |
... |
Other arguments passed to ggraph::geom_edge_*() |
geom_dag_edges
understand the following aesthetics. Bold aesthetics are
required.
x
y
xend
yend
edge_colour
edge_width
edge_linetype
edge_alpha
start_cap
end_cap
label
label_pos
label_size
angle
hjust
vjust
family
fontface
lineheight
geom_dag_edges
also uses geom_dag_edges_arc
, which requires the
circular aesthetic, but this is automatically set.
library(ggplot2) dagify( y ~ x + z2 + w2 + w1, x ~ z1 + w1, z1 ~ w1 + v, z2 ~ w2 + v, w1 ~ ~w2 ) %>% ggplot(aes(x = x, y = y, xend = xend, yend = yend)) + geom_dag_edges() + geom_dag_point() + geom_dag_text() + theme_dag()
library(ggplot2) dagify( y ~ x + z2 + w2 + w1, x ~ z1 + w1, z1 ~ w1 + v, z2 ~ w2 + v, w1 ~ ~w2 ) %>% ggplot(aes(x = x, y = y, xend = xend, yend = yend)) + geom_dag_edges() + geom_dag_point() + geom_dag_text() + theme_dag()
Node text labels
geom_dag_label( mapping = NULL, data = NULL, stat = "identity", position = "identity", ..., parse = FALSE, nudge_x = 0, nudge_y = 0, check_overlap = FALSE, na.rm = FALSE, show.legend = NA, inherit.aes = TRUE )
geom_dag_label( mapping = NULL, data = NULL, stat = "identity", position = "identity", ..., parse = FALSE, nudge_x = 0, nudge_y = 0, check_overlap = FALSE, na.rm = FALSE, show.legend = NA, inherit.aes = TRUE )
mapping |
Set of aesthetic mappings created by |
data |
The data to be displayed in this layer. There are three options: If A A |
stat |
The statistical transformation to use on the data for this
layer, either as a |
position |
Position adjustment, either as a string, or the result of
a call to a position adjustment function. Cannot be jointly specified with
|
... |
Other arguments passed on to |
parse |
If |
nudge_x , nudge_y
|
Horizontal and vertical adjustment to nudge labels by.
Useful for offsetting text from points, particularly on discrete scales.
Cannot be jointly specified with |
check_overlap |
If |
na.rm |
If |
show.legend |
logical. Should this layer be included in the legends?
|
inherit.aes |
If |
geom_dag_label
understand the following aesthetics (required aesthetics are in bold):
x
y
label
alpha
angle
colour
family
fontface
group
hjust
lineheight
size
vjust
library(ggplot2) library(ggraph) g <- dagify(m ~ x + y, y ~ x) ggdag(g, text = FALSE) + geom_dag_label() g %>% tidy_dagitty() %>% ggplot(aes(x = x, y = y, xend = xend, yend = yend)) + geom_dag_edges(aes( start_cap = label_rect(name, padding = margin(2.5, 2.5, 2.5, 2.5, "mm")), end_cap = label_rect(name, padding = margin(2.5, 2.5, 2.5, 2.5, "mm")) )) + geom_dag_label(size = 5, fill = "black", color = "white") + theme_dag()
library(ggplot2) library(ggraph) g <- dagify(m ~ x + y, y ~ x) ggdag(g, text = FALSE) + geom_dag_label() g %>% tidy_dagitty() %>% ggplot(aes(x = x, y = y, xend = xend, yend = yend)) + geom_dag_edges(aes( start_cap = label_rect(name, padding = margin(2.5, 2.5, 2.5, 2.5, "mm")), end_cap = label_rect(name, padding = margin(2.5, 2.5, 2.5, 2.5, "mm")) )) + geom_dag_label(size = 5, fill = "black", color = "white") + theme_dag()
Node text
geom_dag_text( mapping = NULL, data = NULL, stat = "identity", position = "identity", ..., parse = FALSE, nudge_x = 0, nudge_y = 0, check_overlap = FALSE, na.rm = FALSE, show.legend = NA, inherit.aes = TRUE )
geom_dag_text( mapping = NULL, data = NULL, stat = "identity", position = "identity", ..., parse = FALSE, nudge_x = 0, nudge_y = 0, check_overlap = FALSE, na.rm = FALSE, show.legend = NA, inherit.aes = TRUE )
mapping |
Set of aesthetic mappings created by |
data |
The data to be displayed in this layer. There are three options: If A A |
stat |
The statistical transformation to use on the data for this
layer, either as a |
position |
Position adjustment, either as a string, or the result of
a call to a position adjustment function. Cannot be jointly specified with
|
... |
Other arguments passed on to |
parse |
If |
nudge_x , nudge_y
|
Horizontal and vertical adjustment to nudge labels by.
Useful for offsetting text from points, particularly on discrete scales.
Cannot be jointly specified with |
check_overlap |
If |
na.rm |
If |
show.legend |
logical. Should this layer be included in the legends?
|
inherit.aes |
If |
geom_dag_text
understand the following aesthetics (required aesthetics are in bold):
x
y
label
alpha
angle
colour
family
fontface
group
hjust
lineheight
size
vjust
library(ggplot2) g <- dagify(m ~ x + y, y ~ x) g %>% tidy_dagitty() %>% ggplot(aes(x = x, y = y, xend = xend, yend = yend)) + geom_dag_point() + geom_dag_edges() + geom_dag_text() + theme_dag()
library(ggplot2) g <- dagify(m ~ x + y, y ~ x) g %>% tidy_dagitty() %>% ggplot(aes(x = x, y = y, xend = xend, yend = yend)) + geom_dag_point() + geom_dag_edges() + geom_dag_text() + theme_dag()
ggdag()
is a wrapper to quickly plot DAGs.
ggdag( .tdy_dag, ..., edge_type = "link_arc", node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = "black", node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL )
ggdag( .tdy_dag, ..., edge_type = "link_arc", node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = "black", node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL )
.tdy_dag |
input graph, an object of class |
... |
additional arguments passed to |
edge_type |
a character vector, the edge geom to use. One of: "link_arc", which accounts for directed and bidirected edges, "link", "arc", or "diagonal" |
node_size |
size of DAG node |
text_size |
size of DAG text |
label_size |
size of label text |
text_col |
color of DAG text |
label_col |
color of label text |
node |
logical. Should nodes be included in the DAG? |
stylized |
logical. Should DAG nodes be stylized? If so, use
|
text |
logical. Should text be included in the DAG? |
use_labels |
a string. Variable to use for |
a ggplot
dag <- dagify( y ~ x + z2 + w2 + w1, x ~ z1 + w1, z1 ~ w1 + v, z2 ~ w2 + v, w1 ~ ~w2 ) ggdag(dag) ggdag(dag) + theme_dag_blank() ggdag(dagitty::randomDAG(5, .5))
dag <- dagify( y ~ x + z2 + w2 + w1, x ~ z1 + w1, z1 ~ w1 + v, z2 ~ w2 + v, w1 ~ ~w2 ) ggdag(dag) ggdag(dag) + theme_dag_blank() ggdag(dagitty::randomDAG(5, .5))
ggdag_classic()
is a wrapper to quickly plot DAGs in a more
traditional style.
ggdag_classic( .tdy_dag, ..., size = 8, label_rect_size = NULL, text_label = "name", text_col = "black" )
ggdag_classic( .tdy_dag, ..., size = 8, label_rect_size = NULL, text_label = "name", text_col = "black" )
.tdy_dag |
input graph, an object of class |
... |
additional arguments passed to |
size |
text size, with a default of 8. |
label_rect_size |
specify the |
text_label |
text variable, with a default of "name" |
text_col |
text color, with a default of "black" |
a ggplot
dag <- dagify( y ~ x + z2 + w2 + w1, x ~ z1 + w1, z1 ~ w1 + v, z2 ~ w2 + v, w1 ~ ~w2 ) ggdag_classic(dag) ggdag_classic(dag) + theme_dag_blank() ggdag_classic(dagitty::randomDAG(5, .5))
dag <- dagify( y ~ x + z2 + w2 + w1, x ~ z1 + w1, z1 ~ w1 + v, z2 ~ w2 + v, w1 ~ ~w2 ) ggdag_classic(dag) ggdag_classic(dag) + theme_dag_blank() ggdag_classic(dagitty::randomDAG(5, .5))
Create a new ggplot
## S3 method for class 'tidy_dagitty' ggplot(data = NULL, mapping = aes(), ...) ## S3 method for class 'dagitty' ggplot(data = NULL, mapping = aes(), ...)
## S3 method for class 'tidy_dagitty' ggplot(data = NULL, mapping = aes(), ...) ## S3 method for class 'dagitty' ggplot(data = NULL, mapping = aes(), ...)
data |
Default dataset to use for plot. If not already a data.frame,
will be converted to one by |
mapping |
Default list of aesthetic mappings to use for plot. If not specified, must be supplied in each layer added to the plot. |
... |
Other arguments passed on to methods. Not currently used. |
These functions are minor modifications of those in the ggrepel
package. geom_dag_text_repel adds text directly to the plot.
geom_dag_label_repel draws a rectangle underneath the text, making it easier
to read. The text labels repel away from each other and away from the data
points.
geom_dag_text_repel( mapping = NULL, data = NULL, parse = FALSE, ..., box.padding = 0.35, point.padding = 1.5, segment.color = "#666666", fontface = "bold", segment.size = 0.5, arrow = NULL, force = 1, max.iter = 2000, nudge_x = 0, nudge_y = 0, na.rm = FALSE, show.legend = NA, inherit.aes = TRUE ) geom_dag_label_repel( mapping = NULL, data = NULL, parse = FALSE, ..., box.padding = grid::unit(0.35, "lines"), label.padding = grid::unit(0.25, "lines"), point.padding = grid::unit(1.5, "lines"), label.r = grid::unit(0.15, "lines"), label.size = 0.25, segment.color = "grey50", segment.size = 0.5, arrow = NULL, force = 1, max.iter = 2000, nudge_x = 0, nudge_y = 0, na.rm = FALSE, show.legend = NA, inherit.aes = TRUE )
geom_dag_text_repel( mapping = NULL, data = NULL, parse = FALSE, ..., box.padding = 0.35, point.padding = 1.5, segment.color = "#666666", fontface = "bold", segment.size = 0.5, arrow = NULL, force = 1, max.iter = 2000, nudge_x = 0, nudge_y = 0, na.rm = FALSE, show.legend = NA, inherit.aes = TRUE ) geom_dag_label_repel( mapping = NULL, data = NULL, parse = FALSE, ..., box.padding = grid::unit(0.35, "lines"), label.padding = grid::unit(0.25, "lines"), point.padding = grid::unit(1.5, "lines"), label.r = grid::unit(0.15, "lines"), label.size = 0.25, segment.color = "grey50", segment.size = 0.5, arrow = NULL, force = 1, max.iter = 2000, nudge_x = 0, nudge_y = 0, na.rm = FALSE, show.legend = NA, inherit.aes = TRUE )
mapping |
Set of aesthetic mappings created by |
data |
A data frame. If specified, overrides the default data frame defined at the top level of the plot. |
parse |
If TRUE, the labels will be parsed into expressions and displayed as described in ?plotmath |
... |
other arguments passed on to
|
box.padding |
Amount of padding around bounding box, as unit or number.
Defaults to 0.25. (Default unit is lines, but other units can be specified
by passing |
point.padding |
Amount of padding around labeled point, as unit or
number. Defaults to 0. (Default unit is lines, but other units can be
specified by passing |
segment.color , segment.size
|
|
fontface |
A character vector. Default is "bold" |
arrow |
specification for arrow heads, as created by |
force |
Force of repulsion between overlapping text labels. Defaults to 1. |
max.iter |
Maximum number of iterations to try to resolve overlaps. Defaults to 10000. |
nudge_x , nudge_y
|
Horizontal and vertical adjustments to nudge the
starting position of each text label. The units for |
na.rm |
If |
show.legend |
logical. Should this layer be included in the legends?
|
inherit.aes |
If |
label.padding |
Amount of padding around label, as unit or number.
Defaults to 0.25. (Default unit is lines, but other units can be specified
by passing |
label.r |
Radius of rounded corners, as unit or number. Defaults
to 0.15. (Default unit is lines, but other units can be specified by
passing |
label.size |
Size of label border, in mm. |
library(ggplot2) g <- dagify(m ~ x + y, y ~ x, exposure = "x", outcome = "y", latent = "m", labels = c("x" = "Exposure", "y" = "Outcome", "m" = "Collider") ) g %>% tidy_dagitty() %>% ggplot(aes(x = x, y = y, xend = xend, yend = yend)) + geom_dag_edges() + geom_dag_point() + geom_dag_text_repel(aes(label = name), show.legend = FALSE) + theme_dag() g %>% tidy_dagitty() %>% dag_label(labels = c( "x" = "This is the exposure", "y" = "Here's the outcome", "m" = "Here is where they collide" )) %>% ggplot(aes(x = x, y = y, xend = xend, yend = yend)) + geom_dag_edges() + geom_dag_point() + geom_dag_text() + geom_dag_label_repel(aes(label = label, fill = label), col = "white", show.legend = FALSE ) + theme_dag()
library(ggplot2) g <- dagify(m ~ x + y, y ~ x, exposure = "x", outcome = "y", latent = "m", labels = c("x" = "Exposure", "y" = "Outcome", "m" = "Collider") ) g %>% tidy_dagitty() %>% ggplot(aes(x = x, y = y, xend = xend, yend = yend)) + geom_dag_edges() + geom_dag_point() + geom_dag_text_repel(aes(label = name), show.legend = FALSE) + theme_dag() g %>% tidy_dagitty() %>% dag_label(labels = c( "x" = "This is the exposure", "y" = "Here's the outcome", "m" = "Here is where they collide" )) %>% ggplot(aes(x = x, y = y, xend = xend, yend = yend)) + geom_dag_edges() + geom_dag_point() + geom_dag_text() + geom_dag_label_repel(aes(label = label, fill = label), col = "white", show.legend = FALSE ) + theme_dag()
node_instrumental
tags instrumental variables given an exposure and
outcome. ggdag_instrumental
plots all instrumental variables. See
dagitty::instrumentalVariables()
for details.
node_instrumental(.dag, exposure = NULL, outcome = NULL, ...) ggdag_instrumental( .tdy_dag, exposure = NULL, outcome = NULL, ..., node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL )
node_instrumental(.dag, exposure = NULL, outcome = NULL, ...) ggdag_instrumental( .tdy_dag, exposure = NULL, outcome = NULL, ..., node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL )
.dag , .tdy_dag
|
input graph, an object of class |
exposure |
character vector of length 1, name of exposure variable.
Default is |
outcome |
character vector of length 1, name of exposure variable.
Default is |
... |
additional arguments passed to |
node_size |
size of DAG node |
text_size |
size of DAG text |
label_size |
size of label text |
text_col |
color of DAG text |
label_col |
color of label text |
node |
logical. Should nodes be included in the DAG? |
stylized |
logical. Should DAG nodes be stylized? If so, use
|
text |
logical. Should text be included in the DAG? |
use_labels |
a string. Variable to use for |
a tidy_dagitty
with an instrumental
column for
instrumental variables or a ggplot
library(dagitty) node_instrumental(dagitty("dag{ i->x->y; x<->y }"), "x", "y") ggdag_instrumental(dagitty("dag{ i->x->y; i2->x->y; x<->y }"), "x", "y")
library(dagitty) node_instrumental(dagitty("dag{ i->x->y; x<->y }"), "x", "y") ggdag_instrumental(dagitty("dag{ i->x->y; i2->x->y; x<->y }"), "x", "y")
Assess if a variable confounds a relationship
is_confounder(.tdy_dag, z, x, y, direct = FALSE)
is_confounder(.tdy_dag, z, x, y, direct = FALSE)
.tdy_dag |
input graph, an object of class |
z |
a character vector, the potential confounder |
x , y
|
a character vector, the variables z may confound. |
direct |
logical. Only consider direct confounding? Default is
|
Logical. Is the variable a confounder?
dag <- dagify(y ~ z, x ~ z) is_confounder(dag, "z", "x", "y") is_confounder(dag, "x", "z", "y")
dag <- dagify(y ~ z, x ~ z) is_confounder(dag, "z", "x", "y") is_confounder(dag, "x", "z", "y")
Test for object class for tidy_dagitty
is.tidy_dagitty(x)
is.tidy_dagitty(x)
x |
object to be tested |
geom_dag_node
and geom_dag_point
are very similar to
ggplot2::geom_point but with a few defaults changed. geom_dag_node
is
slightly stylized and includes an internal white circle, while
geom_dag_point
plots a single point.
geom_dag_node( mapping = NULL, data = NULL, position = "identity", ..., na.rm = FALSE, show.legend = NA, inherit.aes = TRUE ) geom_dag_point( mapping = NULL, data = NULL, position = "identity", ..., na.rm = FALSE, show.legend = NA, inherit.aes = TRUE )
geom_dag_node( mapping = NULL, data = NULL, position = "identity", ..., na.rm = FALSE, show.legend = NA, inherit.aes = TRUE ) geom_dag_point( mapping = NULL, data = NULL, position = "identity", ..., na.rm = FALSE, show.legend = NA, inherit.aes = TRUE )
mapping |
Set of aesthetic mappings created by |
data |
The data to be displayed in this layer. There are three options: If A A |
position |
Position adjustment, either as a string naming the adjustment
(e.g. |
... |
Other arguments passed on to |
na.rm |
If |
show.legend |
logical. Should this layer be included in the legends?
|
inherit.aes |
If |
geom_dag_node
and geom_dag_point
understand the
following aesthetics (required aesthetics are in bold):
x
y
alpha
colour
fill
shape
size
stroke
filter
geom_dag_node
also accepts:
internal_colour
library(ggplot2) g <- dagify(m ~ x + y, y ~ x) p <- g %>% tidy_dagitty() %>% ggplot(aes(x = x, y = y, xend = xend, yend = yend)) + geom_dag_edges() + theme_dag() p + geom_dag_node() + geom_dag_text() p + geom_dag_point() + geom_dag_text()
library(ggplot2) g <- dagify(m ~ x + y, y ~ x) p <- g %>% tidy_dagitty() %>% ggplot(aes(x = x, y = y, xend = xend, yend = yend)) + geom_dag_edges() + theme_dag() p + geom_dag_node() + geom_dag_text() p + geom_dag_point() + geom_dag_text()
dag_paths
finds open paths between a given exposure and outcome.
ggdag_paths
and ggdag_paths_fan
plot all open paths. See
dagitty::paths()
for details.
dag_paths( .dag, from = NULL, to = NULL, adjust_for = NULL, limit = 100, directed = FALSE, paths_only = FALSE, ... ) ggdag_paths( .tdy_dag, from = NULL, to = NULL, adjust_for = NULL, limit = 100, directed = FALSE, shadow = FALSE, ..., node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL ) ggdag_paths_fan( .tdy_dag, from = NULL, to = NULL, adjust_for = NULL, limit = 100, directed = FALSE, ..., shadow = FALSE, spread = 0.7, node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL )
dag_paths( .dag, from = NULL, to = NULL, adjust_for = NULL, limit = 100, directed = FALSE, paths_only = FALSE, ... ) ggdag_paths( .tdy_dag, from = NULL, to = NULL, adjust_for = NULL, limit = 100, directed = FALSE, shadow = FALSE, ..., node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL ) ggdag_paths_fan( .tdy_dag, from = NULL, to = NULL, adjust_for = NULL, limit = 100, directed = FALSE, ..., shadow = FALSE, spread = 0.7, node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL )
.dag , .tdy_dag
|
input graph, an object of class |
from |
character vector of length 1, name of exposure variable. Default
is |
to |
character vector of length 1, name of exposure variable. Default is
|
adjust_for |
character vector, a set of variables to control for.
Default is |
limit |
maximum amount of paths to show. In general, the number of paths grows exponentially with the number of variables in the graph, such that path inspection is not useful except for the most simple models. |
directed |
logical. Should only directed paths be shown? |
paths_only |
logical. Should only open paths be returned? Default is
|
... |
additional arguments passed to |
shadow |
logical. Show edges which are not on an open path? Ignored if
|
node_size |
size of DAG node |
text_size |
size of DAG text |
label_size |
size of label text |
text_col |
color of DAG text |
label_col |
label color |
node |
logical. Should nodes be included in the DAG? |
stylized |
logical. Should DAG nodes be stylized? If so, use
|
text |
logical. Should text be included in the DAG? |
use_labels |
a string. Variable to use for |
spread |
the width of the fan spread |
a tidy_dagitty
with a path
column for path variables and a set
grouping column or a ggplot
.
confounder_triangle(x_y_associated = TRUE) %>% dag_paths(from = "x", to = "y") confounder_triangle(x_y_associated = TRUE) %>% ggdag_paths(from = "x", to = "y") butterfly_bias(x_y_associated = TRUE) %>% ggdag_paths_fan(shadow = TRUE)
confounder_triangle(x_y_associated = TRUE) %>% dag_paths(from = "x", to = "y") confounder_triangle(x_y_associated = TRUE) %>% ggdag_paths(from = "x", to = "y") butterfly_bias(x_y_associated = TRUE) %>% ggdag_paths_fan(shadow = TRUE)
tidy_dagitty
Print a tidy_dagitty
## S3 method for class 'tidy_dagitty' print(x, ...)
## S3 method for class 'tidy_dagitty' print(x, ...)
x |
an object of class |
... |
optional arguments passed to |
pull_dag()
and pull_dag_data()
are generic methods to pull components of
DAG objects, e.g. tidy_dagitty
, such as the dagitty
object or the data
frame associated with it. These methods are recommended over extracting
components manually, e.g. my_dag$data
, because the internal structure of
these objects may change over time. Similarly, use update_dag()
if you want
to sync the data back to the DAG object or override it with another DAG; use
update_dag_data()
to do update the data frame. This is useful with
pull_dag_data()
.
pull_dag(x, ...) ## S3 method for class 'tidy_dagitty' pull_dag(x, ...) ## S3 method for class 'dagitty' pull_dag(x, ...) pull_dag_data(x, ...) ## S3 method for class 'tidy_dagitty' pull_dag_data(x, ...) ## S3 method for class 'dagitty' pull_dag_data(x, ...) update_dag_data(x) <- value ## S3 replacement method for class 'tidy_dagitty' update_dag_data(x) <- value update_dag(x, ...) update_dag(x) <- value ## S3 method for class 'tidy_dagitty' update_dag(x, ...) ## S3 replacement method for class 'tidy_dagitty' update_dag(x) <- value
pull_dag(x, ...) ## S3 method for class 'tidy_dagitty' pull_dag(x, ...) ## S3 method for class 'dagitty' pull_dag(x, ...) pull_dag_data(x, ...) ## S3 method for class 'tidy_dagitty' pull_dag_data(x, ...) ## S3 method for class 'dagitty' pull_dag_data(x, ...) update_dag_data(x) <- value ## S3 replacement method for class 'tidy_dagitty' update_dag_data(x) <- value update_dag(x, ...) update_dag(x) <- value ## S3 method for class 'tidy_dagitty' update_dag(x, ...) ## S3 replacement method for class 'tidy_dagitty' update_dag(x) <- value
x |
a |
... |
For |
value |
a value to set, either a |
a DAG object, e.g. dagitty
, or data frame
tidy_dagitty_obj <- dagify(y ~ x + z, x ~ z) %>% tidy_dagitty() dag <- pull_dag(tidy_dagitty_obj) dag_data <- pull_dag_data(tidy_dagitty_obj) tidy_dagitty_obj %>% dplyr::mutate(name = toupper(name)) %>% # recreate the DAG component update_dag() dag_data$label <- paste0(dag_data$name, "(observed)") update_dag_data(tidy_dagitty_obj) <- dag_data
tidy_dagitty_obj <- dagify(y ~ x + z, x ~ z) %>% tidy_dagitty() dag <- pull_dag(tidy_dagitty_obj) dag_data <- pull_dag_data(tidy_dagitty_obj) tidy_dagitty_obj %>% dplyr::mutate(name = toupper(name)) %>% # recreate the DAG component update_dag() dag_data$label <- paste0(dag_data$name, "(observed)") update_dag_data(tidy_dagitty_obj) <- dag_data
base functions create an object of class dagitty
; ggdag_*
functions
are wrappers that also call ggdag()
on the dagitty
object.
m_bias( x = NULL, y = NULL, a = NULL, b = NULL, m = NULL, x_y_associated = FALSE ) butterfly_bias( x = NULL, y = NULL, a = NULL, b = NULL, m = NULL, x_y_associated = FALSE ) confounder_triangle(x = NULL, y = NULL, z = NULL, x_y_associated = FALSE) collider_triangle(x = NULL, y = NULL, m = NULL, x_y_associated = FALSE) mediation_triangle(x = NULL, y = NULL, m = NULL, x_y_associated = FALSE) ggdag_m_bias( x = NULL, y = NULL, a = NULL, b = NULL, m = NULL, x_y_associated = FALSE, edge_type = "link_arc", node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL ) ggdag_butterfly_bias( x = NULL, y = NULL, a = NULL, b = NULL, m = NULL, x_y_associated = FALSE, edge_type = "link_arc", node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL ) ggdag_confounder_triangle( x = NULL, y = NULL, z = NULL, x_y_associated = FALSE, edge_type = "link_arc", node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL ) ggdag_collider_triangle( x = NULL, y = NULL, m = NULL, x_y_associated = FALSE, edge_type = "link_arc", node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL ) ggdag_mediation_triangle( x = NULL, y = NULL, m = NULL, x_y_associated = FALSE, edge_type = "link_arc", node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL )
m_bias( x = NULL, y = NULL, a = NULL, b = NULL, m = NULL, x_y_associated = FALSE ) butterfly_bias( x = NULL, y = NULL, a = NULL, b = NULL, m = NULL, x_y_associated = FALSE ) confounder_triangle(x = NULL, y = NULL, z = NULL, x_y_associated = FALSE) collider_triangle(x = NULL, y = NULL, m = NULL, x_y_associated = FALSE) mediation_triangle(x = NULL, y = NULL, m = NULL, x_y_associated = FALSE) ggdag_m_bias( x = NULL, y = NULL, a = NULL, b = NULL, m = NULL, x_y_associated = FALSE, edge_type = "link_arc", node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL ) ggdag_butterfly_bias( x = NULL, y = NULL, a = NULL, b = NULL, m = NULL, x_y_associated = FALSE, edge_type = "link_arc", node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL ) ggdag_confounder_triangle( x = NULL, y = NULL, z = NULL, x_y_associated = FALSE, edge_type = "link_arc", node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL ) ggdag_collider_triangle( x = NULL, y = NULL, m = NULL, x_y_associated = FALSE, edge_type = "link_arc", node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL ) ggdag_mediation_triangle( x = NULL, y = NULL, m = NULL, x_y_associated = FALSE, edge_type = "link_arc", node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL )
x , y , a , b , m , z
|
Character vector. Optional label. Default is |
x_y_associated |
Logical. Are x and y associated? Default is |
edge_type |
a character vector, the edge geom to use. One of: "link_arc", which accounts for directed and bidirected edges, "link", "arc", or "diagonal" |
node_size |
size of DAG node |
text_size |
size of DAG text |
label_size |
size of label text |
text_col |
color of DAG text |
label_col |
color of label text |
node |
logical. Should nodes be included in the DAG? |
stylized |
logical. Should DAG nodes be stylized? If so, use
|
text |
logical. Should text be included in the DAG? |
use_labels |
a string. Variable to use for |
a DAG of class dagitty
or a ggplot
m_bias() %>% ggdag_adjust("m") ggdag_confounder_triangle()
m_bias() %>% ggdag_adjust("m") ggdag_confounder_triangle()
remove_axes()
and remove_grid()
are convenience functions that removes
the axes and grids from a ggplot, respectively. This is useful when you want
to use an existing theme, e.g. those included in ggplot2
, for a DAG.
remove_axes() remove_grid()
remove_axes() remove_grid()
library(ggplot2) ggdag(confounder_triangle()) + theme_bw() + remove_axes()
library(ggplot2) ggdag(confounder_triangle()) + theme_bw() + remove_axes()
scale_adjusted()
is a convenience function that implements ways of
visualizing adjustment for a variable. By convention, a square shape is used
to indicate adjustment and a circle when not adjusted. Arrows out of adjusted
variables are often eliminated or de-emphasized, and scale_adjusted()
uses
a lower alpha
for these arrows. When adjusting a collider, a dashed line is
sometimes used to demarcate opened pathways, and scale_adjusted()
does this
whenever geom_dag_collider_edges()
is used. scale_dag()
is deprecated in
favor of scale_adjusted()
.
scale_adjusted() scale_dag(breaks = ggplot2::waiver())
scale_adjusted() scale_dag(breaks = ggplot2::waiver())
breaks |
One of:
|
This is a thin wrapper for the simulateSEM()
function in dagitty
that works with tidied dagitty objects. It treats the input DAG as a
structural equation model, generating random path coefficients and simulating
corresponding data. See dagitty::simulateSEM()
for
details.
simulate_data( .tdy_dag, b.default = NULL, b.lower = -0.6, b.upper = 0.6, eps = 1, N = 500, standardized = TRUE )
simulate_data( .tdy_dag, b.default = NULL, b.lower = -0.6, b.upper = 0.6, eps = 1, N = 500, standardized = TRUE )
.tdy_dag |
the input DAG, which can be a |
b.default |
default path coefficient applied to arrows for which no coefficient is defined in the model syntax. |
b.lower |
lower bound for random path coefficients, applied if b.default = NULL. |
b.upper |
upper bound for path coefficients. |
eps |
residual variance (only meaningful if standardized=FALSE). |
N |
number of samples to generate. |
standardized |
whether a standardized output is desired (all variables have variance 1). |
a tbl
with N values for each variable in .tdy_dag
dagify(y ~ z, x ~ z) %>% tidy_dagitty() %>% simulate_data()
dagify(y ~ z, x ~ z) %>% tidy_dagitty() %>% simulate_data()
tidy_dagitty
object to tbl_dfConvert a tidy_dagitty
object to tbl_df
tbl_df.tidy_daggity(.tdy_dag)
tbl_df.tidy_daggity(.tdy_dag)
.tdy_dag |
an object of class |
Detecting colliders in DAGs
is_collider(.dag, .var, downstream = TRUE) is_downstream_collider(.dag, .var)
is_collider(.dag, .var, downstream = TRUE) is_downstream_collider(.dag, .var)
.dag |
an input graph, an object of class |
.var |
a character vector of length 1, the potential collider to check |
downstream |
Logical. Check for downstream colliders? Default is |
Logical. Is the variable a collider or downstream collider?
dag <- dagify(m ~ x + y, m_jr ~ m) is_collider(dag, "m") is_downstream_collider(dag, "m_jr") # a downstream collider is also treated as a collider is_collider(dag, "m_jr") # but a direct collider is not treated as a downstream collider is_downstream_collider(dag, "m")
dag <- dagify(m ~ x + y, m_jr ~ m) is_collider(dag, "m") is_downstream_collider(dag, "m_jr") # a downstream collider is also treated as a collider is_collider(dag, "m_jr") # but a direct collider is not treated as a downstream collider is_downstream_collider(dag, "m")
Minimalist DAG themes
theme_dag_blank(base_size = 12, base_family = "", ...) theme_dag(base_size = 12, base_family = "", ...) theme_dag_grid(base_size = 12, base_family = "", ...)
theme_dag_blank(base_size = 12, base_family = "", ...) theme_dag(base_size = 12, base_family = "", ...) theme_dag_grid(base_size = 12, base_family = "", ...)
base_size |
base font size, given in pts. |
base_family |
base font family |
... |
additional arguments passed to |
ggdag(m_bias()) + theme_dag_blank() # the default
ggdag(m_bias()) + theme_dag_blank() # the default
Simple grey themes for DAGs
theme_dag_grey(base_size = 12, base_family = "", ...) theme_dag_gray(base_size = 12, base_family = "", ...) theme_dag_grey_grid(base_size = 12, base_family = "", ...) theme_dag_gray_grid(base_size = 12, base_family = "", ...)
theme_dag_grey(base_size = 12, base_family = "", ...) theme_dag_gray(base_size = 12, base_family = "", ...) theme_dag_grey_grid(base_size = 12, base_family = "", ...) theme_dag_gray_grid(base_size = 12, base_family = "", ...)
base_size |
base font size, given in pts. |
base_family |
base font family |
... |
additional arguments passed to |
ggdag(m_bias()) + theme_dag_grey()
ggdag(m_bias()) + theme_dag_grey()
dagitty
objectTidy a dagitty
object
tidy_dagitty(.dagitty, seed = NULL, layout = "nicely", ...)
tidy_dagitty(.dagitty, seed = NULL, layout = "nicely", ...)
.dagitty |
a |
seed |
a numeric seed for reproducible layout generation |
layout |
a layout available in |
... |
optional arguments passed to |
a tidy_dagitty
object
library(dagitty) library(ggplot2) dag <- dagitty("dag { Y <- X <- Z1 <- V -> Z2 -> Y Z1 <- W1 <-> W2 -> Z2 X <- W1 -> Y X <- W2 -> Y X [exposure] Y [outcome] }") tidy_dagitty(dag) tidy_dagitty(dag, layout = "fr") %>% ggplot(aes(x = x, y = y, xend = xend, yend = yend)) + geom_dag_node() + geom_dag_text() + geom_dag_edges() + theme_dag()
library(dagitty) library(ggplot2) dag <- dagitty("dag { Y <- X <- Z1 <- V -> Z2 -> Y Z1 <- W1 <-> W2 -> Z2 X <- W1 -> Y X <- W2 -> Y X [exposure] Y [outcome] }") tidy_dagitty(dag) tidy_dagitty(dag, layout = "fr") %>% ggplot(aes(x = x, y = y, xend = xend, yend = yend)) + geom_dag_node() + geom_dag_text() + geom_dag_edges() + theme_dag()
time_ordered_coords()
is a helper function to create time-ordered DAGs.
Pass the results to the coords
argument of dagify()
. If .vars
if not
specified, these coordinates will be determined automatically. If you want to
be specific, you can also use a list or data frame. The default is to assume
you want variables to go from left to right in order by time. Variables are
spread along the y-axis using a simple algorithm to stack them. You can also
work along the y-axis by setting direction = "y"
.
time_ordered_coords( .vars = NULL, time_points = NULL, direction = c("x", "y"), auto_sort_direction = c("right", "left") )
time_ordered_coords( .vars = NULL, time_points = NULL, direction = c("x", "y"), auto_sort_direction = c("right", "left") )
.vars |
A list of character vectors, where each vector represents a single time period. Alternatively, a data frame where the first column is the variable name and the second column is the time period. |
time_points |
A vector of time points. Default is |
direction |
A character string indicating the axis along which the variables should be time-ordered. Either "x" or "y". Default is "x". |
auto_sort_direction |
If |
A tibble with three columns: name
, x
, and y
.
dagify()
, coords2df()
, coords2list()
dagify( d ~ c1 + c2 + c3, c1 ~ b1 + b2, c3 ~ a, b1 ~ a, coords = time_ordered_coords() ) %>% ggdag() coords <- time_ordered_coords(list( # time point 1 "a", # time point 2 c("b1", "b2"), # time point 3 c("c1", "c2", "c3"), # time point 4 "d" )) dagify( d ~ c1 + c2 + c3, c1 ~ b1 + b2, c3 ~ a, b1 ~ a, coords = coords ) %>% ggdag() # or use a data frame x <- data.frame( name = c("x1", "x2", "y", "z1", "z2", "z3", "a"), time = c(1, 1, 2, 3, 3, 3, 4) ) dagify( z3 ~ y, y ~ x1 + x2, a ~ z1 + z2 + z3, coords = time_ordered_coords(x) ) %>% ggdag()
dagify( d ~ c1 + c2 + c3, c1 ~ b1 + b2, c3 ~ a, b1 ~ a, coords = time_ordered_coords() ) %>% ggdag() coords <- time_ordered_coords(list( # time point 1 "a", # time point 2 c("b1", "b2"), # time point 3 c("c1", "c2", "c3"), # time point 4 "d" )) dagify( d ~ c1 + c2 + c3, c1 ~ b1 + b2, c3 ~ a, b1 ~ a, coords = coords ) %>% ggdag() # or use a data frame x <- data.frame( name = c("x1", "x2", "y", "z1", "z2", "z3", "a"), time = c(1, 1, 2, 3, 3, 3, 4) ) dagify( z3 ~ y, y ~ x1 + x2, a ~ z1 + z2 + z3, coords = time_ordered_coords(x) ) %>% ggdag()
Detects variable status given a DAG (exposure, outcome, latent). See
dagitty::VariableStatus()
for details.
node_status(.dag, as_factor = TRUE, ...) ggdag_status( .tdy_dag, ..., edge_type = "link_arc", node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL )
node_status(.dag, as_factor = TRUE, ...) ggdag_status( .tdy_dag, ..., edge_type = "link_arc", node_size = 16, text_size = 3.88, label_size = text_size, text_col = "white", label_col = text_col, node = TRUE, stylized = FALSE, text = TRUE, use_labels = NULL )
.dag , .tdy_dag
|
input graph, an object of class |
as_factor |
treat |
... |
additional arguments passed to |
edge_type |
a character vector, the edge geom to use. One of: "link_arc", which accounts for directed and bidirected edges, "link", "arc", or "diagonal" |
node_size |
size of DAG node |
text_size |
size of DAG text |
label_size |
size of label text |
text_col |
color of DAG text |
label_col |
color of label text |
node |
logical. Should nodes be included in the DAG? |
stylized |
logical. Should DAG nodes be stylized? If so, use
|
text |
logical. Should text be included in the DAG? |
use_labels |
a string. Variable to use for |
node_collider
tags variable status and ggdag_collider
plots all
variable statuses.
a tidy_dagitty
with a status
column for
variable status or a ggplot
dag <- dagify(l ~ x + y, y ~ x, exposure = "x", outcome = "y", latent = "l" ) node_status(dag) ggdag_status(dag)
dag <- dagify(l ~ x + y, y ~ x, exposure = "x", outcome = "y", latent = "l" ) node_status(dag) ggdag_status(dag)