Permalink
Cannot retrieve contributors at this time
Join GitHub today
GitHub is home to over 31 million developers working together to host and review code, manage projects, and build software together.
Sign up
Fetching contributors…

#' Create a dagitty DAG | |
#' | |
#' A convenience wrapper for dagitty::dagitty("dag{...}") | |
#' | |
#' @param ... a character vector in the style of dagitty. See | |
#' \code{dagitty::\link[dagitty]{dagitty}} for details. | |
#' | |
#' @return a `dagitty` | |
#' @export | |
#' | |
#' @examples | |
#' dag("{x m} -> y") | |
#' | |
#' | |
dag <- function(...) { | |
dag_string <- paste(..., sep = "; ") | |
dagitty::dagitty(paste0("dag{", dag_string, "}")) | |
} | |
#' Create a dagitty DAG using R-like syntax | |
#' | |
#' `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`. | |
#' | |
#' @param ... formulas, which are converted to `dagitty` syntax | |
#' @param exposure a character vector for the exposure (must be a variable name | |
#' in the DAG) | |
#' @param outcome a character vector for the outcome (must be a variable name in | |
#' the DAG) | |
#' @param latent a character vector for any latent variables (must be a variable | |
#' name in the DAG) | |
#' @param labels a named character vector, labels for variables in the DAG | |
#' @param coords coordinates for the DAG nodes. Can be a named list or a | |
#' `data.frame` with columns x, y, and name | |
#' | |
#' @return a `dagitty` DAG | |
#' @export | |
#' | |
#' @examples | |
#' | |
#' 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) | |
#' | |
#' @seealso [dag()], [coords2df()], [coords2list()] | |
dagify <- function(..., exposure = NULL, outcome = NULL, latent = NULL, labels = NULL, coords = NULL) { | |
fmlas <- list(...) | |
dag_txt <- purrr::map_chr(fmlas, formula2char) | |
dag_txt <- paste(dag_txt, collapse = "; ") %>% | |
paste("dag {", ., "}") | |
dgty <- dagitty::dagitty(dag_txt) | |
if (!is.null(exposure)) dagitty::exposures(dgty) <- exposure | |
if (!is.null(outcome)) dagitty::outcomes(dgty) <- outcome | |
if (!is.null(latent)) dagitty::latents(dgty) <- latent | |
if (!is.null(coords)) { | |
if (is.data.frame(coords)) { | |
dagitty::coordinates(dgty) <- coords2list(coords) | |
} else if (is.list(coords)) { | |
dagitty::coordinates(dgty) <- coords | |
} else { | |
stop("`coords` must be of class `list` or `data.frame`") | |
} | |
} | |
if (!is.null(labels)) label(dgty) <- labels | |
dgty | |
} |