这里写目录标题
- 双重稳健模型
- 数据
- 简单双重稳健模型
- 双重稳健 IP 特征模型
双重稳健模型
基本上,这些是利用加权模型增强结果模型的不同集合模型。
本笔记展示了不同的结果模型和倾向性模型组合方式,
但由于可能的组合非常多,本笔记并不打算展示所有组合。
%matplotlib inline
from sklearn.linear_model import LogisticRegression, LinearRegression
from causallib.datasets import load_nhefs
from causallib.estimation import IPW, Standardization, StratifiedStandardization
from causallib.estimation import AIPW, PropensityFeatureStandardization, WeightedStandardization
from causallib.evaluation import evaluate
数据
戒烟对体重减轻效果的研究。
数据示例取自 Hernán 和 Robins 的《因果推断》一书。
data = load_nhefs()
data.X.join(data.a).join(data.y).head()
简单双重稳健模型
用于平均结果。
其个体结果估计直接来自于结果模型,
但对于群体结果,它会在取加权平均之前使用个体结果预测来校正观察到的结果。
ipw = IPW(LogisticRegression(solver="liblinear"), clip_min=0.05, clip_max=0.95)
std = StratifiedStandardization(LinearRegression())
dr = AIPW(std, ipw)
dr.fit(data.X, data.a, data.y)
AIPW(outcome_covariates=None, outcome_model=StratifiedStandardization(learner=LinearRegression()), overlap_weighting=False, predict_proba=False, weight_covariates=None,
weight_model=IPW(clip_max=0.95, clip_min=0.05, use_stabilized=False, verbose=False,
learner=LogisticRegression(solver='liblinear')))
双重稳健校正群体结果
pop_outcome = dr.estimate_population_outcome(data.X, data.a, data.y)
pop_outcome
qsmk
0 1.761707
1 5.205193
dtype: float64
effect = dr.estimate_effect(pop_outcome[1], pop_outcome[0])
effect
diff 3.443486
dtype: float64
双重稳健 IP 特征模型
训练一个加权模型,然后将其输出(预测的权重)作为附加特征输入到结果模型中。
如果可能(如同 IPW),会使用整个权重矩阵(每个个体对于每种处理的权重),
但通常情况下,只会使用权重向量(根据实际的处理分配)。
ipw = IPW(LogisticRegression(solver="liblinear"))
std = Standardization(LinearRegression())
dr = PropensityFeatureStandardization(std, ipw)
dr.fit(data.X, data.a, data.y)
PropensityFeatureStandardization(feature_type=weight_vector, outcome_covariates=None, outcome_model=Standardization(encode_treatment=False, predict_proba=False,
learner=LinearRegression()), predict_proba=False, weight_covariates=None,
weight_model=IPW(clip_max=None, clip_min=None, use_stabilized=False, verbose=False,
learner=LogisticRegression(solver='liblinear')))
ind_outcomes = dr.estimate_individual_outcome(data.X, data.a)
ind_outcomes.head()
effect = dr.estimate_effect(ind_outcomes[1], ind_outcomes[0],
effect_types=["diff", "ratio"])
effect
diff 3.112635
ratio 2.694151
dtype: float64