from _api_doc_utils import *PartiallyLinearDML
Cross-fit partially linear Double ML
1 Where it fits
Group: Causal inference
PartiallyLinearDML estimates the treatment coefficient in
\[ y = \theta d + g(x) + u, \qquad d = m(x) + v, \]
using cross-fitted ridge nuisance regressions. The final coefficient is estimated from the orthogonalized residual-on-residual score.
2 Python API
Constructor: cm.PartiallyLinearDML
Use PartiallyLinearDML(penalty=None, cv=5, n_folds=5, seed=42), then fit(y, d, x). summary() reports the coefficient, robust standard error, covariance, and selected nuisance penalties by fold.
print(inspect.signature(cm.PartiallyLinearDML))(penalty=None, cv=5, n_folds=5, seed=42)
cls = cm.PartiallyLinearDML
display(HTML(html_table(["Public method"], public_methods(cls))))| Public method |
|---|
fit(self, /, y, d, x) |
summary(self, /, vcov=None, lags=None, clusters=None) |
3 Minimal example
rng=np.random.default_rng(13)
x=rng.normal(size=(400,4)); d=.3+x@np.array([.5,-.4,.2,.1])+rng.normal(scale=.8,size=400); y=1.3*d+x@np.array([.4,-.2,.1,.3])+rng.normal(scale=.6,size=400)
model=cm.PartiallyLinearDML(penalty=np.logspace(-4,1,10), cv=3, n_folds=4, seed=1); model.fit(y,d,x)
print(model.summary()["coef"])
print(model.summary()["outcome_penalties"][:2])1.3633657170229083
[2.7825594 2.7825594]
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(113); x=rng.normal(size=(160,4)); d=.3+x@np.array([.5,-.4,.2,.1])+rng.normal(size=160)*.8; y=1.3*d+x@np.array([.4,-.2,.1,.3])+rng.normal(size=160)*.6
model=cm.PartiallyLinearDML(penalty=np.logspace(-4,1,6),cv=3,n_folds=4,seed=1); model.fit(y,d,x)
summary = model.summary()
display(HTML(html_table(["summary() key", "shape"], summary_shape_rows(summary))))| summary() key | shape |
|---|---|
coef |
() |
se |
() |
vcov |
(1, 1) |
outcome_penalties |
(4,) |
treatment_penalties |
(4,) |