-
⌥ 3 steps Index: 132 89 peers Did someone manipulate the cutoff? (rddensity)
The standard manipulation test for RD designs — checks whether the running variable's density jumps at the cutoff (a sign units sorted around it).
Data prep Take the running variable▼Diagnostic / pre-tests Run the manipulation test▼Reporting Plot the two densities -
⌥ 3 steps Index: 132 84 peers The balance–sample-size frontier (MatchingFrontier)
Trace the whole tradeoff curve between covariate balance and how many units you keep, then estimate the effect at every point on the frontier.
Data prep Load MatchIt's lalonde data▼Estimation Compute the matching frontier▼Reporting Estimate effects along the frontier -
⌥ 3 steps Index: 132 40 peers Simulation-based inference for any model (clarify)
Turn any fitted model into interpretable quantities of interest — average marginal effects, predictions, contrasts — with simulation-based confidence intervals.
Estimation Fit any regression model▼Inference Simulate the coefficient distribution▼Reporting Average marginal effect of treatment -
⌥ 5 steps Index: 132 35 peers Entropy balancing for covariate overlap (ebal)
Reweight controls to exactly match the treated group's covariate moments, achieving balance without iterative propensity-score tweaking.
Data prep Assemble treatment indicator and covariat…▼Estimation Run entropy balancing▼Diagnostic / pre-tests Check exact moment balance▼Estimation Weighted ATT estimate▼Reporting Love plot of standardized differences -
⌥ 4 steps Index: 132 44 peers Synthetic control for comparative case studies (Synth)
Build a weighted 'synthetic' control from untreated units to estimate the effect of a single treated case over time.
Data prep Prepare the panel with dataprep()▼Estimation Optimize the donor weights▼Reporting Donor weights and predictor balance tables▼Reporting Path and gaps plots -
⌥ 3 steps Index: 132 67 peers Sensitivity analysis & the E-value (Ding & VanderWeele)
Reports how strong an unmeasured confounder would have to be, on the risk-ratio scale, to fully explain away an observed association.
Data prep Record the observed risk ratio and its co…▼Robustness check Compute the E-value for the estimate and …▼Reporting Interpret the E-values -
⌥ 4 steps Index: 132 23 peers Quantitative Social Science: data and code (qss)
The companion R package for Imai's textbook Quantitative Social Science, bundling every dataset and chapter vignette for hands-on data-analysis teaching.
Data prep Install and load qss▼Diagnostic / pre-tests Cross-tabulate callbacks by race▼Estimation Difference-in-means in callback rates▼Reporting Interpret the effect -
⌥ 4 steps Index: 132 83 peers Analyzing list / item-count experiments (list)
Multivariate regression for list (item-count) experiments, recovering the prevalence and predictors of a sensitive attitude without asking about it directly.
Data prep Load the list package and race data▼Diagnostic / pre-tests Difference-in-means prevalence▼Estimation Multivariate ML regression▼Reporting Predict sensitive-item prevalence -
⌥ 3 steps Index: 132 85 peers Predicting race/ethnicity from name and geography (wru)
"Who Are You?" predicts an individual's probable race/ethnicity from surname, first/middle name, and geolocation using Bayesian (BISG) updating.
Data prep Load wru and the voter file▼Estimation Predict race with BISG▼Reporting Inspect posterior probabilities -
⌥ 5 steps Index: 132 106 peers Matching for panel / time-series cross-sectional data (PanelMatch)
Matches treated unit-periods to controls with identical recent treatment histories, then applies a difference-in-differences estimator for TSCS data.
Diagnostic / pre-tests Inspect treatment distribution▼Estimation Build matched sets▼Diagnostic / pre-tests Check covariate balance▼Estimation Estimate the ATT (DiD)▼Reporting Summarize and plot leads -
⌥ 4 steps Index: 132 81 peers Ecological inference (ei)
Infers individual-level behavior from aggregate (district-level) data, the classic example being voting rates by race from precinct totals.
Data prep Load ei and prepare the 2x2 margins▼Estimation Fit the ecological inference model▼Inference Summarize aggregate estimates▼Reporting Read out precinct-level betas -
⌥ 5 steps ⑂ 1 branch Index: 60 32 peers An observational ATE you can defend (balance → estimate → sensitivity)
My checklist for an observational effect: match, prove balance with cobalt, estimate on the matched sample, then quantify hidden-confounding risk with sensemakr.
Data prep Treatment, covariates, outcome Data prep matchit() — nearest-neighbour matching Diagnostic / pre-tests bal.tab() / love.plot() — cobalt Estimation Estimate the ATT on matched data Reporting sensemakr() — robustness value + contours -
⌥ 5 steps ⑂ 1 branch Index: 84 94 peers Staggered DiD done three ways (did · did2s · fixest)
My side-by-side for staggered adoption: Callaway–Sant'Anna vs Gardner's two-stage vs Sun–Abraham — do the event studies agree?
Data prep Build the staggered panel Estimation att_gt() — Callaway & Sant'Anna Estimation did2s() — Gardner two-stage Estimation sunab() — Sun & Abraham (fixest) Reporting Overlay the three event studies -
⌥ 4 steps ⑂ 1 branch Index: 195 86 peers Confounder-adjusted survival curves for a treatment (adjustedCurves)
Compare survival between treatment groups after removing confounding — via IPTW, the g-formula or AIPW — instead of a raw Kaplan-Meier that quietly bakes in selection.
Data prep Time-to-event, treatment, confounders Estimation Adjust for confounding (IPTW / g-formula) Inference Curves with confidence bands Reporting Summaries: RMST difference, survival at t -
⌥ 4 steps ⑂ 1 branch Index: 170 65 peers Goodman-Bacon decomposition: what your TWFE estimate is averaging (bacondecomp)
A two-way fixed-effects DiD is a weighted average of all possible 2×2 comparisons — including 'forbidden' ones that use already-treated units as controls. This shows you the weights.
Data prep A staggered-adoption panel Diagnostic / pre-tests Decompose into 2×2 comparisons Robustness check Spot the forbidden comparisons Reporting Read β as a weighted average -
⌥ 4 steps ⑂ 1 branch Index: 207 21 peers Synthetic control, the tidy way — weights, gaps and placebo inference (tidysynth)
Build a synthetic version of the treated unit from a convex blend of donors, read the treated-minus-synthetic gap, and test it against placebos run on every donor.
Data prep Panel, treated unit, donor pool Estimation Solve for donor & predictor weights Reporting Read the gap: observed − synthetic Inference Placebo permutation across donors -
⌥ 4 steps ⑂ 1 branch Index: 182 16 peers Uplift modelling with S-, T-, X- and R-learners (CausalML)
Estimate who responds, not just the average: fit a family of meta-learners for the CATE, pick the best by validation error, then rank and target with an uplift curve.
Data prep Outcome, treatment, features Estimation Fit a family of meta-learners Heterogeneity Compare learners; choose by validation Reporting Targeting: uplift / Qini gain -
⌥ 4 steps ⑂ 1 branch Index: 96 21 peers Synthetic difference-in-differences (synthdid)
Reweight both control units and pre-periods to build a synthetic control, then apply a DiD correction — robust where plain SC or TWFE struggle.
Data prep Balanced panel + treated block Estimation Solve for unit & time weights Inference Placebo / jackknife standard errors Reporting Plot trajectories & the gap -
⌥ 4 steps ⑂ 1 branch Index: 96 59 peers Distributional effects: potential quantiles & CVaR (DoubleML)
When the tails matter: estimate potential quantiles and the conditional value-at-risk of a treatment with Neyman-orthogonal scores.
Data prep Build DoubleMLData (y, d, X) Estimation Potential quantiles Estimation Conditional value-at-risk Reporting Plot quantile & CVaR effects -
⌥ 4 steps ⑂ 1 branch Index: 108 73 peers Dose–response with average potential outcomes (DoubleML APO)
For a multi-valued or continuous treatment: estimate E[Y(d)] at each dose and the contrasts between them, all cross-fitted.
Data prep Declare the multi-valued treatment Estimation Average potential outcome at each level Inference Contrasts between doses Reporting Plot the dose–response curve -
⌥ 3 steps ⑂ 1 branch Index: 108 101 peers Learn an interpretable treatment policy (DoubleML policy tree)
Turn debiased CATEs into a rule: fit a shallow, readable decision tree that maximises the doubly-robust policy value.
Estimation Orthogonal scores from an IRM Heterogeneity Fit a depth-limited policy tree Reporting Read the tree & its value -
⌥ 4 steps ⑂ 1 branch Index: 120 18 peers Quantile treatment effects of 401(k) eligibility (DoubleML)
Beyond the average: how 401(k) eligibility shifts net financial assets across the whole wealth distribution, estimated orthogonally.
Data prep Build DoubleMLData (net_tfa, e401, X) Estimation Estimate QTEs across the distribution Inference Simultaneous confidence bands Reporting Plot the QTE curve -
⌥ 5 steps ⑂ 1 branch Index: 132 78 peers Group & conditional effects with DoubleML (GATE / CATE)
Slice the average effect: Group Average Treatment Effects and a CATE surface from a debiased IRM, with simultaneous confidence bands.
Data prep Build DoubleMLData (y, d, X) Estimation Fit an Interactive Regression Model (IRM) Heterogeneity Group Average Treatment Effects Heterogeneity CATE via a basis expansion Reporting Plot with simultaneous bands -
⌥ 4 steps ⑂ 1 branch Index: 195 35 peers Sensitivity analysis for unobserved confounding (sensemakr)
Don't just assume no unobserved confounding — quantify it: robustness value + contour plots benchmarked against your real covariates.
Data prep Fit the OLS outcome model▼▼Reporting Contour plot — point estimate Reporting Contour plot — t-value -
⌥ 4 steps Index: 183 62 peers Two-stage difference-in-differences (did2s)
Gardner's 2-stage estimator for staggered DiD: residualize on the untreated, then estimate the event study — fast and timing-robust.
Data prep Staggered panel + relative event time▼▼Robustness check Compare to TWFE / CS▼Reporting Event-study plot -
⌥ 5 steps ⑂ 1 branch Index: 244 15 peers Double machine learning for the 401(k) effect (DoubleML)
Effect of 401(k) eligibility on net assets via PLR / IRM / IIVM with cross-fit ML nuisances — four learners, one honest comparison.
Data prep Build DoubleMLData (y, d, X, z)▼Data prep Choose ML learners for the nuisances▼Estimation [DoubleML] Double/debiased ML — PLR / IRM… Robustness check IRM / IIVM cross-checks▼Reporting Coefficient comparison plot -
⌥ 4 steps Index: 171 107 peers Covariate balance for matching & weighting (cobalt)
Before you trust an observational estimate, prove balance: SMDs, overlap, and a Love plot before vs after adjustment.
Data prep Treatment W + covariates X▼Data prep Estimate weights / matches (WeightIt / Ma…▼▼Reporting love.plot() -
⌥ 4 steps ⑂ 1 branch Index: 195 79 peers Event-study DiD with Sun & Abraham (fixest)
Fast fixed-effects event study that survives staggered timing — sunab() vs naive TWFE, plotted against the truth.
Data prep Assemble panel with cohort timing▼Estimation [fixest] Sun & Abraham event study — suna… Robustness check Naive TWFE comparison▼Reporting iplot(): SA20 vs TWFE vs truth -
⌥ 5 steps ⑂ 1 branch Index: 231 101 peers Difference-in-differences with multiple periods (did)
Staggered-adoption DiD done right: group-time ATT(g,t) → event-study / group / calendar aggregations, with honest pre-trends.
Data prep Build the staggered panel▼▼Inference aggte(type = 'dynamic') Heterogeneity aggte(type = 'group')▼Reporting ggdid() event-study plot -
⌥ 5 steps ⑂ 1 branch Index: 96 84 peers Qini curves: automatic cost-benefit analysis
From CATEs to a budgeted treatment policy: causal forest → DR scores → cost matrix → maq Qini curve → pick the budget.
▼Data prep Doubly-robust score matrix Data prep Cost matrix▼▼Reporting Pick the budget; report the gain -
⌥ 5 steps ⑂ 1 branch Index: 108 87 peers Smooth signals with a local linear forest
When the conditional mean is smooth: regression forest baseline → ll_regression_forest → tuning → diagnostics.
▼Diagnostic / pre-tests Tune λ via cross-validation▼Diagnostic / pre-tests Calibration & boundary plot▼Reporting Side-by-side comparison -
⌥ 5 steps Index: 120 98 peers Cross-fold validation of heterogeneity
K-fold cross-fitted CATEs → RATE on out-of-fold priorities → honest verdict on heterogeneity strength.
Data prep K-fold split (e.g. K = 5)▼▼▼▼Reporting TOC curve + bootstrap CI -
⌥ 6 steps ⑂ 1 branch Index: 132 42 peers Evaluating a causal forest fit
Did the forest actually capture treatment-effect heterogeneity? Calibration → variable importance → BLP → omnibus tests.
▼Diagnostic / pre-tests test_calibration() Diagnostic / pre-tests variable_importance() Heterogeneity best_linear_projection() Diagnostic / pre-tests OOB residual checks▼Reporting Fit-evaluation report -
⌥ 5 steps ⑂ 1 branch Index: 194 103 peers An introduction to GRF (getting started)
A minimal first-contact recipe: regression forest, quantile forest, and a causal forest on the same data.
Data prep Assemble X, W, Y; check overlap▼▼Reporting OOB predictions & variable importance -
⌥ 3 steps Index: 96 20 peers Estimating ATEs on a new target population
Train a causal forest on the source sample → reweight AIPW to a target population → report transported ATE.
▼▼Reporting Transported ATE + overlap caveats -
⌥ 5 steps Index: 183 61 peers Policy learning via optimal decision trees
Causal forest → doubly-robust scores → policytree → evaluate policy value → plot the tree.
▼Data prep double_robust_scores()▼Estimation policytree: depth-2 optimal tree▼Inference Evaluate policy value (held-out)▼Reporting Plot the learned decision tree -
⌥ 5 steps ⑂ 1 branch Index: 170 30 peers Causal forest with time-to-event data (survival)
Censoring check → causal survival forest → RMST-scale AIPW ATE → calibration → report.
▼▼Inference [GRF] AIPW average treatment effect Diagnostic / pre-tests test_calibration()▼Reporting RMST difference by subgroup -
⌥ 6 steps ⑂ 1 branch Index: 207 23 peers Assessing heterogeneity with RATE (AUTOC & Qini)
Causal forest → train/eval split → RATE with both AUTOC and Qini → TOC plot.
▼▼Data prep Train / evaluation split▼Heterogeneity [GRF] Rank-weighted ATE — RATE / AUTOC / … Heterogeneity [GRF] Rank-weighted ATE — RATE / AUTOC / …▼Reporting TOC plot + AUTOC/Qini table -
⌥ 8 steps ⑂ 1 branch Index: 292 48 peers Heterogeneous treatment effects with a causal forest (GRF recipe)
The full GRF HTE playbook: cross-fit nuisances → causal forest → calibration → AIPW ATE → BLP → RATE → policy.
▼▼Diagnostic / pre-tests test_calibration() Inference [GRF] AIPW average treatment effect Heterogeneity best_linear_projection() Heterogeneity [GRF] Rank-weighted ATE — RATE / AUTOC / …▼Robustness check Policy learning (policytree)▼Reporting CATE histogram + targeting report