前置条件与学习依赖 / PREREQUISITES
① 前置页面
先读 12 论文复现流程(复现包结构、调用链),再读本页的真实案例与稳健性操作。
② 软件
Stata 17+,reghdfe / estout / coefplot;会 dolog、读 SMCL。
③ 方法基础
DID / RDD / IV / SCM / RCT 的识别逻辑,见站内 07 DID08 RDD06 IV25 SCM
④ 数据来源
EJD 库网址 https://ejd.econ.mathematik.uni-ulm.de/,学习素材引用,非课程广告。

A EJD 方法地图:顶刊到底用什么方法发文

EJD 库(Empirical Journal Articles,由 Ulm 大学 Sebastian Kranz 维护)长期收录 AER、QJE、JPE、REStat、AEJ 系列、Management Science、Econometrica 等顶刊的实证论文,并把作者公开的数据 + 代码一并归档。下面所有数字均来自对该库全量条目的抓取:库规模 11,470 篇,覆盖 2005–2025 二十年,其中 97.8% 的条目附带可下载的数据文件——这是它区别于普通论文库的核心价值:你看到的不只是题目,还有能跑的代码。

11,470
收录论文(篇)
2005–2025
时间跨度(年)
97.8%
附带数据条目占比
15+
收录顶刊数

A.1 期刊分布:钱与注意力流向哪里

下图按论文数排序。可以看到 AER 一枝独秀(约 2000 篇),Management Science、REStat、REStud 构成第二梯队;AEJ 三大刊(Policy / Applied / Macro / Micro)合计已超过 2,400 篇,是近年"中型顶刊"里最活跃、且数据代码开放度最高的阵地。对学生而言,AEJ 系列复现包友好度最高——这正是本页 B 部分两个案例都选自 AEJ:Policy 的原因。

图 A1 · EJD 库各刊收录论文数
数据来源:EJD 全库抓取(2005–2025),单位:篇

A.2 代码语言分布:Stata 仍是实证事实标准

把所有复现代件按语言归类,Stata(.do + .ado)合计超过 7,300 篇次,是绝对主力;MATLAB(结构估计 / 校准 / 宏观模型常用)约 2,300 篇居次;R 与 Python 合计约 1,450 篇,增长最快但仍非主流;Julia 仍处早期。这一分布告诉你:想复现绝大多数顶刊,先把 Stata 练熟,边际收益最大;做结构估计再补 MATLAB,做文本 / ML 再补 Python。

图 A2 · 复现代码语言分布(论文数)
Stata do/ado 合并统计占比;Notebook 含 Jupyter / R Markdown

A.3 方法分布:从摘要关键词看识别策略

对全部论文摘要做方法关键词命中统计(一篇论文可命中多个方法,故合计大于总篇数)。随机实验 / RCT 遥遥领先(约 700 篇),反映近年"实验革命";面板固定效应(330)、DID(231)、RDD(201)、IV(196)构成准实验四件套;bunching、合成控制、空间、placebo/多重检验等更细的方法命中数较小但都已稳定出现在顶刊。

图 A3 · 摘要关键词命中方法分布(横向条形图)
单位:命中论文数;一篇论文可命中多个方法

A.4 每个方法的真实代表论文

下面挑出每个方法在 EJD 库中可下载、可复现的真实代表条目。作者、期刊、卷期、年份均已按 AEA / UCPress 官方信息核验;凡标"数据大小 / 代码语言"者均为 EJD 复现包元数据。

方法代表论文(题名 / 期刊 / 年份)复现包特征
DID Li, Song, Zhang & Zhang, "The Effects of a Multifaceted Poverty Alleviation Program on Rural Income and Household Behavior in China", AEJ: Economic Policy, 17(2), 2025, pp.319–357 县级 DID + CFPS 户政;数据约 35.8MB,Stata .do 约 186KB
RDD Management Science 2025 一篇断点回归复现包(EJD 收录条目,以期刊 / 年份 / 语言检索 RDD 关键词可得) Stata .do;含 RD 图与带宽敏感性表
合成控制 SCM Kumar & Liang, "Labor Market Effects of Credit Constraints: Evidence from a Natural Experiment", AEJ: Economic Policy, 16(3), 2024, pp.1–26 州级合成控制 + ML 改进权重;Stata / MATLAB
结构估计 De Groote, "Dynamic Effort Choice in High School: Costs and Benefits of an Academic Track", Journal of Labor Economics, 43(2), 2025, pp.467–502 动态离散选择(MLE),MATLAB;弗拉芒学生追踪数据
机器学习 Ash, Galletta & Giommoni, "A Machine Learning Approach to Analyze and Support Anticorruption Policy", AEJ: Economic Policy, 17(2), 2025, pp.162–193 文本/监督学习检测腐败;Python + R
RCT Kessler & Roth, "Increasing Organ Donor Registration as a Means to Increase Transplantation: An Experiment with Actual Organ Donor Registrations", AEJ: Economic Policy, 17(2), 2025, pp.60–83 "field-in-the-lab"随机实验 + 州级注册数据;Stata .do 约 84.8KB
ℹ 怎么用这张地图

不要按"方法名词"去学,要按"你手上有什么数据 → 它落在哪个方法格子 → 该格子里顶刊怎么写、怎么复现"来学。比如你有中国县级面板 + 一个 2012 年开始的政策,你就在 DID / 面板固定效应那两个格子里,直接去 EJD 搜本页表中的 Li et al. (2025) 复现包照着做。

B 真实复现工作流:两个完整案例

下面两个案例都来自 2025 年 AEJ:Economic Policy 同一期(Vol.17 No.2),是 EJD 库里数据与代码开放度最高的一类。它们恰好覆盖两种最典型的工程结构:案例一是"多源中文数据 + 受限数据 + 手工图"的复杂 DID案例二是"单 master.do 一键跑全部图表"的干净 RCT + 合成控制

B.1 案例一:中国扶贫 DID(Li, Song, Zhang & Zhang, 2025)

AEJ: Policy · 2025
The Effects of a Multifaceted Poverty Alleviation Program on Rural Income and Household Behavior in China
Rui Li, Hong Song, Jun Zhang, Junsen Zhang. American Economic Journal: Economic Policy, 17(2), 2025, pp.319–357. DOI: 10.1257/pol.20210485
评估中国政府主导的大规模、多维度精准扶贫对农村收入的影响。利用"国家扶贫开发工作重点县"的政策身份构造 DID,发现重点县农村收入提升约 10.9%,主要来自产业扶持、农业开发与公共服务改善;户层面进一步分析家庭行为变化。复现包数据约 35.8MB,Stata .do 约 186KB。

① 真实中文数据来源清单

这类中国县域研究的"硬资产"是把多源中文数据拼成一张面板。复现时必须逐源核对口径、年份、县级行政区划调整:

  • CFPS 2010–2018(中国家庭追踪调查,北京大学开放研究数据平台):户层面收入、消费、行为变量,是 household 分析部分的核心。
  • World Bank Open Data:国家级贫困率、人口等宏观对照序列。
  • WITS / TRAINS:中国出口关税 MFN 税率,用于构造县级对外暴露控制变量。
  • 《中国农村贫困监测报告 2020》(CNKI / 国家统计局):重点县名单与贫困监测口径。
  • 《中国农村统计年鉴》2008–2021:县级农业产值、耕地、农业人口等。
  • WIND(受限数据):县级财政、信贷等金融变量——受限,需凭机构授权访问
  • 第六次全国人口普查 2010:县级人口结构、城乡比。
  • 县级 / 省级统计年鉴:财政、教育、卫生等县级协变量。

② 复现包工程规范:Raw/ → Data/ 双层目录 + 输出溯源

该复现包的精髓在于每个中间 / 输出文件都标注它服务正文哪张表哪张图,让审阅者能从最终表反推到原始数据。这是"可审阅论证"的工程化。

text · 目录与输出溯源规范
poverty_alleviation_replication/
├── Raw/                      # 只读原始下载(CFPS csv、年鉴扫描表、WIND导出)
│   ├── cfps_2010_2018/
│   ├── yearbook_rural_*.csv
│   └── wind_restricted/      # 受限数据,不入版本库,仅本地
├── Data/                     # 清洗后中间/分析数据,可由代码重生成
│   ├── county_panel.dta      # 县级面板(服务 Tables 1,3,9 & Figures 4,5,A4)
│   ├── household_cfps.dta    # 户级(服务 Tables 5-8)
│   └── county_baseline.dta   # 基线(服务 Tables 1,3,9 & Figures 4,5,A4)
├── Code/
│   ├── clean_raw.do          # Raw -> Data(每步 count 记 N)
│   ├── Table_Do.do           # 行号映射:Table 1 = 26-54行 -> Table1.csv
│   └── Figure_Do.do
└── Output/
    ├── Tables/   Table1.csv ... Table9.csv
    ├── Figures/  Figure2_arcgis.png(手工)  Figure3_ppt.png(手工)
    └── logs/     wind_restricted.smcl + wind_restricted.png

③ 行号映射:Table_Do.do 第 26–54 行 → Table1.csv

规范的复现包会在 do 文件里用注释标出"这一段对应正文哪张表"。复现者据此核对:打开 Table_Do.do,定位到第 26–54 行,跑出来的就是正文 Table 1;第 26 行附近是 eststo 收集各列,第 54 行附近是 esttab using .../Table1.csv

stata · Table_Do.do(行号映射示意)
*==============================================================
* Table_Do.do  —— 每段注释标注服务正文哪张表
*==============================================================
use "$root/Data/county_baseline.dta", clear
xtset county_id year

*----- Table 1:描述性统计(重点县 vs 非重点县) -----
* [行号 26-54] -> Output/Tables/Table1.csv
eststo clear
estpost summarize rural_income ln_agr_output urban_share ///
        if treat==1, detail
esttab using "$root/Output/Tables/Table1.csv", replace ///
        cells("mean(fmt(3)) sd(fmt(3)) min max") ///
        title("Table 1: Summary Statistics, Treated Counties")

*----- Table 3:DID 主回归(县级,双向固定效应) -----
* [行号 60-95] -> Output/Tables/Table3.csv
eststo clear
eststo m1: reghdfe ln_rural_income post_treat $covars, ///
        absorb(county_id year) vce(cluster county_id)
eststo m2: reghdfe ln_rural_income post_treat $covars, ///
        absorb(county_id year province#year) vce(cluster county_id)
esttab m1 m2 using "$root/Output/Tables/Table3.csv", replace ///
        se star(* 0.1 ** 0.05 *** 0.01)

*----- Table 9:机制异质性(比较优势) -----
* [行号 102-140] -> Output/Tables/Table9.csv

④ 受限数据与手工图:区分"可自动"与"需手工"

这类论文有两个复现陷阱,必须提前知道:

  • 受限数据(WIND):作者无法把原始数据放进复现包。规范做法是提供一份 wind_restricted.smcl 日志 + 导出 PNG,证明"如果你有 WIND 授权,跑这几行就能复现该县级金融变量"。复现者没有授权时,这部分只能核对日志,不能重跑数字
  • 手工图:Figure 2 需要在 ArcGIS 里手工分级设色县级地图(地理 shapefile + 处理标签),Stata 无法一键出图;Figure 3 是 PowerPoint 手工拼的事件研究示意图。复现包会给出"数据已算好、请手工排版"的说明——不要指望 master.do 自动生成这两张
⚠ 复现这类中国县域论文的两个常见坑

(1) 县级行政区划调整:2008–2021 年间撤县设区、县界合并频繁,CFPS / 年鉴 / 普查三套县级代码必须先统一到同一口径,否则 merge 后样本莫名其妙减少。(2) 重点县名单时点:处理组身份要用"被列为国家重点县"的起始年份,而不是论文写作年份——DID 的 post 时点错了,主系数会系统性偏。

B.2 案例二:Kessler & Roth 器官捐赠 RCT + 合成控制(2025)

AEJ: Policy · 2025
Increasing Organ Donor Registration as a Means to Increase Transplantation: An Experiment with Actual Organ Donor Registrations
Judd B. Kessler, Alvin E. Roth. American Economic Journal: Economic Policy, 17(2), 2025, pp.60–83. DOI: 10.1257/pol.20220760
用"field-in-the-lab"实验让被试修改真实的器官捐赠登记状态,评估不同提问措辞对登记的影响;再结合美国各州新登记数据,用合成控制思路外推政策。复现包单文件 master.do 约 84.8KB,一键跑出全部 9 图 9 表,预计运行 1–2 小时。

这个案例是"教科书级干净复现包":一个 master.do 跑全部 9 图 9 表。它的工程范式正好与案例一相反——数据来源单一(实验面板 + 州级登记 CSV),所以能做到高度自动化。

① master.do:单入口、顺序调用
开头 clear all / set seed / cd / log using,然后依次 do clean_data.do → 各图各表子程序。从 raw CSV 一路生成最终图,预计运行 1–2 小时(实验数据量不大,但 bootstrap / 随机化推断较慢)。
② clean_data.do:从 raw CSV 生成 final dta
读入原始实验 CSV 与州级登记 CSV,做变量构造、随机化分层标签、依从性(complier)分组,输出 final_analysis.dta。这一步对应正文 Data Availability and Provenance Statements 里声明的每一个数据来源。
③ 行号映射表:9 图 9 表各占一段
复现包附一份 README 映射:Table 1 = master.do 某段、Figure 2 = 另一段。核对时定位行号即可,不必通读全部 84.8KB。
stata · master.do(干净单入口范式)
*==============================================================
* Kessler & Roth (2025) 复现主程序示意
* 单 master.do 跑全部 9 图 9 表,预计运行 1-2 小时
*==============================================================
clear all
set more off
set varabbrev off
set seed 20250501              // 固定种子(随机化推断/permutation)

global root "C:/你路径/KesslerRoth2025"
cd "$root"
capture log close
log using "log/master_$S_DATE.log", replace

* --- 数据清洗:raw CSV -> final_analysis.dta ---
do "code/clean_data.do"        // 读 raw/experiment.csv + raw/state_reg.csv
                               // 生成 data/final_analysis.dta

* --- 9 表 ---
do "code/Tables/Table1_balance.do"     // 随机化平衡性检验
do "code/Tables/Table2_itt.do"         // 意向处理效应 ITT
do "code/Tables/Table3_complier.do"    // 依从者效应 CACE
* ... Table4-9 ...

* --- 9 图 ---
do "code/Figures/Figure1_frame.do"     // 不同提问措辞对照
do "code/Figures/Figure2_state_sc.do"  // 州级合成控制外推
* ... Figure3-9 ...

display _n "===== 全部完成,请核对 Output/Tables 与 Figures ====="
log close
✓ 对照两个案例你就懂了"复现包的光谱"

案例一(中国扶贫)= 多源中文数据 + 受限数据 + 手工图,工程难点在数据拼合与"哪些能自动跑"的边界;案例二(器官捐赠)= 单源干净数据 + 一键 master,工程难点在随机化推断与依从性。真实研究落在两者之间:先判断你属于哪一端,再决定你的复现包该长什么样。

B+ 验证前人结论稳健性:标准操作三步法

"复现"只到"跑通核对"为止;"验证稳健性"是在跑通之后,主动改动设定、看主结论动不动摇。这是把一篇别人的论文变成你自己方法训练的关键。标准三步如下。

第一步:下载包 → 读 README → 跑 master → 核对表图数字

严格按 12 复现流程五步走:从 raw 重跑到 output,把生成表与正文逐列比对(符号、量级、显著性)。这一步的产出是一张"复现核对表":哪几张表对上了、哪几张差多少、差在哪一步 do 文件。

第二步:改动设定重跑(核心训练)

在跑通的包上,系统地改下列设定,每改一次重跑一次,记录主系数变化:

方法可改的稳健性维度对应 Stata 命令
DID换聚类层级(县→省→双向);换控制变量;换样本窗口;换估计器(TWFE → CSDID → stacked)reghdfe ... cluster()csdideventdd
RDD换带宽(IK / CCT / 手动);换核函数;换多项式阶数;换边界rdrobust y x, h()rdplot
合成控制换权重非负 / 凸组合约束;换预测变量;换 donor pool;安慰剂检验synth_runnerpysynth
IV换工具变量;换弱 IV 稳健推断;换过度识别检验ivreg2weakivxtivreg2
RCTITT vs CACE;换随机化推断;换协变量调整;排除分析性 attritionritestteffects

DID 换估计器:TWFE → CSDID → stacked 的代码骨架

stata · did_robustness.do(换估计器重跑)
*==============================================================
* did_robustness.do:在跑通主回归后,系统换估计器重跑
* 用法:接在主回归包之后,use 已构造好的 final.dta
*==============================================================
use "$root/Data/analysis/final.dta", clear

* --- (0) 基准:双向固定效应 TWFE ---
eststo twfe: reghdfe ln_rural_income post_treat $covars, ///
        absorb(county_id year) vce(cluster county_id)

* --- (1) 换聚类层级:从县级 -> 省级 ---
eststo twfe_prov: reghdfe ln_rural_income post_treat $covars, ///
        absorb(county_id year) vce(cluster province_id)

* --- (2) Callaway & Sant'Anna (2021) 异质性稳健 DID ---
* ssc install csdid, replace
csdid ln_rural_income $covars, ivar(county_id) time(year) ///
        gvar(first_treat_year) cluster(county_id)
estat event            // 事件研究动态效应

* --- (3) stacked regression(Sun & Abraham 2021 思路)---
* 为每个处理队列构造干净对照,避免负权重
* ssc install eventdd, replace
eventdd ln_rural_income $covars, timevar(rel_year) ///
        eventvar(treat) cluster(county_id) ///
        coefplot(-5(1)5) lag(4) leads(5) ///
        graph_op(ytitle("动态效应") title("Event Study"))

* --- 输出对照:一列 TWFE,一列 CSDID,一列 stacked ---
esttab twfe twfe_prov using "$root/Output/robust_estimator.csv", ///
        se star(* 0.1 ** 0.05 *** 0.01) ///
        mtitles("TWFE" "TWFE省聚类")

第三步:与原文数字对照 → 写复现 / 稳健性报告

改完一轮后,把"原文数字 vs 你复现数字 vs 你改设定后数字"放在一张表里,写一份简短报告。报告模板如下(可直接抄成你自己的练习):

text · 复现 / 稳健性报告模板
《[作者 年份] 复现与稳健性报告》
1. 复现对象:题名 / 期刊 / 卷期 / 年份 / DOI
2. 环境:Stata 版本、外部命令及版本、运行时长
3. 复现核对:
   - 成功复现:Table X(主系数 0.xxx,与原文差异 < 0.00x)
   - 未完全复现:Table Y(差在 …,定位到 do 文件第 … 行)
   - 受限/手工:WIND 部分仅有 log;Fig2 ArcGIS 手工
4. 稳健性改动与结论:
   | 设定           | 主系数 | 标准误 | 显著性 | 与原文一致? |
   | 原文 TWFE      | 0.109  | ...   | ***    | -           |
   | 省聚类        | 0.109  | ...   | ***    | 是          |
   | CSDID         | 0.098  | ...   | ***    | 是          |
   | 缩窗 ±3年     | 0.115  | ...   | **     | 是          |
5. 结论:主结论在 X/Y/Z 种设定下稳健;在 … 设定下敏感,
   可能原因是 …(如交叠处理异质性、弱平衡趋势)。

C 数据清洗 / 可视化 / 建模实操清单(配 Stata 代码)

C.1 三阶段文件夹规范:Raw → Clean → Analysis

无论复现别人还是做自己,第一天就把目录搭成三层。Raw 只读、绝不修改;Clean 是可重生成的中间产物;Analysis 是最终回归样本。每个阶段开头固定日志、固定种子、记录 N。

stata · 00_setup.do(项目初始化)
*==============================================================
* 00_setup.do:每个项目第一步
*==============================================================
clear all
set more off
set varabbrev off
set seed 20260911                 // 固定种子,保证可复现
set linesize 120

global root "C:/你路径/your_project"
cd "$root"

* 三阶段目录
global raw      "$root/Raw"          // 只读,绝不 save,replace
global clean    "$root/Clean"        // 中间数据,可重生成
global analysis "$root/Analysis"     // 最终回归样本
global out      "$root/Output"
global logdir   "$root/Log"

capture mkdir "$clean"
capture mkdir "$analysis"
capture mkdir "$out/Tables"
capture mkdir "$out/Figures"
capture mkdir "$logdir"

capture log close
log using "$logdir/run_$S_DATE.log", replace

* 外部命令版本登记(写进 log,方便日后核对)
which reghdfe
which estout
which coefplot

C.2 变量构造、codebook 与缺失 / 受限数据处理

每构造一个变量,就在 codebook 里登记:变量名、单位、来源、构造公式。缺失值要分"真缺失"与"结构性零";受限数据(WIND、企业保密数据)只放本地、不入版本库,并保留导出 log。

stata · 01_clean.do(变量构造与 codebook)
*==============================================================
* 01_clean.do:Raw -> Clean,变量构造 + 缺失处理
*==============================================================
use "$raw/county_raw.dta", clear

* 1) 关键被解释变量:log 农村收入(加 1 防 log(0))
gen ln_rural_income = ln(rural_income + 1)
label var ln_rural_income "log(农村人均可支配收入+1), 来源:农村统计年鉴"

* 2) 处理变量:是否国家重点县 x 政策后
gen post_treat = (treat==1 & year>=2012)
label var post_treat "DID处理=重点县且2012年后"

* 3) 缺失值:区分结构性零与真缺失
*    企业未报告 -> 缺失;本就无此收入 -> 0,不要盲目 replace
mvdecode rural_income, mv(-999 = .)        // 把 -999 编码缺失转为系统缺失

* 4) 缩尾:按年份组内 1%/99%(winsor2)
* ssc install winsor2, replace
winsor2 ln_rural_income $covars, cuts(1 99) by(year) replace

* 5) 生成 codebook,留档供审阅
codebook county_id year ln_rural_income post_treat ///
        using "$out/codebook.md", markdown replace

* 6) 每步记 N(做 flow chart)
count
display "清洗后 N = " r(N)
save "$clean/county_clean.dta", replace

C.3 顶刊图规范:事件研究 / RD / 系数森林 / 时间序列

顶刊图有约定俗成的画法:事件研究图要画动态系数 + 95% CI + 归一化在事件前一期为 0;RD 图要局部线性拟合叠加散点分箱;系数森林图横放、按大小排序;时间序列图要标政策时点。

stata · figures.do(四类顶刊图)
*==============================================================
* figures.do:四类顶刊标准图
*==============================================================
use "$analysis/final.dta", clear

* --- (1) 事件研究图:eventdd / coefplot ---
* ssc install eventdd, replace
eventdd ln_rural_income $covars, ///
        timevar(rel_year) eventvar(post_treat) ///
        absorb(county_id year) cluster(county_id) ///
        lag(5) leads(5) baseline(-1) ///
        graph_op(ytitle("政策效应") xtitle("相对政策年份") ///
        title("Figure X: Event Study") ///
        yline(0, lcolor(red%40)) xline(0, lcolor(red%40)))
graph export "$out/Figures/fig_eventstudy.png", replace width(2000)

* --- (2) RD 图:rdplot(局部线性 + 分箱散点)---
* ssc install rdrobust, replace
rdplot y running_var, c(0) h(10) ///
        title("Figure Y: RD Plot") ///
        graph_options(ytitle("结果") xtitle("分配变量"))
graph export "$out/Figures/fig_rd.png", replace width(2000)

* --- (3) 系数森林图:coefplot(异质性分组系数横放)---
eststo g1: reghdfe ln_rural_income c.post_treat#c.female $covars, ///
        absorb(county_id year) cluster(county_id)
eststo g2: reghdfe ln_rural_income c.post_treat#c.old $covars, ///
        absorb(county_id year) cluster(county_id)
coefplot g1 g2, keep(*post_treat*) vertical ///
        title("Figure Z: Heterogeneity Forest") ///
        yline(0, lcolor(red))
graph export "$out/Figures/fig_forest.png", replace width(2000)

* --- (4) 时间序列图:标政策时点 ---
twoway (line ln_rural_income year, lwidth(2)) ///
       (rcap lo ci_hi year), ///
       xline(2012, lpattern(dash) lcolor(red)) ///
       xtitle("年份") ytitle("log农村收入") ///
       title("Figure W: 处理县均值与政策时点")
graph export "$out/Figures/fig_ts.png", replace width(2000)

C.4 主回归建模设定决策树

拿到一个研究问题,建模设定按下面顺序决策:① 估计器(实验?准实验?结构?)→ ② 固定效应组合(个体 / 时间 / 个体×时间趋势)→ ③ 聚类层级(处理层级是什么就聚到哪)→ ④ 控制变量策略(先不加、再加时不变协变量、最后加 pre-trend)。

stata · decision_tree.do(建模设定递进)
*==============================================================
* decision_tree.do:建模设定逐步递进(避免"控制变量轰炸")
*==============================================================
use "$analysis/final.dta", clear

* 第1层:仅双向固定效应(最干净,先看 raw 相关)
eststo m1: reghdfe ln_rural_income post_treat, ///
        absorb(county_id year) vce(cluster county_id)

* 第2层:加时不变协变量(人口、初始收入)
eststo m2: reghdfe ln_rural_income post_treat $x0, ///
        absorb(county_id year) vce(cluster county_id)

* 第3层:加省份×年份趋势(吸收省级时变冲击)
eststo m3: reghdfe ln_rural_income post_treat $x0, ///
        absorb(county_id province#year) vce(cluster county_id)

* 第4层:换更稳的 DID 估计器(交叠处理时)
* csdid ln_rural_income $x0, ivar(county_id) time(year) ///
*        gvar(first_treat) cluster(county_id)

esttab m1 m2 m3 using "$out/Tables/main_spec.csv", replace ///
        se star(* 0.1 ** 0.05 *** 0.01) ///
        mtitles("FE only" "+协变量" "+省×年趋势")

D 模型设定假设清单:识别假设 + 检验 + 常见违规

每类因果方法都靠一组"不可直接检验、只能做证伪性检验"的识别假设成立。下表把本站涉及的方法逐一列出:核心假设、可做的检验、以及顶刊审稿人最常攻击的违规情形。写论文时,这张表就是你的"审稿人清单"——先自问每一行,再送审。

方法核心识别假设可做的检验常见违规 / 审稿人攻击点
DID 平行趋势(含交叠处理) 无处理时处理组与对照组结果趋势平行;交叠处理下还要求无负权重异偏误 事件研究图看处理前系数是否贴 0;安慰剂(假处理时点);换 CSDID / stacked 事前趋势不平行;处理时点交错导致 TWFE 负权重;预期效应
IV 相关性 + 排他性 工具与内生变量强相关;工具只通过内生变量影响结果(排他约束) 第一阶段 F 统计量(弱 IV,经验值 >10);过度识别 J 检验;弱 IV 稳健 Anderson-Rubin 弱工具变量(F<10);排他性被违反(工具走其他渠道)
RDD 连续性 潜在结果在断点处连续;个体不能精确操纵分配变量 McCrary / 密度连续性检验;协变量在断点连续;换带宽/核/多项式 精确堆点(manipulation);操纵分配变量;带宽敏感
合成控制 SCM 权重非负 + 凸组合(权重和=1);事前拟合良好;donor pool 未受污染 事前 RMSPE 比值;安慰剂检验;换 donor pool / 预测变量 事前拟合差;处理组受其他冲击溢出;权重退化到单一 donor
RCT SUTVA(无干扰);随机化;依从性(非依从时用 ITT/CACE) 平衡性检验(处理前协变量均值差);attrition 差异;随机化推断 SUTVA 违反(溢出/一般均衡);非随机 attrition;部分依从
面板固定效应 严格外生性(过去 / 现在 / 未来解释变量与误差项不相关) Arellano-Bond 序列相关;加入未来值做 Granger 式检验;动态面板 GMM 动态面板滞后被解释变量与 FE 相关(Nickell 偏误);反向因果
结构估计 MLE/GMM 模型设定正确(效用/生产函数形式);矩条件/分布假设正确;参数可识别 过度识别 Sargan/Hansen;拟合优度;out-of-sample 预测;反事实稳定性 函数形式误设;矩条件弱;参数不可识别(弱识别)
机器学习 区分预测 vs 因果;正则化引入偏误需去偏(DML) 样本外预测误差;双重交叉拟合;安慰剂 / 假标签检验 把预测精度当因果证据;过拟合;正则化偏误未校正
⛔ 一句话记住假设清单的用法

假设本身永远无法"证明成立",只能"尽量不被证伪"。顶刊与普通期刊的差距,不在于假设更强,而在于作者把每一个可能的证伪性检验都做了、并把结果摆出来。你写自己论文时,按这张表逐条准备检验,就等于提前回答了审稿人。

E 严谨论证框架:从故事到可审阅工程

E.1 顶刊论文论证链模板

一篇顶刊实证论文,无论用什么方法,论证链都高度同构。下面这条链可以直接当你写论文的目录骨架:

① 动机 Motivation
现实现象 + 政策空白 + 文献缺口。一句话说清"为什么这件事重要、为什么之前没人说清"。
② 问题 Question
把动机收敛成一个可识别的因果问题(X 对 Y 的效应),并定义处理、结果、总体。
③ 识别策略 Identification
用什么准实验 / 实验 / 结构模型切断反向因果与混杂,明确写出识别假设(对应 D 部分清单)。
④ 数据 Data
数据来源、样本构造 flow chart(每步删多少)、变量定义、codebook。
⑤ 主结果 Baseline
一张主回归表 + 一张事件研究 / RD 图,系数大小、置信区间、经济含义。
⑥ 稳健性 Robustness
按 D 部分假设清单逐一做证伪检验;对应本站 09 稳健性
⑦ 机制 Mechanism
效应通过什么渠道产生?对应 10 机制检验
⑧ 异质性 Heterogeneity
对谁效应更大?对应 11 异质性,画系数森林图。
⑨ 福利 / 政策 Welfare
量化效应的政策含义、成本收益、外部有效性边界。

E.2 复现包 = "可审阅论证"的组成部分

过去复现包被当作论文的"附属品";现在 AER / AEJ / QJE / Management Science 都把 Data Availability and Provenance Statements 与可重跑复现包当成论文正式组成部分。原因很简单:正文 8000 字无法承载从原始数据到主表的几百个决策,只有代码能承载。一个规范的复现包(master file、行号映射、README、数据来源声明)本身就是论证严谨性的证据——它让"你声称做了什么"变成"任何人都能核对你做了什么"。

E.3 借鉴方式:选一篇目标期刊论文,用其框架 + 自己的数据重做

最快的训练路径不是泛读,而是:选一篇你想投的期刊的目标论文(如本页 B 的 AEJ:Policy 两篇),完全照搬它的论证链骨架与复现工程规范,把它的数据换成你自己的、把它的政策换成你研究的政策。这样你同时练了"怎么讲顶刊的故事"和"怎么搭顶刊的工程",比读十篇综述都管用。

F 方法归位核验:本站实证组怎么分工

本页是"地图",告诉你每个方法在本站哪一页展开。下表逐项核验 EJD 方法分布里出现的方法是否都在实证组有对应页面,方便你按图索骥、交叉跳转。

方法归入本站哪个页面本页角色
面板固定效应 / 基准回归04 基准回归 · 02 数据合并与面板地图 + 决策树
DID / 交叠处理07 DID · 本页 B 案例一 + CSDID 代码真实复现案例
RDD 断点回归08 RDDrdrobust / McCrary 假设检验
IV 内生性06 IV弱 IV 检验清单
合成控制 SCM25 SCM本页 Kumar & Liang 代表论文
RCT 随机实验本页 Kessler & Roth 案例 · 16 因果图ITT/CACE、SUTVA
机器学习 / DML / 因果森林17 DML · 18 因果森林Ash et al. ML 代表论文
结构估计 MLE/GMM结构 02 MLE · 结构 03 GMM · 结构 07 动态结构De Groote 代表论文
动态面板 GMM26 动态面板 GMM严格外生假设
分位数 / 非参21 分位数与 GaR方法分布定位
空间计量27 空间计量方法分布定位
bunching / placebo / 多重检验24 显著性手法库 · 12 显著性诊断规范判别
复现流程 / 工程规范13 复现流程(前置)本页为其方法地图与真实案例延伸

交叉链接:本页与 12 论文复现流程(复现包结构与调用链)、11 显著性诊断实务(统计推断规范)、23 显著性手法库与规范判别(p-hacking / 多重检验)形成闭环——那三页讲"流程与规范",本页讲"顶刊真实怎么做、怎么照着复现与验证稳健性"。

G 网站引用、数据来源与版权说明

  • EJD 库:Empirical Journal Articles,由 University of Ulm 的 Sebastian Kranz 维护,网址 https://ejd.econ.mathematik.uni-ulm.de/。本页所有库规模、期刊 / 语言 / 方法统计数字均来自对该库公开条目的抓取,仅作学习素材引用,非课程广告。请尊重原作者与各期刊的版权条款,复现包下载后仅限个人学习使用。
  • 本页引用的真实论文(题名 / 期刊 / 卷期 / 年份 / 作者均按官方信息标注):
    • Li, Rui, Hong Song, Jun Zhang, and Junsen Zhang. 2025. "The Effects of a Multifaceted Poverty Alleviation Program on Rural Income and Household Behavior in China." American Economic Journal: Economic Policy, 17(2): 319–357. DOI: 10.1257/pol.20210485.
    • Kessler, Judd B., and Alvin E. Roth. 2025. "Increasing Organ Donor Registration as a Means to Increase Transplantation: An Experiment with Actual Organ Donor Registrations." American Economic Journal: Economic Policy, 17(2): 60–83. DOI: 10.1257/pol.20220760.
    • Kumar, Anil, and Che-Yuan Liang. 2024. "Labor Market Effects of Credit Constraints: Evidence from a Natural Experiment." American Economic Journal: Economic Policy, 16(3): 1–26. DOI: 10.1257/pol.20200683.
    • De Groote, Olivier. 2025. "Dynamic Effort Choice in High School: Costs and Benefits of an Academic Track." Journal of Labor Economics, 43(2): 467–502. DOI: 10.1086/726702.
    • Ash, Elliott, Sergio Galletta, and Tommaso Giommoni. 2025. "A Machine Learning Approach to Analyze and Support Anticorruption Policy." American Economic Journal: Economic Policy, 17(2): 162–193. DOI: 10.1257/pol.20210618.
  • Stata 代码为本页教学示意(基于上述复现包的公开工程范式改写),变量名与行号为说明性示例;实际复现请以 EJD / AEA 官方复现包中的原始代码为准。