from _api_doc_utils import *HorizontalPanelRidge
Horizontal ridge counterfactuals for panel treatment effects
1 Where it fits
Group: Causal inference
HorizontalPanelRidge implements a horizontal panel-prediction design. For each adoption cohort, never-treated donor outcomes at time \(t\) become features for treated outcomes at time \(t\) in the pre-period. Ridge then extrapolates counterfactual treated paths into the treated post-period.
The public panel contract is fit(Y, W): balanced outcomes plus a same-shaped absorbing treatment matrix.
2 Python API
Constructor: cm.HorizontalPanelRidge
After fit(y, w), predict() returns treated-unit counterfactuals, treatment_effect() returns observed-minus-counterfactual effects, and summary() returns ATT, event-study, group means, fitted coefficients, cohorts, and diagnostics.
print(inspect.signature(cm.HorizontalPanelRidge))(penalty=1.0)
cls = cm.HorizontalPanelRidge
display(HTML(html_table(["Public method"], public_methods(cls))))| Public method |
|---|
fit(self, /, y, w) |
predict(self, /) |
summary(self, /) |
treatment_effect(self, /) |
3 Minimal example
rng=np.random.default_rng(16)
y=rng.normal(size=(10,14)); w=np.zeros_like(y); w[7:,9:]=1; y[7:,9:]+=1.0
model=cm.HorizontalPanelRidge(penalty=1.0); model.fit(y,w)
print(model.summary()["att"])
print(list(model.summary()["event_study"].items())[:3])1.828237644527115
[('unweighted', {'event_time': array([-9., -8., -7., -6., -5., -4., -3., -2., -1., 0., 1., 2., 3.,
4.]), 'estimate': array([-0.08518528, -0.32173306, 0.01790597, 0.08711928, -0.16374416,
0.21465388, 0.35825572, 0.07763981, -0.18491216, 0.47756012,
2.27161272, 2.58629069, 2.36319848, 1.44252621]), 'n': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])}), ('weighted', {'event_time': array([-9., -8., -7., -6., -5., -4., -3., -2., -1., 0., 1., 2., 3.,
4.]), 'estimate': array([-0.08518528, -0.32173306, 0.01790597, 0.08711928, -0.16374416,
0.21465388, 0.35825572, 0.07763981, -0.18491216, 0.47756012,
2.27161272, 2.58629069, 2.36319848, 1.44252621]), 'n': array([3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3.])})]
4 summary() contract
The table below is generated by fitting the live class in this repository and then inspecting summary(). Shapes are shown because most values are plain NumPy arrays or scalars.
rng=np.random.default_rng(116); y=rng.normal(size=(8,12)); w=np.zeros_like(y); w[6:,8:]=1; y[6:,8:]+=.8
model=cm.HorizontalPanelRidge(); model.fit(y,w)
summary = model.summary()
display(HTML(html_table(["summary() key", "shape"], summary_shape_rows(summary))))| summary() key | shape |
|---|---|
att |
() |
intercept |
() |
coef |
(8,) |
cohort_intercepts |
(1,) |
cohort_coef |
(1, 8) |
counterfactual |
(8, 12) |
treatment_effect |
(8, 12) |
event_study |
() |
group_means |
() |
pre_rmse |
() |
penalty |
() |
control_units |
(6,) |
treated_units |
(2,) |
cohorts |
(1,) |