在实证研究中,我们经常会遇到一个看似简单、但其实很容易有偏的问题:
处理组和控制组本来就不一样。
比如,想研究企业数字化转型是否提升生产率。直接比较数字化企业和非数字化企业,可能会发现数字化企业的生产率更高。但这并不一定说明数字化转型本身有效,因为数字化企业往往规模更大、研发投入更高、管理水平更好,原本就可能具有更高的生产率。
这时,简单做均值比较或普通回归,可能会把企业原本的差异也算到数字化转型的效果里。
本期教程介绍一种常见的因果推断方法:
IPW 逆概率加权估计。
它的核心思想是:
先估计每个样本进入处理组的概率,再根据这个概率给样本重新赋权,让处理组和控制组在特征上更加可比,最后估计处理效应。
一、案例背景
本案例研究的问题是:
企业数字化转型是否提升了企业生产率?
变量设定如下:
| | |
|---|
productivity | | |
digital | | |
size | | |
age | | |
leverage | | |
roa | | |
rd_intensity | | |
industry_score | | |
如果直接比较数字化企业和非数字化企业,可能得到的是:
数字化企业生产率 - 非数字化企业生产率
但这个差异里面,既可能包含数字化转型的影响,也可能包含企业规模、盈利能力、研发能力等因素的影响。
因此,我们需要先解决一个问题:
如何让数字化企业和非数字化企业变得更可比?
IPW 就是为这个问题服务的。
二、方法思路
IPW 的完整流程可以概括为五步:
准备企业样本数据 ↓估计倾向得分 ↓构造 IPW 权重 ↓检查加权前后平衡性 ↓估计平均处理效应 ATE
其中最关键的是倾向得分。
倾向得分可以理解为:
在给定企业特征的情况下,一个企业进行数字化转型的概率。
记作:
P(D = 1 | X)
其中:
- •
X 表示企业规模、年龄、资产负债率、研发强度等控制变量。
估计出倾向得分之后,就可以构造权重:
| |
|---|
| 1 / pscore |
| 1 / (1 - pscore) |
直观理解是:
如果一个企业本来很不容易进入数字化组,但它实际进行了数字化转型,那么它在样本中就比较“稀有”,需要被赋予更大的权重。
如果一个企业本来很容易数字化,但它实际没有数字化,它同样也比较“稀有”,也需要更大的权重。
通过这种方式,IPW 可以重新调整样本结构,使处理组和控制组在可观测特征上更加接近。
三、核心代码
1. 导入库
import numpy as npimport pandas as pdimport statsmodels.api as smfrom sklearn.linear_model import LogisticRegressionfrom sklearn.preprocessing import StandardScaler
这里主要用到三个部分:
- •
statsmodels 用于加权回归估计处理效应。
2. 构造案例数据
np.random.seed(42)n = 1500df = pd.DataFrame({ "size": np.random.normal(10, 2, n), "age": np.random.randint(1, 30, n), "leverage": np.random.uniform(0.1, 0.8, n), "roa": np.random.normal(0.06, 0.03, n), "rd_intensity": np.random.uniform(0.01, 0.12, n), "industry_score": np.random.normal(0, 1, n)})
这一步构造企业层面的基础变量,包括企业规模、年龄、资产负债率、资产收益率、研发强度和行业技术水平。
3. 生成处理变量
linear_prob = ( -2.5 + 0.25 * df["size"] - 0.8 * df["leverage"] + 8.0 * df["rd_intensity"] + 0.45 * df["industry_score"])prob = 1 / (1 + np.exp(-linear_prob))df["digital"] = np.random.binomial(1, prob)
这里设定企业是否进行数字化转型与企业自身特征有关。
例如:
这也符合实际研究中的常见情况:数字化转型不是随机发生的,而是与企业自身条件有关。
4. 生成结果变量
df["productivity"] = ( 1.2 + 0.45 * df["digital"] + 0.35 * df["size"] + 0.015 * df["age"] - 1.1 * df["leverage"] + 2.5 * df["roa"] + 5.0 * df["rd_intensity"] + 0.4 * df["industry_score"] + np.random.normal(0, 1, n))
这里的结果变量是企业生产率。
其中,digital 的系数设定为正,表示数字化转型会提高企业生产率。
但是,生产率同时也受到企业规模、研发强度、资产收益率、行业技术水平等变量影响。因此,如果不处理样本差异,直接比较数字化企业和非数字化企业,很可能会高估数字化转型的作用。
5. 估计倾向得分
x_cols = [ "size", "age", "leverage", "roa", "rd_intensity", "industry_score"]X = df[x_cols]D = df["digital"]scaler = StandardScaler()X_scaled = scaler.fit_transform(X)ps_model = LogisticRegression(max_iter=1000)ps_model.fit(X_scaled, D)df["pscore"] = ps_model.predict_proba(X_scaled)[:, 1]
这一步用 Logit 模型估计倾向得分。
也就是估计:
数字化转型 = f(企业规模, 企业年龄, 资产负债率, 资产收益率, 研发强度, 行业技术水平)
得到的 pscore 就是每个企业进行数字化转型的预测概率。
6. 限制共同支撑区间
df = df[(df["pscore"] > 0.05) & (df["pscore"] < 0.95)].copy()
这一步是为了避免极端倾向得分。
如果某些企业的倾向得分接近 0 或 1,那么它们的权重会非常大,可能导致估计结果不稳定。
因此,通常会对倾向得分做一个简单限制,例如保留:
0.05 < pscore < 0.95
7. 构造 IPW 权重
df["ipw"] = ( df["digital"] / df["pscore"] + (1 - df["digital"]) / (1 - df["pscore"]))
这就是 IPW 的核心代码。
对于数字化企业:
权重 = 1 / pscore
对于非数字化企业:
权重 = 1 / (1 - pscore)
通过这个权重,样本会被重新调整,使处理组和控制组在控制变量上更加可比。
8. 估计处理效应
X_ipw = sm.add_constant(df["digital"])ipw_model = sm.WLS( df["productivity"], X_ipw, weights=df["ipw"]).fit(cov_type="HC1")print(ipw_model.summary())
这里使用加权最小二乘估计:
productivity = α + β digital + ε
其中,digital 的系数就是 IPW 估计得到的平均处理效应。
四、平衡性检验
IPW 做完之后,不能只看处理效应,还要检查加权是否真的改善了样本可比性。
常用指标是标准化均值差异,即 SMD。
SMD 越接近 0,说明处理组和控制组越平衡。
def weighted_mean(x, w): return np.sum(x * w) / np.sum(w)def weighted_var(x, w): mean = weighted_mean(x, w) return np.sum(w * (x - mean) ** 2) / np.sum(w)def smd_unweighted(data, var, treat): treated = data[data[treat] == 1][var] control = data[data[treat] == 0][var] return ( treated.mean() - control.mean() ) / np.sqrt((treated.var() + control.var()) / 2)def smd_weighted(data, var, treat, weight): treated = data[data[treat] == 1] control = data[data[treat] == 0] mean_t = weighted_mean(treated[var], treated[weight]) mean_c = weighted_mean(control[var], control[weight]) var_t = weighted_var(treated[var], treated[weight]) var_c = weighted_var(control[var], control[weight]) return (mean_t - mean_c) / np.sqrt((var_t + var_c) / 2)balance_table = []for var in x_cols: balance_table.append({ "变量": var, "加权前SMD": smd_unweighted(df, var, "digital"), "加权后SMD": smd_weighted(df, var, "digital", "ipw") })balance_df = pd.DataFrame(balance_table)print(balance_df)
这段代码的作用是比较加权前后处理组和控制组的差异。
如果 IPW 有效,那么加权后 SMD 应该明显下降。
五、结果展示
1. 样本情况
2. 平衡性检验
从平衡性结果可以看到,加权前数字化企业和非数字化企业存在明显差异。
尤其是:
这些变量在加权前的 SMD 较大,说明数字化企业本身就具有更强的基础条件。
经过 IPW 加权之后,各变量的 SMD 明显下降,大多接近 0,说明处理组和控制组变得更加可比。
3. ATE 估计结果
结果显示,直接比较数字化企业和非数字化企业时,生产率差异为 0.772。
但这个差异并不完全来自数字化转型本身,还包含了企业规模、研发强度、行业技术水平等因素的影响。
使用 IPW 调整样本可比性后,数字化转型的估计效应下降为 0.468,但仍然显著为正。
这说明:
在控制可观测企业特征差异后,数字化转型仍然能够显著提升企业生产率。
六、结果解读
这个案例的重点不只是得到一个显著系数,而是展示 IPW 的识别逻辑。
原始比较中,数字化企业生产率更高,但这种差异可能来自两个部分:
生产率差异 = 数字化转型效应 + 企业原本差异
IPW 的作用是通过重新赋权,尽量消除企业原本差异带来的影响。
从结果看,原始均值差异为 0.772,IPW 估计值为 0.468,说明如果不处理样本选择问题,可能会高估数字化转型的作用。
但 IPW 估计值仍然显著为正,说明数字化转型对企业生产率具有较稳定的促进作用。
七、教程总结
IPW 逆概率加权估计适合处理这类问题:
处理组和控制组不是随机形成的,而是由样本自身特征影响的。
它的优势在于:
不过,IPW 也有一个重要前提:
所有影响处理变量和结果变量的重要混杂因素,都需要被观测并纳入模型。
如果存在重要的遗漏变量,IPW 仍然可能产生偏误。
因此,在实际研究中,IPW 常常和以下内容一起使用:
总体来看,IPW 是一个非常适合入门因果推断的工具。它比普通回归更强调样本可比性,又比双重机器学习更容易理解,非常适合用来做政策评估、企业行为分析和劳动经济学研究中的处理效应估计。