MCNNM — Matrix Completion with Nuclear-Norm Minimization (Athey et al. 2021)#
- Estimator:
Matrix Completion with Nuclear Norm Minimization (MCNNM) —
mlsynth.MCNNM- Source:
Athey, S., Bayati, M., Doudchenko, N., Imbens, G., & Khosravi, K. (2021), “Matrix Completion Methods for Causal Panel Data Models,” Journal of the American Statistical Association 116(536):1716-1730.
- Replication type:
Path A — Proposition 99 empirical, with a cross-validation against the authors’ own
MCPanelR package.- Status:
Fully verified — estimand reproduced and matched against the authors’ MC-NNM implementation.
Validation strategy#
MC-NNM imputes the treated post-period cells of the outcome matrix as missing
entries via low-rank completion with two-way fixed effects. Athey et al. report
a Proposition 99 effect of roughly -20 packs per capita. mlsynth recovers
that estimand, and we cross-validate against a live run of the authors’ own
MCPanel package (mcnnm_cv) on the same matrix.
Path A — Proposition 99#
import pandas as pd
from mlsynth import MCNNM
df = pd.read_csv("basedata/smoking_data.csv")
df["treat"] = df["Proposition 99"].astype(int)
res = MCNNM({"df": df[["state", "year", "cigsale", "treat"]],
"outcome": "cigsale", "treat": "treat",
"unitid": "state", "time": "year",
"display_graphs": False}).fit()
res.att # -19.83
Durable check#
The reference is pinned under benchmarks/reference/mcnnm_prop99/ (R 4.3.3,
MCPanel commit 6b2706f, set.seed(1), data checksum), captured by its
reference.R. The benchmark reads the frozen values (no R at test time):
python benchmarks/run_benchmarks.py --case mcnnm_prop99
It asserts the ATT matches MCPanel to within \(0.4\) (observed
\(0.15\)) and the California counterfactual path to RMSE \(0.9\)
(observed \(0.47\)).
References#
Athey, S., Bayati, M., Doudchenko, N., Imbens, G., & Khosravi, K. (2021). “Matrix Completion Methods for Causal Panel Data Models.” Journal of the American Statistical Association 116(536):1716-1730.