SCUL: California (Proposition 99) vs hollina/scul#
This page documents the verification of mlsynth’s Synthetic Control Using Lasso (SCUL) estimator against the authors’ reference R package (hollina/scul, Hollingsworth & Wing 2022).
Cross-validation – California (Proposition 99)#
On the cigarette panel shipped with the reference package (California plus 38
donor states, 28 years, treatment from the 19th period), SCUL builds the
synthetic control as a rolling-origin cross-validated lasso of California’s
pre-treatment cigarette sales on a 76-column multi-type donor pool – every
donor state’s per-capita sales and its retail price. mlsynth, fed the identical
panel, reproduces the authors’ SCUL() value-for-value:
Quantity |
mlsynth |
|
abs. diff |
|---|---|---|---|
cross-validation penalty (median) |
\(0.02121478\) |
\(0.02121478\) |
\(0\) |
ATT (post-1988 mean, packs) |
\(-13.171\) |
\(-13.306\) |
\(0.135\) |
Cohen’s D (pre-fit) |
\(0.0137\) |
\(0.0160\) |
\(0.0023\) |
The rolling-origin cross-validation penalty matches glmnet to ten digits –
the selection procedure ports exactly. The small ATT difference is not a method
difference: the lasso solution is unique for continuously distributed donors
[TIBSHIRANI2013], and glmnet’s default convergence threshold slightly
under-converges this correlated, high-dimensional (donors > pre-periods)
problem. mlsynth solves the same penalty exactly (the Langlois & Darbon
[LangloisDarbon2025] differential-inclusion homotopy, no convergence tolerance)
and lands on the unique optimum; when glmnet is run to a tight threshold, the
two agree on the donor support and on the weights to within \(10^{-5}\).
The case runs the R package live and asserts the penalty matches bit-for-bit and
the ATT and synthetic series agree to solver tolerance. Durable case
scul_prop99 (skips gracefully when Rscript or glmnet is
unavailable); the committed side-by-side table is
benchmarks/reference/scul_prop99/comparison.csv.