| Type: | Package | 
| Title: | Fast Staggered Difference-in-Difference Estimators | 
| Version: | 1.0.5 | 
| Date: | 2025-06-13 | 
| Maintainer: | Lin-Tung Tsai <tsaidondon@gmail.com> | 
| Description: | A fast and flexible implementation of Callaway and Sant'Anna's (2021)<doi:10.1016/j.jeconom.2020.12.001> staggered Difference-in-Differences (DiD) estimators, 'fastdid' reduces the computation time from hours to seconds, and incorporates extensions such as time-varying covariates and multiple events. | 
| License: | MIT + file LICENSE | 
| Depends: | R (≥ 4.1.0) | 
| Imports: | data.table (≥ 1.15.0), stringr, BMisc, collapse, dreamerr (≥ 1.4.0), parglm, ggplot2 | 
| Suggests: | did, knitr, parallel, rmarkdown, tinytest | 
| Encoding: | UTF-8 | 
| RoxygenNote: | 7.3.2 | 
| URL: | https://github.com/TsaiLintung/fastdid, https://tsailintung.github.io/fastdid/ | 
| BugReports: | https://github.com/TsaiLintung/fastdid/issues | 
| VignetteBuilder: | knitr | 
| NeedsCompilation: | no | 
| Packaged: | 2025-06-23 17:26:07 UTC; lttsai | 
| Author: | Lin-Tung Tsai [aut, cre, cph], Maxwell Kellogg [ctb], Kuan-Ju Tseng [ctb] | 
| Repository: | CRAN | 
| Date/Publication: | 2025-06-23 17:40:02 UTC | 
Fast Staggered DID Estimation
Description
Performs Difference-in-Differences (DID) estimation.
Usage
fastdid(
  data,
  timevar,
  cohortvar,
  unitvar,
  outcomevar,
  control_option = "both",
  result_type = "group_time",
  balanced_event_time = NA,
  control_type = "ipw",
  allow_unbalance_panel = FALSE,
  boot = FALSE,
  biters = 1000,
  cband = FALSE,
  alpha = 0.05,
  weightvar = NA,
  clustervar = NA,
  covariatesvar = NA,
  varycovariatesvar = NA,
  copy = TRUE,
  validate = TRUE,
  anticipation = 0,
  anticipation2 = 0,
  base_period = "universal",
  exper = NULL,
  full = FALSE,
  parallel = FALSE,
  cohortvar2 = NA,
  event_specific = TRUE,
  double_control_option = "both"
)
Arguments
| data | data.table, the dataset. | 
| timevar | character, name of the time variable. | 
| cohortvar | character, name of the cohort (group) variable. | 
| unitvar | character, name of the unit (id) variable. | 
| outcomevar | character vector, name(s) of the outcome variable(s). | 
| control_option | character, control units used for the DiD estimates, options are "both", "never", or "notyet". | 
| result_type | character, type of result to return, options are "group_time", "time", "group", "simple", "dynamic" (time since event), "group_group_time", or "dynamic_stagger". | 
| balanced_event_time | number, max event time to balance the cohort composition. | 
| control_type | character, estimator for controlling for covariates, options are "ipw" (inverse probability weighting), "reg" (outcome regression), or "dr" (doubly-robust). | 
| allow_unbalance_panel | logical, allow unbalance panel as input or coerce dataset into one. | 
| boot | logical, whether to use bootstrap standard error. | 
| biters | number, bootstrap iterations. Default is 1000. | 
| cband | logical, whether to use uniform confidence band or point-wise. | 
| alpha | number, the significance level. Default is 0.05. | 
| weightvar | character, name of the weight variable. | 
| clustervar | character, name of the cluster variable. | 
| covariatesvar | character vector, names of time-invariant covariate variables. | 
| varycovariatesvar | character vector, names of time-varying covariate variables. | 
| copy | logical, whether to copy the dataset. | 
| validate | logical, whether to validate the dataset. | 
| anticipation | number, periods with anticipation. | 
| anticipation2 | number, periods with anticipation for the second event. | 
| base_period | character, type of base period in pre-preiods, options are "universal", or "varying". | 
| exper | list, arguments for experimental features. | 
| full | logical, whether to return the full result (influence function, call, weighting scheme, etc,.). | 
| parallel | logical, whether to use parallization on unix system. | 
| cohortvar2 | character, name of the second cohort (group) variable. | 
| event_specific | logical, whether to recover target treatment effect or use combined effect. | 
| double_control_option | character, control units used for the double DiD, options are "both", "never", or "notyet". | 
Details
'balanced_event_time' is only meaningful when 'result_type == "dynamic'.
'result_type' as 'group-group-time' and 'dynamic staggered' is only meaningful when using double did.
'biter' and 'clustervar' is only used when 'boot == TRUE'.
Value
A data.table containing the estimated treatment effects and standard errors or a list of all results when 'full == TRUE'.
Examples
# simulated data
simdt <- sim_did(1e+02, 10, cov = "cont", second_cov = TRUE, second_outcome = TRUE, seed = 1)
dt <- simdt$dt
# basic call
result <- fastdid(
  data = dt, timevar = "time", cohortvar = "G",
  unitvar = "unit", outcomevar = "y",
  result_type = "group_time"
)
Plot event study
Description
Plot event study results.
Usage
plot_did_dynamics(x, margin = "event_time")
Arguments
| x | A data table generated with [fastdid] with one-dimensional index. | 
| margin | character, the x-axis of the plot | 
Value
A ggplot2 object
Examples
# simulated data
simdt <- sim_did(1e+02, 10, seed = 1)
dt <- simdt$dt
# estimation
result <- fastdid(
  data = dt, timevar = "time", cohortvar = "G",
  unitvar = "unit", outcomevar = "y",
  result_type = "dynamic"
)
# plot
plot_did_dynamics(result)
Simulate a Difference-in-Differences (DiD) dataset
Description
Simulates a dataset for a Difference-in-Differences analysis with various customizable options.
Usage
sim_did(
  sample_size,
  time_period,
  untreated_prop = 0.3,
  epsilon_size = 0.001,
  cov = "no",
  hetero = "all",
  second_outcome = FALSE,
  second_cov = FALSE,
  vary_cov = FALSE,
  na = "none",
  balanced = TRUE,
  seed = NA,
  stratify = FALSE,
  treatment_assign = "latent",
  second_cohort = FALSE,
  confound_ratio = 1,
  second_het = "all"
)
Arguments
| sample_size | The number of units in the dataset. | 
| time_period | The number of time periods in the dataset. | 
| untreated_prop | The proportion of untreated units. | 
| epsilon_size | The standard deviation for the error term in potential outcomes. | 
| cov | The type of covariate to include ("no", "int", or "cont"). | 
| hetero | The type of heterogeneity in treatment effects ("all" or "dynamic"). | 
| second_outcome | Whether to include a second outcome variable. | 
| second_cov | Whether to include a second covariate. | 
| vary_cov | include time-varying covariates | 
| na | Whether to generate missing data ("none", "y", "x", or "both"). | 
| balanced | Whether to balance the dataset by random sampling. | 
| seed | Seed for random number generation. | 
| stratify | Whether to stratify the dataset based on a binary covariate. | 
| treatment_assign | The method for treatment assignment ("latent" or "uniform"). | 
| second_cohort | include confounding events | 
| confound_ratio | extent of event confoundedness | 
| second_het | heterogeneity of the second event | 
Value
A list containing the simulated dataset (dt) and the treatment effect values (att).
Examples
# Simulate a DiD dataset with default settings
data <- sim_did(sample_size = 100, time_period = 5)