当前位置:首页>python>样本不可比怎么办?用 Python 跑一遍 IPW 逆概率加权估计

样本不可比怎么办?用 Python 跑一遍 IPW 逆概率加权估计

  • 2026-09-27 01:28:29
样本不可比怎么办?用 Python 跑一遍 IPW 逆概率加权估计

在实证研究中,我们经常会遇到一个看似简单、但其实很容易有偏的问题:

处理组和控制组本来就不一样。

比如,想研究企业数字化转型是否提升生产率。直接比较数字化企业和非数字化企业,可能会发现数字化企业的生产率更高。但这并不一定说明数字化转型本身有效,因为数字化企业往往规模更大、研发投入更高、管理水平更好,原本就可能具有更高的生产率。

这时,简单做均值比较或普通回归,可能会把企业原本的差异也算到数字化转型的效果里。

本期教程介绍一种常见的因果推断方法:

IPW 逆概率加权估计。

它的核心思想是:

先估计每个样本进入处理组的概率,再根据这个概率给样本重新赋权,让处理组和控制组在特征上更加可比,最后估计处理效应。


一、案例背景

本案例研究的问题是:

企业数字化转型是否提升了企业生产率?

变量设定如下:

变量
含义
类型
productivity
企业生产率
结果变量
digital
是否数字化转型
处理变量
size
企业规模
控制变量
age
企业年龄
控制变量
leverage
资产负债率
控制变量
roa
资产收益率
控制变量
rd_intensity
研发强度
控制变量
industry_score
行业技术水平
控制变量

如果直接比较数字化企业和非数字化企业,可能得到的是:

数字化企业生产率 - 非数字化企业生产率

但这个差异里面,既可能包含数字化转型的影响,也可能包含企业规模、盈利能力、研发能力等因素的影响。

因此,我们需要先解决一个问题:

如何让数字化企业和非数字化企业变得更可比?

IPW 就是为这个问题服务的。


二、方法思路

IPW 的完整流程可以概括为五步:

准备企业样本数据        ↓估计倾向得分        ↓构造 IPW 权重        ↓检查加权前后平衡性        ↓估计平均处理效应 ATE

其中最关键的是倾向得分。

倾向得分可以理解为:

在给定企业特征的情况下,一个企业进行数字化转型的概率。

记作:

P(D = 1 | X)

其中:

  • • D = 1 表示企业进行了数字化转型;
  • • D = 0 表示企业没有进行数字化转型;
  • • 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

这里主要用到三个部分:

  • • pandas 用于数据整理;
  • • sklearn 用于估计倾向得分;
  • • 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. 样本情况

项目
数值
初始样本量
1500
共同支撑后样本量
1496
数字化企业数量
831
非数字化企业数量
665
数字化企业占比
55.5%

2. 平衡性检验

变量
加权前 SMD
加权后 SMD
企业规模
0.492
0.041
企业年龄
-0.026
-0.014
资产负债率
-0.127
-0.018
资产收益率
0.034
0.009
研发强度
0.235
0.027
行业技术水平
0.421
0.036

从平衡性结果可以看到,加权前数字化企业和非数字化企业存在明显差异。

尤其是:

  • • 企业规模;
  • • 研发强度;
  • • 行业技术水平。

这些变量在加权前的 SMD 较大,说明数字化企业本身就具有更强的基础条件。

经过 IPW 加权之后,各变量的 SMD 明显下降,大多接近 0,说明处理组和控制组变得更加可比。


3. ATE 估计结果

方法
估计值
标准误
p值
原始均值差异
0.772
-
-
IPW 加权估计
0.468
0.058
0.000

结果显示,直接比较数字化企业和非数字化企业时,生产率差异为 0.772。

但这个差异并不完全来自数字化转型本身,还包含了企业规模、研发强度、行业技术水平等因素的影响。

使用 IPW 调整样本可比性后,数字化转型的估计效应下降为 0.468,但仍然显著为正。

这说明:

在控制可观测企业特征差异后,数字化转型仍然能够显著提升企业生产率。


六、结果解读

这个案例的重点不只是得到一个显著系数,而是展示 IPW 的识别逻辑。

原始比较中,数字化企业生产率更高,但这种差异可能来自两个部分:

生产率差异 = 数字化转型效应 + 企业原本差异

IPW 的作用是通过重新赋权,尽量消除企业原本差异带来的影响。

从结果看,原始均值差异为 0.772,IPW 估计值为 0.468,说明如果不处理样本选择问题,可能会高估数字化转型的作用。

但 IPW 估计值仍然显著为正,说明数字化转型对企业生产率具有较稳定的促进作用。


七、教程总结

IPW 逆概率加权估计适合处理这类问题:

处理组和控制组不是随机形成的,而是由样本自身特征影响的。

它的优势在于:

优点
说明
思路清楚
先估计进入处理组的概率,再重新赋权
样本保留较多
相比 PSM,通常不需要大量丢弃样本
结果好展示
可以展示倾向得分、平衡性检验和 ATE 表
适合扩展
可以继续接 AIPW、DML、DID 等方法

不过,IPW 也有一个重要前提:

所有影响处理变量和结果变量的重要混杂因素,都需要被观测并纳入模型。

如果存在重要的遗漏变量,IPW 仍然可能产生偏误。

因此,在实际研究中,IPW 常常和以下内容一起使用:

  • • 平衡性检验;
  • • 倾向得分分布图;
  • • 极端权重处理;
  • • 稳健性检验;
  • • 替换倾向得分模型;
  • • 与 OLS、PSM、DML 等结果进行对比。

总体来看,IPW 是一个非常适合入门因果推断的工具。它比普通回归更强调样本可比性,又比双重机器学习更容易理解,非常适合用来做政策评估、企业行为分析和劳动经济学研究中的处理效应估计。

最新文章

随机文章