对标教材:单元 15(推断性统计)
阶段定位:分析——"算清楚"
本章为全手册最重章节,建议分 2–3 周完成
学习目标
完成本章后,你应当能够:
- 说出 GLM(一般线性模型)如何统摄 t 检验、方差分析与回归——三者不是"三种方法",而是同一枚硬币的不同面
- 选择 为自己的研究假说匹配最合适的识别策略(OLS / FE / IV / DID / PSM / RDD)
- 完成 用 stata-mcp 驱动的"六步法"实证全流程(描述 → 基准 → 内生性 → 稳健性 → 机制 → 异质性)
- 解释 每种识别策略"解决了第 4 章七大效度威胁中的哪一条"
- 独立撰写 一份可复现的实证分析 do 文件(从
use data/raw/到esttab using ...)
核心理念
"数据是用来验证模型的,而不是用来设定模型的。"
—— Bhattacherjee《社会科学研究》单元 15,qmd 第 1255 行
这句话是整章的灵魂。你在第 8 章已经学会给数据做"体检"(描述统计),本章要做的是:先基于理论把模型设定好,再用数据去验证它。如果你反复换变量、换样本直到 p < 0.05——那叫 p-hacking,是本章诚信检查点 S9.1 的红线。
章内流程图
┌────────────────────────────────────────────────────────────────────────────┐
│ 第 9 章 · 推断统计与实证策略 │
├────────────────────────────────────────────────────────────────────────────┤
│ │
│ §9.0 GLM 世界观 ─── "t检验/ANOVA/回归是一家人" │
│ │ │
│ ▼ │
│ §9.1 OLS 基准回归 ─── 六步法第 1-2 步 / 假设诊断 │
│ │ │
│ ▼ │
│ §9.2 面板数据 FE·RE ─── xtset / reghdfe / Hausman │
│ │ │
│ ▼ │
│ ┌────┴─────────────────────┐ │
│ │ 三大识别策略(§9.3-§9.5)│ │
│ │ IV ─ DID ─ PSM/RDD │ │
│ └────┬─────────────────────┘ │
│ │ │
│ ▼ │
│ §9.6 稳健性与异质性 ─── 规格曲线(S9.1 自证) │
│ │ │
│ ▼ │
│ §9.7 中介效应与机制 ─── Baron-Kenny / Sobel / Bootstrap │
│ │ │
│ ▼ │
│ §9.8 ABM 仿真实验(选修)─── 超越回归的反事实推演 │
│ │
└────────────────────────────────────────────────────────────────────────────┘节结构
| 节 | 标题 | 教材对标 | 核心方法 |
|---|---|---|---|
| 9.0 | GLM 统摄视角 | 单元 15 | t 检验/ANOVA/回归同属 GLM;双组比较;2×2 因子设计 |
| 9.1 | OLS 基准回归 | 单元 15 | reg / vce(robust) / vif / estat hettest / estat ovtest |
| 9.2 | 面板数据:FE 与 RE | — | xtset / reghdfe / hausman / BP-LM |
| 9.3 | 工具变量法(IV/2SLS) | — | ivregress 2sls / estat firststage / 排他性 |
| 9.4 | 双重差分法(DID) | 单元 15 因子设计 | did_multiplegt / eventstudyinteract / 平行趋势 |
| 9.5 | PSM 与 RDD | — | psmatch2 / teffects psmatch / rdrobust |
| 9.6 | 稳健性与异质性 | — | 替换变量 / 子样本 / 规格曲线 |
| 9.7 | 中介效应与机制检验 | — | sgmediation(Sobel + Bootstrap) |
| 9.8 | ABM 仿真实验(选修) | — | ODD 协议 / 四川水稻保险 ABM |
| 合计 |
💡 本章在全书的位置
- 承接第 8 章:第 8 章教你"数据体检做扎实,回归才跑得放心"——描述统计、缺失值处理、缩尾、变量转换。本章直接在这些"干净数据"上建模。
- 回指第 4 章:每个识别策略(IV / DID / PSM / RDD / FE)都对应解决第 4 章七大效度威胁中的一条或多条。写论文时,你必须说清楚"我用 DID 是因为要解决选择偏差+历史效应"。
- 对比第 10 章:本章走的是"回归路线"(What 型问题:X 对 Y 有没有因果效应?有多大?);第 10 章走的是"案例路线"(How 型问题:这个过程是怎样发生的?)。两条路线在第 4 章 §4.5"研究策略三分选型"已做铺垫。
- 主例数据集:
bank_panel.dta(100 家上市银行 × 5 年面板),变量包括roe(因变量)、size、leverage、governance、board_size、bank_id、year。三方向副例:【金】资本结构决定因素 /【险】农业保险需求决定因素 /【农】微型金融贷款可得性。
§9.0 GLM 统摄视角
核心理念:t 检验、方差分析、回归——你以为它们是三种方法,其实它们是同一棵树上的三根枝。
对标教材:单元 15"一般线性模型"(qmd 第 1241–1255 行)+ "双组比较"(第 1257–1279 行)+ "因子设计"(第 1281–1287 行)
9.0.1 GLM 家族:t 检验 / ANOVA / 回归同源
教材告诉我们:
"社会科学研究中的大部分推断统计程序都来源于一组统计模型,叫做一般线性模型(general linear model,GLM)。"(qmd 第 1243 行)
GLM 的一般形式为:
其中
教材第 1254 行进一步阐明了 GLM 的统摄性:
| 预测变量类型 | 对应方法 | 等价说法 |
|---|---|---|
| 一个虚拟变量(比较两组) | 方差分析(ANOVA) = t 检验 | reg y i.group 中 group 系数的 t 检验 |
| 虚拟变量 + 协变量 | 协方差分析(ANCOVA) | 加了控制变量的 ANOVA |
| 多个连续预测变量 | 多元回归 | 你熟悉的 OLS |
| 多个结果变量 | 多变量回归 / MANOVA | 方程组 |
| 一个方程的因变量是另一个方程的自变量 | 结构方程模型(SEM) | 路径分析 |
一句话总结:GLM 是一个"超级框架",t 检验和 ANOVA 只是它在特定变量类型下的"别名"。
9.0.2 双组比较 = 最简单的回归
教材在"双组比较"一节中给出了关键等式(qmd 第 1278 行):
"效应规模或者 β₁ 就是实验组和对照组均值的差异 Δy = y₁ − y₂"
这意味着什么?当你的预测变量是一个 0/1 虚拟变量时:
- t 检验问的是:两组均值差是否显著(p 值)?
- 回归
reg y i.group给出的是:β₁ = 均值差(效应规模)+ p 值(显著性)+ 置信区间
它们是完全等价的——回归系数 β₁ 恰好等于 t 检验中两组均值之差,回归输出的 t 统计量恰好等于独立样本 t 检验的 t 值。
这个认识的实际价值在于:当你以后做 DID(§9.4)时,"处理组前后差 − 对照组前后差"本质上就是一个交互项的回归系数——它的底层逻辑和双组比较的 t 检验完全一致。
9.0.3 2×2 因子设计与交互项
教材"因子设计"一节(qmd 第 1283–1285 行)给出了双因素 GLM:
其中:
、 是两个因子(均为虚拟变量) 、 是主效应(每个因子的独立效应) 是交互效应(两个因子的联合效应)
教材特别强调(qmd 第 1285 行):
"如果 β₃ 是显著的,那么意味着课程类型对学生表现的影响有赖于教学时间。我们就不能显著地解读出课程类型(β₁)或者教学时间(β₂)的独立效应,因为这两个效应不能被区分开来。只有当交互效应不显著的时候,主效应才能被解读出来。"
这对 DID 意味着什么? §9.4 中 DID 的核心回归方程是:
这里的 β₃ 就是 2×2 因子设计的交互项——DID 估计量。而 β₁(处理组主效应)和 β₂(时间主效应)在 β₃ 显著时不应单独解读。这正是教材因子设计原理在因果推断中的直接应用。
9.0.4 模型设定的理论优先原则
教材在 GLM 一节末尾掷地有声地说(qmd 第 1255 行):
"模型设定应该基于对所研究的现象的理论思考,而不是什么模型能够最好地拟合观测数据。数据是用来验证模型的,而不是用来设定模型的。"
这句话直接对应本章诚信检查点 S9.1 不 p-hacking:
| 理论优先(正确做法) | 数据驱动(红线行为) |
|---|---|
| 先根据文献和理论确定因变量、核心自变量、控制变量 | 先把所有变量扔进去,看哪个显著留哪个 |
| 先确定样本范围(如"沪深 A 股上市银行 2019–2023") | 事后剔除"异常值"直到结果显著 |
| 先确定一个主模型,再做稳健性检验 | 跑了 20 个设定只报告显著的那一个 |
| 用规格曲线展示所有合理设定下的结果分布 | 隐瞒不显著的设定 |
操作建议:在动手跑回归之前,先在 do 文件开头用注释写清楚你的理论模型:
* ══════════════════════════════════════════════════════════
* 理论模型(写代码前先确定,不得事后修改)
* ══════════════════════════════════════════════════════════
* 假说 H1:公司治理水平(governance)正向影响银行 ROE
* 因变量:roe
* 核心自变量:governance
* 控制变量:size(规模)、leverage(杠杆)、board_size(董事会规模)
* 理论依据:代理理论(Jensen & Meckling, 1976)
* 样本范围:沪深 A 股上市银行 2019-2023(100家×5年=500 obs)
* 识别策略:OLS 基准 + FE 稳健性(解决不随时间变的遗漏变量)
* ══════════════════════════════════════════════════════════9.0.5 Stata 演示:t 检验 / ANOVA / 回归的等价性
下面用主例数据 bank_panel.dta 演示三种命令如何得到相同的结论:
* ── 加载数据 ──
use data/clean/bank_panel.dta, clear
* 生成一个二值分组变量:governance 高于中位数为"高治理组"
qui sum governance, detail
gen hi_gov = (governance > r(p50))
label var hi_gov "高治理组(1) vs 低治理组(0)"
* ══════════════════════════════════════════════════════════
* 方法一:独立样本 t 检验
* ══════════════════════════════════════════════════════════
ttest roe, by(hi_gov)
* 输出解读:
* mean(hi_gov=1) - mean(hi_gov=0) = 均值差 = β₁
* t 统计量和 p 值判断是否显著
* 95% 置信区间 = 均值差的区间估计
* ══════════════════════════════════════════════════════════
* 方法二:单因素方差分析(ANOVA)
* ══════════════════════════════════════════════════════════
anova roe i.hi_gov
* 输出解读:
* F 统计量 = t² (两组时 ANOVA 的 F 恰好等于 t 检验的 t 的平方)
* p 值与 t 检验完全一致
* ══════════════════════════════════════════════════════════
* 方法三:OLS 回归(与 t 检验等价)
* ══════════════════════════════════════════════════════════
reg roe i.hi_gov
* 输出解读:
* 1.hi_gov 的系数 = 两组均值差(与 ttest 的 diff 完全相同)
* t 统计量 = ttest 的 t 值
* p 值 = ttest 的 p 值
* R² = 组间方差 / 总方差(效应规模的另一种度量)
* ══════════════════════════════════════════════════════════
* 进阶:2×2 因子设计(等价于 DID 的结构)
* ══════════════════════════════════════════════════════════
* 假设我们还有"是否实施新监管政策"的变量 policy
gen post = (year >= 2021)
label var post "政策实施后(1) vs 实施前(0)"
* 双因素回归 = 2×2 因子设计的 GLM
reg roe i.hi_gov##i.post
* 输出解读:
* 1.hi_gov → β₁ 主效应(治理水平的独立影响)
* 1.post → β₂ 主效应(时间趋势)
* 1.hi_gov#1.post → β₃ 交互效应(= DID 估计量!)
* 如果 β₃ 显著 → 不能单独解读 β₁ 和 β₂
* 这正是教材 qmd 第 1285 行的原则在因果推断中的应用等价性验证清单:
| 比较维度 | ttest | anova | reg y i.group |
|---|---|---|---|
| 效应规模 | 均值差 diff | — | β₁ 系数 |
| 检验统计量 | t | F = t² | t |
| p 值 | ✓(相同) | ✓(相同) | ✓(相同) |
| 置信区间 | ✓ | — | ✓ |
| 可扩展性 | 只能两组 | 可多组 | 可加控制变量/交互项 |
结论:当你学会了 reg,你其实已经掌握了 t 检验和 ANOVA。GLM 框架让你用一套命令应对从简单比较到复杂因果推断的所有场景。
9.0.6 三方向副例中的 GLM 思维
| 方向 | 研究问题 | GLM 设定 | 交互项含义 |
|---|---|---|---|
| 【金】资本结构 | 公司治理是否影响杠杆率? | reg leverage i.hi_gov size roe | 治理×规模:大公司的治理效应是否不同? |
| 【险】农保需求 | 风险厌恶是否影响投保决策? | logit insure i.risk_averse income age | 风险厌恶×收入:高收入农户的风险厌恶效应更强? |
| 【农】微型金融 | 联保机制是否提高还款率? | reg repay i.group_loan##i.rural | 联保×农村:联保在农村地区效果更突出? |
📌 记住:无论你的方向是金融、保险还是农村经济,底层的统计逻辑都是 GLM。差异只在于因变量类型(连续 → OLS;二值 → Logit/Probit)、数据结构(截面/面板/时间序列)和识别策略(§9.1–§9.5)。
方法选型决策树(速查)
在进入 §9.1 之前,先花 5 分钟理解这棵决策树。它是本章所有章节的"导航地图"——每学完一个识别策略,回来看看它在树中的位置,你的方法论框架就会越来越清晰。
决策树原文
你的研究问题是因果推断吗?
├── 否 → 描述统计/相关分析(第 8 章)
└── 是 → 你有随机分组(实验)吗?
├── 是 → 真实验分析(t检验/ANOVA → §9.0 GLM)
└── 否 → 观测数据(非实验/事后追溯)
├── 有外生冲击/政策变化?
│ ├── 是 + 冲击前后两期 → DID(§9.4)
│ └── 是 + 连续处理变量 → RDD(§9.5)
├── 有合适的工具变量?
│ ├── 是 → IV/2SLS(§9.3)
│ └── 否 → 有匹配对照组?
│ ├── 是 → PSM(§9.5)
│ └── 否 → 面板数据?
│ ├── 是 → FE/RE(§9.2)
│ └── 否 → OLS + 充分控制变量(§9.1)
└── 以上均不满足 → 诚实地说"相关但无法确定因果"如何使用这棵决策树
决策树的使用分三步:
第一步:确认你的研究问题类型。 如果你问的是"X 和 Y 有没有关系"(相关),第 8 章描述统计就够了。如果你问的是"X 是否导致了 Y"(因果),才需要往下走。
第二步:盘点你手里的"识别资源"。 依次检查:有没有外生政策冲击?有没有可用的工具变量?有没有可匹配的对照组?数据是面板还是截面?——你在第 5 章下载数据、第 6 章设计问卷时,就应该开始思考这些问题。
第三步:选择最"干净"的策略。 优先选择识别假设最少的策略(DID 需要平行趋势;IV 需要排他性;PSM 需要可观测对照;FE 只需要"遗漏变量不随时间变")。如果一个策略的假设在你的场景中不成立,退而求其次选下一个——但必须在论文中诚实讨论局限。
三层结构说明
┌──────────────────────────────────────────────────────┐
│ 第一层:数据结构决定方法边界 │
│ │
│ 截面数据 ─→ OLS / PSM / RDD / IV │
│ 面板数据 ─→ FE / RE / DID / IV │
│ 时间序列 ─→ ARIMA / VAR(本手册不展开,见附录 B) │
│ │
├──────────────────────────────────────────────────────┤
│ 第二层:有内生性疑虑吗? │
│ │
│ 有 ─→ 需要识别策略:IV / DID / PSM / RDD │
│ 无 ─→ OLS 或 FE 已经足够 │
│ │
│ ⚠️ 判断"有无内生性"的依据: │
│ · 遗漏变量(理论上有重要因素未观测到) │
│ · 反向因果(Y 也可能影响 X) │
│ · 测量误差(X 的度量不准确) │
│ │
├──────────────────────────────────────────────────────┤
│ 第三层:要解释机制吗? │
│ │
│ 要 ─→ 中介效应分析(§9.7) │
│ 不要 ─→ 做好稳健性检验即可(§9.6) │
│ │
│ 💡 机制分析的前提:主效应已经显著且稳健 │
└──────────────────────────────────────────────────────┘每个识别策略对应解决的效度威胁(回指第 4 章):
识别策略 解决的效度威胁 对应教材原理 FE(固定效应) 不随时间变的遗漏变量 组内变异消除个体异质性 IV(工具变量) 遗漏变量偏误 / 反向因果 外生变异通过工具传导 DID + 平行趋势 历史效应 + 选择偏差 2×2 因子设计的交互项(qmd 1284) PSM 选择偏差(可观测部分) 构造"伪随机"对照组 RDD 自选择的断点 断点附近的局部随机化 写论文时,你必须在"研究设计"或"识别策略"段落中明确说出:"本文采用 XX 方法,以解决 XX 效度威胁"——这是答辩和审稿时评委必问的问题。
§9.1 OLS 基准回归(上):假设与诊断
核心理念:OLS 不只是一个命令,它是一套"契约"——你假设数据满足五个条件,Stata 才能保证系数无偏且有效。先诊断,后信任。
9.1.1 OLS 五大经典假设(Gauss-Markov 条件)
在第 1 章你已经跑通了 reg roe size leverage governance board_size,但当时我们只关心"流程能走通"。现在正式问一个问题:凭什么相信这组系数?
答案是:凭五个假设全部成立。
| 编号 | 假设名称 | 数学表达 | 直觉含义 | 违反后果 |
|---|---|---|---|---|
| A1 | 线性于参数 | (y = \beta_0 + \beta_1 x_1 + \cdots + \beta_k x_k + \varepsilon) | 模型对 β 是线性的(x 可以非线性变换) | 系数含义错误 |
| A2 | 随机抽样 | 样本从总体中 i.i.d. 抽取 | 每个观测相互独立、来自同一分布 | 标准误失效、推断不可靠 |
| A3 | 无完全多重共线性 | 解释变量之间不存在精确线性关系 | 不能有某个 x 是其他 x 的完美线性组合 | Stata 自动 drop 变量 |
| A4 | 零条件均值 | (E(\varepsilon \mid x_1, \ldots, x_k) = 0) | 误差项与解释变量不相关(无内生性) | 系数有偏且不一致(最严重) |
| A5 | 同方差 | (\text{Var}(\varepsilon \mid x) = \sigma^2)(常数) | 不管 x 取什么值,扰动项的波动幅度相同 | 系数仍无偏,但标准误有偏 → 推断失效 |
💡 教材对接:单元 15 在讲 GLM 时强调——"数据是用来验证模型的,而不是用来设定模型的"。五大假设是你"设定模型"时的理论承诺;诊断检验是你"验证承诺"的数据面证据。
A4 为什么最严重?因为一旦 (E(\varepsilon|x) \neq 0)(遗漏变量、反向因果、测量误差),OLS 系数不仅这次错,样本再大也救不回来——这就是"不一致"的含义。第 9.3 节 IV 和第 9.2 节 FE 正是针对 A4 违反的两把手术刀。
9.1.2 异方差诊断
异方差(Heteroskedasticity)= A5 被违反。直觉上,大银行的 ROE 波动可能比小银行大——这就造成了"不同 x 值对应不同方差"。
* ── 异方差诊断 ──
* 前提:刚跑完 reg(诊断命令必须在 reg 之后立即使用)
use "data/clean/bank_panel.dta", clear
reg roe size leverage governance board_size
* 方法 1:Breusch-Pagan 检验(BP 检验)
* 原假设 H0:同方差(残差方差与解释变量无关)
estat hettest
* 输出解读:
* chi2(4) = XX.XX, Prob > chi2 = 0.XXXX
* 判读规则:p < 0.05 → 拒绝同方差原假设 → 存在异方差 → 需用稳健标准误
* 方法 2:White 检验(更一般,允许残差平方与 x 的非线性函数相关)
estat imtest, white
* 输出解读:
* H0: Homoskedasticity vs. H1: Unrestricted heteroskedasticity
* LM-stat = XX.XX, p-value = 0.XXXX
* 判读规则:p < 0.05 → 存在异方差
* ── 如果确认存在异方差,修正方案 ──
reg roe size leverage governance board_size, vce(robust)
* vce(robust) = Huber-White 稳健标准误
* 系数不变,标准误修正 → t 值和 p 值可能变化判断标准:
| 检验结果 | 结论 | 下一步 |
|---|---|---|
| BP 和 White 均 p > 0.10 | 未发现异方差证据 | 报告经典标准误即可 |
| 任一 p < 0.05 | 存在异方差 | 必须用 vce(robust) 重跑(详见 §9.1 下半) |
| 0.05 < p < 0.10 | 边界情况 | 建议保守处理:用稳健标准误并在脚注说明 |
9.1.3 多重共线性诊断
多重共线性 = 解释变量之间高度相关(如 size 和 leverage 在大银行中往往同方向变化)。它不导致系数有偏,但让标准误膨胀 → 显著性下降 → "明明该显著的变量变得不显著"。
* ── 多重共线性诊断 ──
* 必须在 reg 之后使用
estat vif
* 输出解读:
* Variable | VIF 1/VIF
* ---------+----------------------
* size | X.XX 0.XXXX
* leverage | X.XX 0.XXXX
* ...
* Mean VIF | X.XX
*
* 判读规则(经验法则):
* VIF > 10 → 该变量存在严重共线性,需警惕
* VIF > 5 → 中度共线性,关注但不必恐慌
* VIF < 5 → 安全
* Mean VIF > 3 → 模型整体共线性偏高
* ── 简单相关矩阵辅助判断 ──
correlate size leverage governance board_size
* 任何两个变量 |r| > 0.8 时,对应的 VIF 通常会 > 5处理策略(按优先级排列):
- 不处理:如果核心变量系数方向和显著性未变,共线性只是让"锦上添花"的控制变量不显著——如实报告即可
- 减少冗余变量:去掉 VIF 最高且理论上最不必要的变量
- 合并变量:如多个指标衡量同一构念,用因子得分或均值合成(回指第 5 章 §5.4)
- 增大样本:共线性是"信息不足"的表现,更多数据有助于区分
9.1.4 模型设定误差(RESET 检验)
RESET 检验(Regression Equation Specification Error Test)回答一个根本问题:你的线性模型设定对吗?是否遗漏了重要的非线性项或交互项?
* ── RESET 检验(Ramsey 1969)──
estat ovtest
* 原假设 H0:模型设定正确(无遗漏的高次项)
* 备择 H1:模型存在设定误差
*
* 输出解读:
* F(3, 495) = X.XX
* Prob > F = 0.XXXX
* 判读规则:p < 0.05 → 拒绝 H0 → 存在模型设定问题
*
* 原理:在模型中加入 ŷ² 和 ŷ³ 作为额外回归元,
* 检验这些项是否联合显著。如果显著,说明原来的
* 线性设定不够,可能存在遗漏的非线性关系。
* ── 如果 RESET 拒绝,怎么办?──
* 策略 1:加入二次项
gen size_sq = size * size
reg roe size size_sq leverage governance board_size
* 策略 2:加入遗漏的交互项
gen gov_size = governance * size
reg roe size leverage governance board_size gov_size
* 策略 3:对因变量取对数(如果经济含义允许)
gen ln_roe = ln(roe) if roe > 0
reg ln_roe size leverage governance board_size9.1.5 四大诊断的完整工作流
把上面三个诊断整合成一个标准流程——以后每次跑完基准回归都照着走一遍:
* ══════════════════════════════════════════════════════
* §9.1 完整诊断流程模板(基于 bank_panel.dta)
* ══════════════════════════════════════════════════════
use "data/clean/bank_panel.dta", clear
* Step 1:基准回归
reg roe size leverage governance board_size
estimates store m1_baseline
* Step 2:异方差诊断
estat hettest // BP 检验
estat imtest, white // White 检验
* → 记录 p 值,决定是否需要 vce(robust)
* Step 3:多重共线性诊断
estat vif
* → 记录 Mean VIF 和各变量 VIF
* Step 4:模型设定诊断
estat ovtest
* → p < 0.05 则需要考虑加非线性项
* Step 5:根据诊断结果修正
reg roe size leverage governance board_size, vce(robust)
estimates store m1_robust
* Step 6:对照表输出
esttab m1_baseline m1_robust using "output/diagnosis_comparison.rtf", ///
replace b(3) se(3) star(* 0.10 ** 0.05 *** 0.01) ///
title("表:OLS基准回归诊断对照") ///
mtitles("经典标准误" "稳健标准误") ///
stats(N r2, labels("观测数" "R²"))诊断结果速查表:
| 诊断命令 | 检验的假设 | 原假设 H₀ | p < 0.05 意味着 | 修正方案 |
|---|---|---|---|---|
estat hettest | A5 同方差 | 残差方差恒定 | 存在异方差 | vce(robust) |
estat imtest, white | A5 同方差 | 残差方差恒定 | 存在异方差 | vce(robust) |
estat vif | A3 无共线性 | 变量间无线性相关 | VIF > 10 严重共线 | 删变量 / 合并 |
estat ovtest | A1 线性设定 | 模型设定正确 | 遗漏非线性 / 交互项 | 加高次项或交互项 |
⚠️ 诚信提醒(S9.1 前置):诊断结果不好时,正确做法是修正模型或如实报告局限,绝不是"反复换变量组合直到诊断全过"。后者是 p-hacking 的变体。
§9.1 OLS 基准回归(下):六步法第 1-2 步
核心理念:稳健标准误不是"锦上添花",而是发表期刊的最低门槛。掌握六步法全景,才知道自己现在走到了哪一步。
9.1.5 稳健标准误:从"能用"到"能发表"
上一节诊断完异方差后,修正方案就是 vce(robust)。但你还需要知道:面板数据中,同一个银行不同年份的观测值不独立(组内自相关),此时需要更强力的修正——聚类稳健标准误。
* ── 三种标准误对比 ──
use "data/clean/bank_panel.dta", clear
* 方案 A:经典标准误(假设 A5 同方差 + A2 独立)
reg roe size leverage governance board_size
* 输出中标注:(无特殊标注 = 经典标准误)
* 方案 B:异方差稳健标准误(Huber-White,放松 A5)
reg roe size leverage governance board_size, vce(robust)
* 输出中标注:Std. errs. robust to heteroskedasticity
* 方案 C:聚类稳健标准误(放松 A5 + A2 组内相关)
reg roe size leverage governance board_size, vce(cluster bank_id)
* 输出中标注:Std. errs. adjusted for clustering on bank_id
* 含义:允许同一家银行内部的残差相互关联
* 适用场景:面板数据 / 重复截面按地区分组 / 多观测嵌套于个体
* ── 经验法则 ──
* 1. 截面数据 + 不确定是否同方差 → vce(robust) 总是安全的
* 2. 面板数据 → vce(cluster 个体ID) 是最低要求
* 3. 聚类数 G < 50 → 考虑 wild cluster bootstrap(进阶,暂不展开)三种标准误的选择决策:
| 数据结构 | 推荐标准误 | Stata 语法 | 理由 |
|---|---|---|---|
| 截面(每观测独立) | 稳健 | vce(robust) | 防异方差 |
| 面板(同个体多期) | 聚类 | vce(cluster bank_id) | 组内残差自相关 |
| 面板 + 时间冲击相关 | 双向聚类 | reghdfe ..., vce(cluster bank_id year) | 个体+时间双重相关 |
9.1.6 stata-mcp 六步法概览
六步法是本手册实证分析的总纲——从描述到结论,每一步都有明确的 Stata 命令和产出物。第 9 章 §9.1—§9.7 恰好对应这六步:
┌────────────────────────────────────────────────────────────────┐
│ stata-mcp 六步法(实证分析全流程) │
├────────────────────────────────────────────────────────────────┤
│ │
│ Step 1 · 描述统计 │
│ ───────────────── │
│ §8.2 数据体检 + §8.3-8.4 一元/双变量分析 │
│ 命令:summarize / tab / correlate / winsor2 │
│ 产出:Table 1(描述统计表) │
│ ↓ │
│ Step 2 · 基准回归 │
│ ───────────────── │
│ §9.1 OLS + 诊断 + 稳健标准误 ← 你现在在这里 │
│ 命令:reg / vce(robust) / estat hettest / vif / ovtest │
│ 产出:Table 2(基准回归表,含诊断结果脚注) │
│ ↓ │
│ Step 3 · 内生性处理 │
│ ───────────────── │
│ §9.2 面板 FE/RE + §9.3 IV/2SLS + §9.4 DID + §9.5 PSM/RDD │
│ 命令:xtreg / reghdfe / ivregress / did_multiplegt / psmatch2 │
│ 产出:Table 3-5(识别策略结果表) │
│ ↓ │
│ Step 4 · 稳健性检验 │
│ ───────────────── │
│ §9.6 替换变量 + 子样本 + 规格曲线 │
│ 命令:reghdfe(换变量/换样本重跑) │
│ 产出:Table 6(稳健性检验对照表) │
│ ↓ │
│ Step 5 · 机制/中介 │
│ ───────────────── │
│ §9.7 Baron-Kenny + Sobel + Bootstrap │
│ 命令:sgmediation / bootstrap │
│ 产出:Table 7(中介效应三步表)+ 机制图 │
│ ↓ │
│ Step 6 · 异质性分析 │
│ ───────────────── │
│ §9.6 分组回归 + 交乘项 │
│ 命令:bysort + reghdfe / gen interaction + reg │
│ 产出:Table 8(异质性分组表) │
│ │
└────────────────────────────────────────────────────────────────┘💡 AI 辅助提示:使用 stata-mcp 时,你可以把诊断输出贴给 AI 问"这组结果有哪些潜在问题"——这是 S9.4 允许的合法用途(AI 解释输出,不生成系数)。
9.1.7 三方向副例:OLS 基准回归在你方向的变体
主例用的是银行 ROE 面板数据。你的研究方向不同,但六步法的逻辑完全一样——只需替换变量。以下是三个方向的基准回归设定参考:
【金】资本结构决定因素
研究问题:公司特征如何影响资本结构(资产负债率)?三大理论假说的回归检验。
* ── 【金】资本结构基准回归 ──
* 理论假说:
* 权衡理论 → 盈利能力强(roe↑) → 负债率↓(内源融资优先)
* 优序融资 → 盈利能力强(roe↑) → 负债率↓(同方向,但机制不同)
* 市场择时 → 市值账面比(mtb↑) → 负债率↓(股价高时倾向股权融资)
*
* 变量:lev(资产负债率)= β₀ + β₁·size + β₂·roe + β₃·mtb + β₄·tangibility + ε
reg lev size roe mtb tangibility, vce(robust)
estat hettest
estat vif【险】农业保险需求决定因素
研究问题:农户特征如何影响农业保险参与决策?
* ── 【险】农业保险需求(因变量连续:保费支出/保额比)──
* 理论假说:
* 风险厌恶(risk_aversion↑) → 投保意愿↑
* 损失厌恶(loss_aversion↑) → 对保险的需求↑
* 收入(income↑) → 支付能力↑ → 投保↑
*
* 变量:ins_premium = β₀ + β₁·risk_aversion + β₂·loss_aversion + β₃·income + β₄·farm_size + ε
reg ins_premium risk_aversion loss_aversion income farm_size, vce(robust)
estat hettest
estat vif
* 注:如果因变量是 0/1(是否投保),则应改用 logit/probit(教材单元 15 §15.5)【农】微型金融贷款可得性
研究问题:联合责任机制和动态激励如何影响农户贷款可得性?
* ── 【农】微型金融贷款可得性 ──
* 理论假说:
* 联合责任(group_loan=1) → 贷款可得性↑(同伴监督降低违约率)
* 动态激励(repeat_borrower) → 贷款额度↑(声誉效应)
*
* 变量:loan_access = β₀ + β₁·group_loan + β₂·repeat_borrower + β₃·income + β₄·education + ε
reg loan_access group_loan repeat_borrower income education, vce(robust)
estat hettest
estat vif
estat ovtest🖐️ 跟做练习 1
目标:独立跑通"基准回归 + 四大诊断 + 稳健标准误"全流程,并用自己的话写出判读结论。
操作步骤:
- 打开你的研究文件夹,确认
data/clean/bank_panel.dta存在(如不存在,从第 1 章 §1.4 重新生成) - 新建 do 文件
code/ch09_exercise1_ols_diagnosis.do - 依次完成以下六步:
- Step A:
use "data/clean/bank_panel.dta", clear - Step B:
reg roe size leverage governance board_size(基准 OLS) - Step C:
estat hettest+estat imtest, white(异方差诊断)→ 记录 p 值,写出判断 - Step D:
estat vif(共线性诊断)→ 记录 Mean VIF,写出判断 - Step E:
estat ovtest(设定误差诊断)→ 记录 p 值,写出判断 - Step F:
reg roe size leverage governance board_size, vce(robust)(稳健标准误)→ 对比 Step B 和 Step F 的标准误变化
- Step A:
- 在 do 文件末尾用
* 结论:注释写出 3-5 句诊断总结 - 运行 do 文件,保存 log 到
output/ch09_ex1.log
自查清单:
- [ ] 四项诊断的 p 值你都记录了吗?
- [ ] 你能说出"p < 0.05 时应该做什么"吗?
- [ ] 经典标准误与稳健标准误的差别大吗?如果差别大,说明什么?
- [ ] log 文件是否完整(从
use到最后一行命令)?
⚠️ S9.4 提醒:这一步的所有系数、标准误、p 值必须来自你自己的 Stata 运行输出。如果你让 AI "帮我编一组回归结果"——那就是学术造假。AI 的合法用途是帮你写代码、解释输出。
§9.2 面板数据:FE 与 RE
核心理念:面板数据的价值在于——它让你能控制住那些观测不到、但不随时间变化的遗漏变量。这是 OLS 做不到的。固定效应(FE)解决的正是第 4 章七大效度威胁中的"不随时间变的遗漏变量"问题。
9.2.1 什么是面板数据?为什么要用面板?
面板数据(Panel Data)= 同一个体在多个时间点被重复观测。本手册主例 bank_panel.dta 就是 100 家银行 × 5 年(2020—2024)= 500 条观测的面板。
* ── 声明面板数据结构 ──
use "data/clean/bank_panel.dta", clear
xtset bank_id year
* 输出解读:
* panel variable: bank_id (strongly balanced)
* time variable: year
* series: 2020 2021 2022 2023 2024
* delta: 1 unit
*
* "strongly balanced" = 每个银行都有完整 5 年数据(无缺失期)
* 如果出现 "weakly balanced" = 某些个体在某些年份缺失
* 确认数据结构
xtdescribe
* 展示面板的个体数、时间跨度、是否平衡为什么面板比纯截面好?
| 数据类型 | 能控制的遗漏变量 | 不能控制的遗漏变量 |
|---|---|---|
| 截面(cross-section) | 可观测变量(放入回归) | 所有不可观测变量 |
| 面板 + FE | 可观测变量 + 不随时间变的不可观测变量 | 随时间变化的不可观测变量 |
| 面板 + FE + 时间效应 | 上述 + 不随个体变的时间冲击 | 既随时间又随个体变的遗漏 |
💡 与第 4 章的对接:第 4 章列出内部效度七大威胁——历史 / 成熟 / 测验效应 / 仪器变化 / 统计回归 / 选择偏差 / 样本流失。FE 主要解决的是**选择偏差中"不随时间变的遗漏变量"**这一子类(例如:银行的企业文化、所在地区的金融生态——你观测不到它们,但它们 5 年内基本不变)。
9.2.2 组内估计(Within/FE)vs GLS 随机效应(RE)
固定效应(FE)的核心思路:对每个变量减去其个体均值(去均值化),从而消灭所有不随时间变化的个体特征——无论你是否观测到它们。
随机效应(RE)的核心思路:假设个体效应 (u_i) 与解释变量不相关((E(u_i|x_{it}) = 0)),用 GLS 加权平均组内和组间信息,比 FE 更高效(标准误更小)。
| 维度 | FE(固定效应) | RE(随机效应) |
|---|---|---|
| 关键假设 | 个体效应与解释变量可以相关 | 个体效应与解释变量不相关 |
| 估计方法 | 组内去均值后 OLS | GLS(利用组内+组间信息) |
| 效率 | 较低(只用组内变异) | 较高(信息利用更充分) |
| 一致性 | 假设更弱,几乎总是一致 | 假设强,若违反则不一致 |
| 能估计不随时间变的变量吗? | ❌ 不能(被去均值消除了) | ✅ 能 |
| 适用场景 | 不确定个体效应是否与 x 相关时 | 有理论依据支持个体效应与 x 无关时 |
* ── FE 与 RE 估计(沿用第 1 章 bank_roe 三模型)──
xtset bank_id year
* 模型 2:固定效应(FE)
xtreg roe size leverage governance board_size, fe
estimates store m2_fe
* 输出关键指标:
* R-sq: within = 0.XXX ← 组内解释力(FE 的核心指标)
* F test that all u_i=0: F(99, 396) = XX.XX, Prob > F = 0.0000
* → p < 0.05 说明个体效应整体显著,FE 比混合 OLS 合适
* 模型 3:随机效应(RE)
xtreg roe size leverage governance board_size, re
estimates store m3_re
* 输出关键指标:
* corr(u_i, X) = 0 ← RE 假设该值为 0
* sigma_u / sigma_e 比例 ← 个体效应占总方差的比例9.2.3 Hausman 检验:FE 还是 RE?
Hausman 检验是FE vs RE 的裁判——它检验的核心问题是:个体效应 (u_i) 是否与解释变量相关?
* ── Hausman 检验 ──
hausman m2_fe m3_re
* 原假设 H0:FE 和 RE 的系数差异不系统(即个体效应与 x 不相关 → RE 一致且高效)
* 备择 H1:差异系统(个体效应与 x 相关 → RE 不一致 → 必须用 FE)
*
* 输出解读:
* chi2(4) = (b-B)'[(V_b-V_B)^(-1)](b-B) = XX.XX
* Prob > chi2 = 0.XXXX
*
* 判读规则:
* p < 0.05 → 拒绝 H0 → 选 FE(个体效应与解释变量相关,RE 有偏)
* p > 0.05 → 不拒绝 H0 → 选 RE(更高效且无偏)
* p ≈ 0.05(边界)→ 保守起见选 FE
* ── Hausman 检验的注意事项 ──
* 1. 必须先 estimates store 两个模型的结果
* 2. 如果 Hausman 报 "not positive definite" → 通常意味着 RE 有问题,直接选 FE
* 3. Hausman 检验的前提是 FE 本身一致——如果 FE 也不一致(如存在时变遗漏变量),
* Hausman 结果无意义 → 需要 IV/DID 等更强识别策略(§9.3-§9.4)Hausman 检验决策表:
| Hausman p 值 | 结论 | 选择 | 理由 |
|---|---|---|---|
| p < 0.01 | 强烈拒绝 H₀ | FE | 个体效应与 x 高度相关 |
| 0.01 ≤ p < 0.05 | 拒绝 H₀ | FE | 存在相关性,RE 不一致 |
| 0.05 ≤ p < 0.10 | 边界 | FE(保守) | 宁可牺牲效率也要一致性 |
| p ≥ 0.10 | 不拒绝 H₀ | RE | 未发现相关性证据,RE 更高效 |
9.2.4 BP-LM 检验:RE 还是混合 OLS?
Hausman 回答了"FE vs RE"。但还有一个前置问题:RE 比不用面板信息(混合 OLS)更好吗? Breusch-Pagan Lagrange Multiplier 检验回答这个问题。
* ── BP-LM 检验(需要先安装 xttest0)──
* ssc install xttest0 // 首次使用需安装
* 先跑 RE 模型
xtreg roe size leverage governance board_size, re
* BP-LM 检验
xttest0
* 原假设 H0:σ²_u = 0(无个体效应 → 混合 OLS 即可)
* 备择 H1:σ²_u > 0(存在个体效应 → RE 或 FE 优于混合 OLS)
*
* 输出解读:
* Breusch and Pagan Lagrangian Multiplier Test for random effects
* chibar2(01) = XX.XX
* Prob > chibar2 = 0.XXXX
*
* 判读规则:
* p < 0.05 → 存在显著个体效应 → RE/FE 优于混合 OLS
* p > 0.05 → 个体效应不显著 → 混合 OLS 足够完整的面板模型选择流程:
Step 1: 混合 OLS vs RE → BP-LM 检验(xttest0)
├── p > 0.05 → 用混合 OLS(无面板效应)
└── p < 0.05 → 进入 Step 2
Step 2: FE vs RE → Hausman 检验
├── p < 0.05 → 用 FE
└── p > 0.05 → 用 RE9.2.5 reghdfe:高维固定效应的高效实现
当面板数据量大(如 100 家银行 × 5 年 = 500 obs 还好,但 3000 家企业 × 10 年 = 30000 obs)时,传统 xtreg, fe 计算速度慢。reghdfe 是社区开发的高效替代,还能同时吸收多维固定效应。
* ── reghdfe 高维固定效应 ──
* ssc install reghdfe // 首次使用需安装
* ssc install ftools // reghdfe 依赖 ftools
* 基本用法(等价于 xtreg, fe 但更快)
reghdfe roe size leverage governance board_size, absorb(bank_id) vce(cluster bank_id)
* absorb(bank_id) = 吸收银行个体固定效应
* vce(cluster bank_id) = 聚类稳健标准误
* reghdfe vs xtreg 结果对比(应该完全一致)
xtreg roe size leverage governance board_size, fe vce(cluster bank_id)
* → 对比系数和标准误,验证两种实现等价
* reghdfe 的优势:
* 1. 速度:大样本比 xtreg 快 10-100 倍
* 2. 多维 FE:可同时吸收多个固定效应维度
* 3. 灵活:支持 partial out 后的 F 检验9.2.6 双向固定效应(个体 + 时间)
现实中,不仅银行之间有不同的"先天条件"(个体效应),不同年份也有共同的宏观冲击(时间效应,如 2020 年疫情、2023 年利率下调)。双向固定效应同时控制两者。
* ── 双向固定效应 ──
* 方法 1:reghdfe 直接吸收(推荐,最简洁)
reghdfe roe size leverage governance board_size, ///
absorb(bank_id year) vce(cluster bank_id)
estimates store m4_twoway
* absorb(bank_id year) = 同时吸收个体FE和时间FE
* 含义:每家银行有自己的截距,每年也有自己的截距
* → 消除了"不随时间变的个体特征" + "不随个体变的时间冲击"
* 方法 2:xtreg + 年份虚拟变量(等价但写法不同)
tab year, gen(yr_d)
xtreg roe size leverage governance board_size yr_d2-yr_d5, fe vce(cluster bank_id)
* yr_d2-yr_d5 = 2021-2024年的虚拟变量(以2020为基准年)
* ── 双向FE vs 单向FE 的 F 检验 ──
* 问题:时间效应是否必要?
* reghdfe 自动报告 "Absorbed degrees of freedom" 和各维度的 F 检验
* 如果时间维度的 F 检验 p < 0.05 → 时间效应显著 → 双向FE合理
* ── 三模型 + 双向FE 完整对照表 ──
esttab m1_ols m2_fe m3_re m4_twoway using "output/panel_model_comparison.rtf", ///
replace b(3) se(3) star(* 0.10 ** 0.05 *** 0.01) ///
title("表:银行ROE影响因素——四种模型对照") ///
mtitles("混合OLS" "FE" "RE" "双向FE") ///
stats(N r2 r2_w, labels("观测数" "R²" "Within R²")) ///
note("标准误聚类于银行层面;* p<0.10, ** p<0.05, *** p<0.01")与第 4 章效度威胁的完整对接:
| 模型 | 控制的效度威胁(第 4 章) | 不能控制的 |
|---|---|---|
| 混合 OLS | 仅可观测变量 | 所有不可观测因素 |
| FE(个体) | 不随时间变的遗漏变量(如银行文化、地域特征) | 随时间变化的遗漏(如管理能力变动) |
| 双向 FE(个体+时间) | 上述 + 不随个体变的时间冲击(如宏观政策) | 既随时间又随个体变的遗漏(如银行特定的行业趋势) |
| IV(§9.3) | 遗漏变量 + 反向因果 | 依赖工具变量的有效性 |
| DID(§9.4) | 历史效应 + 选择偏差 | 依赖平行趋势假设 |
9.2.7 面板分析完整工作流(模板)
* ══════════════════════════════════════════════════════
* §9.2 面板分析完整流程模板
* ══════════════════════════════════════════════════════
clear all
set more off
capture log close
log using "output/ch09_panel_analysis.log", replace
use "data/clean/bank_panel.dta", clear
* Step 1:声明面板结构
xtset bank_id year
xtdescribe
* Step 2:混合 OLS(基准)
reg roe size leverage governance board_size, vce(cluster bank_id)
estimates store m1_ols
* Step 3:BP-LM 检验(RE vs 混合 OLS)
xtreg roe size leverage governance board_size, re
xttest0
* → p < 0.05? 如果是,面板方法优于混合 OLS
* Step 4:FE 估计
xtreg roe size leverage governance board_size, fe
estimates store m2_fe
* Step 5:RE 估计
xtreg roe size leverage governance board_size, re
estimates store m3_re
* Step 6:Hausman 检验(FE vs RE)
hausman m2_fe m3_re
* → p < 0.05? 如果是,选 FE
* Step 7:双向固定效应
reghdfe roe size leverage governance board_size, ///
absorb(bank_id year) vce(cluster bank_id)
estimates store m4_twoway
* Step 8:输出对照表
esttab m1_ols m2_fe m3_re m4_twoway using "output/panel_four_models.rtf", ///
replace b(3) se(3) star(* 0.10 ** 0.05 *** 0.01) ///
title("银行ROE影响因素:面板模型对照") ///
mtitles("混合OLS" "FE" "RE" "双向FE") ///
stats(N r2 r2_w, labels("观测数" "R²" "Within R²"))
log close
display "=== 面板分析完成 ==="🖐️ 跟做练习 2
目标:独立完成面板模型选择全流程(BP-LM → Hausman → 双向 FE),并写出模型选择的判断依据。
操作步骤:
- 新建 do 文件
code/ch09_exercise2_panel.do - 按 §9.2.7 模板完成 Step 1—Step 8
- 在代码中用注释记录以下判断:
- BP-LM 的 p 值是多少?→ 结论是什么?
- Hausman 的 p 值是多少?→ 选 FE 还是 RE?
- 双向 FE 与单向 FE 的系数变化大吗?→ 时间效应是否重要?
- 运行 do 文件,确认
output/panel_four_models.rtf已生成 - 打开 RTF 文件,检查四列系数是否合理(方向一致、量级相近)
进阶挑战(选做):
- 把主例换成你自己的数据(如第 6 章下载的宏观面板),重复整个流程
- 思考:如果你的 Hausman 检验 p = 0.03(刚好 < 0.05),你会怎么选?为什么?
自查清单:
- [ ]
xtset输出的 "strongly balanced" 还是 "weakly balanced"?你知道差别吗? - [ ] FE 的 Within R² 通常比混合 OLS 的 R² 低——这是正常的吗?为什么?
- [ ] 你的 Hausman 检验结论与第 1 章 §1.4 跑的结果一致吗?
- [ ] 双向 FE 中
absorb(bank_id year)吸收了 100 + 5 - 1 = 104 个参数——这对自由度有什么影响?
⚠️ S9.4 提醒:面板分析的所有系数、Hausman 统计量、BP-LM 值必须来自你自己的 Stata 运行。AI 可以帮你理解"为什么选 FE",但不能替你"编一个 Hausman p 值"。
§9.3 工具变量法(IV/2SLS)
核心理念:当解释变量与误差项相关(内生性)时,OLS 估计有偏且不一致。工具变量法的核心思想是——找到一个"外生推手",它只通过影响内生变量来间接影响结果变量,从而把内生变量中"干净"的部分分离出来。
9.3.1 内生性的三大来源
在 §9.1 的 OLS 五大经典假设中,我们要求 E(ε|X) = 0——即解释变量与误差项不相关。当这个假设被违反时,就出现了内生性(endogeneity)。三大来源:
| 来源 | 机制 | 金融例子 | 后果 |
|---|---|---|---|
| 遗漏变量偏误 | 同时影响 X 和 Y 的变量未被纳入模型 | 银行管理层能力同时影响治理水平(governance)和盈利能力(roe),但"能力"无法观测 | β̂ 有偏且不一致 |
| 反向因果 | Y 反过来影响 X | 盈利好的银行有更多资源改善治理 → 治理好;但治理好也促进盈利 → 双向因果 | β̂ 有偏且不一致 |
| 测量误差 | X 的度量包含噪声 | 问卷自评"金融素养"得分有系统性偏差 | β̂ 衰减偏误(attenuation bias) |
📌 判断内生性的经验法则:如果你的核心解释变量是"行为"(如投保、贷款、参加培训)或"制度特征"(如治理水平、股权结构),几乎一定有内生性——因为选择和行为本身就是非随机的。
9.3.2 有效工具变量的两大条件
一个合格的工具变量 Z 必须同时满足:
条件 1:相关性(Relevance)
Z 与内生变量 X 显著相关
→ 可检验:第一阶段 F 统计量 > 10(Stock & Yogo, 2005)
条件 2:排他性约束(Exclusion Restriction)
Z 只通过 X 影响 Y,不能有直接影响 Y 的其他路径
→ 不可检验!只能靠经济理论和制度逻辑论证图形化理解:
Z(工具变量)
│
│ ① Z → X(相关性:可检验)
▼
X(内生变量)──────→ Y(结果变量)
▲ ▲
│ │
└─── U ─────────┘ ② 遗漏变量 U 同时影响 X 和 Y(内生性来源)
排他性约束:Z 到 Y 没有除了经过 X 之外的箭头(即 Z ⊥ U)9.3.3 两阶段最小二乘法(2SLS)的 Stata 实现
主例:研究公司治理(governance)对银行盈利能力(roe)的影响。我们担心 governance 是内生的(遗漏变量 + 反向因果),使用同行业其他银行的平均治理水平(industry_avg_governance)作为工具变量。
IV 的逻辑:同行业其他银行的平均治理水平与本研究银行的治理水平相关(行业示范效应、监管标准趋同),但不会直接影响本银行的 ROE(排他性约束:其他银行的治理水平只通过"行业规范压力"影响本行治理,而不直接影响本行利润)。
* ── §9.3 IV/2SLS 完整流程 ──
* 数据:bank_panel.dta(100家上市银行×5年面板)
use data/clean/bank_panel.dta, clear
xtset bank_id year
* 第一步:OLS 基准(作为对比)
reg roe size leverage governance board_size, vce(cluster bank_id)
est store m1_ols
* 第二步:2SLS 估计
* 语法:ivregress 2sls 因变量 外生变量列表 (内生变量 = 工具变量), 选项
ivregress 2sls roe size leverage board_size ///
(governance = industry_avg_governance), ///
vce(cluster bank_id)
est store m2_iv
* 输出解读:
* governance 的 IV 系数 = 利用工具变量"提纯"后的因果效应估计
* 若 IV 系数 > OLS 系数 → OLS 可能低估了治理的因果效应(衰减偏误或反向因果稀释)
* 若 IV 系数 < OLS 系数 → OLS 可能高估(遗漏变量正向偏误)9.3.4 弱工具变量检验:第一阶段 F 统计量
* ── 第一阶段诊断 ──
estat firststage
* 输出解读:
* 关注 F 统计量(Kleibergen-Paap rk Wald F statistic)
* 判读规则:
* F ≥ 10 → 非弱工具变量,2SLS 估计可信(Stock & Yogo 临界值)
* F < 10 → 弱工具变量!2SLS 估计可能有严重偏误,甚至比 OLS 更差
*
* 示例输出:
* Kleibergen-Paap rk Wald F statistic = 15.32
* 判读:F = 15.32 > 10 → 非弱工具,可以信赖 2SLS 结果
*
* 若 F = 3.8 < 10:
* → 工具变量与内生变量的相关性太弱
* → 需要换一个更强的工具变量,或放弃 IV 策略弱工具变量的后果(务必理解):
| 第一阶段 F | 后果 | 应对 |
|---|---|---|
| F > 10 | 正常,2SLS 一致且近似正态 | 直接报告 |
| 5 < F < 10 | 灰色地带,可能有有限样本偏误 | 补充报告 Anderson-Rubin 置信区间 |
| F < 5 | 严重弱工具,2SLS 可能比 OLS 更糟 | 放弃该 IV,另寻工具变量 |
9.3.5 过度识别检验(Sargan / Hansen J)
当你有多个工具变量时(工具变量数 > 内生变量数),可以检验"多余的工具变量是否满足排他性约束":
* ── 过度识别检验(使用两个工具变量) ──
ivregress 2sls roe size leverage board_size ///
(governance = industry_avg_governance regulatory_pressure), ///
vce(cluster bank_id)
* Hansen J 检验(异方差稳健版,优先使用)
estat overid
* 输出解读:
* H0:所有工具变量均满足排他性约束(即过度识别约束有效)
* p > 0.05 → 不能拒绝 H0 → 工具变量整体可接受
* p < 0.05 → 拒绝 H0 → 至少有一个工具变量不满足排他性,需要逐一排查
*
* 示例:Hansen J chi2(1) = 0.82, p = 0.365
* 判读:p = 0.365 > 0.05 → 过度识别约束不被拒绝,两个 IV 整体有效⚠️ 注意:当工具变量数 = 内生变量数时(恰好识别,just-identified),过度识别检验不可用——此时排他性约束完全无法被统计检验,只能靠经济逻辑论证。
9.3.6 金融学常用工具变量举例
| IV 类型 | 具体变量 | 适用场景 | 排他性论证思路 |
|---|---|---|---|
| 行业/地区均值 | 同行业其他企业的平均 X | 企业层面内生变量(治理、杠杆、研发投入) | 其他企业的特征不直接影响本企业结果 |
| 政策冲击 | 政策试点的批次/时间差异 | 政策评估(数字金融试点、绿色信贷政策) | 批次分配由行政因素决定,与企业绩效无直接关联 |
| 地理变量 | 到金融中心距离、海拔、河流密度 | 金融可得性、保险覆盖 | 地理是"天然的",不受个体行为影响 |
| 历史变量 | 历史上的金融基础设施(如民国钱庄数量) | 当前金融发展水平 | 历史变量通过路径依赖影响当前制度,但不直接影响当前个体结果 |
| 制度变量 | 法律起源、监管框架差异 | 跨国/跨地区比较 | 制度由历史决定,不由个体企业选择 |
💡 AI 辅助研究提示:你可以把研究假设贴给 AI 问"这个场景可能的工具变量有哪些?排他性约束是否合理?"——但最终的 IV 选择和论证是你的学术判断,不能外包给 AI(S9.4 红线)。
🖐️ 跟做练习 3
任务:用 bank_panel.dta 完成 IV/2SLS 全流程并诊断。
- 打开数据并设定面板:
use data/clean/bank_panel.dta, clear+xtset bank_id year - 运行 OLS 基准:
reg roe size leverage governance board_size, vce(cluster bank_id),记录 governance 系数 - 运行 2SLS:
ivregress 2sls roe size leverage board_size (governance = industry_avg_governance), vce(cluster bank_id) - 检验弱工具变量:
estat firststage,记录 F 值并判断是否 > 10 - 对比 OLS 与 IV 系数:governance 的系数变大还是变小?尝试解释方向
- (进阶)如果你能找到第二个工具变量,加入后运行
estat overid,解读 Hansen J 的 p 值
🔗 回指第4章效度威胁
第 4 章 §4.2 定义了七大内部效度威胁。工具变量法主要解决以下威胁:
| 第4章效度威胁 | IV 如何应对 |
|---|---|
| 选择偏差(Selection) | 当"参与"是非随机的(如自愿改善治理的银行本身就是好银行),IV 通过外生变异打破自选择,使得"被工具推动改善治理"的部分近似随机 |
| 历史(History)(间接) | 若外部事件同时影响了 X 和 Y,一个好的 IV 与这些事件无关(排他性约束),因此 IV 估计不受历史干扰 |
用第 4 章的语言说:IV 把"是不是它干的"这个问题,转化为"有没有一个外生的推手能证明是它干的"。如果第一阶段 F > 10 且排他性论证站得住,你就获得了对选择偏差和遗漏变量偏误的有效防御。
§9.4 双重差分法(DID)
核心理念:双重差分是政策评估的"黄金标准"之一。它的直觉极为简洁——用对照组的"自然变化"来扣除处理组的"自然变化",剩下的就是政策的因果效应。DID 的本质是一个 2×2 因子设计的交互项。
9.4.1 DID 直觉:差分掉共同趋势
场景:2019 年某省推行"数字金融示范区"政策,你想知道这个政策是否提高了当地银行的 ROE。
政策前(2018) 政策后(2020) 变化
处理组(示范省) roe_T,pre roe_T,post ΔT = roe_T,post - roe_T,pre
对照组(非示范省) roe_C,pre roe_C,post ΔC = roe_C,post - roe_C,pre
DID 估计量 = ΔT - ΔC
=(处理组前后差)-(对照组前后差)为什么需要"双重"差分?
- 只做一次差分(处理组前后差 ΔT):包含了政策效应 + 时间趋势(宏观经济好转、行业整体复苏等)
- 只做截面差分(处理后处理组 - 对照组):包含政策效应 + 两组先天差异
- 双重差分:ΔT - ΔC 把"共同时间趋势"和"先天水平差异"同时扣掉
📌 关键假设:平行趋势——如果没有政策干预,处理组和对照组的结果变量应该沿着平行的轨迹变化。不要求水平相同,只要求变化趋势相同。
9.4.2 2×2 因子设计本质(⭐ B版核心新增)
回指 §9.0:我们在 GLM 统摄视角中学过,教材单元 15(qmd 行 1283-1285)给出了 2×2 因子设计的一般线性模型:
其中 β₁、β₂ 是主效应,β₃ 是交互效应。
DID 就是这个公式的直接应用:
| 因子设计术语 | DID 术语 | 含义 |
|---|---|---|
| x₁(因子1) | treat(处理组虚拟变量) | 1 = 处理组,0 = 对照组 |
| x₂(因子2) | post(时间虚拟变量) | 1 = 政策后,0 = 政策前 |
| β₁(主效应1) | treat 系数 | 处理组与对照组的先天水平差异 |
| β₂(主效应2) | post 系数 | 共同时间趋势 |
| β₃(交互效应) | treat × post 系数 | = DID 估计量 = 政策因果效应 |
教材原文(qmd 行 1284):"回归系数 β₁ 和 β₂ 提供了主效应的效应规模估计值,β₃ 则提供了交互效应的效应规模估计值。"
DID 回归方程:
* ── 2×2 DID 基本回归 ──
use data/clean/bank_panel.dta, clear
* 生成 DID 所需变量
gen treat = (province == "示范省") /* 处理组标记 */
gen post = (year >= 2019) /* 政策后标记 */
gen did = treat * post /* 交互项 = DID 估计量 */
* 运行 DID 回归
reg roe treat post did size leverage, vce(cluster bank_id)
* 输出解读:
* did 的系数 β₃ = 政策的因果效应(ATT)
* 若 β₃ = 1.2, p < 0.05 → 示范区政策使银行 ROE 提高约 1.2 个百分点
* treat 系数 = 两组先天差异(不随时间变)
* post 系数 = 共同时间趋势(两组共享)教材的关键警示(qmd 行 1285):"如果 β₃ 是显著的……我们就不能显著地解读出课程类型(β₁)或者教学时间(β₂)的独立效应,因为这两个效应不能被区分开来。只有当交互效应不显著的时候,主效应才能被解读出来。"
映射到 DID:当交互项 treat×post 显著时(即政策有效应),treat 和 post 的主效应系数不应单独解读为"处理组特征"或"时间趋势"——它们已经被交互项"吸收"了部分含义。只有在 DID 估计量不显著时,treat 和 post 才可以作为独立的组间差异和时间趋势来解读。
9.4.3 平行趋势假设与事件研究法
平行趋势是 DID 的命门。如何检验?——事件研究法(Event Study):把政策前每一期都设为虚拟变量,看政策前处理组与对照组的差异是否为零。
* ── 事件研究法检验平行趋势 ──
* 需要安装:ssc install eventstudyinteract
* 生成相对时间虚拟变量(以政策前1期为基准期)
gen rel_time = year - 2019 /* -3, -2, -1, 0, 1, 2 */
* 用 eventstudyinteract 估计动态效应
eventstudyinteract roe L3.rel_time L2.rel_time L1.rel_time ///
F1.rel_time F2.rel_time, ///
absorb(i.bank_id i.year) ///
vce(cluster bank_id)
* 或使用标准 DID + 时期虚拟变量手动实现
forvalues k = 3(-1)2 {
gen D_m`k' = (rel_time == -`k') & treat == 1
}
forvalues k = 0/2 {
gen D_p`k' = (rel_time == `k') & treat == 1
}
reghdfe roe D_m3 D_m2 D_p0 D_p1 D_p2 size leverage, ///
absorb(bank_id year) vce(cluster bank_id)
* 输出解读:
* 政策前各期系数(D_m3, D_m2)应不显著(p > 0.10)
* → 说明政策前两组趋势平行,DID 假设成立
* 政策后各期系数(D_p0, D_p1, D_p2)逐步显著
* → 说明政策效应存在且可能随时间累积
*
* ⚠️ 若政策前系数显著 → 平行趋势不成立 → DID 结果不可信
* → 需要换对照组、缩短时间窗口、或改用合成控制法判断标准:
| 检验结果 | 判读 | 下一步 |
|---|---|---|
| 政策前各期系数联合 F 检验 p > 0.10 | 平行趋势成立 | 放心使用 DID |
| 个别期显著但无趋势 | 可能是随机波动 | 补充安慰剂检验 |
| 政策前呈系统性趋势 | 平行趋势不成立 | 换方法(合成控制/匹配+DID) |
9.4.4 多期/交错 DID 与异质性处理效应
现实中,政策往往不是"一刀切"同时实施——不同地区在不同年份被纳入试点(交错处理,staggered adoption)。传统双向固定效应(TWFE)DID 在交错处理 + 异质性处理效应时会产生偏误(Goodman-Bacon, 2021; de Chaisemartin & D'Haultfœuille, 2020)。
* ── 交错 DID:使用 did_multiplegt ──
* 需要安装:ssc install did_multiplegt
* 假设不同银行在不同年份受到政策冲击
* first_treat: 每个个体首次受处理的年份(从未处理的设为 0 或极大值)
did_multiplegt roe bank_id year treat, ///
robust_dynamic dynamic(3) placebo(3) ///
breps(200) cluster(bank_id)
* 输出解读:
* "Average cumulative effect" = 累积平均处理效应
* "Dynamic effect" 按事件时间报告 → 可画出事件研究图
* 与传统 TWFE 对比:若两者差异大 → 存在异质性处理效应
*
* ⚠️ 异质性处理效应警示:
* 如果早期处理者的效应 ≠ 晚期处理者的效应
* → TWFE 的 DID 系数是各 2×2 DID 的加权平均,权重可能为负!
* → 此时必须使用 did_multiplegt / callaway / sun_abraham 等新方法9.4.5 标准误聚类到处理层面
DID 的标准误必须聚类到处理分配的层面(treatment assignment level),而不是个体层面:
* ── 正确 vs 错误的标准误 ──
* ❌ 错误:聚类到个体(bank_id)—— 如果政策是省级分配的
reg roe treat post did size leverage, vce(cluster bank_id)
* ✅ 正确:聚类到政策分配层面(province)
reg roe treat post did size leverage, vce(cluster province)
* 判断规则:
* 政策在哪个层面分配 → 就聚类到哪个层面
* 例:省级试点 → cluster(province)
* 行业级监管 → cluster(industry)
* 银行级处理 → cluster(bank_id)
*
* 聚类层级越高,有效样本量越小,标准误越大
* Abadie et al. (2023):当处理组数量少时,应考虑 wild bootstrap🖐️ 跟做练习 4
任务:用 bank_panel.dta 完成一个完整的 DID 分析。
- 构造处理变量:假设 bank_id 1-30 的银行在 2019 年被纳入"数字治理示范行",生成
treat、post、did三个变量 - 运行 2×2 DID 回归:
reg roe treat post did size leverage, vce(cluster bank_id) - 解读交互项
did的系数——这是政策的因果效应吗?为什么? - 用事件研究法检验平行趋势:生成政策前各期的 treat×year 交互虚拟变量,用
reghdfe估计 - 画出事件研究图(
coefplot):政策前系数应围绕零线波动 - (进阶)思考:如果不同银行在 2018、2019、2020 不同年份被纳入示范,你应该用什么方法?为什么传统 TWFE 可能有问题?
🔗 回指第4章效度威胁
第 4 章 §4.2 的七大内部效度威胁中,DID + 平行趋势主要解决以下两条:
| 第4章效度威胁 | DID 如何应对 |
|---|---|
| 历史(History) | "你的研究期恰好赶上 LPR 下调 / 疫情 / 房地产调控"——DID 通过对照组吸收了所有共同的外部事件冲击。只要这些事件同等地影响了处理组和对照组(平行趋势),差分后就被消除 |
| 选择偏差(Selection) | "试点县本来就是省里挑的先进县"——DID 不要求处理组和对照组水平相同(treat 主效应吸收了先天差异),只要求变化趋势相同。因此,即便处理组先天更优秀,只要没有政策时两组会平行变化,DID 估计就是无偏的 |
用第 4 章的语言说:DID 把"历史威胁"交给对照组去吸收,把"选择偏差"转化为"平行趋势是否成立"这个可检验的问题。这正是为什么 DID 在政策评估中如此强大——它不要求消除选择偏差的来源,只要求偏差的时间模式是可预测的。
§9.5 倾向得分匹配(PSM)与断点回归(RDD)
核心理念:PSM 和 RDD 都试图在观测数据中"模拟随机实验"——PSM 通过匹配可观测特征构造"近似等价"的对照组;RDD 利用制度规则的断点,在断点附近创造"近似随机化"的局部比较。
Part A:倾向得分匹配(PSM)
9.5.1 选择偏差与可观测对照组的构造
问题:在第 4 章 §4.2 中,我们把**选择偏差(Selection)**称为"金融研究的头号杀手"——自愿参与保险、贷款、培训的人与不参与的人从一开始就不一样。
PSM 的核心思想:
理想状态(RCT):随机分配 → 处理组 ≈ 对照组(所有特征均衡)
现实状态(观测数据):自选择 → 处理组 ≠ 对照组
PSM 的折中方案:
1. 用可观测特征(规模、杠杆、地区、行业...)估计"参与概率"(倾向得分)
2. 给每个处理组个体找一个倾向得分最接近的对照组个体(匹配)
3. 匹配后,两组在可观测特征上"近似等价"
4. 比较匹配后的结果变量差异 = ATT(处理组的平均处理效应)⚠️ PSM 的根本局限:它只能平衡可观测的特征。如果存在不可观测的混淆变量(如"管理层能力""风险偏好"),PSM 无法解决——此时需要 IV 或 DID。
9.5.2 Stata 实现:psmatch2 与 teffects psmatch
* ── PSM 完整流程 ──
use data/clean/bank_panel.dta, clear
* 假设:treat = 1 表示银行实施了数字化转型
* 目标:评估数字化转型对 ROE 的因果效应
* ─── 方法一:psmatch2(经典,输出详细) ───
* 需要安装:ssc install psmatch2
* Step 1: 估计倾向得分 + 最近邻匹配
psmatch2 treat size leverage board_size governance, ///
outcome(roe) logit neighbor(1) common ate
* 输出解读:
* "ATT (Average Treatment Effect on the Treated)" = 处理组的平均处理效应
* 示例:ATT = 0.85, t = 2.31, p = 0.021
* → 数字化转型使银行 ROE 平均提高 0.85 个百分点,统计显著
*
* "Number of treated observations matched" = 成功匹配的处理组样本数
* 若有大量未匹配(off support)→ 共同支撑域不足,需谨慎
* ─── 方法二:teffects psmatch(Stata 官方,更现代) ───
teffects psmatch (roe) (treat size leverage board_size governance, logit), ///
atet nn(1) vce(cluster bank_id)
* 输出解读:
* ATET = 处理组平均处理效应(与 psmatch2 的 ATT 含义相同)
* teffects 自动报告标准误和置信区间9.5.3 匹配质量诊断
匹配不是"跑一下就完了"——你必须证明匹配后两组确实"近似等价"。
* ── 诊断 1:共同支撑域(Common Support) ──
* psmatch2 运行后自动输出
sum _pscore if treat == 1 /* 处理组倾向得分范围 */
sum _pscore if treat == 0 /* 对照组倾向得分范围 */
* 判断:两组倾向得分分布应有大面积重叠
* 若处理组最低分 > 对照组最高分 → 无共同支撑,匹配失败
* ── 诊断 2:平衡性检验 ──
* 方法 A:pstest(psmatch2 配套)
pstest size leverage board_size governance, treated(_weight>0) both
* 方法 B:手动计算标准化偏差(Standardized Bias, SB)
* 匹配前后各协变量的 SB 对比
psacov treat size leverage board_size governance, ///
pscore(_pscore) treated(1)
* 判断标准:
* 匹配后每个协变量的标准化偏差 |SB| < 10%
* → 平衡性良好,匹配有效
* |SB| > 10% → 该变量未平衡,需要调整匹配方法
* (如:增加匹配数 neighbor(3)、改用核匹配 kernel、加入更多协变量)匹配质量诊断清单:
| 诊断项 | 合格标准 | 不合格的后果 | 补救措施 |
|---|---|---|---|
| 共同支撑域 | 两组倾向得分分布重叠 ≥ 90% | 大量样本被丢弃,外部效度下降 | 修剪(trimming)或换匹配方法 |
| 标准化偏差 | 匹配后所有协变量 | SB | < 10% |
| 匹配后样本量 | ATT 估计基于足够样本 | 统计检验力不足 | 放宽匹配容差或改用 IPW |
| Rosenbaum 敏感性分析 | Γ > 1.5 时结论仍稳健 | 存在潜在不可观测混淆 | 承认局限,讨论方向 |
Part B:断点回归(RDD)
9.5.4 RDD 直觉:断点附近近似随机化
场景:某省规定"资本充足率 ≥ 10.5% 的银行可获得创新业务牌照"。你想知道获得牌照是否提高了银行 ROE。
获得牌照概率
1.0 ─────────────────┐
│ ← 断点(cutoff = 10.5%)
0.0 ──────────────────┘
──────────────────────────
8% 9% 10% 10.5% 11% 12%
资本充足率(running variable)
核心直觉:
资本充足率 = 10.4% 的银行 vs 10.6% 的银行
→ 两者在其他方面几乎一样(0.2% 的差异可能是随机波动)
→ 但一个没拿到牌照,一个拿到了
→ 比较断点两侧的 Y = 近似随机实验的局部因果效应RDD 的识别假设:在断点附近,个体无法精确操纵(manipulate)自己的 running variable 值。如果银行可以精确地把资本充足率调到 10.5% 以上,RDD 就不成立。
9.5.5 Stata 实现:rdrobust 与带宽选择
* ── RDD 完整流程 ──
use data/clean/bank_panel.dta, clear
* 假设:car = 资本充足率(running variable)
* cutoff = 10.5(断点值)
* roe = 结果变量
* 需要安装:ssc install rdrobust
* ssc install rddensity
* ssc install rdplot
* ─── Step 1:先画图看断点 ───
rdplot roe car, c(10.5) p(1) graph_options(xtitle("资本充足率(%)") ///
ytitle("ROE(%)") title("断点回归:创新牌照对银行盈利的影响"))
* ─── Step 2:rdrobust 正式估计 ───
rdrobust roe car, c(10.5) kernel(triangular) p(1) bwselect(mserd)
* 输出解读:
* "Point estimate of the RD treatment effect" = 断点处的因果效应(局部)
* "p-value" = 常规 t 检验 / 稳健偏差校正检验
* "Bandwidth" = 最优带宽(MSE 最优,由数据自动选择)
*
* 示例输出:
* Method: RD | 有效观测: 68 | 带宽: [9.8, 11.2]
* Coefficient: 0.72 Std.Err: 0.31 t-stat: 2.32 p-value: 0.020
* → 在断点附近(资本充足率 9.8%-11.2%),获得牌照使 ROE 提高约 0.72 个百分点
*
* ⚠️ 注意:这是"局部平均处理效应"(LATE)——只对断点附近的银行有效
* 不能推广到资本充足率 = 15% 的银行
* ─── Step 3:带宽敏感性检验 ───
* 用不同带宽检查结论是否稳健
rdrobust roe car, c(10.5) kernel(triangular) p(1) bwselect(msecomb1)
rdrobust roe car, c(10.5) kernel(uniform) p(1) h(2.0) /* 手动带宽 ±2% */
rdrobust roe car, c(10.5) kernel(triangular) p(2) /* 二阶多项式 */
* ─── Step 4:操纵检验(McCrary density test) ───
rddensity roe car, c(10.5) plot
* 判断标准:
* p > 0.05 → 断点处无密度跳变 → 不存在操纵,RDD 有效
* p < 0.05 → 密度跳变 → 个体可能在操纵 running variable → RDD 不可信带宽选择要点:
| 带宽策略 | 优点 | 缺点 | 推荐 |
|---|---|---|---|
| MSE 最优带宽(默认) | 均方误差最小,统计效率最高 | 可能有偏 | ✅ 主结果 |
| 0.5× 最优带宽 | 偏差更小 | 样本少,方差大 | 稳健性检验 |
| 2× 最优带宽 | 样本多,精度高 | 偏差可能增大 | 稳健性检验 |
| 手动固定带宽 | 透明可复现 | 可能被"挑选" | 补充报告 |
9.5.6 精确断点 vs 模糊断点
| 类型 | 定义 | 断点处处理概率 | 估计方法 | 金融例子 |
|---|---|---|---|---|
| 精确断点(Sharp RDD) | running variable 跨过 cutoff → 100% 获得处理 | 从 0 跳到 1 | 直接比较断点两侧 Y 的局部线性回归 | 资本充足率 ≥ 10.5% → 自动获牌照 |
| 模糊断点(Fuzzy RDD) | 跨过 cutoff → 处理概率跳升但不是 100% | 从 p₁ 跳到 p₂(p₂ > p₁ 但 < 1) | IV 思路:用"是否在断点以上"作为"实际是否接受处理"的工具变量 | 评分 ≥ 60 分的贷款申请"大概率"获批,但审批员有酌情权 |
* ── 模糊断点 RDD(Fuzzy)──
* 当处理不是由断点唯一决定时
* 用 rdrobust 的 fuzzy 选项:以 cutoff dummy 为工具变量
* 示例:贷款审批分数 ≥ 60 分的申请"大概率"获批
rdrobust loan_amount credit_score, c(60) fuzzy(approved) ///
kernel(triangular) p(1)
* 输出解读:
* 系数 = Wald 估计量 = (Y 在断点处的跳变) / (处理概率在断点处的跳变)
* 本质上就是 2SLS:用 1(credit_score ≥ 60) 作为 approved 的工具变量
* → 模糊 RDD = 局部 IV💡 AI 辅助研究提示:你可以问 AI "我的数据中是否存在天然的断点?"或"帮我论证 running variable 在断点处不可操纵"——但 McCrary 密度检验和带宽敏感性分析必须自己跑,AI 不能替你生成统计量(S9.4 红线)。
🖐️ 跟做练习 5
任务 A(PSM):
- 打开 bank_panel.dta,定义
treat = 1为 board_size > 中位数的银行(大董事会) - 运行
psmatch2 treat size leverage governance, outcome(roe) logit neighbor(1) common - 检查 ATT 是否显著——大董事会是否"因果地"提高了 ROE?
- 运行平衡性检验:匹配后各协变量的标准化偏差是否 < 10%?
- 思考:PSM 能排除"不可观测的管理层能力"这一混淆因素吗?如果不能,该用什么方法?
任务 B(RDD):
- 假设 bank_panel.dta 中有变量
capital_ratio(资本充足率),监管红线为 10.5% - 先画散点图:
scatter roe capital_ratio || lowess roe capital_ratio, c(10.5) - 运行
rdplot roe capital_ratio, c(10.5),目视检查断点处是否有跳变 - 运行
rdrobust roe capital_ratio, c(10.5),记录点估计、标准误和最优带宽 - 做带宽敏感性:分别用 0.5× 和 2× 带宽重跑,结论是否稳健?
- (进阶)运行
rddensity,判断是否存在操纵
🔗 回指第4章效度威胁
第 4 章 §4.2 定义的七大内部效度威胁中,PSM 和 RDD 各自针对的核心威胁:
| 识别策略 | 对应的第4章效度威胁 | 具体机制 |
|---|---|---|
| PSM | 选择偏差(Selection) | "参加农业保险的都是风险厌恶型农户"——PSM 通过匹配可观测特征(收入、规模、教育),构造一个"在可观测维度上与处理组等价"的对照组,从而消除可观测部分的选择偏差 |
| RDD | 选择偏差(Selection)—— 特指"自选择的断点" | "试点县本来就是省里挑的先进县"——RDD 利用制度规则的外生断点(如资本充足率门槛),在断点附近个体无法精确操纵自己的位置,因此断点两侧的比较近似随机化 |
PSM vs RDD 的本质区别:
- PSM 解决的是"可观测特征造成的选择偏差"——前提是你相信控制了所有重要的可观测混淆因素(条件独立假设 CIA)
- RDD 解决的是"制度规则造成的选择偏差"——不需要 CIA,只需要断点处不可操纵(连续性假设)
- PSM 估计的是全局 ATT(对整个处理组);RDD 估计的是局部 LATE(只对断点附近的个体)
用第 4 章的话说:PSM 是"在可观测维度上模拟随机分组";RDD 是"利用制度规则制造局部的随机化"。两者都不如真正的 RCT 干净,但在金融观测研究中已是最佳实践。
§9.6 稳健性与异质性
核心理念:稳健性检验不是"凑显著"的借口,而是对你核心结论的诚实压力测试。 参见 S9.1"不 p-hacking"与 S9.2"稳健性检验如实报告"。
9.6.1 三组稳健性检验:主检验 + 替换变量 + 子样本
完成基准回归(§9.1-§9.5)后,你需要回答一个关键问题:我的结论对模型设定的依赖程度有多大? 稳健性检验的标准做法是"三组对照":
| 组别 | 含义 | 具体操作 | 论文报告格式 |
|---|---|---|---|
| 第 1 组:主检验 | 改变估计方法/控制变量集 | 加入更多控制变量、换聚类层级、换标准误类型 | "在加入 XX 控制变量后,核心系数保持显著" |
| 第 2 组:替换变量 | 用另一种方式测量核心概念 | 替换因变量(ROE→ROA)、替换自变量(治理指数→独董比例) | "替换核心变量后,结论方向一致/不一致" |
| 第 3 组:子样本 | 排除特定样本重新估计 | 剔除国有银行、剔除疫情年份、仅保留东部地区 | "在子样本中,效应更大/更小/不显著" |
关键原则(S9.2 红线):
- 三组稳健性检验的结果全部如实报告,不挑好看的
- 如果某组检验失败了(核心系数不显著),要写明"在 XX 条件下不再稳健"并讨论原因
- 稳健性检验的目的是给读者提供信息,不是为了"通过"
* ══════════════════════════════════════════════════════
* §9.6 稳健性检验三组:基于 bank_panel.dta 主例
* ══════════════════════════════════════════════════════
use "data/clean/bank_panel.dta", clear
xtset bank_id year
* ── 第 1 组:主检验(基准 + 更多控制 + 换聚类) ──
* 基准:§9.2 已跑过的 reghdfe
reghdfe roe governance size leverage, absorb(bank_id year) vce(cluster province)
est store rob_1a
* 加入更多控制变量
reghdfe roe governance size leverage board_size dual npl_ratio, ///
absorb(bank_id year) vce(cluster province)
est store rob_1b
* 换聚类层级:银行层面
reghdfe roe governance size leverage, absorb(bank_id year) vce(cluster bank_id)
est store rob_1c
* ── 第 2 组:替换变量 ──
* 替换因变量:ROE → ROA
reghdfe roa governance size leverage, absorb(bank_id year) vce(cluster province)
est store rob_2a
* 替换核心自变量:governance → board_indep(独董比例)
reghdfe roe board_indep size leverage, absorb(bank_id year) vce(cluster province)
est store rob_2b
* ── 第 3 组:子样本 ──
* 剔除国有大型银行
reghdfe roe governance size leverage if bank_type != 1, ///
absorb(bank_id year) vce(cluster province)
est store rob_3a
* 仅保留 2018-2022(剔除疫情冲击年份 2020)
reghdfe roe governance size leverage if year != 2020, ///
absorb(bank_id year) vce(cluster province)
est store rob_3b
* ── 输出多列稳健性三线表 ──
esttab rob_1a rob_1b rob_2a rob_2b rob_3a rob_3b ///
using "reports/robustness.rtf", replace ///
b(3) se(3) star(* 0.10 ** 0.05 *** 0.01) ///
stats(N r2_w, fmt(0 3)) ///
mtitles("基准FE" "更多控制" "ROA" "独董比例" "非国有" "剔疫情") ///
title("表 9-6 稳健性检验:三组对照") ///
label booktabs ///
addnotes("注:括号内为聚类到省份层面的稳健标准误。*** p<0.01, ** p<0.05, * p<0.1。")输出解读要点:
- 如果核心变量(governance)在所有列中方向和显著性一致 → 结论稳健
- 如果某一列不显著 → 诚实报告"在剔除国有银行后效应不再显著,可能因为国有银行治理机制不同"
- 如果方向翻转 → 严重问题,需重新审视模型设定
9.6.2 规格曲线:S9.1"不 p-hacking"的自证工具
什么是规格曲线(Specification Curve)?
传统稳健性检验报告 3-5 种设定,但审稿人可能质疑:"你只挑了对你有利的设定。"规格曲线的做法是:穷举所有合理的模型设定(如所有控制变量组合),画出核心系数的分布图,让读者一目了然。
逻辑:如果你尝试了 128 种合理设定,其中 120 种都显著且方向一致 → 强证据。如果只有 20 种显著 → 你的结论可能是 p-hacking 的产物。
* ══════════════════════════════════════════════════════
* 规格曲线模拟:穷举控制变量子集
* ══════════════════════════════════════════════════════
use "data/clean/bank_panel.dta", clear
xtset bank_id year
* 定义可选控制变量池(4 个变量 → 2^4 = 16 种组合)
local controls "size leverage board_size npl_ratio"
local n_comb = 16
* 循环跑所有组合,存储 governance 系数
postfile spec_curve spec_id b_gov se_gov p_gov using "data/clean/spec_curve.dta", replace
forvalues i = 1/`n_comb' {
* 根据二进制位决定哪些控制变量进入模型
local ctrl_list ""
local j = 0
foreach v of local controls {
local j = `j' + 1
if mod(floor(`i' / 2^(`j'-1)), 2) == 1 {
local ctrl_list "`ctrl_list' `v'"
}
}
* 跑回归
capture reghdfe roe governance `ctrl_list', absorb(bank_id year) vce(cluster province)
if _rc == 0 {
post spec_curve (`i') (_b[governance]) (_se[governance]) (2*ttail(e(df_r), abs(_b[governance]/_se[governance])))
}
}
postclose spec_curve
* 规格曲线图(需安装 coefplot)
use "data/clean/spec_curve.dta", clear
sort b_gov
gen order = _n
coefplot (scatter b_gov order, msymbol(O) msize(tiny)), ///
vertical yline(0, lcolor(red)) ///
title("规格曲线:governance 系数在 16 种设定下的分布") ///
ytitle("系数估计值") xtitle("模型设定(按系数大小排序)") ///
note("红线 = 0。所有点在红线同侧 → 结论稳健")
graph export "figures/spec_curve.pdf", replace给学生的话:规格曲线不是让你"找到显著的那一种",而是展示你的结论不依赖于某一种特定设定。如果曲线在 0 两侧频繁穿越,你的结论确实不稳健——这时候诚实比显著更重要。
9.6.3 异质性分析
异质性回答的问题:核心效应在不同群体间是否有差异? 这不是"换着法子凑显著",而是探索效应的边界条件。
方法一:分组回归(bysort)
* ── 异质性:按银行类型分组 ──
* bank_type: 1=国有大型, 2=股份制, 3=城商行
bysort bank_type: reghdfe roe governance size leverage, ///
absorb(bank_id year) vce(cluster province)
* 存储分组结果
reghdfe roe governance size leverage if bank_type == 1, absorb(bank_id year) vce(cluster province)
est store het_soe
reghdfe roe governance size leverage if bank_type == 2, absorb(bank_id year) vce(cluster province)
est store het_joint
reghdfe roe governance size leverage if bank_type == 3, absorb(bank_id year) vce(cluster province)
est store het_city方法二:交乘项(交互效应)
* ── 异质性:交乘项法(推荐,可做组间差异检验) ──
* 生成交乘项
gen gov_x_soe = governance * (bank_type == 1)
reghdfe roe governance gov_x_soe size leverage, ///
absorb(bank_id year) vce(cluster province)
* 输出解读:
* governance 系数 = 非国有银行的基准效应
* gov_x_soe 系数 = 国有银行相对非国有银行的增量效应
* 如果 gov_x_soe 显著 → 治理对国有银行的效果不同于非国有银行两种方法的选择:
- 分组回归:直观,适合描述;但无法检验"两组系数差异是否显著"
- 交乘项:可以检验组间差异(交互项的 p 值),适合推断;论文更推荐
9.6.4 三方向副例异质性
| 方向 | 异质性维度 | 分组变量 | 预期结论 |
|---|---|---|---|
| 【金】资本结构 | 企业规模(大/中/小) | size_group | 大企业融资渠道多元,杠杆率对治理更不敏感 |
| 【险】农业保险需求 | 城乡(城区/郊县/农村) | urban_rural | 农村农户风险厌恶更强,保险需求对补贴更敏感 |
| 【农】微型金融贷款可得性 | 区域(东部/中部/西部) | region | 西部金融抑制更强,关系型贷款效应更显著 |
§9.7 中介效应与机制检验
核心理念:回归告诉你"X 影响 Y",中介分析进一步回答"X 通过什么渠道影响 Y"。 参见教材单元 15(qmd 行 1296):"一个方程的因变量是另一个方程的自变量"——这就是路径分析的核心思想。
9.7.1 Baron-Kenny 三步法
中介效应的经典检验框架由 Baron & Kenny(1986)提出,包含三步回归:
X ──────────────────────→ Y (第 1 步:总效应 c)
X ──────────────────────→ M (第 2 步:X 对中介变量的效应 a)
X ────────→ M ──────────→ Y (第 3 步:直接效应 c' + 中介效应 a×b)| 步骤 | 回归方程 | 关注系数 | 含义 |
|---|---|---|---|
| 第 1 步 | Y = α₀ + c·X + 控制变量 | c | X 对 Y 的总效应 |
| 第 2 步 | M = β₀ + a·X + 控制变量 | a | X 对中介变量 M 的效应 |
| 第 3 步 | Y = γ₀ + c'·X + b·M + 控制变量 | c', b | c' = 直接效应;b = M 对 Y 的效应 |
中介效应 = a × b = c - c'
判定标准(逐步检验法):
- 第 1 步 c 显著 → X 确实影响 Y
- 第 2 步 a 显著 → X 确实影响 M
- 第 3 步 b 显著,且 c' 的绝对值 < c 的绝对值 → 存在部分中介
- 若 c' 不显著 → 完全中介(X 完全通过 M 影响 Y)
* ══════════════════════════════════════════════════════
* Baron-Kenny 三步法:governance → npl_ratio → roe
* 假说:公司治理(governance)通过降低不良贷款率(npl_ratio)提升盈利能力(roe)
* ══════════════════════════════════════════════════════
use "data/clean/bank_panel.dta", clear
xtset bank_id year
* ── 第 1 步:总效应(X → Y) ──
reghdfe roe governance size leverage, absorb(bank_id year) vce(cluster province)
est store step1_total
* 预期:governance 系数 c > 0 且显著(治理越好,ROE 越高)
* ── 第 2 步:X → M ──
reghdfe npl_ratio governance size leverage, absorb(bank_id year) vce(cluster province)
est store step2_xm
* 预期:governance 系数 a < 0 且显著(治理越好,不良贷款率越低)
* ── 第 3 步:X + M → Y ──
reghdfe roe governance npl_ratio size leverage, absorb(bank_id year) vce(cluster province)
est store step3_full
* 预期:npl_ratio 系数 b < 0 且显著;governance 系数 c' 仍显著但绝对值 < c
* ── 输出三步结果表 ──
esttab step1_total step2_xm step3_full ///
using "reports/mediation_bk.rtf", replace ///
b(3) se(3) star(* 0.10 ** 0.05 *** 0.01) ///
stats(N r2_w, fmt(0 3)) ///
mtitles("Step1: Y~X" "Step2: M~X" "Step3: Y~X+M") ///
title("表 9-7 Baron-Kenny 三步法中介效应检验") ///
label booktabs9.7.2 Sobel 检验
Baron-Kenny 逐步法有一个缺陷:它不直接检验"a × b 是否显著异于 0"。Sobel(1982)提出了中介效应的直接检验:
Sobel Z 统计量:Z = a·b / SE(a·b),其中 SE(a·b) = √(a²·SE_b² + b²·SE_a²)
判读:|Z| > 1.96 → 中介效应在 5% 水平显著。
局限:Sobel 检验假设 a·b 服从正态分布,但乘积分布通常偏态 → 检验力偏低 → 推荐用 Bootstrap 替代。
9.7.3 Bootstrap 置信区间(推荐方法)
Bootstrap 不依赖正态性假设,直接通过重复抽样构造 a·b 的置信区间:
* ══════════════════════════════════════════════════════
* sgmediation:一键中介效应(Sobel + Bootstrap)
* 需安装:ssc install sgmediation
* ══════════════════════════════════════════════════════
* 方法一:sgmediation(经典三步 + Sobel 检验)
sgmediation roe, mv(npl_ratio) iv(governance) cv(size leverage)
* 输出解读:
* Indirect effect (a*b) = 系数值
* Sobel z = Z 统计量,p = p 值
* 若 p < 0.05 → 中介效应显著
* 方法二:Bootstrap 置信区间(推荐,更稳健)
* bootstrap 1000 次抽样,构造 a*b 的 95% CI
bootstrap r(ind_eff), reps(1000) seed(42): sgmediation roe, mv(npl_ratio) iv(governance)
estat bootstrap, percentile bc
* 输出解读:
* Percentile CI: [下界, 上界]
* 若 CI 不包含 0 → 中介效应显著
* BC(偏差校正)CI 更准确,优先看 BC 结果
* 方法三:手动 Bootstrap(理解原理)
capture program drop my_mediation
program define my_mediation, rclass
reghdfe npl_ratio governance size leverage, absorb(bank_id year)
scalar a = _b[governance]
reghdfe roe governance npl_ratio size leverage, absorb(bank_id year)
scalar b = _b[npl_ratio]
return scalar ind_eff = a * b
end
bootstrap r(ind_eff), reps(1000) seed(42) cluster(bank_id): my_mediation
estat bootstrap, percentile bc结果解读模板(写入论文):
"Bootstrap 检验(1000 次重复抽样)结果表明,公司治理通过降低不良贷款率影响盈利能力的间接效应为 -0.032,95% 偏差校正置信区间为 [-0.058, -0.011],不包含 0,中介效应显著。中介效应占总效应的比例为 23.5%。"
9.7.4 与教材路径分析的关系
教材单元 15(qmd 行 1296)指出:"多变量 GLM 中,一个方程的因变量是另一个方程的自变量"——这正是路径分析(Path Analysis)的定义,也是中介效应的本质。
对应关系:
| 教材概念(路径分析) | 中介效应术语 | Stata 实现 |
|---|---|---|
| 外生变量 | X(自变量) | governance |
| 内生变量(中间) | M(中介变量) | npl_ratio |
| 最终内生变量 | Y(因变量) | roe |
| 直接路径系数 | c'(直接效应) | 第 3 步 X 的系数 |
| 间接路径系数 | a × b(间接效应) | 两步系数乘积 |
| 总效应 | c = c' + a·b | 第 1 步 X 的系数 |
中介效应是路径分析的最简形态(单条间接路径)。更复杂的多路径模型(如 SEM)将在高级课程中学习。
9.7.5 中介效应 vs 调节效应辨析
| 维度 | 中介效应(Mediation) | 调节效应(Moderation) |
|---|---|---|
| 回答的问题 | X 通过什么渠道影响 Y? | X 对 Y 的影响在什么条件下更强/更弱? |
| 变量角色 | M 是 X→Y 链条上的中间环节 | W 改变 X→Y 关系的强度/方向 |
| 因果图 | X → M → Y | X → Y,W 调节箭头粗细 |
| 检验方法 | Baron-Kenny / Bootstrap | 交乘项 X×W 是否显著(§9.6.3) |
| Stata 命令 | sgmediation | reghdfe y c.x##c.w |
| 本章对应 | §9.7 | §9.6.3 异质性分析 |
常见混淆:异质性分析(§9.6.3)本质上就是调节效应检验——"治理效应在国有银行和非国有银行之间不同"= "银行类型调节了治理→绩效的关系"。
§9.8 ABM 仿真实验
核心理念:回归从历史数据中识别因果,仿真从模型规则中生成反事实——两者互补而非替代。 本节为选修内容,面向希望做政策仿真类论文的学生(尤其是【险】方向)。
9.8.1 为什么需要仿真?
回归分析(§9.1-§9.7)的核心能力是:从已经发生的数据中,利用自然实验或统计控制来识别因果关系。但有些研究问题是回归无法回答的:
| 局限 | 例子 | ABM 的解决方案 |
|---|---|---|
| 无法做 RCT | 农业保险补贴率不能随机分配给不同省份 | 在计算机中模拟"如果补贴率是 60%/70%/80%/90%"的反事实 |
| 数据不存在 | 新政策尚未实施,没有历史数据 | 基于行为规则模拟政策实施后的可能结果 |
| 系统复杂性 | 500 个农户相互影响(邻里效应)、多主体博弈 | 让每个 Agent 遵循决策规则,观察宏观涌现 |
| 非线性动态 | 参保率随时间的路径依赖(先亏后保 vs 一直不保) | 离散时间步逐期模拟,观察动态轨迹 |
定位:ABM 不是回归的替代品。最佳实践是"回归 + 仿真"双轮驱动——回归验证历史因果,仿真预测政策效果。
9.8.2 ODD 协议:模型描述的国际标准
ABM 模型如果没有标准化的描述文档,他人无法复现、审稿人无法评审。ODD 协议(Grimm et al., 2006)是国际公认的 ABM 报告标准:
| ODD 组件 | 含义 | 四川水稻保险 ABM 对应 |
|---|---|---|
| Overview | 概述:目的、主体类型、空间结构、时间尺度 | 评估补贴率政策效果;4 类主体(农户/保险公司/银行/政府);小世界网络;步长=1天 |
| Design concepts | 设计理念:涌现、适应性、目标、学习、随机性 | 参保率涌现;农户根据前景理论适应决策;多随机种子 |
| Details | 细节:状态变量、过程、调度顺序 | config.yaml 全部参数 + 年度周期(投保→生产→灾害→收获→理赔) |
写论文的启示:如果你的专硕论文选择"产品设计"范式(附录 F.3),其中包含仿真模块,那么 ODD 协议就是"方法"一节必须遵循的报告框架。
9.8.3 四川水稻保险 ABM 跟做
项目路径(绝对路径,请复制到你自己的研究文件夹后再运行):
/Users/xiaoshiishun/微云同步助手(275531137)/当前工作/课件/风险管理与保险研究生课程2026年讲义更新/sichuan_rice_insurance_abm/项目结构:
sichuan_rice_insurance_abm/
├── run.py # 启动脚本(python run.py --scenario baseline)
├── config.yaml # 全部参数配置(YAML 格式)
├── ODD协议.md # ODD 标准描述文档
├── model/rice_insurance_model.py # 主模型类
├── agents/rice_farmer_agent.py # 农户主体(核心决策逻辑)
├── agents/insurer_agent.py # 保险公司
├── agents/bank_agent.py # 银行(保险+信贷联动)
├── agents/government_agent.py # 政府(补贴政策)
└── results/ # 运行输出核心参数一览(来自 config.yaml):
| 参数类别 | 关键参数 | 取值 | 数据来源 |
|---|---|---|---|
| 模型规模 | 农户数量 | 500 | 代表四川 2800 万亩水稻种植户样本 |
| 网络结构 | 小世界网络 k=8, p=0.1 | — | 模拟农村熟人社会 |
| 风险偏好 | CRRA 风险厌恶系数 | N(1.2, 0.4) | 文献估计 |
| 行为参数 | 损失厌恶系数 λ | N(2.8, 0.6) | 蔡天鸣(2024)中国农户实验 |
| 保险合约 | 保额 1100 元/亩,费率 4.5% | 保费 49.5 元/亩 | 四川水稻完全成本保险条款 |
| 财政补贴 | 总补贴率 75%(中央45%+省20%+市县10%) | 农户自缴 25% ≈ 12.4 元/亩 | 四川省农业农村厅 |
| 灾害参数 | 洪涝 3%/年,干旱 2%/年,病虫害 5%/年 | — | 国家统计局四川调查总队 |
跟做步骤:
# 步骤 1:复制项目到你的研究文件夹
cp -r "/Users/xiaoshiishun/微云同步助手(275531137)/当前工作/课件/风险管理与保险研究生课程2026年讲义更新/sichuan_rice_insurance_abm/" ~/research/my_abm/
# 步骤 2:安装依赖
cd ~/research/my_abm
pip install -r requirements.txt
# 步骤 3:运行基准情景(补贴率 75%)
python run.py --scenario baseline
# 观察输出:参保率、财政支出、赔付率
# 步骤 4:运行补贴率扫描实验(50% → 90%,步长 5%)
python run.py --scenario subsidy_sweep
# 输出四指标曲线:补贴率 → 参保率 → 财政效率 → 赔付率subsidy_sweep 参数扫描的四个输出指标:
| 指标 | 含义 | 政策关注点 |
|---|---|---|
| 参保率 | 投保农户占比 | 政策目标:≥85% |
| 财政支出 | 政府补贴总额 | 预算约束:≤8000万元 |
| 财政效率 | 每万元财政支出带动的参保率提升 | 边际效益递减点在哪? |
| 赔付率 | 保险公司理赔/保费收入 | 可持续性:60%-80% 为健康区间 |
论文写法:跑完 subsidy_sweep 后,画四指标对补贴率的折线图,找到"参保率≥85% 且财政效率最大"的拐点 → 这就是你的政策建议。
9.8.4 ABM 诚信边界
┌───────────────────────────────────────────────────────────────────────┐
│ ⚠️ ABM 仿真的三条诚信红线 │
│ │
│ 1. 仿真结果 ≠ 现实 │
│ · ABM 输出是"在假设条件下的可能结果",不是预测 │
│ · 论文中必须写"本模型结果依赖于以下假设:..." │
│ │
│ 2. 参数校准与来源必须披露 │
│ · 每一个参数都要注明数据来源(文献/统计年鉴/调研) │
│ · 禁止"拍脑袋"设定关键行为参数(如风险厌恶系数) │
│ · config.yaml 中的注释就是你的"参数审计轨迹" │
│ │
│ 3. 禁止调参凑结论 │
│ · 不得反复修改参数直到仿真结果"符合预期" │
│ · 正确做法:先确定参数(有来源)→ 跑模型 → 如实报告结果 │
│ · 如果结果与预期不符 → 讨论为什么,而不是改参数 │
│ · 敏感性分析(±20% 扰动)是合法的稳健性检验 │
│ · 多随机种子(seed=42,123,456,789,999)报告均值和标准差 │
└───────────────────────────────────────────────────────────────────────┘S9.4 延伸:AI 可以帮你写 Python 仿真代码、解释 ODD 协议、调试报错;但 AI 不能帮你编造参数值或伪造仿真输出。所有参数必须有可追溯的来源。
AI 辅助研究栏 · 第 9 章
AI 在实证分析中的合法应用
① 贴回归输出让 AI 诊断(推荐提示词模板)
我跑了一个面板回归(reghdfe),输出如下:
[粘贴 Stata 输出]
请帮我诊断:
1. 是否存在异方差疑虑?(看 Breusch-Pagan 或 White 检验 p 值)
2. 是否存在多重共线性?(看 VIF 值)
3. 是否有内生性风险?(核心解释变量是否可能与误差项相关)
4. 我的聚类标准误选择是否合理?
请不要帮我编造任何数字,只基于我贴的输出进行分析。② stata-mcp 六步法 AI 协作要点
| 六步法步骤 | AI 可以做什么 | AI 不能做什么 |
|---|---|---|
| Step 1 数据导入 | 帮你写 import excel / use 代码 | 帮你编造数据 |
| Step 2 描述统计 | 生成 summarize / tabstat 代码 | 编造描述统计数值 |
| Step 3 基准回归 | 推荐模型设定、写回归命令 | 生成回归系数 |
| Step 4 内生性 | 帮你想 IV 候选、写 ivregress 代码 | 编造第一阶段 F 值 |
| Step 5 稳健性 | 生成多组检验代码框架 | 选择性报告(AI 不知道哪些"好看") |
| Step 6 输出 | 写 esttab / putdocx 格式化命令 | 伪造表格中的数字 |
③ AI 能做 / 不能做对照表
| ✅ AI 能做 | ❌ AI 绝对不能做 |
|---|---|
| 根据你的描述生成 Stata 代码 | 生成回归系数、标准误、p 值、R² |
| 解释回归输出中各统计量的含义 | 编造"看起来合理"的数字填入论文 |
| 诊断异方差/共线性/内生性的可能原因 | 替你判断"该不该剔除这个样本" |
| 推荐识别策略(IV/DID/PSM/RDD) | 保证推荐的策略适用于你的数据 |
| 帮你写 esttab / coefplot 美化代码 | 修改你的实证结果使其"更好看" |
| 翻译统计术语为日常语言 | 替代你对理论的理解 |
AI 诚信栏 · 第 9 章
S9.1 不 p-hacking
┌─────────────────────────────────────────────────────┐
│ ✦ 诚信检查点 S9.1 │
│ │
│ 核心原则: │
│ 模型设定必须基于理论,不是基于"哪种设定最显著"。 │
│ 教材原话:"数据是用来验证模型的,而不是用来设定模型的" │
│ │
│ 具体要求: │
│ □ 不得"换三个控制变量组合终于显著了"只报显著那个 │
│ □ 不得事后剔除"异常值"以凑显著 │
│ (剔除标准必须事前确定,如 winsor2 在回归前完成) │
│ □ 不得尝试多个因变量只报告显著的那个 │
│ □ 不得隐藏不显著的尝试——规格曲线就是你的"自证清白" │
│ │
│ 自检方法: │
│ 画一张规格曲线(§9.6.2),展示所有合理设定下核心 │
│ 系数的分布。如果曲线在 0 两侧频繁穿越,说明你的 │
│ 结论不稳健——此时诚实比显著更重要。 │
│ │
│ 反面教材: │
│ · "我试了 20 种控制变量组合,第 17 种终于 p<0.05" │
│ · 论文报告 N=387,实际原始数据 N=500——中间悄悄 │
│ 删了 113 个"异常值"但没说明标准 │
│ · 先跑 ROE 不显著,换 ROA 显著了,只报 ROA 结果 │
└─────────────────────────────────────────────────────┘S9.2 稳健性检验如实报告
┌─────────────────────────────────────────────────────┐
│ ✦ 诚信检查点 S9.2 │
│ │
│ 核心原则: │
│ 稳健性检验是给读者提供完整信息,不是给自己找退路。 │
│ "失败的稳健性检验"同样必须如实报告。 │
│ │
│ 具体要求: │
│ □ 三组检验全做:主检验 + 替换变量 + 子样本 │
│ □ 所有结果写入论文表格(通常 4-6 列) │
│ □ 如果某组不显著,写"在 XX 条件下不再稳健"并讨论 │
│ □ 不得把不显著的稳健性检验藏在附录/脚注中 │
│ □ 表述格式统一: │
│ "在替换 X 变量后,核心结论保持/不再稳健" │
│ │
│ 自检方法: │
│ 检查你的论文稳健性表格是否有"全是星号"的可疑现象。 │
│ 现实中,稳健性检验有部分不显著是正常的。 │
│ │
│ 反面教材: │
│ · 跑了 10 种稳健性检验,只把显著的 4 种放进论文 │
│ · 稳健性表格所有列都 p<0.01——高度可疑 │
│ · "替换因变量后不显著"但论文中只字不提 │
└─────────────────────────────────────────────────────┘S9.3 可复现三件套
┌─────────────────────────────────────────────────────┐
│ ✦ 诚信检查点 S9.3 │
│ │
│ 核心原则: │
│ 你的实证分析必须"一键可复现"——同学拿到你的文件夹, │
│ 运行 master.do,能得到和你论文中一模一样的表格。 │
│ │
│ 具体要求: │
│ □ do 文件:从 use "data/raw/xxx.dta" 开始 │
│ · data/raw/ 只读存档(原始数据,绝不修改) │
│ · do 文件生成 data/clean/(清洗后数据) │
│ · 回归 → 表格 → 图全部在 do 文件中完成 │
│ □ data 文件夹结构: │
│ · data/raw/ → 原始数据(只读) │
│ · data/clean/ → 清洗后数据(do 生成) │
│ · data/derived/ → 中间变量(do 生成) │
│ □ log 文件: │
│ · 每次运行自动生成带时间戳的 log │
│ · log 中包含所有命令 + 输出 + 运行环境信息 │
│ │
│ 自检方法: │
│ □ 把 master.do 发给同学从零跑一遍 │
│ □ 对比 log 中的数字与论文表格是否完全一致 │
│ □ 确认 data/raw/ 从未被修改(对比 MD5 校验码) │
│ │
│ 反面教材: │
│ · "这个表格是我三个月前跑的,现在找不到代码了" │
│ · data/raw/ 被直接修改过,无法追溯原始数据 │
│ · log 文件中的 N=450 但论文写 N=453 │
└─────────────────────────────────────────────────────┘S9.4 AI 辅助计量不编造系数
┌─────────────────────────────────────────────────────┐
│ ✦ 诚信检查点 S9.4 │
│ │
│ 核心原则: │
│ AI 是你的"编程助手"和"翻译官",不是"数据生成器"。 │
│ 论文中出现的每一个数字,都必须来自你自己的 Stata 运行。│
│ │
│ 具体要求: │
│ □ AI 可以做:写代码 / 解释输出 / 诊断问题 / 推荐方法 │
│ □ AI 绝对不能做: │
│ · 生成回归系数(如"b=0.045, se=0.012, p<0.01") │
│ · 编造 F 统计量、R²、Hausman 检验 p 值 │
│ · 虚构"看起来合理"的稳健性检验结果 │
│ □ 检测红线:论文中任何一个数字,导师有权要求你 │
│ 当场打开 Stata 复现 │
│ │
│ 自检方法: │
│ □ 打开你的 log 文件,逐一核对论文表格中的数字 │
│ □ 确认每个系数都能在 log 中找到对应输出 │
│ □ 如果你在 ChatGPT/AI 对话中看到"建议系数为..." │
│ 立即警惕——这不是你的数据 │
│ │
│ 反面教材: │
│ · 问 AI "帮我写一段实证结果",AI 编造了系数, │
│ 你直接复制进论文 │
│ · 导师要求当场跑回归,你说"我回去跑给你看" │
│ · log 文件和论文表格数字不一致(说明表格是手打的) │
└─────────────────────────────────────────────────────┘本章产出物
| 序号 | 产出物 | 文件名建议 | 说明 |
|---|---|---|---|
| 1 | 实证论文草稿 | my_paper_v1.docx | ≥8000 字,含完整实证章节 |
| 2 | 基准回归表 | reports/baseline.docx | OLS/FE/RE 三列对照 |
| 3 | DID 回归表 | reports/did.docx | 双重差分主表 + 事件研究图 |
| 4 | 中介效应表 | reports/mediation.docx | Baron-Kenny 三步 + Bootstrap CI |
| 5 | 系数图 | figures/coefplot.pdf | 核心变量系数及 95% CI |
| 6 | AI 使用声明 | ai_disclosure_v1.md | 开题版(说明 AI 在哪些环节参与) |
| 7 | (选修)ABM 报告 | abm_sweep_report.md | subsidy_sweep 四指标结果与政策建议 |
提交要求:产出物 1-6 为必交项,产出物 7 为选修加分项。所有文件遵循 S9.3 可复现三件套标准(do + data + log 齐备)。
自检题
1. DID 的交互项和 2×2 因子设计的交互项是什么关系?
参考答案
本质相同。教材单元 15(qmd 行 1284)给出双因素 GLM:y = β₀ + β₁·x₁ + β₂·x₂ + β₃·x₁·x₂ + ε,其中 β₃ 是交互效应。
DID 的回归方程:y = β₀ + β₁·Treat + β₂·Post + β₃·Treat×Post + ε
对应关系:
| 因子设计 | DID |
|---|---|
| 因素 A(如课程类型) | Treat(处理组/对照组) |
| 因素 B(如教学时间) | Post(政策前/后) |
| β₃ 交互效应 | DID 估计量(处理效应) |
关键解读(qmd 行 1285):"若交互效应显著,不能独立解读主效应"——对应 DID 中"当 Treat×Post 显著时,Treat 主效应和 Post 主效应不应单独解读"。
一句话:DID 就是一个 2×2 因子设计的交互项回归,只不过因素 A 是"是否受处理"、因素 B 是"时间前后"。
2. PSM 解决选择偏差的思路和 RDD 有何不同?
参考答案
| 维度 | PSM(倾向得分匹配) | RDD(断点回归) |
|---|---|---|
| 核心思路 | 在可观测变量上找到"长得像"的对照组 | 利用处理分配的断点,比较断点两侧的个体 |
| 识别假设 | 条件独立假设(CIA):给定可观测变量 X,处理分配与潜在结果无关 | 连续性假设:潜在结果在断点处连续(无人能精确操控自己在断点哪一侧) |
| 解决的效度威胁 | 选择偏差(可观测部分) | 自选择的断点(断点附近近似随机化) |
| 估计量 | ATT(处理组平均处理效应) | LATE(断点附近局部平均处理效应) |
| 外推性 | 可推广到匹配样本范围 | 仅适用于断点附近(外推性弱) |
| 典型应用 | 比较参保农户 vs 未参保农户(匹配风险偏好等) | 分数线录取、贫困县认定(收入低于某阈值) |
一句话区别:PSM 用"统计匹配"构造反事实,RDD 用"制度断点"构造反事实。PSM 需要"所有混淆变量可观测"的强假设,RDD 只需要"断点附近无法精确操控"。
3. "换了三个控制变量组合终于显著了"——这算什么问题?(S9.1)
参考答案
这是典型的 p-hacking(p 值操纵),违反 S9.1 诚信红线。
为什么是错的:
- 每次尝试都增加"偶然发现显著结果"的概率——如果尝试 20 次,即使真实效应为零,在 α=0.05 下平均有 1 次"显著"
- 只报告最后一次(显著的)= 选择性报告 = 误导读者
- 违反教材原则(qmd 行 1255):"模型设定应该基于对所研究的现象的理论思考,而不是什么模型能够最好地拟合观测数据"
正确做法:
- 事前(看到数据之前)确定控制变量集——基于理论和文献
- 如果基准模型不显著 → 诚实报告"核心假说在本样本中未获支持"
- 如果想展示结论对设定的敏感性 → 画规格曲线(§9.6.2),穷举所有合理设定
- 讨论为什么可能不显著(样本量?测量误差?理论边界条件?)
后果:如果被发现 p-hacking,论文可能被撤稿,学术声誉受损。
4. Hausman p<0.05 但 BP-LM p>0.05 时怎么解释?
参考答案
两个检验回答不同的问题:
| 检验 | 原假设 H₀ | p 值含义 |
|---|---|---|
| Hausman | RE 与 FE 系数无系统差异(RE 一致) | p<0.05 → 拒绝 H₀ → FE 和 RE 结论不同 → 应选 FE |
| BP-LM | 不存在随机效应(σ²_u = 0) | p>0.05 → 无法拒绝 H₀ → 可能不存在个体效应 → OLS 也许够用 |
组合解读:
- Hausman 显著 → 个体效应与解释变量相关 → FE 一致、RE 不一致
- BP-LM 不显著 → 但个体效应的方差可能很小(σ²_u ≈ 0)
- 结论:选 FE(因为 Hausman 告诉你 RE 有偏),但个体效应本身不大——这意味着面板结构的"个体异质性"较弱,FE 和 OLS 的结果可能很接近
实操建议:仍然用 FE(reghdfe),因为即使个体效应小,只要它与解释变量相关就会导致 OLS/RE 有偏。在论文中写:"Hausman 检验拒绝随机效应模型(χ²=XX, p<0.05),故采用固定效应估计。"
5. IV 第一阶段 F<10 意味着什么?
参考答案
弱工具变量问题(Weak IV)。
第一阶段 F 统计量检验的是"工具变量 Z 对内生变量 X 的解释力"。经验法则(Stock & Yogo, 2005):
| 第一阶段 F | 诊断 | 后果 |
|---|---|---|
| F > 10 | 工具变量强度可接受 | 2SLS 估计近似无偏 |
| F < 10 | 弱工具变量 | 2SLS 估计严重偏误,可能比 OLS 更差 |
| F < 5 | 极弱工具变量 | 2SLS 完全不可信,置信区间无意义 |
为什么会这样:当 Z 与 X 的相关性很弱时,2SLS 本质上是在"放大噪声"——用 Z 中微弱的变异去"纯化" X,结果纯化出来的部分几乎全是噪声。
应对措施:
- 换更强的工具变量(找与 X 相关性更高的 Z)
- 使用多个工具变量(过度识别),但每个都要通过 Sargan/Hansen J 检验
- 如果实在找不到强 IV → 诚实地放弃 IV 策略,改用其他识别方法(DID/PSM/RDD)
- 报告:"第一阶段 F=6.3,低于 Stock-Yogo 临界值 10,工具变量较弱,结果需谨慎解读"
6. sgmediation 的 Sobel 检验 p<0.05 但 Bootstrap 区间包含 0 怎么办?
参考答案
以 Bootstrap 结果为准,报告"中介效应不显著"。
原因分析:
- Sobel 检验假设间接效应 a·b 服从正态分布
- 但乘积分布(a·b)通常是偏态的(右偏或左偏)
- 正态假设导致 Sobel 检验在某些情况下过度拒绝 H₀(假阳性偏高)
- Bootstrap 不依赖分布假设,直接从数据中构造置信区间,更准确
论文写法:
"Sobel 检验表明中介效应边际显著(Z=1.98, p=0.048),但 Bootstrap 1000 次的 95% 偏差校正置信区间为 [-0.003, 0.041],包含 0。鉴于 Sobel 检验依赖正态性假设而乘积分布通常偏态,本文以 Bootstrap 结果为准,认为中介效应证据不足。"
进一步建议:
- 增加 Bootstrap 次数(如 5000 次)看区间是否收窄
- 检查中介变量 M 的测量是否有较大误差
- 考虑是否存在多个并行中介路径(单一路径效应被稀释)
- 诚实报告"中介机制的证据不充分,需进一步研究"
7. 方向题:为你的假说选识别策略并说明它对应解决哪条效度威胁。
参考答案框架
答题模板(三步):
| 步骤 | 你需要回答 | 示例 |
|---|---|---|
| ① 明确假说 | X → Y 是什么? | "公司治理水平(X)提升银行盈利能力(Y)" |
| ② 识别效度威胁 | 什么因素可能让 X-Y 关系是虚假的? | "遗漏变量:管理能力同时影响治理和盈利" |
| ③ 选择识别策略 | 用什么方法排除这个威胁? | "FE 消除不随时间变的遗漏变量;或用行业平均治理水平作 IV" |
三方向参考:
【金】"资本结构(杠杆率)→ 企业价值"
- 威胁:反向因果(高价值企业主动选择高杠杆)
- 策略:IV(用行业平均杠杆率作工具)或滞后一期自变量
【险】"农业保险参保 → 农户收入稳定性"
- 威胁:选择偏差(风险厌恶者更倾向参保,本身收入就更稳定)
- 策略:PSM(匹配风险偏好、土地规模等)或 DID(利用保险试点政策的时间差异)
【农】"微型金融可得性 → 农户创业概率"
- 威胁:遗漏变量(社会网络同时影响贷款可得性和创业)
- 策略:IV(用村庄到最近银行网点的距离作工具)或 RDD(利用信用评分阈值)
关键要求:必须说清楚"为什么这个策略能解决这条效度威胁",而不只是列名字。
下一章预告:第 9 章走的是"回归路线"——用统计模型从数据中识别因果。但并非所有研究问题都适合回归。第 10 章将进入"案例研究路线":当你的问题是 How 型("某政策是如何落地的?")或 Why 型("某银行为何失败?")时,案例研究能给你回归给不了的过程性洞察。两条路线不是对立的——好的专硕论文常常是"案例 + 数据"混合设计。
📦 本章配套资源
下载配套 notebook:Wooldridge 教材数据 + Python 复现实战(.ipynb,用 Qoder / Jupyter / VS Code 打开):
pip install wooldridge linearmodels后开箱即跑,111 个教材数据集四类实证设计全流程(OLS → 面板 FE → IV/2SLS → 时间序列)- 每个回归均与教材例题答案对照(例 2.4/3.1、14.1、第 15 章 Card IV、第 11 章期限结构)——答案对不上就是代码错了
- 含 Stata ↔ Python 命令对照表与「两个取数坑」提示
农村金融业务及监管 2026 秋季 | AI 辅助金融研究学生自学手册