【Python实战因果推断】24_倾向分4
目录
Variance of IPW
遗憾的是,计算 IPW 的标准误差不像线性回归那样简单。获得 IPW 估计值置信区间的最直接方法是使用自举法。使用这种方法,您将反复对数据进行替换重采样,以获得多个 IPW 估计值。然后,您可以计算这些估计值的 2.5 百分位数和 97.5 百分位数,从而得到 95% 的置信区间。
要编写这样的代码,首先要将 IPW 估计值封装到一个可重复使用的函数中。注意我是如何用 sklearn 代替 statsmodels 的。statsmodels 中的 logit 函数比 sklearn 中的逻辑回归模型要慢,因此这一改动将为您节省一些时间。此外,由于你可能不想失去 statsmodels 中公式的便利性,我使用了 patsy 的 dmatrix 函数。该函数基于 R 风格公式设计特征矩阵,就像你目前使用的那些公式一样:
from sklearn.linear_model import LogisticRegression
from patsy import dmatrix
# define function that computes the IPW estimator
def est_ate_with_ps(df, ps_formula, T, Y):
X = dmatrix(ps_formula, df)
ps_model = LogisticRegression(penalty="none",
max_iter=1000).fit(X, df[T])
ps = ps_model.predict_proba(X)[:, 1]
# compute the ATE
return np.mean((df[T]-ps) / (ps*(1-ps)) * df[Y])
以下是您将如何使用此函数:
formula = """tenure + last_engagement_score + department_score
+ C(n_of_reports) + C(gender) + C(role)"""
T = "intervention"
Y = "engagement_score"
est_ate_with_ps(df, formula, T, Y)
0.2659755621752663
现在您已经有了在一个整洁的函数中计算 ATE 的代码,您可以在引导过程中应用它。为了加快速度,我还将并行运行重采样。你只需调用数据帧方法 .sample(frac=1, replace=True),就能得到一个自举样本。然后,将该样本传递给您之前创建的函数。为了使 bootstrap 代码更通用,它的参数之一是一个估计函数 est_fn,它接收一个数据帧并返回一个数字作为估计值。我使用的是四个工作,但您也可以将其设置为您计算机的内核数。
在每个引导样本中多次运行这个估计器,最后会得到一个估计值数组。最后,要得到 95% CI,只需取该数组的 2.5 和 97.5 百分位数即可:
from joblib import Parallel, delayed # for parallel processing
def bootstrap(data, est_fn, rounds=200, seed=123, pcts=[2.5, 97.5]):
np.random.seed(seed)
stats = Parallel(n_jobs=4)(
delayed(est_fn)(data.sample(frac=1, replace=True))
for _ in range(rounds)
)
return np.percentile(stats, pcts)
我的代码倾向于函数式编程,这可能不是每个人都熟悉的。因此,我将添加注释,解释我使用的一些函数式编程模式,首先是部分函数。
我将使用 partial 来获取 est_ate_with_ps 函数,并部分应用公式、干预和结果参数。这样就可以得到一个以数据帧为唯一输入的函数,并输出 $ATE$ 估计值。然后,我就可以将此函数作为 est_fn 参数传递给我之前创建的 bootstrap 函数:
from toolz import partial
print(f"ATE: {est_ate_with_ps(df, formula, T, Y)}")
est_fn = partial(est_ate_with_ps, ps_formula=formula, T=T, Y=Y)
print(f"95% C.I.: ", bootstrap(df, est_fn))
ATE: 0.2659755621752663
95% C.I.: [0.22654315 0.30072595]
这个 95% 的范围与之前线性回归的范围差不多。重要的是要认识到,如果权重较大,倾向得分估计值的方差就会很大。权重大意味着某些单位对最终估计值的影响很大。少数单位对最终估计值的影响很大,这正是造成方差的原因。
如果在倾向得分高的地区只有少数控制单位,或者在倾向得分低的地区只有少数接受治疗的单位,那么权重就会很大。这将导致你只有很少的单位来估计反事实 Y0 和 Y1,这可能会给你带来一个非常嘈杂的结果。
原文地址:https://blog.csdn.net/qq_32146369/article/details/139371380
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!