查看原文
其他

因果分析及Python实现

王海华 模型视角 2023-08-11

在当前的数据驱动时代,准确地确定变量间的因果关系已经成为了统计学和经济学的研究热点。但是如何简洁、高效地进行因果分析呢?让我为您介绍一个强大的Python工具——causalinference。

因果分析与causalinference

因果分析是统计学和经济学中的一个核心研究领域,它旨在确定一个或多个变量对另一个变量的影响。causalinference 是一个 Python 包,旨在提供一系列的因果推理工具。其主要接口是 CausalModel 类。以下是这个包的功能梳理:

初始化:

  • 使用 Y(结果变量)、D(处理/干预变量)和 X(协变量)来初始化该模型。

主要方法:

  • reset():重新初始化数据为原始输入,并删除任何已估计的结果。
  • est_propensity():估计倾向得分,即给定观测到的协变量接受处理的条件概率。使用 logistic 回归进行估计。
  • est_propensity_s():使用算法选择协变量来估计倾向得分。该算法基于一系列的似然比测试。
  • trim()trim_s():根据倾向得分修剪数据,以创建具有更好协变量平衡的子样本。
  • stratify()stratify_s():根据倾向得分对样本进行分层。默认地,样本被分为五个等大小的分箱。
  • est_via_ols():使用最小二乘法估计平均处理效应。
  • est_via_blocking():使用块内回归估计平均处理效应。该方法只能在样本被分层后执行。
  • est_via_weighting():使用 Horvitz-Thompson 加权估计器的双重稳健版本估计平均处理效应。
  • est_via_matching():使用最近邻匹配估计平均处理效应。该方法支持多重匹配和修正由于不完美匹配产生的偏差。
示例:
from causalinference import CausalModel
import numpy as np

# 假设数据
Y = np.random.randn(100)  # 结果变量
D = np.random.randint(02100)  # 处理/干预变量
X = np.random.randn(1003)  # 三个协变量

# 初始化模型
causal = CausalModel(Y, D, X)

# 估计倾向得分
causal.est_propensity()

# 修剪数据
causal.trim()

# 使用最小二乘法估计处理效应
causal.est_via_ols()

# 输出处理效应的估计
print(causal.estimates)

因果分析方法及Python实现

1.倾向得分匹配 (Propensity Score Matching, PSM)

原理:使用观察到的协变量来估计单位受到干预的概率,然后基于这些得分来匹配干预组和对照组的单元。示例:

from causalinference import CausalModel
import numpy as np

Y = np.random.randn(100)  # 结果
D = np.random.randint(02100)  # 干预
X = np.random.randn(1003)  # 协变量

causal = CausalModel(Y, D, X)
causal.est_propensity()
causal.trim()
causal.stratify()
causal.est_via_matching()

2. 差分法 (Difference-in-Differences, DiD)

原理:通过比较干预前后干预组和对照组的变化来估计干预的效果。注:causalinference 不直接提供 DiD 方法,但可以手动实现。

3. 工具变量法 (Instrumental Variables, IV)

原理:使用与干预变量关联但与结果无关的变量(工具变量)来控制混淆。注:causalinference 不直接提供 IV 方法。

4. 回归调整

原理:使用回归模型来控制多个协变量,从而估计干预的平均效应

在 causalinference 中的实现:

causal.est_via_ols()

5. 双重稳健估计

原理:结合倾向得分和回归方法来估计干预效应。

在 causalinference 中的实现:

causal.est_via_weighting()

6. 块估计

原理:在基于倾向得分的块内使用回归来估计干预效应

在 causalinference 中的实现:

causal.est_via_blocking()

结果解读

causalinference 包的输出提供了对处理效应的估计,以及与这些估计相关的统计。解读这些结果首先需要了解输出中的各个部分表示什么。以下是一些核心输出的概述和如何解读它们:

1. 平均处理效应 (Average Treatment Effect, ATE)

这是最核心的输出。它估计了接受处理/干预与否之间的平均差异

解释: 如果 ATE 为 5,则意味着接受处理的组别的平均结果比未接受治疗的组别高5个单位。同样,如果 ATE 为 -3,则意味着未接受治疗的组别的平均结果比接受治疗的组别高3个单位。

2. 标准误差 (Standard Error, SE)

估计的治疗效应是有不确定性的,标准误差提供了这种不确定性的量度

解释: 较小的 SE 表示估计更为精确,而较大的 SE 表示估计有更大的不确定性。

3. 置信区间 (Confidence Interval, CI)

这提供了一个区间,在这个区间内,我们有足够的信心认为真实的治疗效应位于这个范围内。

解释: 例如,一个 95% 的 CI 为 [2, 8] 意味着我们有 95% 的信心认为真实的治疗效应在2到8之间。

4. p值 (p-value)

这提供了一个统计检验的结果,用于检验治疗效应是否显著不为零。

解释: 通常,p值小于0.05被认为是统计显著的。这意味着如果真实的治疗效应为零,我们观察到的数据或更极端的数据的概率小于5%。

示例解读。考虑以下虚构的输出:

Average Treatment Effect: 5.2
Standard Error: 2.0
95% Confidence Interval: [1.4, 9.0]
p-value: 0.01

这可以解释为:

  • 干预组与对照组之间的平均差异为5.2个单位。
  • 这个估计的标准误差为2.0,这意味着估计有一定的不确定性。
  • 我们有95%的信心,真实的处理效应位于1.4到9.0之间。
  • p值为0.01,远小于0.05,这意味着我们有很强的证据认为治疗效应是显著的。

具体来看最开始代码的输出结果:

列解释:

  • Est.:这是估计的治疗效应。
  • S.e.:这是估计的标准误差。
  • z:这是z统计量,由估计的治疗效应除以其标准误差得到。
  • P>|z|:这是z统计量的双侧p值。
  • [95% Conf. int.]:这是估计的治疗效应的95%置信区间。行解释:
  • ATE (Average Treatment Effect):估计了干预对整体样本的平均效果。
  • ATC (Average Treatment Effect on the Controls):估计了如果对照组接受了治疗,其效果会是什么。
  • ATT (Average Treatment Effect on the Treated):估计了治疗组接受治疗的实际效果。具体结果解读:
  • ATE:
    • Est. = 0.104:整体样本的平均治疗效应估计为0.104,但是由于标准误差和置信区间的宽度,这个效应不是统计显著的。
    • p-value = 0.622:这意味着在0.05的显著性水平下,我们不能拒绝零假设,即治疗没有效果。[95% Conf. int.] = [-0.309, 0.516]:我们有95%的信心,真实的治疗效应在-0.309和0.516之间。
  • ATC:
    • Est. = 0.191:对于对照组,如果它们受到治疗,预计的效果为0.191。
    • p-value = 0.368:这意味着在0.05的显著性水平下,我们不能拒绝零假设,即治疗对对照组没有效果。
    • [95% Conf. int.] = [-0.225, 0.607]:我们有95%的信心,如果对照组接受治疗,真实的效果在-0.225和0.607之间。
  • ATT:
    • Est. = -0.003:对于实际接受治疗的组,治疗的效果几乎为零。
    • p-value = 0.989:这意味着在0.989的显著性水平下,我们不能拒绝零假设,即治疗对治疗组没有效果。
    • [95% Conf. int.] = [-0.431, 0.424]:我们有95%的信心,治疗组接受治疗的真实效果在-0.431和0.424之间。

总结

因果分析是探索变量间关系的关键手段,它超越了简单的相关性,深入探讨了实际的影响力。通过causalinference这个Python包,我们不仅可以方便地实施多种因果推理方法,还能深入挖掘并解读分析结果,为我们的决策提供有力的数据支持。无论您是数据科学家、经济学家还是研究人员,掌握并运用causalinference都将为您的工作带来巨大的价值。

参考资料:

  • https://causalinferenceinpython.org/index.html#

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存