异质性分析:分组、交互项与组间系数差异检验
Heterogeneity:平均效应之外,效应在不同所有制、地区、规模、行业间如何分化?本节讲分组回归、交互项法、组间系数差异检验(SUR / 费舍尔组合 / bdiff)、分位数回归 qreg,以及异质性的经济学解读与"异质性—机制"联动。
bdiff、qreg、suest、estout、reghdfe,按分析选用)。01 为什么要做异质性分析
基准回归给出的是平均处理效应 ATT / ATE,它把所有个体"揉"在一起,掩盖了效应在不同群体间的分化。但政策评估的核心关切往往恰恰是分化:谁受益多、谁受损、谁不受影响?同样一项减税政策,对国有企业和民营企业、对东部沿海与内陆省份、对大企业与小企业、对资本密集与劳动密集行业的效应可能天差地别。异质性分析(heterogeneity analysis)就是要把这个"平均黑箱"打开。
从写作角度看,异质性分析有三重价值:(1) 充实故事——效应在理论预测应当更强的子样本里更强,本身就是对机制的侧面印证;(2) 政策含义——告诉你政策应当向哪个群体倾斜;(3) 回应审稿人——证明你的结论不是某个极端子样本的产物。但要警惕:异质性不是"随便切几刀样本看谁显著",每一次切分都必须有经济学先验。
异质性分析有两条技术路线:分组回归(把样本切成子样本分别回归,直观看系数大小)与交互项法(在全样本里加入 X×D 交互项,直接检验差异是否统计显著)。前者直观,后者严谨,顶刊通常两者并用。
02 分组回归法
分组回归(split-sample regression)最直观:按某个维度(所有制、地区、规模、行业)把样本切成两组或多组,分别估计 $Y=\beta X+\gamma'Z+\varepsilon$,比较各组的 $\hat{\beta}$。常见的分组维度包括:
- 所有制:国有 vs 非国有 / 民营 vs 外资;
- 地区:东部 vs 中西部、沿海 vs 内陆、高市场化 vs 低市场化地区;
- 企业规模:大企业 vs 中小企业(按员工数或资产中位数);
- 行业:高污染 vs 低污染、资本密集 vs 劳动密集、高技术 vs 传统行业;
- 治理/融资特征:高融资约束 vs 低融资约束、高成长性 vs 低成长性。
分组回归只是分别估计,两组系数一个显著、一个不显著,并不能直接推出"两组系数有显著差异"。因为"显著 vs 不显著"在统计上并不等价于"两者差异显著"。要证明组间差异本身显著,必须做组间系数差异检验(见第 04 节)。这是中文论文最常见的错误之一。
* ===== 02.1 按所有制分组:国有 vs 非国有 =====
reghdfe Y X $Xctrl if SOE==1, absorb(id year) vce(cluster id) // 国有
est store h_soe
reghdfe Y X $Xctrl if SOE==0, absorb(id year) vce(cluster id) // 非国有
est store h_nonsoe
esttab h_soe h_nonsoe, keep(X) se star(* 0.1 ** 0.05 *** 0.01) ///
mtitles("国有" "非国有")
* ===== 02.2 按地区分组:东部 vs 中西部 =====
reghdfe Y X $Xctrl if east==1, absorb(id year) vce(cluster id)
est store h_east
reghdfe Y X $Xctrl if east==0, absorb(id year) vce(cluster id)
est store h_west
* ===== 02.3 按规模分组:大企业 vs 中小企业 =====
xtile size_grp = lnasset, nq(2)
reghdfe Y X $Xctrl if size_grp==1, absorb(id year) vce(cluster id)
est store h_small
reghdfe Y X $Xctrl if size_grp==2, absorb(id year) vce(cluster id)
est store h_large
esttab h_small h_large, keep(X) se star(* 0.1 ** 0.05 *** 0.01) ///
mtitles("中小企业" "大企业")
03 交互项法与形式化
交互项法(interaction model)在全样本里一次性估计组间差异,不需要切分样本,且能直接给出差异项的显著性。设 $D$ 为分组虚拟变量(如 $D=1$ 表示国有企业),模型为:
系数解读:$\beta_1$ 是 $D=0$ 组中 $x$ 对 $y$ 的效应;$\beta_3$ 是两组在截距上的差异;$\beta_2$ 是组间效应差异——即 $D=1$ 组的 $x\to y$ 斜率比 $D=0$ 组多(或少)$\beta_2$。$D=1$ 组的总效应为 $\beta_1+\beta_2$。$\beta_2$ 是否显著不为零,正是"两组系数差异是否显著"的直接检验,这比分组回归后肉眼比较严谨得多。
当分组变量是连续变量(如融资约束指数、市场化程度)时,做法完全相同:把 $D$ 换成连续变量 $Z$,交互项为 $x\times Z$,$\beta_2$ 度量 $Z$ 每上升一单位时 $x\to y$ 斜率的变化。为降低多重共线性,连续变量通常先中心化。
* ===== 03.1 分组虚拟变量交互 =====
gen XxD = X * SOE
reghdfe Y X SOE XxD $Xctrl, absorb(id year) vce(cluster id)
* XxD 的系数 beta2 显著 => 国有/非国有两组效应差异显著
* D=1 组总效应 = _b[X] + _b[XxD]
* ===== 03.2 连续变量交互(先中心化)=====
center SA_index, prefix(c_)
gen XxcSA = X * c_SA_index
reghdfe Y X c_SA_index XxcSA $Xctrl, absorb(id year) vce(cluster id)
* ===== 03.3 用因子变量语法自动生成交互并做简单效应 =====
reghdfe Y c.X##i.SOE $Xctrl, absorb(id year) vce(cluster id)
margins SOE, dydx(X) // 分别给出 SOE=0/1 两组 X 的边际效应
marginsplot // 画两组边际效应及置信区间对比
04 组间系数差异检验
当你坚持用分组回归(而非交互项)来报告时,必须正式检验两组系数是否真的不同。三种常用方法:
(1) 似无相关回归 SUR(suest):把两组回归放在同一系统里估计,利用跨方程误差相关,直接检验 $\beta_{group1}=\beta_{group2}$。
(2) 费舍尔组合检验 / 自体抽样(Fisher permutation / bootstrap):通过有放回或无放回地重抽样构造"组间系数差"的经验分布,判断真实差异是否落在尾部。中文顶刊常用 bdiff 命令实现。
(3) 交互项法:即上一节的 $\beta_2$ 检验,本质上是在全样本里做一个等价的 Wald 检验,最简洁。
* ===== 04.1 似无相关回归 suest 检验组间差异 =====
* 注意:suest 不能直接用 reghdfe,先用 regress/xtreg 估计并存储
reg Y X $Xctrl if SOE==1
est store g1
reg Y X $Xctrl if SOE==0
est store g0
suest g1 g0
* 检验两组的 X 系数是否相等
test [g1_mean]X = [g0_mean]X
* 输出差异与 p 值:p<0.05 => 组间系数差异显著
* ===== 04.2 费舍尔组合检验:bdiff 命令 =====
* ssc install bdiff
* 语法:bdiff, group(分组变量) model(回归模型) reps(次数)
bdiff, group(SOE) model(reghdfe Y X $Xctrl, absorb(id year) vce(cluster id)) ///
reps(1000) seed(20240101)
* 输出经验 p 值:diff_p<0.05 => 组间差异显著
* ===== 04.3 交互项法:直接 Wald 检验(最简洁)=====
gen XxD = X*SOE
reghdfe Y X SOE XxD $Xctrl, absorb(id year) vce(cluster id)
test XxD // H0: beta2 = 0,等价于组间系数无差异
05 分位数回归 qreg
分组与交互项只回答"在类别维度或单一调节变量上"的异质性。分位数回归(quantile regression, qreg)则回答另一个维度的问题:$x$ 对 $y$ 的效应,在 $y$ 分布的不同分位上是否不同?例如政策对"高生产率企业"和"低生产率企业"(即 $y$ 分布的 90 分位与 10 分位)的影响是否不同?
OLS 估计的是条件均值 $E[y|x]$,而分位数回归估计条件分位数 $Q_\tau(y|x)$:
通过比较 $\beta_1(\tau)$ 在 $\tau=0.1,0.25,0.5,0.75,0.9$ 处的轨迹,可以看到效应是否随 $y$ 分布位置系统性变化。建议同时画系数分位图(coefplot over quantiles):横轴为分位点,纵轴为 $\hat{\beta}_1(\tau)$ 及其置信区间,与 OLS 的水平线对比。
* ===== 05.1 单个分位点 =====
qreg Y X $Xctrl, quantile(0.25) vce(bootstrap, reps(500))
est store q25
* ===== 05.2 多个分位点联立(分位数回归)=====
qreg Y X $Xctrl, quantile(0.10)
est store q10
qreg Y X $Xctrl, quantile(0.50)
est store q50
qreg Y X $Xctrl, quantile(0.90)
est store q90
esttab q10 q50 q90, keep(X) se star(* 0.1 ** 0.05 *** 0.01) ///
mtitles("10分位" "50分位(中位)" "90分位")
* ===== 05.3 面板分位数回归(需 xtqreg / usereghdfe)=====
* ssc install xtqreg
xtqreg Y X $Xctrl, quantile(0.50)
* ===== 05.4 画系数沿分位变化图 =====
* 循环估计 0.05~0.95 各分位,记录系数,再 coefplot
* 与 OLS 水平线对比,看效应是否随分位系统性上升/下降
06 异质性的经济学解读
异质性分析最容易"跑而不思":切完样本、跑完系数就写"在 X 组更显著"。但审稿人真正关心的是这个差异的经济学含义。一个合格的异质性章节,应当回答三个问题:
- 方向是否与理论一致?如果理论预测"高融资约束组效应更强",那实证上就应当是高约束组系数更大;若相反,要解释为什么。
- 大小差异是否有政策含义?差异多大才值得政策上区别对待?不要把统计显著但经济上微小的差异夸大。
- 是否排除了其他解释?两组系数不同,可能不是因为分组维度本身,而是因为两组在其他协变量上分布不同(如大企业组里高出口企业更多)。要检查协变量的组间平衡。
"我们预期政策对高融资约束企业影响更大(理论:融资约束渠道)。分组回归显示高约束组系数为 0.12(p<0.01),低约束组为 0.03(不显著);交互项 $X\times SA$ 系数为 0.08(p<0.05),bdiff 检验经验 p 值为 0.03,确认组间差异显著。这与融资约束渠道一致。"
07 异质性—机制联动
异质性与机制不是两张皮。最强的实证叙事,是让异质性分析反过来印证机制:如果 X 通过渠道 M 起作用,那么在"M 更容易被激活"的子样本里效应应当更强。这就把异质性(谁受影响更大)和机制(通过什么渠道)锁在了一起。
例如:若"数字经济 → 融资约束缓解 → 创新"是机制链,那么异质性分析应当显示:在融资约束更紧、金融发展更弱的地区,数字经济对创新的边际效应更大。这种"异质性方向与机制预测一致"的证据,比单纯的中介系数更有说服力,因为它利用了理论预测的交叉限制(cross-equation restriction)。写作时建议把异质性表和机制表放在同一节,互相引用。
08 逐步流程
09 QTE 分位数处理效应
本页 s5 的条件分位数回归(qreg)回答的是"给定 $X$,$y$ 的条件分位数如何随 $x$ 变化"。但政策评估更关心另一个问题:处理对结果的整个分布产生了什么影响?平均处理效应 ATE 只问 $E[Y(1)-Y(0)]$,它可能掩盖"处理把低收入人群往上拉、却把高收入人群往下压"这种分布层面的故事。分位数处理效应 QTE(Quantile Treatment Effect)就是为此设计的。
9.1 原理:τ_q = Y_q(1) − Y_q(0)
其中 $Q_q(Y(d))$ 是潜在结果 $Y(d)$ 分布的第 $q$ 分位数。$\tau_q$ 度量"处理把第 $q$ 分位的个体收入 / 生产率 / 工资抬高了多少"。把 $q$ 从 0.1 扫到 0.9,就得到一条处理效应的分布曲线:如果 $\tau_q$ 在低分位很大、高分位很小,说明处理主要帮了"底层";如果 $\tau_q$ 随 $q$ 上升,说明处理加剧了不平等。
ATE 是"分布的平均位置"效应(一阶矩),$\tau_q$ 是"分布整条曲线"效应(各分位数)。ATE 可能为 0 而 QTE 不为 0——例如处理让一半人收入 +100、另一半人 −100,均值不变但分布被拉开了。这就是为什么政策评估常同时报 ATE 与 QTE:平均效应不显著 ≠ 处理无效。
9.2 估计方法谱系
- 分位数回归(Koenker & Bassett, 1978):估计条件分位数 $Q_q(Y\mid X,D)$。在可忽略性下,对处理组、对照组分别拟合分位数回归,再取条件分位之差——但这给的是"条件 QTE",解释时要固定 $X$。
- Firpo (2007) 重新加权 QTE:在选择观察条件下,用倾向得分把处理组 / 对照组的分布"加权"到同一个反事实分布上,直接估计无条件分位数处理效应 $\tau_q$,Stata 有
qte命令实现。 - RIF 回归(Firpo, Fortin & Lemieux, 2009):构造"再中心化影响函数" RIF(Y,q),对它做 OLS,系数就是处理对无条件分位数的边际效应,Stata 命令
rifreg。 - Callaway & Li (2023) 分布处理效应:在交错处理 / DID 框架下,估计处理对整个结果分布(而非仅均值)的动态因果效应,是 QTE 在面板 / 政策评估下的前沿扩展。
9.3 Stata 完整代码
* ============================================================
* 09.3 QTE 分位数处理效应(模拟数据,set seed)
* ssc install qte // Firpo(2007) 无条件 QTE
* ssc install rif // RIF 回归相关
* ============================================================
clear all
set seed 20240101
set obs 2000
drawnorm X1 X2 X3, means(0) sds(1)
* 倾向得分 + 结果:处理效应随 Y 分布变化
gen double e_x = invlogit(X1 + 0.5*X2)
gen byte D = runiform() < e_x
* 真实 QTE:低分位效应大、高分位效应小(处理压缩分布)
gen double u = rnormal()
gen double Y0 = X2 + u
gen double Y1 = Y0 + (1.5 - 1.0*norm(u)) // 低分位(u小)效应≈1.5,高分位≈0.5
gen double Y = D*Y1 + (1-D)*Y0
* ---- (1) 条件分位数回归:处理组 vs 对照组 ----
qreg Y D X1 X2 X3, quantile(0.10) vce(boot, reps(500))
est store q10
qreg Y D X1 X2 X3, quantile(0.50) vce(boot, reps(500))
est store q50
qreg Y D X1 X2 X3, quantile(0.90) vce(boot, reps(500))
est store q90
esttab q10 q50 q90, keep(D) se star(* 0.1 ** 0.05 *** 0.01) ///
mtitles("10分位" "50分位" "90分位")
* D 的系数即"条件 QTE",应看到从 1.5 降到 0.5 的轨迹
* ---- (2) 无条件 QTE:Firpo (2007) 重新加权 ----
* qte Y D X1 X2 X3, q(0.1 0.25 0.5 0.75 0.9)
* 输出各无条件分位点的 QTE 及 bootstrap SE
* ---- (3) 工具变量分位数处理效应(若 D 内生)----
* ivqreg Y D X1 X2 X3 (Z = 工具变量), quantile(0.5)
* ---- (4) RIF 回归:处理对无条件分位数的边际效应 ----
* 先生成第 q 分位的 RIF,再回归 Y~D+X
* 例:rifreg Y D X1 X2 X3, rif(q(0.5))
* 循环 q=0.1...0.9,记录 D 的系数,画 QTE 轨迹图
10 分布分解(DFL / RIF / Oaxaca-Blinder)
QTE 问"处理如何移动结果分布",分布分解则问:两组(男 / 女、处理 / 对照、政策前 / 后)的结果分布差异,有多少来自"个体特征不同",有多少来自"特征的回报率不同"?这是 Oaxaca-Blinder 均值分解在分布层面的推广。
10.1 从 Oaxaca-Blinder 到分布分解
经典 Oaxaca-Blinder 只分解均值差 $\Delta\bar Y=\bar Y_A-\bar Y_B$:把它拆成"特征构成效应"(endowment,A、B 的 $X$ 分布不同)与"系数 / 回报效应"(coefficient,同样的 $X$ 在两组回报不同)。但均值分解看不到分布两端——工资性别差距在 10 分位和 90 分位可能完全不同。分布分解把这套逻辑推广到整条分布。
10.2 DFL 重新加权分解(DiNardo-Fortin-Lemieux, 1996)
DFL 的核心是构造一个"反事实分布":用 A 组的特征、B 组的回报率会得到什么分布?做法是给样本重新加权:
用这个权重调整 B 组样本,使其协变量分布"看起来像"A 组,再比较原 B 分布与加权后分布的分位数差,即为特征构成效应。DFL 的优点是不假设函数形式,缺点是权重对倾向得分误设敏感。
10.3 RIF 回归分解(Firpo-Fortin-Lemieux, 2009)
RIF(Recentered Influence Function)是一个把"分布统计量(分位数、基尼系数、方差)"变换成"可对其做 OLS 的因变量"的工具。对第 $q$ 分位数,RIF 近似等于把"个体对该分位数的贡献"作为因变量做 OLS,系数就是协变量对无条件分位数的边际效应。在 Oaxaca-Blinder 框架下用 RIF 替代 $Y$,就能把均值分解直接搬到任意分位数 / 基尼系数上。
条件分位数回归的系数不能直接做 Oaxaca 分解(条件 ≠ 无条件)。RIF 的巧妙在于:它构造的是无条件分位数的影响函数,因此可以直接代入 Oaxaca 分解公式,把"均值分解"无缝升级为"分布分解"。这是过去十年劳动经济学实证最常用的分布分解工具。
10.4 Stata 完整代码
* ============================================================
* 10.4 分布分解(模拟数据,set seed)
* ssc install oaxaca, replace
* ssc install rif, replace // RIF 回归
* ============================================================
clear all
set seed 20240101
set obs 3000
gen byte group = _n < 1500 // A=1(如处理组), B=0
drawnorm educ exper, means(0) sds(1)
* A 组特征更好、回报率更高
gen double Y = 0.8*group + (1 + 0.6*group)*educ + (0.3 + 0.2*group)*exper + rnormal()
* ---- (1) 均值 Oaxaca-Blinder 分解 ----
oaxaca Y educ exper, by(group) detail
* 输出:总差异 = 解释部分(特征) + 未解释部分(回报)
* ---- (2) DFL 重新加权(手工倾向得分加权)----
logit group educ exper
predict double pA, pr
gen double dfl_w = cond(group==1, 1, pA/(1-pA)) * (1-0.5)/0.5
* dfl_w 把 B 组加权成 A 组的协变量分布;
* 用 dfl_w 加权比较 A、B 的 Y 分布(直方图 / 分位数差)
* ---- (3) RIF 分解:在各分位上重复 Oaxaca ----
* 对 q=0.1,0.5,0.9 分别构造 RIF 并做分解
* 循环:
foreach q in 0.1 0.5 0.9 {
* 生成第 q 分位的 RIF(用 rif 包或手工:
* RIF = q + (q - 1(Y<=q)) / f_Y(q))
* 再对 RIF 跑 oaxaca
di "=== 分位 `q` 的 RIF 分解 ==="
* oaxaca rif_Y educ exper, by(group)
}
* 画出"分位数 — 特征效应 / 回报效应"两条曲线,
* 即 FFL (2009) 标准的分布分解图
11 异质性的其他前沿方法
除本页前 8 节的分组 / 交互 / 分位数与 QTE / 分布分解外,处理效应异质性还有几条前沿路线,这里只做定位与交叉链接,细节在对应页面展开。
- 相关随机系数模型(Correlated Random Coefficients):允许个体处理效应 $\tau_i=Y_i(1)-Y_i(0)$ 本身随机,并与 $D$ 相关(即"自选择进更受益的组")。它估计的不是固定 ATE,而是$\tau_i$ 的分布特征(均值、方差、与 $D$ 的相关),工具变量识别其边际分位效应。代表如 Heckman-Urzua-Vytlacil 的 marginal treatment effect (MTE) 框架,与本页 QTE 互补:MTE 沿"进入处理的倾向"维度展开,QTE 沿"结果分布"维度展开。
- 机器学习异质性:因果森林:当异质性维度太多、无法事先用交互项穷举时,用因果森林让数据自动估计 $CATE(x)=E[Y(1)-Y(0)\mid X=x]$ 的整条曲线。详见站内 17 因果森林与政策学习;其"双重稳健 + 正交"的统计基础见 16 DML 去偏机器学习。
- 事前 vs 事后分组异质性:先验理论决定的分组(事前) vs 数据驱动后切分(事后),涉及多重检验与"挑选显著"的判别规范。详见站内 23 显著性手法库与规范判别。
想知道"效应在所有制 / 地区 / 规模间是否不同" → 用本页 s2–s4 的分组 / 交互 / 组间检验;想知道"效应沿结果分布怎么变" → s5 条件 qreg 或 s9 QTE;想知道"两组结果分布差距从何而来" → s10 DFL/RIF 分解;想"让数据自己找异质性" → 17 因果森林。
12 论文案例与常见错误
前沿扩展:机器学习与因果推断(DML / 因果森林 / 政策树)
传统异质性分析依赖研究者事先指定的调节变量(所有制、地区、规模……),本质上是在一个低维网格上手动搜索异质性。2018 年以来,机器学习方法被引入因果推断,提供了两条新路线:(1) DML(Double/Debiased Machine Learning)用 Lasso、随机森林、Boosting 等灵活拟合高维混淆函数,再通过 Neyman 正交矩给出半参有效、对模型误设稳健的处理效应估计——当控制变量维度很高时,这是比"手工挑几个控制变量"更稳的稳健性做法;(2) 因果森林(Causal Forest)直接估计个体层面的条件平均处理效应 $CATE(x)=E[Y(1)-Y(0)\mid X=x]$,让数据自己发现"谁受影响更大"的异质性维度,而不必事先切分样本;(3) 政策树 / 政策学习(Policy Tree)则更进一步,把"应当对谁施加政策"当成一个直接的决策问题来优化。下面这些文献是这一前沿的方法与应用代表作。
rdrobust 生态外的 R 包 grf 实现,是当前异质性处理效应的主流工具。QTE 与分布分解方法学文献
qreg 与一切分位数 / QTE 方法的理论源头。qte 命令即据此实现(见本页 9.3)。区分了"条件 QTE"与"无条件 QTE",是 QTE 实证的标准参考。rifreg 由此而来,是当下分布分解的主力工具。常见错误
这是最普遍的错误。两个系数一个显著一个不显著,在统计上完全可能来自抽样波动,组间差异未必显著。必须用交互项 $\beta_2$、suest 或 bdiff 正式检验组间系数差。
把所有制、地区、规模、行业、年龄、成长性……每个都切一遍,只报告显著的那几格,本质是多重检验下的 p-hacking。异质性切分维度必须事先由理论限定,并控制多重比较(如报告所有切分结果)。
写 $Y=\beta_1 X+\beta_2 X\times D$ 却漏掉 $D$ 的主效应 $\beta_3$,会让交互项系数的解释变得混乱。正确做法是"有交互必有主效应":$X$、$D$、$X\times D$ 三者同时进模型。
连续变量未中心化时,主效应项与交互项高度共线,标准误被人为放大或缩小。连续调节变量应先中心化(center)再构造交互项。
$\tau_q=Q_q(Y(1))-Q_q(Y(0))$ 是反事实分布第 $q$ 分位数之差,是一个分布层面的因果对比,不是"某个位于第 $q$ 分位的个体被处理后效应是多少"。它回答的是"处理如何移动整条分布",不能解释为个体效应大小,也不能跨分位数把 $\tau_{0.2}$ 与 $\tau_{0.8}$ 读成"同一个人先在 20% 位、后到 80% 位"。报告时应写"处理把收入分布第 10 分位抬高了多少",而非"对第 10 名个体的效应"。
DFL 重新加权与 QTE 都依赖倾向得分 $0<e(X)<1$ 的共同支撑。若某组协变量取值在另一组几乎不存在(如高教育样本在处理组极少),权重会极端化、反事实分布外推到无数据区域,分解结果不可信。做分布分解前必须画两组倾向得分 / 协变量的重叠图,trim 共同支撑外样本,并报告"在重叠样本上"的分解结果。
进阶资料
- Melitz (2003), Econometrica — 异质性企业贸易理论。
- Hsieh & Klenow (2009), QJE — 错配与生产率离散。
- Koenker & Bassett (1978) — 分位数回归的原始方法。
- Stata 命令:
suest、bdiff、qreg / xtqreg、margins / marginsplot、因子变量c.X##i.D。