Observed and synthetic
Monthly rate per 100,000. The model is fit to the months before the line; the shaded band is the interval for the synthetic prediction, from the method chosen under Intervals.
Estimate how a city's monthly crime rate changed after an intervention, compared to a synthetic control built from other cities in the Real-Time Crime Index. The model runs in your browser, in Python (via Pyodide), using the lasso, conformal intervals and placebo tests from SynthPower.
Suggested citation: Wheeler, A. P. (2026). Synthetic control for city crime [Web application]. https://apwheele.github.io/SynthRTCI/
Choose a treated city, an outcome, and the date the intervention started, then press Run analysis. Or fill in an example:
Synthetic control report · printed
Cite as: Wheeler, A. P. (2026). Synthetic control for city crime [Web application]. https://apwheele.github.io/SynthRTCI/
Everything needed to rerun this analysis. Results can change when the Real-Time Crime Index data are updated, so the data version is recorded too.
Monthly rate per 100,000. The model is fit to the months before the line; the shaded band is the interval for the synthetic prediction, from the method chosen under Intervals.
Each post-period month, with its interval.
Sum of the monthly differences since the intervention.
Every donor city's monthly rate. Hover a line to identify the city.
The numbers behind the monthly and cumulative charts.
The outcome is the treated city's monthly crime count per 100,000 residents (not annualized). Violent crime is murder, rape, robbery and aggravated assault; property crime is burglary, theft and motor vehicle theft. Donor cities are every other agency in the Real-Time Crime Index national sample with data in every month of the window, less any left out.
Lasso + intercept regresses the treated city's rate on the donor cities' rates over the pre-period, with non-negative coefficients that need not sum to one and an intercept, so the treated city can be above or below every donor (Wheeler 2019). The penalty is chosen by 5-fold cross-validation on the pre-period, never so large that no donor gets weight. Classic synth uses non-negative weights that sum to one and no intercept.
Rolling-origin forecasts: for each month in the pre-period after the first training window, the model (with the same penalty) is fit to the months before it and forecasts the next months, up to the length of the post-period. The interval for post-period month h uses the h-month-ahead forecast errors, and the cumulative band uses the sums of the first h errors, each at the finite-sample conformal quantile. With too few forecasts reaching month h (fewer than 19 for 95%) the interval is infinite and not drawn. Jackknife: each pre-period month is left out in turn and predicted from a model fit to the rest; the pointwise interval is the prediction plus or minus the conformal quantile of those errors, and the cumulative band either simulates independent draws of the errors (Wheeler 2023) or uses sums of consecutive errors.
In SynthPower, cumulative jackknife bands had far too many false positives beyond the first post-period year, including in monthly RTCI city data, while rolling-origin bands kept their coverage in simulated and real state data. Placebo tests: each donor city at or above the placebo population cutoff is fit as if it were treated, with every other donor (never the treated city) as its donor pool and, for the cross-validated lasso, its own penalty. The cumulative band is the treated city's pre-period RMSPE times the conformal quantile of the placebos' cumulative gaps divided by their own pre-period RMSPE; monthly intervals use each month's gap the same way. The band excludes zero exactly when the placebo test on the cumulative gap rejects. SynthPower found an all-city placebo pool over-rejects for a large city like Los Angeles, and restricting it to cities of 250,000 or more fixed that. Implied crimes are the cumulative rate difference times the city's population divided by 100,000.