|
| 1 | +# SDID Practitioner Validation Tooling - Briefing |
| 2 | + |
| 3 | +## Problem |
| 4 | + |
| 5 | +A data scientist runs `SyntheticDiD`, gets an ATT and a p-value, and then |
| 6 | +faces the question: *should I trust this estimate?* The library gives them the |
| 7 | +point estimate and inference, but the validation workflow - the steps between |
| 8 | +"I got a number" and "I'm confident enough to present this" - is largely |
| 9 | +left to the practitioner to assemble from scratch. |
| 10 | + |
| 11 | +The standard validation workflow for synthetic control methods is well |
| 12 | +understood in the econometrics literature (Arkhangelsky et al. 2021, |
| 13 | +Abadie et al. 2010, Abadie 2021). The pieces include pre-treatment fit |
| 14 | +assessment, weight diagnostics, placebo/falsification tests, sensitivity |
| 15 | +analysis, and cross-estimator comparison. Our library provides some of the |
| 16 | +raw ingredients (pre-treatment RMSE, weight dicts, placebo effects array) |
| 17 | +but doesn't connect them into an accessible diagnostic workflow. |
| 18 | + |
| 19 | +The gap is most visible in `practitioner.py`, where `_handle_synthetic` |
| 20 | +recommends in-time placebos and leave-one-out analysis but provides only |
| 21 | +comment-only pseudo-code. A practitioner following that guidance hits a wall. |
| 22 | + |
| 23 | +## Current state |
| 24 | + |
| 25 | +What we have today: |
| 26 | + |
| 27 | +- `results.pre_treatment_fit` (RMSE) with a warning when it exceeds the |
| 28 | + treated pre-period SD |
| 29 | +- `results.get_unit_weights_df()` and `results.get_time_weights_df()` |
| 30 | +- Three variance methods: placebo (default), bootstrap, and jackknife (just |
| 31 | + landed in v3.1.1) |
| 32 | +- `results.placebo_effects` - stores per-iteration estimates for all three |
| 33 | + variance methods, but for jackknife these are positional LOO estimates |
| 34 | + with no unit labels |
| 35 | +- `results.summary()` shows top-5 unit weights and count of non-trivial weights |
| 36 | +- `practitioner.py` guidance that names the right steps but can't point to |
| 37 | + runnable code for most of them |
| 38 | + |
| 39 | +What the practitioner must currently build themselves: |
| 40 | + |
| 41 | +- Mapping jackknife LOO estimates back to unit identities to answer "which |
| 42 | + unit, when dropped, changes my estimate the most?" |
| 43 | +- In-time placebo tests (re-estimate with a fake treatment date) |
| 44 | +- Any weight concentration metric beyond eyeballing the sorted list |
| 45 | +- Any sense of whether their RMSE is "bad enough to worry about" beyond |
| 46 | + the binary warning |
| 47 | +- Regularization sensitivity (does the ATT change if I perturb zeta?) |
| 48 | +- Pre-treatment trajectory data for plotting (the Y matrices are internal |
| 49 | + to `fit()` and not returned) |
| 50 | + |
| 51 | +## Context from prior discussion |
| 52 | + |
| 53 | +The jackknife work created an interesting opportunity. The delete-one-re-estimate |
| 54 | +loop already runs for SE computation. The per-unit ATT estimates are stored in |
| 55 | +`results.placebo_effects`. The missing piece is a presentation layer that maps |
| 56 | +those estimates to unit identities and surfaces the diagnostic interpretation |
| 57 | +(which units are influential, how stable is the estimate to unit composition). |
| 58 | + |
| 59 | +More broadly, the validation gaps fall into two categories: |
| 60 | + |
| 61 | +1. **Low-marginal-cost additions** - things where the computation already |
| 62 | + exists and we just need to expose or label it (LOO diagnostic from |
| 63 | + jackknife, weight concentration metrics, trajectory data extraction) |
| 64 | + |
| 65 | +2. **New functionality** - things that require new estimation loops or |
| 66 | + helpers (in-time placebo, regularization sensitivity sweep) |
| 67 | + |
| 68 | +The practitioner guidance in `practitioner.py` should evolve alongside any |
| 69 | +new tooling so that the recommended steps point to real, runnable code paths. |
| 70 | + |
| 71 | +## What "done" looks like |
| 72 | + |
| 73 | +A practitioner using SyntheticDiD should be able to follow a credible |
| 74 | +validation workflow using library-provided tools and guidance, without |
| 75 | +needing to reverse-engineer internals or write substantial boilerplate. |
| 76 | +The validation steps recognized in the literature should either be directly |
| 77 | +supported or have clear, concrete guidance for how to perform them with |
| 78 | +the library's API. |
| 79 | + |
| 80 | +This is not about adding visualization or plotting (that's a separate |
| 81 | +concern). It's about making the computational and diagnostic building |
| 82 | +blocks accessible and well-documented through the results API and |
| 83 | +practitioner guidance. |
0 commit comments