--- name: er-robustness description: Use when building or writing the robustness-check section of an Economic-Research manuscript — organizes checks by the identification threat each one answers, not as an undifferentiated pile. --- # 稳健性检验体系(er-robustness) ## 触发时机 - 主回归已定稿,准备补稳健性,但只想到"换控制变量""缩尾"几招 - 审稿人质疑识别(遗漏变量 / 测量误差 / 样本选择),不知道该补哪类检验 - 已堆了一大堆稳健性表,但都没正面回应审稿人最担心的那个威胁 - 把异质性 / 机制误当稳健性写进了"稳健性检验"小节 - DID 文章只画了一张事件研究图,安慰剂只跑了一次 ## 核心区分:稳健性不是机制也不是异质性 | 类型 | 回答的问题 | 操作 | |---|---|---| | **基准结果** | 主效应是什么 | 主回归 | | **稳健性** | 换个方式做主回归,结论变不变 | 同一个 Y、同一个核心解释变量,改度量 / 样本 / 方法 | | **机制** | 为什么有这个效应 | 换中介变量做被解释变量 | | **异质性** | 在什么条件下效应更强 | 分组 / 交互 | 判定法则:**稳健性检验的结论句永远是"核心结论不变"。** 如果一段话的结论是"在 A 组更强""通过 M 起作用",它就不是稳健性,挪到 er-mechanism / er-heterogeneity。 ## 稳健性检验分类与清单(按识别威胁组织) ### 威胁 1:遗漏变量 / 内生性 - 更换识别策略(OLS → IV / DID / RDD,见 er-identification) - 工具变量 / Bartik 工具,报告第一阶段 F - 逐步加入更高维固定效应(个体×年份、行业×年份、地区×年份)与更多控制变量,看系数稳定性 - **Oster (2019) δ 与 β 边界**(`psacalc` / `oster_bounds`):在"观测变量解释力强、担心不可观测选择"时报告 δ(处理效应归零所需的不可观测/可观测选择比)与受限 β 边界。δ > 1 是常用门槛(Altonji, Elder & Taber, 2005 的思想) - 安慰剂检验(见下方专节) ### 威胁 2:测量误差 / 变量定义 - 替换核心被解释变量(如 TFP 的 OP / LP / ACF 不同算法) - 替换核心解释变量的度量(连续 vs. 离散、不同阈值、不同数据源) - 不同指标构造方式(主成分 vs. 熵权 vs. 简单加总) ### 威胁 3:样本选择 - 剔除特殊样本:直辖市、金融业、ST/*ST、IPO 当年、极端规模 - 不同时间窗(剔除危机年份 / 政策预热期 / 疫情年) - PSM 后再估(共同支撑域内重做主回归) - Heckman 两步法(存在自选择进入时) ### 威胁 4:估计方法 / 标准误 - 更换聚类层次(个体 → 行业 / 地区 / 处理层级) - 双向聚类(个体 + 时间) - Bootstrap 标准误 - **少聚类(cluster 数 < ~40)时用 wild cluster bootstrap**(`boottest` / `wild_cluster_bootstrap`) - winsorize / 缩尾比例敏感性(1% vs. 5% vs. 不缩尾) ### 威胁 5:功能形式 - 加入核心变量二次项 / 检验非线性(U 型、倒 U 型) - 分位数回归(效应在分布不同位置是否一致) - 对数 vs. 水平、不同标准化 ### DID 专属稳健性 - **平行趋势事件研究图**(前期系数不显著、置信区间包含 0) - **安慰剂**:随机化处理时点 / 处理对象,跑 500–1000 次,画估计系数分布图,看真实系数是否落在尾部 - 排除同期政策干扰(控制其他在窗口内生效的政策虚拟变量) - 异质性稳健估计量(`csdid` Callaway-Sant'Anna / `did_imputation` Borusyak 等)替换 TWFE - 改变处理组定义(不同的处理强度阈值 / 剔除边缘处理单位) ## 安慰剂检验的两种类型 **(a) 随机化处理**——伪造处理组或处理时点,重复 500–1000 次,主张"如果效应是真实政策造成的,随机安慰剂应得到围绕 0 的系数分布,真实系数应是离群值"。 **(b) 伪造结果变量**——把不该被政策影响的 Y 当被解释变量跑主回归,主张"如果效应是机制驱动而非数据噪声,安慰剂 Y 上应无显著效应"。 安慰剂写作模板: ``` 为排除[不可观测因素 / 偶然性]驱动结果的可能,本文进行安慰剂检验。 本文随机抽取[处理组 / 处理时点]并重复 N 次估计,图 X 报告 N 次估计的系数(核密度)分布。 结果显示,安慰剂系数集中分布于 0 附近,而本文真实估计值(垂直虚线)位于分布尾部, 表明基准结果并非由随机因素或遗漏变量驱动。 ``` ## 写作模板(每个稳健性检验一段,固定结构) ``` 为回应[某识别威胁],本文[具体做法:替换/剔除/更换/加入……]。 结果见表 X,核心解释变量系数为 [数值],[在 X% 水平显著], 与基准回归相比方向一致、量级相近(基准为 Y),核心结论不变。 ``` 要点:**每段都要报量级**,明说"与基准的 Y 相比量级相近",而不是含糊地说"结果依然显著"。 ## 稳健性检验的"度" - 不是越多越好。正文聚焦回应**审稿人最可能质疑的 2–4 个识别威胁** - 正文留最关键的检验(通常:更换识别 / 安慰剂 / 替换核心变量 / Oster 边界) - 次要检验(缩尾比例、聚类层次、剔除子样本逐项)放附录,正文一句话索引 - 正文稳健性表数有限(经验值约 3–5 张图表,以投稿当期官网为准),不要喧宾夺主 ## 执行桥(StatsPAI / Stata MCP) 把稳健性 battery **跑出来**,而不是只罗列。完整映射见 [`execution-with-mcp`](../../../shared-resources/empirical-methods/execution-with-mcp.md)。《经济研究》是中文经济学顶刊,识别可信度通常是约束;交错 DID、弱工具稳健 IV、RDD 与机制检验。 - **多结果 / 多设定:**`romano_wolf`(逐步 FWER)或 `benjamini_hochberg`,报告校正后阈值。 - **遗漏变量敏感性:**`oster_delta` / `sensemakr`。 - **推断:**少聚类用 `wild_cluster_bootstrap`;视依赖结构用 `twoway_cluster` / `conley`。 - **从一个 handle 复跑:**`audit_result(result_id)` 列出缺失检查及对应 `suggest_function`。 - **出表:**`etable` / `did_summary_to_latex` 直接从 handle 生成,不手抄数字。 正文留决定性检查,详尽 battery 进附录。执行链见 [JF 执行 walkthrough](../../../Journal-of-Finance-Skills/resources/worked-examples/02-execution-walkthrough.md)。 ## 必查清单 - [ ] 遗漏变量 / 内生性类:至少一项(更换识别或 IV 或加固定效应+控制)已做 - [ ] 测量误差类:核心被解释变量、核心解释变量度量各替换过 - [ ] 样本选择类:剔除特殊样本 / 不同时间窗 / PSM 至少一项 - [ ] 估计方法类:更换聚类层次或 winsorize 敏感性已做;少聚类时用了 wild cluster bootstrap - [ ] 安慰剂检验已做,且为分布形式(500–1000 次),不是单次 - [ ] 观测变量选择问题严重时,报告了 Oster δ 与 β 边界(δ > 1) - [ ] DID:事件研究平行趋势 + 异质性稳健估计量替换 TWFE 都做了 - [ ] 每个稳健性段落都报告了与主回归一致的**量级**(不只是显著性) - [ ] 没有把机制 / 异质性贴标签当稳健性 ## 反模式 - 稳健性检验堆一大摞,但没有一个正面回应核心识别威胁 - 把机制分析 / 异质性分析贴上"稳健性"标签充数 - 安慰剂只随机一次就下结论,不画系数分布 - 缩尾比例或子样本一变结论就翻,却不讨论、悄悄选有利的那版报告 - 只写"加入控制变量后结果依然显著",从不看系数方向与量级 - 报了 Oster δ < 1 还宣称稳健(δ < 1 意味着合理的不可观测选择即可推翻结果) - 用 TWFE 做 staggered DID 的稳健性,却不换 Callaway-Sant'Anna 类估计量 ## 输出格式 ``` 【已回应的识别威胁】[遗漏变量 / 测量误差 / 样本选择 / 估计方法 / 功能形式] 【正文稳健性检验】[更换识别, 安慰剂分布, 替换核心 Y, Oster 边界, ...] 【附录稳健性检验】[缩尾敏感性, 聚类层次, 剔除子样本, ...] 【安慰剂类型】随机化处理 / 伪造结果变量 / 两者 【Oster δ】[数值,若适用] 【量级一致性】每段是否都报了与基准的量级对比:是 / 否 【下一步】er-tables-figures ```