Validation dashboard#
Every estimator in mlsynth is checked against the original authors’ code on real data. This page is generated from the pinned reference bundles the test suite asserts against, so the numbers here cannot drift from what CI enforces. Each row links to the reference implementation, the dataset (with checksum), and the mlsynth case that runs the check.
Coverage: 61 cross-validation checks against original implementations across 35 estimators – 28 reproduce the reference to display precision, 21 to within two percent. A further 2 are captured on the next daily run (see Pending capture). Per-estimator paper replications (Path A / Path B) are catalogued in Replications.
Legend: exact (agreement to display precision), tight (worst relative deviation \(\le 2\%\)), close (\(\le 10\%\)), and documented (looser, with a stated reason on the estimator’s replication page – typically an intrinsically extrapolated or weakly-identified quantity).
Summary#
Estimator |
Checks |
Agreement |
Worst max |Δ| |
|---|---|---|---|
1 |
1 tight |
0.15 |
|
1 |
1 close |
1 |
|
1 |
1 tight |
0.00041 |
|
CLUSTERSC |
2 |
2 exact |
0 |
ClusterSC |
2 |
1 exact · 1 tight |
0.036 |
1 |
1 exact |
0 |
|
1 |
1 exact |
0.00032 |
|
2 |
2 exact |
0.026 |
|
2 |
1 tight · 1 close |
0.39 |
|
1 |
1 tight |
0.016 |
|
1 |
1 exact |
4.6e-05 |
|
1 |
1 tight |
0.81 |
|
1 |
1 exact |
1e-06 |
|
1 |
1 tight |
0.097 |
|
1 |
1 close |
1.9 |
|
2 |
1 exact · 1 close |
0.037 |
|
5 |
4 exact · 1 close |
0.056 |
|
1 |
1 tight |
0.0022 |
|
1 |
1 exact |
0 |
|
3 |
1 exact · 2 tight |
41 |
|
2 |
2 tight |
0.0013 |
|
1 |
1 exact |
0 |
|
1 |
1 close |
1e+06 |
|
1 |
1 exact |
0 |
|
1 |
1 tight |
0.011 |
|
1 |
1 tight |
0.14 |
|
1 |
1 tight |
0.0016 |
|
1 |
1 exact |
0 |
|
1 |
1 exact |
0 |
|
4 |
1 exact · 1 tight · 1 close · 1 documented |
7.6 |
|
2 |
2 exact |
0.0007 |
|
1 |
1 tight |
0.001 |
|
2 |
1 exact · 1 close |
0.094 |
|
1 |
1 documented |
25 |
|
10 |
4 exact · 4 tight · 2 close |
0.11 |
BEAST#
Reference |
Dataset |
# |
max |Δ| |
Verdict |
Case |
|---|---|---|---|---|---|
jeremylhour/alternative-synthetic-control-sparsity R (CalibrationLasso/OrthogonalityReg/ImmunizedATT) |
|
13 |
0.15 |
tight |
BFSC#
Reference |
Dataset |
# |
max |Δ| |
Verdict |
Case |
|---|---|---|---|---|---|
author appendix Stan (via Rscript + rstan) |
— |
3 |
1 |
close |
BVSS#
Reference |
Dataset |
# |
max |Δ| |
Verdict |
Case |
|---|---|---|---|---|---|
authors’ two-coordinate Gibbs (example2_fspda_2.R primitives), live run, captured |
|
6 |
0.00041 |
tight |
CLUSTERSC#
Reference |
Dataset |
# |
max |Δ| |
Verdict |
Case |
|---|---|---|---|---|---|
Bayani RPCA-SC – the author’s own code, vendored verbatim (vendor/bayani_rpca_synth: FPCA.R + RPCA_2.py) |
— |
9 |
0 |
exact — matches to display precision |
|
scpi_pkg scest(w_constr={‘name’:’ridge’}) + df_EST |
|
3 |
0 |
exact — matches to display precision |
ClusterSC#
Reference |
Dataset |
# |
max |Δ| |
Verdict |
Case |
|---|---|---|---|---|---|
jehangiramjad/tslib RobustSyntheticControl (live run, captured), modelType=’svd’, kSingularValuesToKeep=3 |
|
8 |
0.036 |
tight |
|
deshen24/panel-data-regressions var.var_est (homoskedastic + jackknife) |
— |
6 |
0 |
exact — matches to display precision |
DPSC#
Reference |
Dataset |
# |
max |Δ| |
Verdict |
Case |
|---|---|---|---|---|---|
srho1/dpsc PrivateSC (differentially private SC) |
— |
4 |
0 |
exact — matches to display precision |
FDID#
Reference |
Dataset |
# |
max |Δ| |
Verdict |
Case |
|---|---|---|---|---|---|
Kathleen T. Li’s Fun_FDID.R (MKSC replication, live run, captured) |
|
7 |
0.00032 |
exact — matches to display precision |
GEOLIFT#
Reference |
Dataset |
# |
max |Δ| |
Verdict |
Case |
|---|---|---|---|---|---|
R package augsynth (via Rscript) |
— |
15 |
0.026 |
exact — matches to display precision |
|
R GeoLiftMarketSelection (via Rscript) |
— |
15 |
0.005 |
exact — matches to display precision |
LINF#
Reference |
Dataset |
# |
max |Δ| |
Verdict |
Case |
|---|---|---|---|---|---|
LinfinitySC our(method=’inf’|’l1-inf’) (Wang, Xing & Ye 2025), BioAlgs/LinfinitySC |
— |
40 |
0.00041 |
tight |
|
LinfinitySC our(method=’inf’) (Wang, Xing & Ye 2025), BioAlgs/LinfinitySC, lambda via param_selector(method=’inf’, n_folds=10) |
|
43 |
0.39 |
close |
MAREX#
Reference |
Dataset |
# |
max |Δ| |
Verdict |
Case |
|---|---|---|---|---|---|
jinglongzhao2/SCDesign (cardinality-K design, open quadprog, live run) |
|
7 |
0.016 |
tight |
MASC#
Reference |
Dataset |
# |
max |Δ| |
Verdict |
Case |
|---|---|---|---|---|---|
maxkllgg/masc masc(…, nogurobi=TRUE) (LowRankQP), live run, captured |
|
8 |
4.6e-05 |
exact — matches to display precision |
MCNNM#
Reference |
Dataset |
# |
max |Δ| |
Verdict |
Case |
|---|---|---|---|---|---|
|
13 |
0.81 |
tight |
MLSC#
Reference |
Dataset |
# |
max |Δ| |
Verdict |
Case |
|---|---|---|---|---|---|
leabottmer/multi-level-sc-estimator (mlSC_estimator, cvxpy+SCS) |
— |
4 |
1e-06 |
exact — matches to display precision |
MicroSynth#
Reference |
Dataset |
# |
max |Δ| |
Verdict |
Case |
|---|---|---|---|---|---|
R package microsynth (via Rscript) |
— |
6 |
0.097 |
tight |
NSC#
Reference |
Dataset |
# |
max |Δ| |
Verdict |
Case |
|---|---|---|---|---|---|
Tian (2023) NSC.R (vendored, live run, captured), a*=0.3, b*=0.7 |
|
23 |
1.9 |
close |
ORTHSC#
Reference |
Dataset |
# |
max |Δ| |
Verdict |
Case |
|---|---|---|---|---|---|
Fry GMM-SCE.R GMMSC() (R, live run, captured) |
|
15 |
0.037 |
close |
|
Fry OrthogonalizedSyntheticControl (R, live run, captured) |
|
5 |
0 |
exact — matches to display precision |
PDA#
Reference |
Dataset |
# |
max |Δ| |
Verdict |
Case |
|---|---|---|---|---|---|
Authors’ Fun/L2relax.R (ishwang1/L2relax-PDA), per UK firm, reproduced via cvxpy/ECOS, live run captured |
|
4 |
1e-06 |
exact — matches to display precision |
|
R package pampe (pampe(), live run, captured) |
|
6 |
3.6e-05 |
exact — matches to display precision |
|
Authors’ Fun/L2relax.R (ishwang1/L2relax-PDA) reproduced via cvxpy/ECOS, live run captured |
|
24 |
0 |
exact — matches to display precision |
|
Shi & Huang fsPDA application script (zhentaoshi/fsPDA, live run, captured) |
|
4 |
0.056 |
close |
|
Authors’ Fun/L2relax.R (ishwang1/L2relax-PDA) reproduced via cvxpy/ECOS, live run captured |
|
64 |
1e-06 |
exact — matches to display precision |
PPSCM#
Reference |
Dataset |
# |
max |Δ| |
Verdict |
Case |
|---|---|---|---|---|---|
R augsynth::multisynth (live run, captured) |
|
49 |
0.0022 |
tight |
PROPSC#
Reference |
Dataset |
# |
max |Δ| |
Verdict |
Case |
|---|---|---|---|---|---|
R package propsdid (via Rscript) |
— |
6 |
0 |
exact — matches to display precision |
PROXIMAL#
Reference |
Dataset |
# |
max |Δ| |
Verdict |
Case |
|---|---|---|---|---|---|
R gmm (authors’ analysis.Rmd, commit 3bcb5ec, reltol=1e-13) |
— |
4 |
41 |
tight |
|
KenLi93/proximal_sc_manuscript NC_nocov + NC_nocov_gmm (over-identified, Newey-West q=10), live run, captured |
|
11 |
1e-06 |
exact — matches to display precision |
|
authors’ proximal code (freshtaste/proximal, cloned) |
— |
3 |
0.014 |
tight |
RESCM#
Reference |
Dataset |
# |
max |Δ| |
Verdict |
Case |
|---|---|---|---|---|---|
scmrelax L2RelaxationCV (Liao-Shi-Zheng; github.com/metricshilab/scmrelax = github.com/YapengZheng/Relaxed_SC; MOSEK->CLARABEL; live run, captured) |
|
6 |
0.0013 |
tight |
|
scmrelax L2RelaxationCV (Liao-Shi-Zheng; github.com/metricshilab/scmrelax = github.com/YapengZheng/Relaxed_SC; MOSEK->CLARABEL; live run, captured) |
— |
10 |
0.00036 |
tight |
ROLLDID#
Reference |
Dataset |
# |
max |Δ| |
Verdict |
Case |
|---|---|---|---|---|---|
lwdid.lwdid (Lee & Wooldridge DiD, live run, captured): prop99 common-timing (d, post, vce=None); castle staggered (gvar, control_group=’never_treated’, aggregate=’overall’, vce=None/hc3) |
|
9 |
0 |
exact — matches to display precision |
SBC#
Reference |
Dataset |
# |
max |Δ| |
Verdict |
Case |
|---|---|---|---|---|---|
authors’ SBC_HK.R (lsq detrend + trend_predict + Synth::synth ipop), live run, captured |
|
6 |
1e+06 |
close |
SCD#
Reference |
Dataset |
# |
max |Δ| |
Verdict |
Case |
|---|---|---|---|---|---|
base-R SCD (point estimator + corrected RC variance + in_C projection QP), reproduced on public CPS microdata |
|
5 |
0 |
exact — matches to display precision |
SCMO#
Reference |
Dataset |
# |
max |Δ| |
Verdict |
Case |
|---|---|---|---|---|---|
Tian-Lee-Panchenko Germany.R (fn_W solve.QP, live run, captured) |
|
6 |
0.011 |
tight |
SCUL#
Reference |
Dataset |
# |
max |Δ| |
Verdict |
Case |
|---|---|---|---|---|---|
authors’ SCUL() (R, via Rscript + glmnet) |
— |
3 |
0.14 |
tight |
SDID#
Reference |
Dataset |
# |
max |Δ| |
Verdict |
Case |
|---|---|---|---|---|---|
|
1 |
0.0016 |
tight |
SI#
Reference |
Dataset |
# |
max |Δ| |
Verdict |
Case |
|---|---|---|---|---|---|
authors’ SI code (INFORMS opre.2025.1590.cd), vendored benchmarks/reference/synth_iv_OR25 |
— |
20 |
0 |
exact — matches to display precision |
SNN#
Reference |
Dataset |
# |
max |Δ| |
Verdict |
Case |
|---|---|---|---|---|---|
deshen24/syntheticNN (live run, captured), SyntheticNearestNeighbors(n_neighbors=1) |
|
14 |
0 |
exact — matches to display precision |
SPILLSYNTH#
Reference |
Dataset |
# |
max |Δ| |
Verdict |
Case |
|---|---|---|---|---|---|
Melnychuk-Andrii/Spillover-SCM inclusive SCM (scm_weights/runInclusiveSCM), transcribed to NumPy |
— |
4 |
7.6 |
tight |
|
jcao0/synthetic-control-spillover MATLAB spillover.csv (CA row) |
— |
13 |
5.7e-05 |
exact — matches to display precision |
|
Mendez tutorial Rcpp sc_spillover (cmg777) |
|
4 |
3.4 |
documented — see notes |
|
Sakaguchi-Tagawa RcppArmadillo sc_spillover (method=sar, live run on the nonproprietary panel, captured) |
|
5 |
0.41 |
close |
SPSC#
Reference |
Dataset |
# |
max |Δ| |
Verdict |
Case |
|---|---|---|---|---|---|
— |
4 |
0 |
exact — matches to display precision |
||
— |
31 |
0.0007 |
exact — matches to display precision |
SSC#
Reference |
Dataset |
# |
max |Δ| |
Verdict |
Case |
|---|---|---|---|---|---|
jcao0/staggered_synthetic_control (committed results_ssc.csv / Table1_eigenvalue.csv) |
— |
364 |
0.001 |
tight |
SpSyDiD#
Reference |
Dataset |
# |
max |Δ| |
Verdict |
Case |
|---|---|---|---|---|---|
authors’ functions_ssdid fit_unit_weights / fit_time_weights under the canonical SDID convention (1/T_post post weights, 1/N_sp affected weights) |
— |
2 |
0 |
exact — matches to display precision |
|
authors’ SDID weight functions (serenini/spatial_SDID functions_ssdid) + the notebook’s spatial WLS, via benchmarks.reference.spsydid_ref |
— |
20 |
0.094 |
close |
TASC#
Reference |
Dataset |
# |
max |Δ| |
Verdict |
Case |
|---|---|---|---|---|---|
srho1/tasc TimeAwareSC (live run, captured; em_pre, naive init, set_seed(1)) |
|
15 |
25 |
documented — see notes |
VanillaSC#
Reference |
Dataset |
# |
max |Δ| |
Verdict |
Case |
|---|---|---|---|---|---|
R package augsynth (live run, Kansas study) |
|
8 |
0.0091 |
tight |
|
|
3 |
0 |
exact — matches to display precision |
||
Malo et al. scm.corner (SCM-Debug, live run, captured) |
|
3 |
0.00048 |
tight |
|
Malo et al. scm.corner (SCM-Debug, live run, captured) |
|
6 |
0.0048 |
tight |
|
R package MSCMT (live run, captured) |
|
4 |
4e-05 |
exact — matches to display precision |
|
authors’ wsoll1 (R, via Rscript + LowRankQP) |
— |
3 |
0.00098 |
exact — matches to display precision |
|
scpi_pkg scdata(cointegrated_data=True)+scpi CI_all_gaussian |
|
13 |
0.11 |
close |
|
— |
15 |
4.3e-05 |
exact — matches to display precision |
||
|
8 |
0.02 |
tight |
||
Andersson (2019) AEJ:EP 11(4), Section III reported values |
|
4 |
0.028 |
close |
Pending capture#
These cross-validation cases are wired up but their reference had not been captured when this page was last generated; the daily action records them once its toolchain provisions.
Case |
Reference |
|---|---|
— |
|
independent reproduction of tsudijon/LeaveTwoOutSCI LTO pair loop (outcome-only SC via LowRankQP), all three empirical applications |