Manski bounds
Teaching cardReport the range the effect must lie in given only what the data can support, without assuming away the missing counterfactual.
bounds.manskiStructure learning (causal discovery)
Teaching cardSearch for a graph consistent with the data. It does not recover the true causal structure from observational data without extra assumptions.
discovery.structure_learningHonest causal forest
Python + RGrow trees that look for units whose effect differs, keeping the rows that chose each split away from the rows that estimate it.
ml.causal_forestDouble ML (interactive)
PythonA separate outcome model for each arm plus a treatment model, combined in a doubly robust score: right if either side is right.
ml.dml_irmDouble ML (partially linear)
PythonPredict the outcome and the treatment from the confounders, then regress what is left of one on what is left of the other.
ml.dml_plrMeta-learner (T, S, X, DR)
PythonBuild the per-unit effect out of ordinary prediction models, four different ways, on the same cross-fitting.
ml.metalearnerPolicy tree (who should be treated)
PythonLearn a short, readable rule for who to treat, then value that rule on data it never saw.
ml.policy_treeDoubly robust (AIPW)
Python + RUse a treatment model and an outcome model together; it is right if either one is.
obs.aipwCoarsened exact matching
PythonBin the covariates, then compare only inside bins that contain both arms.
obs.matching.cemGenetic matching
Teaching cardSearch over distance-metric weights until balance is as good as it can get, instead of trusting one metric.
obs.matching.geneticNearest-neighbour matching
PythonPair each treated unit with the most similar untreated unit, then compare within pairs.
obs.matching.nnOptimal and full matching
Teaching cardChoose the whole set of matches at once to minimise total distance, rather than greedily one treated unit at a time.
obs.matching.optimalMultiple imputation compatible with the analysis
Teaching cardImpute the missing values several times, run the analysis in each, and combine -- instead of dropping every row with a gap.
obs.missing.miceOutcome regression (g-computation)
Python + RModel the outcome, then ask what would have happened if everyone had been treated, and if nobody had.
obs.outcome_regressionSuper Learner nuisance models
Teaching cardCombine several candidate learners by cross-validated weights instead of betting on one.
obs.superlearnerTargeted maximum likelihood (TMLE)
PythonFit the outcome model, then nudge it once in the direction the treatment model says it is wrong.
obs.tmleCovariate balancing propensity score
Teaching cardFit the treatment model so that it balances covariates, rather than fitting it to predict treatment and hoping balance follows.
obs.weighting.cbpsEntropy balancing
PythonFind the weights closest to equal that make the covariate means match exactly.
obs.weighting.entropyPropensity weighting
Python + RReweight the sample so the treated and untreated groups look alike on the measured confounders.
obs.weighting.ipwBoosted propensity scores (twang)
Teaching cardGrow a boosted model for the propensity score, stopping at the iteration that balances covariates best.
obs.weighting.twang