-
⌥ 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 -
⌥ 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: 183 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 -
⌥ 4 steps Index: 207 45 peers Matching for causal inference (MatchIt)
Preprocess by matching so groups are comparable, check balance, then estimate the effect on the matched sample — design before analysis.
Data prep Treatment W + covariates X▼▼Diagnostic / pre-tests Assess balance (summary / plot)▼Reporting Estimate the effect on matched data -
⌥ 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