DSC — Distributional Synthetic Controls on Dube (2019)

Contents

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.csv – the DiSCo package’s dube dataset (Dube 2019; adj0contpov by state-year), exported from dube.rda and subsampled to 250 observations per state-year cell (fixed seed) so the micro-panel is ~1 MB rather than 15 MB. 34 states (33 donors) x 7 years (1998-2004); Alaska (fips = 2) treated from 2003, the vignette’s id_col.target = 2, t0 = 2003.

Result#

Quantity

DSC

ATT (mean post QTE)

−0.15

Pre-period 2-Wasserstein fit

0.13

Placebo permutation p (2003)

0.91

Placebo permutation p (2004)

0.32

Donors

33

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

No live DiSCo cross-validation here. The DiSCo R package does not install on this environment’s R version, and the vignette’s weight/QTE numbers live in figures rather than text, so a value-for-value run isn’t reproducible in CI. This case is therefore Path A on the authors’ exact dataset and setup, with mlsynth’s deterministic output pinned and anchored to the one quantitative claim the vignette states (p > 0.05). The subsampling (250 obs/cell) keeps the panel small; it shifts point values slightly from the full-data run but preserves the distributional structure and the inference conclusion.

Reproduce#

python benchmarks/run_benchmarks.py dsc_dube