SPSC — Single Proxy Synthetic Control (Park & Tchetgen Tchetgen 2025)#

Estimator:

Proximal Inference Synthetic Control (PROXIMAL) (method "SPSC") — mlsynth.PROXIMAL

Source:

Park, C., & Tchetgen Tchetgen, E. J. (2025), “Single Proxy Synthetic Control,” Journal of Causal Inference 13(1), 20230079 [SPSC].

Reference implementation:

the authors’ R package qkrcks0218/SPSC (pinned at commit 054f1fbb).

Replication type:

Path B — the authors’ interactive-fixed-effects Monte Carlo — and cross-validation against the R package on both empirical examples in the paper (California / Proposition 99 and the Panic of 1907).

Status:

Verified — the Monte Carlo geometry and both empirical examples reproduce the reference value-for-value.

Validation strategy#

SPSC views the donor units’ outcomes as a single error-prone proxy of the treated unit’s treatment-free potential outcome and recovers the synthetic control by a ridge-regularised GMM. The package exposes the detrend trend (detrend.ft) and the treatment-effect basis (att.ft) as free choices; mlsynth surfaces both through spsc_detrend_basis / spsc_detrend_degree and spsc_att_degree, so the two empirical examples can be run in exactly the parameterisation the authors used and checked against the R package run live on the identical panel.

Path B — interactive-fixed-effects Monte Carlo#

The authors’ README ships a toy interactive-fixed-effects DGP with a drifting donor trend. mlsynth reproduces its geometry: both SPSC-DT (detrended) and SPSC-NoDT recover the true ATT = 3 essentially without bias, while only the detrended estimator covers near nominal (the un-detrended one under-covers because its sandwich SE cannot see the trend misspecification). Durable case spsc_ifem_mc.

Cross-validation — California (Proposition 99)#

On basedata/smoking_data.csv (California plus 38 donor states, T0 = 18) the authors fit a linear detrend with a linear-in-time effect basis (att.ft = (1, t)). mlsynth, configured to the same parameterisation (spsc_att_degree=1, spsc_detrend_basis="poly", ridge lambda fixed at \(10^{0}\)), reproduces the reference effect path and its per-period standard errors value-for-value:

Quantity

mlsynth

qkrcks0218/SPSC

effect path (1988 … 2000)

\(-4.845 \,\dots\, -35.284\)

\(-4.845 \,\dots\, -35.284\)

per-period SE

\(0.0020 \,\dots\, 0.0235\)

\(0.0020 \,\dots\, 0.0235\)

average ATT

\(-20.06\)

\(-20.06\)

conformal band width (1988 … 2000)

\(0.139 \,\dots\, 1.645\)

\(0.139 \,\dots\, 1.645\)

The case runs the R package live and asserts the path and SE agree to solver tolerance (path_vs_ref and se_vs_ref are zero to five digits). It also cross-checks the pointwise conformal prediction intervals for the per-period effect: a short pre-period (\(T_0 = 18\)) supports only a coarse discrete level (the finest is \(2/19 \approx 0.105\)), so the band is taken at \(\alpha \approx 0.11\); its endpoints match the reference to \(\sim 10^{-3}\) at every post period (conformal_lb_vs_ref / conformal_ub_vs_ref). Durable case spsc_prop99.

Cross-validation — Panic of 1907#

The paper’s Example 2 takes the treated unit to be the average log stock price of the two trusts the Panic struck — the Knickerbocker Trust and the Trust Company of America — against a pool of trusts conjectured immune. On basedata/trust.dta (Knickerbocker = ID 34, Trust Co. of America = ID 57, normal trusts as donors, Panic after period 229) mlsynth’s SPSC reproduces the R package on the identical averaged-treated panel, with the ridge lambda fixed at \(10^{-2}\) for a deterministic live run:

Variant

mlsynth ATT

qkrcks0218/SPSC

SPSC-NoDT

\(-0.8129\)

\(-0.8129\)

SPSC-DT

\(-0.8035\)

\(-0.8035\)

Durable case spsc_panic. Both empirical cases skip gracefully when Rscript or the SPSC clone is unavailable.