趋近智
选择偏差相较于混淆偏差,是一个独特的问题,尽管两者都源于与未观测因素相关的问题。混淆偏差涉及变量同时影响处理和结果,而选择偏差则出现在被纳入分析样本 () 的概率本身依赖于处理 ()、结果 (),或与两者均相关的变量时,通常涉及未观测因素 。这意味着所分析的样本与我们希望得出因果结论的目标总体存在系统性差异。即使在调整了已观测协变量 后,应用于此类选择样本的标准估计器仍可能产生对因果效应(例如平均处理效应 (ATE) 或条件平均处理效应 (CATE))的有偏差估计。
试想估计一个新的在线学习平台 () 对学生考试成绩 () 的有效性。如果只有那些感到显著受益(意味着更高的潜在 )的学生选择报告他们的分数,那么样本就是根据与结果相关的因素进行选择的。同样,基于参与公司 () 的收入来估计创业加速器项目 () 的投资回报时,如果只有成功的公司( 取决于高 )同意分享数据,也可能会出现选择偏差。
处理选择偏差的奠基性工作源自计量经济学,特别是赫克曼两步修正程序(常称为Heckit)。其核心思路是明确地将选择过程与结果过程一同建模。
假设存在一个决定选择的潜在变量 : 如果 ,则个体 被选入样本 ()。这里, 代表影响选择的变量, 是系数, 是误差项。
针对整个总体(无论是否被选择)的结果模型为: 这里, 是协变量, 是处理, 和 是参数 (parameter)( 是我们感兴趣的因果效应), 是误差项。
如果选择模型和结果模型的误差项 和 相关,则会发生选择偏差,这通常是因为两者都受到共同的未观测因素 的影响。如果我们简单地仅使用选定样本 () 估计结果模型,误差项的期望值将不为零:
在 和 服从具有相关性 的二元正态分布的假设下,赫克曼表明此条件期望可以表示为: 这里 是 的标准差, 是逆米尔斯比率 (IMR): 这里, 是标准正态概率密度函数 (PDF), 是标准正态累积分布函数 (CDF)。
赫克曼两步程序包括:
经典赫克曼模型中识别的一个必要条件是排他性限制: 中必须至少有一个变量影响选择 () 但不直接影响结果 ,除非可能是通过其对选择本身的影响(即它不包含在 中)。该变量充当选择过程的工具。
尽管简洁,经典的赫克曼程序依赖于在复杂机器学习场景中常难以证明的强假设:
现代机器学习应用通常涉及高维数据、非线性关系和复杂交互,这需要更灵活的方法。调整选择偏差修正涉及用机器学习算法取代刚性参数 (parameter)模型,同时保留建模选择和校正结果预测的核心思路。
替代 Probit 模型,我们可以使用灵活的二元分类器来建模选择概率 。适用的模型包括:
输入特征 将包括所有被认为影响样本纳入的已观测变量。该模型的输出为我们提供了估计的选择概率,。
借助基于机器学习 (machine learning)的选择模型,我们可以调整校正步骤:
使用选择概率逆加权法 (IPSW): 如果选择仅依赖于已观测的预处理协变量 (如果选择发生在处理分配之后,则可能包括 和潜在的处理 ),我们可以考虑用其估计选择概率的倒数对选定样本进行加权:。然后,使用这些权重 (weight)在选定样本上训练结果模型。但此方法要求在给定 的情况下,选择机制与结果 相互独立,即“基于可观测变量的选择”。这是一个在实践中经常被违反的强假设(例如,如果人们根据他们感知到的结果自愿参与研究)。它还需要正性假设(对于所有相关的 , )。
控制函数方法(广义 IMR): 这更接近赫克曼最初的思路。我们需要一种方法来捕捉给定选择条件下的结果误差的条件期望 。在没有正态性假设的情况下,之前推导的 IMR 不能直接成立。然而,我们可以使用估计选择概率 或分类器原始分数的函数作为“控制函数”,并将其作为额外特征包含在结果模型中。
让我们概述使用 Python 库调用实现控制函数方法的步骤:
# 假设:
# df_full 包含用于选择建模的特征 Z(所有单位)
# df_selected 包含特征 X、处理 T、结果 Y 和 Z(仅已选择单位)
# df_full 中的 'selected' 列表示 S=1 或 S=0
from sklearn.ensemble import RandomForestClassifier, RandomForestRegressor
from sklearn.model_selection import train_test_split
import numpy as np
import pandas as pd
# 1. 训练选择模型
# 选择模型的特征
Z_features = ['z1', 'z2', 'instrument'] # 'instrument' ideally satisfies exclusion restriction
# 选择模型的目标
selection_target = 'selected'
selector_model = RandomForestClassifier(n_estimators=100, random_state=42)
selector_model.fit(df_full[Z_features], df_full[selection_target])
# 2. 为已选择样本计算控制函数
# 预测已选择单位的选择概率
selection_probs_selected = selector_model.predict_proba(df_selected[Z_features])[:, 1]
# 定义一个控制函数(例如,概率本身或 logit)
# 避免除以零或 log(0)
epsilon = 1e-6
control_function = np.log(selection_probs_selected / (1 - selection_probs_selected + epsilon))
# 备选方案:control_function = selection_probs_selected
df_selected['control_func'] = control_function
# 3. 使用控制函数训练结果模型
# 结果模型的特征(如果使用了工具变量,则将其从 Z 中排除)
X_features = ['x1', 'x2']
T_feature = 'treatment'
outcome_target = 'outcome'
# 组合结果模型的特征
outcome_features = X_features + [T_feature, 'control_func']
outcome_model = RandomForestRegressor(n_estimators=100, random_state=123)
outcome_model.fit(df_selected[outcome_features], df_selected[outcome_target])
# 4. 估计因果效应(例如 ATE)
# 创建用于预测的反事实数据框
df_cf_treated = df_selected[outcome_features].copy()
df_cf_treated[T_feature] = 1
df_cf_control = df_selected[outcome_features].copy()
df_cf_control[T_feature] = 0
# 预测潜在结果
y_hat_treated = outcome_model.predict(df_cf_treated)
y_hat_control = outcome_model.predict(df_cf_control)
# 在已选择样本上估计 ATE
ate_estimate = np.mean(y_hat_treated - y_hat_control)
print(f"估计的 ATE(已调整选择偏差):{ate_estimate:.4f}")
"> 该代码概述演示了工作流程。实现需要仔细的特征工程、超参数 (parameter) (hyperparameter)调优、交叉验证以及标准误差估计(由于其两阶段性质,通常需要自助法)。"
调整机器学习 (machine learning)中的选择偏差修正方法比经典方法提供了更大的灵活性,但也继承了基本难题:依赖于关于选择过程和未观测变量作用的强假设(通常无法检验)。排他性限制的要求在许多机器学习场景中特别难以令人信服地满足。
因此,这些方法应谨慎应用,并始终伴随严格的敏感性分析。在可能的情况下,本章讨论的替代策略,例如工具变量法(如果存在有效工具变量)、回归不连续性设计(如果存在明确的分配阈值)、双重差分法(如果面板数据和平行趋势假设成立),或近端因果推断(如果存在合适的代理变量),可能通过利用不同类型的数据结构或假设提供更可靠的识别途径,这些假设避免仅仅基于相关性明确建模选择机制。方法的选择在很大程度上取决于具体问题背景、数据可用性以及潜在假设的合理性。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造