DSC — Distributional Synthetic Controls on Dube (2019)#
Path-A reproduction of the Distributional Synthetic Controls application
(Gunsilius 2023) on the Dube (2019) minimum-wage panel. The authors’ reference is
the DiSCo R package
(Davidvandijcke/DiSCos), whose
vignette analyses exactly this data.
DSC fits simplex-constrained weights on the quantile functions of micro-level
distributions: each (unit, time) cell is a sample, and the treated unit’s
counterfactual quantile function is a weighted average of the donors’
(Agueh-Carlier barycenter / optimal transport).
Data#
basedata/dube_minwage.parquet – the DiSCo package’s dube dataset (Dube
2019; adj0contpov by state-year), converted from the package’s
data/dube.rda with every column verified bit-identical on round-trip. 652,870
rows, 34 states (33 donors) x 7 years (1998-2004), 2.0 MB as zstd parquet; Alaska
(fips = 2) treated from 2003, the vignette’s id_col.target = 2,
t0 = 2003.
This is the authors’ complete analysis dataset, not a sample of it. An earlier revision used a 250-observations-per-cell subsample retaining 9.1 percent of the rows. For most estimators that would be an ordinary size-versus-fidelity trade; for a distributional method it is not. The estimand is the within-cell distribution, and true cell sizes run from 1,118 to 9,516 — an eight-fold spread flattened to a constant. Restoring the full data cut the pre-period 2-Wasserstein fit from 0.129 to 0.038.
Result#
Quantity |
DSC |
|---|---|
ATT (mean post QTE) |
−0.262 |
Pre-period 2-Wasserstein fit |
0.038 |
Placebo permutation p (2003) |
0.500 |
Placebo permutation p (2004) |
0.118 |
Donors |
33 |
These values moved when the full data replaced the subsample (previously −0.15, 0.13, 0.91, 0.32). The permutation p-values are multiples of \(1/34\), since there are 33 donors plus the treated unit.
The headline cross-check against the vignette is the placebo-permutation result: both post-year p-values exceed 0.05 – the vignette’s stated “no spurious effect” – and the small pre-period Wasserstein confirms close distributional tracking before treatment.
Note
Two claims previously made here were wrong, and are corrected, not
dropped. The DiSCo R package does install in this environment
(benchmarks/R/install_discos.sh), and the vignette’s numbers do not “live
in figures, not text” — the vignette is built with eval=FALSE and
publishes no numbers at all. The conclusion was right, the reasons were not,
and the wrong reasons made the situation look permanent instead of fixable.
This case still pins mlsynth’s own deterministic output, anchored to the one
quantitative claim the vignette states (\(p > 0.05\)). For genuinely
external validation see Distributional SC — the disco Stata Journal published results, which reproduces the disco
Stata Journal article’s published weights and quantile-effects table.
Reproduce#
python benchmarks/run_benchmarks.py dsc_dube