Oaxaca-Blinder 分解是什么?
Oaxaca-Blinder 分解回答的是两个群体平均结果差距中,有多少来自特征差异,有多少来自同样特征下的回报差异。它常用于工资差距、城乡差距、性别差距或地区绩效差距。
先用一句话理解
把 Oaxaca 分解想成比较两队工资。第一部分问两队教育、经验、行业构成是否不同;第二部分问即使教育经验相同,不同群体得到的回报是否仍不同。
什么时候用
| 判断项 | 教科书式判断 |
|---|---|
| 适合用在 | 研究两个群体的平均结果差距,并希望区分特征构成和系数回报。 |
| 先不要用在 | 群体划分没有清楚含义,或结果差距不是主要研究对象。 |
| 最关键的前提 | 变量组和参考系数选择要透明。 |
| 读表顺序 | 先看总差距,再看 explained 和 unexplained 两部分。 |
| 论文表述边界 | unexplained 不能简单等同于歧视,它也可能包含遗漏变量和模型设定差异。 |
把它和相近方法分清楚
| 容易混淆的对象 | 怎么区分 | 初学者记法 |
|---|---|---|
| 均值比较 | 只报告两个群体差多少。 | 不解释来源。 |
| 回归控制 | 估计群体虚拟变量。 | 不直接分解差距来源。 |
| Oaxaca 分解 | 把差距拆成特征和回报两块。 | 适合差距研究。 |
核心直觉和模型公式
均值差距分解
两组 A 和 B 的差距可分解为:
\[\bar{Y}_A-\bar{Y}_B=(\bar{X}_A-\bar{X}_B)\hat{\beta}_B+\bar{X}_A(\hat{\beta}_A-\hat{\beta}_B)\]
第一项是 explained 部分,第二项是 unexplained 部分;具体形式会随参考组选择变化。
公式里的符号怎么读
| 符号 | 含义 | 在本页怎么理解 |
|---|---|---|
| Y_bar_A - Y_bar_B | 总差距 | 两个群体平均结果的差。 |
| X_bar_A - X_bar_B | 特征差异 | 教育、经验、行业等变量均值差异。 |
| β_A, β_B | 回报系数 | 不同群体中同一特征对应的回报。 |
| explained | 可解释部分 | 由特征构成差异解释的差距。 |
| unexplained | 未解释部分 | 由系数差异和未观测因素共同构成。 |
专业使用口径
专业 Oaxaca 分解要控制解释力度,尤其不能把未解释部分直接贴标签。
| 口径 | 专业写法 |
|---|---|
| 群体定义 | 说明 A/B 如何划分。 |
| 变量组 | 展示哪些特征进入 explained 部分。 |
| 参考系数 | 说明用哪组系数或 pooled 系数做基准。 |
| 谨慎解释 | unexplained 是剩余差距,不自动等于歧视。 |
一步一步做:从问题到结果的五步
| 步骤 | 这一页具体做什么 | 做到什么程度才算读懂 |
|---|---|---|
| 1. 计算总差距 | 先看两个群体平均 Y 差多少。 | 没有差距就无需分解。 |
| 2. 选择解释变量 | 教育、经验、行业等特征。 | 变量选择影响 explained。 |
| 3. 分别估计组内模型 | 得到各组回报系数。 | 系数差异是分解来源。 |
| 4. 做差距分解 | 拆成 explained/unexplained。 | 注意参考组选择。 |
| 5. 写清边界 | 未解释部分不是单一机制。 | 避免过度政治化或道德化解释。 |
结果怎么读:先读口径,再读数字
本页案例读表时,先记住这个口径:SOE 与民营企业的 ln Patent 组间差距是 -0.1100,其中 DFI 可解释部分是 0.0000。
| 读表顺序 | 本页怎么读 | 不要这样读 |
|---|---|---|
| 先看总差距 | 两个群体到底差多少。 | 分解从总差距开始。 |
| 再看 explained | 特征构成解释多少。 | 这部分对应可观察差异。 |
| 然后看 unexplained | 剩余差距大小。 | 它不是纯歧视指标。 |
| 最后看变量贡献 | 哪些特征贡献最大。 | 贡献方向比星号更重要。 |
初学者最容易错在哪里
| 误读 | 为什么错 |
|---|---|
| 把 unexplained 等同歧视 | 错。它还包含遗漏变量和模型误差。 |
| 不说明参考组 | 错。分解结果依赖基准选择。 |
| 变量组随意 | 风险高。解释部分会被变量选择左右。 |
| 忽略样本可比性 | 不严谨。两组支持集差异过大时分解不稳。 |
先看这个案例的结论
- SOE 与民营企业的 ln Patent 组间差距是 -0.1100,其中 DFI 可解释部分是 0.0000。
- 未解释部分是 -0.1100;Oaxaca 页要把 endowment 和 coefficient/structure 两类差异分开说。
- 这页是企业创新案例的分解演示,不应该被写成工资歧视式模板结论。
变量要求和案例口径
| 字段 | 口径 |
|---|---|
| 数据 | CSMAR 风格 A 股企业创新面板 |
| 原始样本 | 196 家上市公司,2015-2020 年,约 1200 个公司-年观测;各方法有效样本以本页输出表 N 为准 |
| 因变量 | patent_count;回归页通常使用 ln(1 + patent_count) |
| 核心解释变量 | dfi_index,数字普惠金融指数;部分案例输出展示的是标准化后的 dfi_index |
| 控制变量 | roa、lev、size、growth、cashflow、tobinq、top1、dual、board、indep、soe、age |
| 输出文件 | oaxaca_results.csv |
| 角色要求 | 因变量、核心解释变量 |
| 依赖包 | oaxaca |
实际代码
下面是本页案例里的最小 Stata 代码。它的作用是帮助你看清变量怎么进入模型、结果文件怎么生成,而不是要求你在网页里手动运行。
import delimited "$DATA_PATH", clear varnames(1) encoding(UTF-8)
gen ln_patent1 = ln(1 + patent_count)
egen firm_id = group(stkcd)
xtset firm_id year
global y ln_patent1
global count_y patent_count
global x dfi_index
global controls roa lev size growth cashflow tobinq top1 dual board indep soe age
gen post = year >= 2018
bysort firm_id: egen pre_dfi = mean(cond(year < 2018, dfi_index, .))
quietly summarize pre_dfi, detail
gen treat = pre_dfi >= r(p50)
gen did = treat * post
gen high_patent = patent_count > 2
gen running_dfi = dfi_index - 260
gen rdd_treat = running_dfi >= 0
oaxaca $y $x roa lev size growth cashflow, by(soe)
export delimited using "$JOB_DIR/oaxaca_results.csv", replace
实际输出表
这张表是本方法页配套案例的输出结果,用来把前面的公式、变量口径和代码对应到实际数字。
| 指标 | 数值 | 解释 |
|---|---|---|
| 样本 | 1200 obs / 196 firms / 2015-2020 | 来自共用案例 CSV |
| 因变量 | ln(1 + patent_count) | 企业创新产出 |
| 核心解释变量 | dfi_index | 数字普惠金融指数 |
| 输出文件 | oaxaca_results.csv | empirical-wizard 对应方法产物 |
| 组间创新差距 | -0.1100 | SOE 与民营企业 ln Patent 均值差 |
| DFI 均值差 | 0.0014 | 两组数字金融暴露差异 |
| DFI 可解释部分 | 0.0000 | 用全样本 DFI 系数近似分解 |
| 未解释部分 | -0.1100 | Oaxaca 页需要说明结构差异而不只是组均值 |
案例图
这是一张由同一份案例数据生成的页面内诊断图。

论文里怎么写
本文在共用企业面板样本上报告Oaxaca-Blinder 分解,核心输出见 oaxaca_results.csv。结果解释时同时关注样本口径、变量构造、系数方向、标准误和适用前提,避免只凭单个 p 值完成方法选择。
检查清单
- 先定义两个组和分解变量,组别不能事后为了差异显著而选择。
- 把 endowment、coefficient 和 interaction 部分分开读。
- 未解释部分不能直接写成歧视或机制,除非有额外理论和证据。