Synthetic control with sci-kit learn models#
from sklearn.linear_model import LinearRegression
import causalpy as cp
Load data#
df = cp.load_data("sc")
treatment_time = 70
Analyse with WeightedProportion
model#
# Note, we do not want an intercept in this model
result = cp.SyntheticControl(
df,
treatment_time,
formula="actual ~ 0 + a + b + c + d + e + f + g",
model=cp.skl_models.WeightedProportion(),
)
fig, ax = result.plot(plot_predictors=True)
/Users/benjamv/opt/mambaforge/envs/CausalPy/lib/python3.11/site-packages/IPython/core/pylabtools.py:77: DeprecationWarning: backend2gui is deprecated since IPython 8.24, backends are managed in matplotlib and can be externally registered.
warnings.warn(
/Users/benjamv/opt/mambaforge/envs/CausalPy/lib/python3.11/site-packages/IPython/core/pylabtools.py:77: DeprecationWarning: backend2gui is deprecated since IPython 8.24, backends are managed in matplotlib and can be externally registered.
warnings.warn(
/Users/benjamv/opt/mambaforge/envs/CausalPy/lib/python3.11/site-packages/IPython/core/pylabtools.py:77: DeprecationWarning: backend2gui is deprecated since IPython 8.24, backends are managed in matplotlib and can be externally registered.
warnings.warn(

result.summary(round_to=3)
==================================Pre-Post Fit==================================
Formula: actual ~ 0 + a + b + c + d + e + f + g
Model coefficients:
a 0.385
b 0.172
c 0.443
d 0
e 5.39e-18
f 0
g 0
But we can see that (for this dataset) these estimates are quite bad. So we can lift the “sum to 1” assumption and instead use the LinearRegression
model, but still constrain weights to be positive. Equally, you could experiment with the Ridge
model (e.g. Ridge(positive=True, alpha=100)
).
Analyse with the LinearRegression
model#
# Note, we do not want an intercept in this model
result = cp.SyntheticControl(
df,
treatment_time,
formula="actual ~ 0 + a + b + c + d + e + f + g",
model=LinearRegression(positive=True),
)
fig, ax = result.plot(plot_predictors=True)

result.summary(round_to=3)
==================================Pre-Post Fit==================================
Formula: actual ~ 0 + a + b + c + d + e + f + g
Model coefficients:
a 0.322
b 0.0581
c 0.288
d 0.0561
e 0.00418
f 0.229
g 0.0378