Causalinference倾向得分估计实战:est_propensity用法、二次项设置与协变量平衡检验
【免费下载链接】CausalinferenceCausal Inference in Python项目地址: https://gitcode.com/gh_mirrors/ca/Causalinference
Causalinference(Causal Inference in Python)是一个用 Python 实现的因果推断与处理效应分析软件包,涵盖倾向得分估计、协变量平衡检验、匹配、加权等经典方法。本文将带你用est_propensity完成倾向得分估计,掌握二次项(qua)的设置技巧,并通过标准化差异(ndiff)快速检验协变量平衡,帮助新手少走弯路。
1. 快速上手:三步搭好因果模型 🚀
Causalinference 的核心是CausalModel类,定义在 causalinference/causal.py 中。只要准备好三个数组即可建模:
- Y:结果变量(数值)
- D:处理指示变量(0/1)
- X:协变量矩阵
import numpy as np from causalinference import CausalModel causal = CausalModel(Y, D, X) # 建模完成后自动计算描述性统计 print(causal.summary_stats) # 查看处理组/对照组均值、标准差💡 安装:
pip install CausalInference(依赖 NumPy 与 SciPy)。也可以从仓库git clone https://gitcode.com/gh_mirrors/ca/Causalinference后本地安装。包内自带示例数据 causalinference/utils/vignette_data.txt(含 Y、D 及两个协变量 X1、X2),适合动手练习。
2. est_propensity 用法详解:参数、返回值怎么读 🔍
调用est_propensity会用逻辑回归估计倾向得分(给定协变量下接受处理的概率 p(X)),核心方法位于 causalinference/causal.py:
causal.est_propensity(lin='all', qua=[(0, 0), (1, 1)]) print(causal.propensity)输出是一张类似统计软件回归表的表格,包含各系数的Coef.(系数)、S.e.(标准误)、z、P>|z|(p值)和 95% 置信区间:
Estimated Parameters of Propensity Score Coef. S.e. z P>|z| [95% Conf. int.] -------------------------------------------------------------------------------- Intercept -2.839 0.526 -5.401 0.000 -3.870 -1.809 X0 0.466 0.155 3.011 0.003 0.163 0.770 X1 0.486 0.153 3.178 0.001 0.186 0.786 X0*X0 -0.045 0.012 -3.579 0.000 -0.069 -0.020 X1*X1 -0.045 0.013 -3.542 0.000 -0.070 -0.020新手读表口诀:先看 P>|z|,小于 0.05 说明该变量对"谁被处理"有显著影响。
causal.propensity是字典式对象,常用键如下:
| 键 | 含义 |
|---|---|
fitted | 每个个体的倾向得分值(后续所有方法都基于它) |
coef/se | 回归系数与标准误 |
lin/qua | 最终纳入的线性项 / 二次项 |
loglike | 最大化对数似然(模型拟合好坏) |
底层实现见 causalinference/core/propensity.py。
3. 二次项(qua)设置:捕捉非线性处理分配 ⚖️
如果处理分配不只与协变量"线性"相关(比如年龄适中的人更可能参加项目),只放线性项会估计偏差。qua参数用元组指定要相乘的列(列号从 0 开始):
(1, 1):第 2 列的平方项(2, 3):第 3 列与第 4 列的乘积项
# 常用写法:保留全部线性项,并为每个协变量添加平方项 causal.est_propensity(lin=[0, 1], qua=[(0, 0), (1, 1)]) # 偷懒写法:'all' 表示加入所有协变量的全部二次组合(含重复) causal.est_propensity(lin='all', qua='all')不确定该放哪些项?改用自动版est_propensity_s,它通过似然比检验序列自动挑选线性项与二次项(默认临界值C_lin=1、C_qua=2.71,来自 Imbens & Rubin 的推荐):
causal.est_propensity_s() # 自动选变量,省去手工调参 print(causal.propensity['lin'], causal.propensity['qua'])📌 经验法则:协变量较少且怀疑非线性时,手动加平方项更可控;协变量较多时用
est_propensity_s更省事。
4. 协变量平衡检验:用 ndiff 判断两组是否"可比" 📊
估计完倾向得分前,先确认处理组和对照组是否"长得像"。causal.summary_stats会自动计算每个协变量的标准化差异 ndiff(Normalized Difference),定义在 causalinference/core/summary.py:
$$ndiff_k = \frac{\bar{X}{k,t} - \bar{X}{k,c}}{\sqrt{(s^2_{k,t} + s^2_{k,c})/2}}$$
它的好处是:数值大小不随样本量增大而膨胀,适合直观比较。经验标准是|ndiff| < 0.1即认为该协变量基本平衡:
print(causal.summary_stats['ndiff']) # 例如 array([0.706, 0.880]) → 两个协变量都明显失衡,需要处理5. 失衡怎么办?修剪、分层与效应估计 🛠️
拿到失衡结论后,标准流程是"修剪 → 分层 → 估计",都基于已估计的倾向得分:
causal.est_propensity() # 必须先估计倾向得分 causal.trim() # 默认剔除倾向得分 <0.1 或 >0.9 的个体,改善平衡 # 或 causal.trim_s() # 自动计算最优修剪阈值(最小化估计方差) causal.stratify() # 按倾向得分分 5 个等宽层(可改 causal.blocks) causal.est_via_weighting() # 加权估计 # 也可选:causal.est_via_ols() / est_via_blocking() / est_via_matching() print(causal.estimates) # 查看 ATE / ATC / ATT 及标准误修剪的意义:倾向得分极端个体的对侧组里找不到"可比的邻居",剔除后协变量平衡通常显著改善——可再次运行causal.summary_stats['ndiff']前后对比验证效果。
6. 小结:一条完整工作流 ✅
| 步骤 | 方法 | 关注点 | ||
|---|---|---|---|---|
| 建模 | CausalModel(Y, D, X) | 三输入:结果、处理、协变量 | ||
| 估计倾向得分 | est_propensity(lin=..., qua=...) | 二次项捕捉非线性 | ||
| 自动选项 | est_propensity_s() | 似然比检验替代手工 | ||
| 平衡检验 | summary_stats['ndiff'] | 目标 | ndiff | < 0.1 |
| 修剪 | trim()/trim_s() | 默认 cutoff = 0.1 | ||
| 估计效应 | est_via_weighting()等 | 输出 ATE/ATC/ATT |
更多完整示例可参考官方示例文档 docs/tex/vignette.tex(配套 PDF:docs/tex/vignette.pdf),以及回归项构造的单测 tests/test_propensity.py。掌握"倾向得分 + 平衡检验"这一组合拳,你的因果分析就有了坚实的第一步。
【免费下载链接】CausalinferenceCausal Inference in Python项目地址: https://gitcode.com/gh_mirrors/ca/Causalinference
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考