Causalinference倾向得分估计实战:est_propensity用法、二次项设置与协变量平衡检验
2026/9/20 14:36:59 网站建设 项目流程

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=1C_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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询