Simple Synthetic Control Model

This method captures the simple-most version of a Synthetic Control Model. It only relies on outcome data $Y_{it}$ and treatment indicators $W_{it}$ to find unit-weights $\omega_i$ by solving

\[\omega^* = \arg \min_{\omega} || Y_{tr, 1:T_0} - \omega Y_{co, 1:T_0} ||_2 \\ s.t. \sum_{i = 1}^{N_{co}} \omega_i = 1 \\ 0 \leq \omega_i \leq 1 \ \forall \ i \in 1, ..., N_{co}\]

where $Y_{tr, \cdot}$ is a length $T_0$ vector of pre-treatment outcomes for the treated unit, $Y_{co, 1:T_0}$ is a $(N_{co} \times T_0)$ matrix of pre-treatment outcomes for the $N_{co}$ control units and $\omega$ is a length $N_{co}$ vector of weights for each control unit. Weights are restricted to lie between zero and one for each control unit and to sum up to one, as in Abadie and Gardeazabal (2003).

The SimpleSCM method can therefore be seen as a simplified version of the Abadie and Gardeazabal (2003) or Abadie, Diamond and Hainmüller (2011) Synthetic Control Model, with the following differences:

  • Only past outcomes are being used to find weights, no other covariate information is taken into account;
  • There is no weighting of covariates (i.e., past outcomes) - in the original Abadie/Gardeazabal notation, the diagonal matrix $V$ which weigts covariates is the identity matrix.

Despite these limitations, the results from this simple procedure can often be close to those of the more fully featured ADH2010 model, as shown in the example below.

Implementation in SynthControl

The simple SCM model can be estimated by passing a TreatmentPanel to the SimpleSCM constructor. The following example estimates the effect of California's proposition 99 on cigarette sales, an application taken from Abadie, Diamond and Hainmüller (2010, JASSA)[1].

First, we load the relevant data:

julia> using SynthControl

julia> smoking_panel = load_smoking_panel()
Balanced Panel - single treated unit, continuous treatment
    Treated unit: 3
    Number of untreated units: 38
    First treatment period: 1989
    Number of pretreatment periods: 19
    Number of treatment periods: 12

Then we create the SimpleSCM model and call fit! on the model instance:

julia> simple_scm = SimpleSCM(smoking_panel);

julia> fit!(simple_scm)
Synthetic Control Model

Treatment panel:
Balanced Panel - single treated unit, continuous treatment
    Treated unit: 3
    Number of untreated units: 38
    First treatment period: 1989
    Number of pretreatment periods: 19
    Number of treatment periods: 12

        Model is fitted
        Impact estimates: [-8.44, -9.207, -12.634, -13.729, -17.534, -22.049, -22.858, -23.997, -26.261, -23.338, -27.52, -26.597]
        ATT: -19.514

The average treatment effect on the treated (ATT) is simply the average of the imputed synthetic control outcomes for the post-treatment periods:

julia> using Statistics

julia> mean(simple_scm.τ̂)
-19.51362976399461

To esimate standard errors, an optional placebo test can be run in which a treatment effect is estimated for the post-treatment period for each of the untreated units in turn, with the treated unit excluded from the donor pool.

julia> fit!(simple_scm; placebo_test = true)

Where the placebo test has been run, the p_test_res field of the SimpleSCM object holds the estimated post-treatment outcomes for each untreated unit.

The standard deviation of the treatment effects for other units can serve as an estimator of the standard error of the treatment effect:

julia> √(var(mean.(eachrow(sscm.p_test_res))))
10.776022984492037
  • 1Abadie, A., Diamond, A., and Hainmüller, J. (2010): Synthetic Control Methods for Comparative Case Studies: Estimating the Effect of California’s Tobacco Control Program, American Journal of Political Science, Vol. 59(2), Pp. 495-510