Inference for Synthetic Control
By the end of this lesson, you should be able to: produce a p-value for a synthetic control without assuming anything, use the statistic that removes a judgement call from that test, and run the two robustness checks that can actually fail.
The problem with lesson 14's placebo test
Lesson 14 ended with a placebo test: pretend each donor city was treated, refit, and see whether Bristol's gap stands out. Seven donors made it into that test. Twenty-three were dropped for having a pre-period fit "more than 2.5 times worse than Bristol's".
That filter's doing something reasonable and something indefensible at the same time.
Reasonable: a city that no blend of its peers can reproduce genuinely tells you nothing. Its post-period gap is large because the method never fitted it, not because anything happened.
Indefensible: the threshold was chosen by me, and moving it changes the p-value. Any test where the analyst picks which comparisons count is not a test.
One statistic, no filter
The fix is to stop excluding badly-fitted units and start dividing by how badly they fit.
A city the method reproduces well pre-treatment has a small denominator, so a real post-period gap makes the ratio large. A city it never reproduced has a large denominator, so its large post-period gap divides down to nothing.
The filter becomes part of the statistic. Nobody chooses a threshold.
For Bristol:
| Pre-period RMSE | 33 orders |
| Post-period RMSE | 624 orders |
| Ratio | 18.82 |
Now run the identical procedure on every donor. Twenty-nine of thirty converged, and none was excluded for fit quality:
| Unit | Pre RMSE | Post RMSE | Ratio |
|---|---|---|---|
| Bristol (treated) | 33 | 624 | 18.82 |
| Tampere | 63 | 249 | 3.95 |
| Iowa City | 106 | 272 | 2.56 |
| Cork | 390 | 961 | 2.46 |
| Salerno | 86 | 202 | 2.36 |
Bristol ranks first of thirty, and it isn't close: 18.82 against a next-best of 3.95.

Notice that 0.033 is also the smallest p-value this design can produce. With 30 units, the treated one can at best rank first out of thirty. If someone demands p below 0.01 you need more donors, and that's a decision to make before running, not after.
This is permutation inference, and it's making no distributional assumption at all. It asks one concrete question: among all the units I could have run this on, how extreme is the one that actually got treated? That's why it survives having a single treated unit, where every formula-based standard error from lesson 10 fell apart.