mattblackwell / DirectEffects

An R package for estimating controlled direct effects.
https://mattblackwell.github.io/DirectEffects/
18 stars 5 forks source link

DirectEffects

R-CMD-check

Overview

DirectEffects is an R package to estimate controlled direct effects (CDEs), which are the effect of a treatment fixing a set of downstream mediators to particular values. As of now, the package supports general doubly robust estimation of CDEs under both selection-on-observables and difference-in-differences assumptions. sequential g-estimation and a two-stage matching approach called telescope matching. For more information on how CDEs can be useful for applied research and a brief introduction to sequential g-estimation, see Acharya, Blackwell, and Sen (2016). For more on the telescope matching procedure, see Blackwell and Strezhnev (2022). For more on the difference-in-differences approach, see Blackwell, Glynn, Hilbig, and Phillips (2024).

Installation

You can install DirectEffects via CRAN for the current stable version or via GitHub for the development version.

# Installing from CRAN
install.packages("DirectEffects")

# Installing development version from Github:
# install.packages("devtools")
devtools::install_github("mattblackwell/DirectEffects", build_vignettes = TRUE)

Usage

DirectEffects uses a modular approach to specifying the models and estimators used to estimate the average controlled direct effect (ACDE). You can specify a propensity score and outcome regression model for each treatment variable (that is, each causal variable of interest), along with a set of parametric and machine learning estimators for these nuisance functions. The package has a workflow for models that assume the selection-on-observables and for models that utilize a difference-in-differences approach.

library(DirectEffects)

data(jobcorps)
my_aipw <- cde_aipw() |>
  set_treatment(treat, ~ female + age_cat) |>
  treat_model(engine = "logit") |>
  outreg_model(engine = "lm") |>
  set_treatment(work2year2q, ~ emplq4 + pemplq4) |>
  treat_model(engine = "logit") |>
  outreg_model(engine = "lm") |>
  estimate(exhealth30 ~ treat + work2year2q, data = jobcorps)

broom::tidy(my_aipw)
##                                            term      estimate  std.error
## treat_1_0             treat [(1, 0) vs. (0, 0)]  0.0324855302 0.02248379
## treat_1_1             treat [(1, 1) vs. (0, 1)]  0.0301271316 0.01394355
## work2year2q_0_1 work2year2q [(0, 1) vs. (0, 0)]  0.0038019794 0.02057364
## work2year2q_1_1 work2year2q [(1, 1) vs. (1, 0)] -0.0006775739 0.01663843
##                   statistic    p.value     conf.low  conf.high   df
## treat_1_0        1.44484233 0.14858424 -0.011595861 0.07656692 3818
## treat_1_1        2.16064973 0.03076055  0.002792942 0.05746132 6207
## work2year2q_0_1  0.18479854 0.85339644 -0.036533854 0.04413781 3991
## work2year2q_1_1 -0.04072342 0.96751774 -0.033294846 0.03193970 6034

Specific estimator implementations

DirectEffects also implements a number of specific estimators outside the modular framework. These are often specific estimators proposed in the literature:

DirectEffects also provides diagnostics for these two approaches, including sensitivity analyses and balance checks.