Oster 系数稳定性边界是什么?
Oster 系数稳定性边界问的是:未观察遗漏变量需要多强,才会把当前估计结果解释掉。它通过观察加入控制变量前后系数和 R² 的变化,评估遗漏变量偏误的敏感性。
先用一句话理解
把 Oster 想成看一扇门被已经加入的控制变量推开了多少。如果加入很多可观察控制后系数几乎不动,要让未观察变量推翻结论,就需要很强的未观察选择。
什么时候用
| 判断项 | 教科书式判断 |
|---|---|
| 适合用在 | 担心遗漏变量偏误,但有从少控制到多控制的可比规格。 |
| 先不要用在 | 控制变量加入顺序没有理论意义,或 Rmax、delta 只是事后调到好看。 |
| 最关键的前提 | 可观察选择能为不可观察选择提供某种参照。 |
| 读表顺序 | 先看 uncontrolled/controlled 系数和 R²,再看 delta 或识别区间。 |
| 论文表述边界 | Oster 是敏感性分析,不是内生性问题的最终解决。 |
把它和相近方法分清楚
| 容易混淆的对象 | 怎么区分 | 初学者记法 |
|---|---|---|
| 稳健性控制 | 看加控制后系数是否稳定。 | 定性判断。 |
| Oster | 把系数和 R² 变化转成偏误边界。 | 定量敏感性分析。 |
| 工具变量 | 用外生变动处理内生性。 | 识别策略不同。 |
核心直觉和模型公式
系数稳定性和 R² 变化
Oster 的核心直觉依赖系数变化和解释度变化:
\[\delta \propto \frac{\beta_{controlled}-\beta_{uncontrolled}}{R^2_{controlled}-R^2_{uncontrolled}}\]
如果加入控制变量后 R² 大幅上升但系数很稳定,结果对遗漏变量偏误更不敏感。
公式里的符号怎么读
| 符号 | 含义 | 在本页怎么理解 |
|---|---|---|
| β_uncontrolled | 少控制系数 | 基准或较少控制下的核心系数。 |
| β_controlled | 多控制系数 | 加入主要控制变量后的核心系数。 |
| R²_controlled | 多控制解释度 | 加入控制后的模型解释度。 |
| Rmax | 理论最大解释度 | 包含未观察变量后可能达到的解释度。 |
| δ | 相对选择强度 | 未观察选择相对可观察选择需要多强。 |
专业使用口径
专业 Oster 报告要说明 Rmax 和 delta 假设,不要只给一个漂亮数字。
| 口径 | 专业写法 |
|---|---|
| 规格序列 | 少控制和多控制模型应可比且有理论顺序。 |
| Rmax | 说明最大 R² 的设定依据。 |
| delta | 解释未观察选择相对可观察选择的强度。 |
| 结论边界 | 若识别区间跨零,应保守解释主结论。 |
一步一步做:从问题到结果的五步
| 步骤 | 这一页具体做什么 | 做到什么程度才算读懂 |
|---|---|---|
| 1. 准备两组规格 | 少控制和多控制模型。 | 变量加入要有理论顺序。 |
| 2. 记录系数变化 | 比较 β_uncontrolled 与 β_controlled。 | 系数大幅变化说明敏感。 |
| 3. 记录 R² 变化 | 控制变量是否显著提高解释度。 | R² 变化是偏误边界来源。 |
| 4. 设定 Rmax/delta | 说明假设含义。 | 不能事后调参。 |
| 5. 报告边界 | 看结论在假设下是否仍排除零。 | 敏感性差要诚实写。 |
结果怎么读:先读口径,再读数字
本页案例读表时,先记住这个口径:短模型系数 = 0.0031;只控制年份时的 DFI 系数。
| 读表顺序 | 本页怎么读 | 不要这样读 |
|---|---|---|
| 先看系数稳定 | 加控制后 β 是否变化很大。 | 不要只看最终 p 值。 |
| 再看 R² | 控制变量增加了多少解释度。 | R² 不变时 Oster 信息有限。 |
| 然后看 δ/Rmax | 假设是否合理。 | 参数不可解释就没有说服力。 |
| 最后看识别区间 | 是否仍支持主方向。 | 跨零时不能写成稳健。 |
初学者最容易错在哪里
| 误读 | 为什么错 |
|---|---|
| 把 Oster 当内生性最终解决 | 错。它只是敏感性分析。 |
| Rmax 事后调到结论好看 | 错。假设要透明。 |
| 规格不可比 | 错。系数/R² 变化无法解释。 |
| 只报 delta 不解释 | 不够。读者需要知道这个强度意味着什么。 |
先看这个案例的结论
- 短模型系数 = 0.0031;只控制年份时的 DFI 系数。
- 全模型系数 = 0.0032;加入控制变量后的 DFI 系数。
- R² 提升 = 0.0346;Oster 边界依赖系数与 R² 的共同变化。
- 这些数字来自页面里的结果表;写论文时先解释数值含义,再讨论理论含义。
变量要求和案例口径
| 字段 | 口径 |
|---|---|
| 数据 | 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 |
| 输出文件 | oster_bound_results.csv |
| 角色要求 | 因变量、核心解释变量 |
| 依赖包 | psacalc |
实际代码
下面是本页案例里的最小 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
reg $y $x i.year
estimates store short
reg $y $x $controls i.year
psacalc beta $x, delta(1) rmax(.8)
export delimited using "$JOB_DIR/oster_bound_results.csv", replace
实际输出表
这张表是本方法页配套案例的输出结果,用来把前面的公式、变量口径和代码对应到实际数字。
| 指标 | 数值 | 解释 |
|---|---|---|
| 样本 | 1200 obs / 196 firms / 2015-2020 | 来自共用案例 CSV |
| 因变量 | ln(1 + patent_count) | 企业创新产出 |
| 核心解释变量 | dfi_index | 数字普惠金融指数 |
| 输出文件 | oster_bound_results.csv | empirical-wizard 对应方法产物 |
| 短模型系数 | 0.0031 | 只控制年份时的 DFI 系数 |
| 全模型系数 | 0.0032 | 加入控制变量后的 DFI 系数 |
| R² 提升 | 0.0346 | Oster 边界依赖系数与 R² 的共同变化 |
| delta proxy | 126.8120 | 教学近似值;正式输出以 psacalc 为准 |
案例图
这是一张由同一份案例数据生成的页面内诊断图。

论文里怎么写
为缓解模型设定或内生性担忧,本文补充报告Oster 系数稳定性边界。相关估计输出见 oster_bound_results.csv。该检验不替代研究设计本身,但可以说明核心结论在替代识别、标准误或稳健性口径下是否保持一致。
检查清单
- 先记录短模型和长模型的系数、R²,再讨论 δ 或识别边界。
- 最大 R² 的设定要有依据,不能为了结论好看任意设值。
- Oster 只能评估选择性遗漏变量的敏感性,不能证明没有内生性。