Chapter 10 因果推断

因果推断是数据科学和机器学习领域的一个重要概念,用于识别和量化因果关系而不仅仅是相关性。以下是一些常见的因果推断方法的总结,以及它们的具体方法和示例:

  1. 随机对照实验:

方法:通过在实验组和对照组中随机分配处理,比较结果来识别因果效应。 示例:在药物研究中,将一组患者随机分为接受治疗和接受安慰剂的组,并比较两组的疗效结果。

  1. 倾向得分匹配:

方法:通过创建一个倾向得分模型来估计处理组和对照组的特征匹配程度,然后使用这些得分进行匹配。 示例:在教育政策研究中,通过匹配接受政策干预的学生和未接受干预的学生,以估计政策对学习成绩的影响。

  1. 差异-差异估计:

方法:比较处理组和对照组的平均差异,然后考虑可能的混杂因素。 示例:在分析最低工资对就业的影响时,比较最低工资上涨地区的就业率与未上涨地区的就业率。

  1. 仪器变量法:

方法:利用仪器变量来解决因果推断问题,这些变量不直接影响结果,但会影响处理变量。 示例:在研究教育对收入的影响时,使用家庭背景作为仪器变量,以解决内生性问题。

  1. 因果图(Causal Graphs):

方法:使用因果图来可视化潜在的因果关系,然后根据因果图进行因果分析。 示例:通过构建患者病史和治疗方案之间的因果图,来分析某种治疗是否会导致更好的康复。

  1. 因果分析库:

方法:使用因果分析库,如DoWhy、CausalImpact等,来自动化因果推断的过程,包括建模、估计因果效应等。 示例:使用DoWhy库来估计教育干预对学生成绩的因果效应。

  1. 潜在因果模型:

方法:使用潜在因果模型,如潜在因果路径分析(LCA)、潜在效应模型(LATE),来估计处理效应。 示例:使用LCA来估计某项政策对不同子群体的效果。

因果推断是一个复杂的领域,需要仔细考虑数据、模型选择和可能的混杂因素。正确的因果推断方法取决于具体问题和可用数据,而不是一种通用的方法。在进行因果分析时,需要特别小心,以确保获得可靠的结论。

10.1 倾向性评分

在自愿性选择或混杂性的情况。其核心思想是通过建立一个倾向得分模型来估计个体选择处理的概率,然后使用这些倾向得分进行匹配,以确保处理组和对照组之间的特征更加平衡。这有助于减少混杂因素的影响,从而更准确地估计处理的因果效应。

倾向得分(Propensity Score)是指个体选择接受处理的概率,通常表示为 P(T=1|X),其中 T 表示是否接受处理(1表示接受,0表示不接受),X 是个体的特征向量。倾向得分模型可以是逻辑回归、决策树等机器学习模型,它用于估计每个个体的倾向得分。

以下是一个简单的示例,以说明倾向得分匹配的原理和应用:

来看一个例子:

建模倾向得分:首先,使用观测数据集,建立一个模型来估计每个个体选择接受处理的概率。通常,这是一个二分类的问题,可以使用逻辑回归来建模,例如:

from sklearn.linear_model import LogisticRegression

model = LogisticRegression()
model.fit(X, T)  # X 是特征,T 是是否接受处理
propensity_scores = model.predict_proba(X)[:, 1]

匹配:接下来,对处理组中的每个个体,寻找对照组中具有相似倾向得分的个体。这可以使用不同的匹配算法,如最近邻匹配或卡尔曼匹配。例如:

from sklearn.neighbors import NearestNeighbors

def matching(propensity_scores, caliper=0.05):
    matches = {}
    for treated_index, score in enumerate(propensity_scores[:treated_count]):
        closest = None
        for control_index, control_score in enumerate(propensity_scores[treated_count:]):
            if abs(score - control_score) < caliper and (closest is None or abs(score - control_score) < abs(score - propensity_scores[closest])):
                closest = control_index
        matches[treated_index] = closest
    return matches

估计因果效应:最后,使用匹配的数据集来比较处理组和对照组的结果,以估计因果效应。可以使用平均处理效应(Average Treatment Effect,ATE)等指标来评估。

10.2 Python 中的因果分析库

  1. Causalinference:
  • 功能:Causalinference库提供了用于因果分析的工具,包括倾向得分匹配、倾向得分加权和双重差异估计。

  • 示例:以下是一个使用Causalinference库的示例,估计了一项政策对就业率的影响:

from causalinference import CausalModel

# 创建CausalModel对象
causal = CausalModel(data, treatment, outcome)

# 进行因果分析
causal.est_via_ols()
causal.est_via_matching()

# 获取因果效应估计
causal.estimates
  1. DoWhy:
  • 功能:DoWhy是一个因果分析框架,它自动化了因果推断过程,包括建模、估计因果效应和检验因果假设。

  • 示例:以下是一个使用DoWhy库的示例,估计了教育政策对学生成绩的影响:

import dowhy
from dowhy import CausalModel

# 创建CausalModel对象
model = CausalModel(data=data, treatment=treatment, outcome=outcome, common_causes=common_causes)

# 估计因果效应
identified_estimand = model.identify_effect()
causal_estimate = model.estimate_effect(identified_estimand)
  1. CausalImpact:
  • 功能:CausalImpact库用于估计和可视化因果效应,特别适用于时间序列数据。

  • 示例:以下是一个使用CausalImpact库的示例,估计了广告投放对销售额的影响:

from causalimpact import CausalImpact

impact = CausalImpact(data, pre_period, post_period)
impact.run()

# 可视化因果效应
impact.plot()
  1. EconML:
  • 功能:EconML库提供了因果分析和处理因果估计的工具,特别关注处理因果估计和高维数据。

  • 示例:以下是一个使用EconML库的示例,估计了广告投放对销售额的因果效应:

from econml.dml import LinearDML

model = LinearDML(model_y, model_t, featurizer=featurizer)
model.fit(Y, T, X)

# 获取因果效应估计
treatment_effect = model.effect(X)