mcpField
E
econ-audit

econ-audit

github.com/thinkingwithagents数据与数据库1039 次安装26 周前更新
代码仓库

关于 econ-audit

econ-audit 是面向研究者的计量经济学代码审查技能,可检查 Stata、R 或 Python 分析中的设定、估计和分析风险,找出代码运行成功但可能导致错误结论的问题。

主要功能

  1. 01审查计量经济学设定
  2. 02检查标准误与聚类层级
  3. 03核查变量和控制项
  4. 04标记样本与缺失值问题
  5. 05支持完整审查和版本比较

适用场景

  1. 01检查 RCT 回归的聚类错误
  2. 02审视 DiD 代码的设定问题
  3. 03比较两个回归文件版本

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/thinkingwithagents/skills --skill econ-audit

安装后在 Claude Code 中输入/econ-audit确认已加载。

详细介绍

经济学审计——计量经济学对抗性审查

v1.0——对抗性审查工具,可发现计量经济学设定错误、估计失误和隐蔽的分析失败。它会追问:“这会得出正确的经济学结论吗?”

审查 Stata、R 或 Python 代码中的计量经济学设定错误、估计失误和可能导致错误结论的分析选择——即使代码运行时没有报错。这是分析代码的“敌对审稿人”。

参数: $ARGUMENTS

  • 文件路径(.do、.R、.py)或目录

模式(追加到参数后):

  • spec(默认)——单文件设定审查:聚类、控制变量、函数形式、样本
  • full —— 深度审查并结合项目背景:读取数据文档、相关文件、预分析计划
  • compare —— 比较两个设定文件或修改前后的版本,检查设定漂移

标志:

  • pap:path/to/pap.pdf —— 对照预分析计划进行比较
  • vars:outcome1,outcome2 —— 聚焦审计指定的结果变量
  • design:rct|did|iv|rd|panel —— 指定研究设计(若未提供则自动检测)
  • severity:high —— 仅报告高严重性问题

示例:/econ-audit code/analysis/02_main_results.do 示例:/econ-audit ./my-project full design:rct 示例:/econ-audit my_regs.do pap:pre_analysis_plan.pdf 示例:/econ-audit old_spec.do compare new_spec.do


说明

步骤 0:定位代码和背景信息
  1. 解析 $ARGUMENTS 以查找目标文件:
    • 如果是文件路径:直接读取该文件
    • 如果是目录:在其中搜索分析阶段的文件
    • 如果是裸文件名:搜索当前工作目录及其直接子目录(code/、analysis/、dofiles/)
    • 使用 glob 查找分析阶段文件:*regress*、*analysis*、*results*、*estimate*、*main*
  2. 如果项目中有 CLAUDE.md、README.md 或类似背景文件,则读取并查找:
    • 研究设计(RCT、DiD、IV、RD、面板)
    • 处理变量名称
    • 主要结果变量
    • 聚类结构(个人、家庭、村庄、学校等)
    • 预分析计划相关信息
  3. 如果是 full 模式,还需读取:
    • 数据清理代码,以了解变量构造方式
    • 主 do 文件,以了解分析流程背景
    • 任何包含“pre-analysis plan”“PAP”或“protocol”的 .pdf 或 .md 文件
    • 可用的变量标签或代码本
  4. 根据文件扩展名检测语言。解析 $ARGUMENTS 中的模式、标志和研究设计。

如果未指定,则自动检测研究设计:

  • 查找 treatment、treat、T、arm 变量 → 可能是 RCT
  • 查找与组别交互的 post、time、after → 可能是 DiD
  • 查找 ivregress、ivreg2、2sls → 可能是 IV
  • 查找 rd、bandwidth、running variable、cutoff → 可能是 RD
  • 查找 xtreg、xtset、plm、fe → 可能是面板数据

步骤 1:聚类和标准误

这是应用经济学中推断错误最常见的来源。

1.1 聚类层级
  • 确定处理分配的层级(个人、家庭、村庄、地区、学校等)
  • 检查标准误是否按处理分配层级或更高层级进行聚类
    • 标记:处理在村庄层面分配时使用 reg y treatment, robust(需要 cluster(village))
    • 标记:处理在村庄层面分配时使用 reg y treatment, cluster(household)(聚类层级过低)
    • 标记:任何回归中的聚类层级低于处理分配层级
  • 对于 DiD:检查是否按单位层级(而非时间)聚类,参见 Bertrand、Duflo 和 Mullainathan(2004)
  • 对于多层级设计:检查是否需要双向聚类(例如 cluster(village year))
1.2 聚类数量较少
  • 根据上下文/文档统计或估算聚类数量
  • 如果聚类数量可能少于 50,且未采用小样本校正(wild cluster bootstrap、CR2/CR3 标准误),则标记
  • 如果聚类变量的基数异常低,则标记
1.3 标准误一致性
  • 如果同一文件中的回归采用了不同的标准误设定,且没有解释,则标记
  • 如果同一样本中有些回归使用 robust,而另一些使用 cluster(),则标记
  • 如果 reghdfe 吸收了组固定效应,却使用了 vce(robust),则标记(应在被吸收的层级进行聚类)
1.4 异方差
  • 如果使用 reg y x 进行 OLS(完全没有 robust 或 vce()),则标记——在应用研究中几乎从不适用
  • 例外:明确采用同方差模型(很少见,必须给出理由)

第 2 步:变量解释与构造
2.1 处理变量
  • 确认处理变量为二元变量(0/1),或已针对多组处理正确编码
  • 如果处理变量看起来是连续变量,却被当作二元变量使用(或反之),则标记
  • 如果混淆了处理变量 = ITT 分配与实际接受处理(TOT),则标记
  • 如果处理变量存在缺失值,导致观测被静默删除,则标记
  • 对于多组试验:如果未检验不同组的效应是否存在差异,却将所有组别合并,则标记(有合理解释时除外)
2.2 结果变量
  • 如果结果变量以水平值而非通常适用的对数形式使用(收入、支出、工资),或反之,则标记
  • 如果结果看起来是指数,却未说明其构造方法,则标记
  • 如果结果是比率,但分母可能为零或缺失,则标记
  • 如果使用 OLS 估计二元结果,却未说明选择了 LPM,则标记(不一定有误,但应予以说明)
2.3 控制变量
  • 不良控制变量(Angrist & Pischke):如果控制变量本身会受到处理影响(处理后变量、中介变量),则标记
    • 模式:reg y treatment post_treatment_var,其中 post_treatment_var 可能位于因果路径上
    • 常见情况:教育 RCT 中的当前收入、培训项目中的当前就业状况、信息实验中的态度
  • 碰撞偏差:如果对处理和结果的共同效应变量进行了条件化,则标记
  • 控制变量大杂烩:如果某个设定包含超过 15 个控制变量,且没有给出理由或讨论过度控制,则标记
2.4 变量混淆
  • 如果变量名暗示一种含义,但用法却表明另一种含义(例如,age 被用作年份、income_monthly 被加总为年收入),则标记
  • 如果同一变量名在不同设定中采用了不同变换,却未说明各自的变换方式,则标记
  • 如果对可能为零或负值的变量进行对数变换,却未使用 log(x + 1) 或 IHS,也未说明这一问题,则标记

第 3 步:设定与函数形式
3.1 核心设定检查
  • RCT:确认基本设定为 Y = a + b*Treatment + controls + e
    • 如果缺少分层/随机化控制变量(分层固定效应、结果变量的基线值),则标记
    • 如果为平衡性检验纳入的基线协变量在不同设定中不一致,则标记
  • DiD:确认包含单位固定效应 + 时间固定效应 + 交互项
    • 如果平行趋势假设无法检验,且未予以讨论,则标记
    • 如果使用传统的双向固定效应处理分期实施的处理,却未说明 Goodman-Bacon / Sun & Abraham / Callaway & Sant'Anna 提出的问题,则标记
  • IV:检查是否报告了第一阶段、F 统计量,并讨论排除性限制
    • 如果第一阶段 F < 10,且未讨论弱工具变量问题,则标记
    • 如果工具变量数量多于内生变量数量,且未进行过度识别检验,则标记
  • RD:检查带宽选择方法、核函数选择和多项式阶数
    • 如果多项式阶数 > 2,则标记(Gelman & Imbens 2019)
    • 如果未提及 McCrary/操纵检验,则标记
    • 如果未展示多个带宽下的稳健性结果,则标记
3.2 固定效应
  • 如果个体/单位固定效应吸收了关注的变异(例如,在横截面处理效应中加入个体固定效应),请标记
  • 如果时间固定效应吸收了共同的处理时点(所有处理组同时接受处理 + 年份固定效应 = 无法识别),请标记
  • 如果使用 areg 或手动去均值,而 reghdfe 更合适且能处理单例,请标记
  • 如果某些规格包含固定效应,而其他规格不包含,且未加以讨论,请标记
3.3 交互项
  • 如果交互项 treatment#X 未包含其组成项(主效应),请标记
  • 如果在非线性模型(logit/probit)中解释交互项系数,却未说明边际效应问题,请标记
  • 如果使用三重交互项,却未明确说明其依据及解释,请标记
3.4 函数形式
  • 如果结果接近 0 或 1,却使用线性概率模型(预测值很可能超出 [0,1]),请标记
  • 如果对数-水平或水平-对数规格的解释与叙述不符,请标记
  • 如果使用二次项,却未检查转折点是否位于样本范围内,请标记

第 4 步:样本与选择
4.1 样本一致性
  • 如果不同规格的样本发生变化,却未明确记录,请标记
    • 回归中使用了不同的 if 条件
    • 使用了不同的 keep/drop 语句
    • 不同控制变量的缺失值导致样本缩小
  • 如果本应相同的表格中,各列的观测值数量发生变化,请标记
  • 确认每个回归都报告了 N,或能据此计算出 N
4.2 样本流失与选择
  • 对于 RCT:如果未处理样本流失问题(Lee 界限、样本流失表或讨论),请标记
  • 如果样本限制可能导致选择偏差(例如,基于处理后的变量删去观测值),请标记
  • 如果对多个变量使用 drop if missing(x),却未检查缺失情况是否因处理而异,请标记
4.3 异常值处理
  • 如果以不对称的方式删除或缩尾处理异常值(仅处理上尾,或对处理组和对照组采用不同百分位数),请标记
  • 如果未报告缩尾阈值,请标记
  • 如果仅展示缩尾数据的结果,而未同时展示原始数据的结果(反之亦然),请标记
  • 如果不同规格的异常值处理方式不同,却未作解释,请标记

第 5 步:插补与缺失数据

“未被要求时进行激进插补”是一个需要特别关注的问题,请密切留意。

5.1 未经授权的插补
  • 如果有任何插补未明确记录或说明理由,请标记:
    • replace x = 0 if missing(x)——将缺失值替换为 0 属于插补
    • mvencode _all, mv(0)——统一将缺失值替换为 0 几乎总是不妥的
    • 使用 ipolate 或 mipolate,却未作说明
    • 使用均值/中位数插补,却未标记被插补的观测值
  • 如果插补导致的样本量超过文档所述,请标记
  • 如果回归中使用插补值,却未进行敏感性分析,请标记
5.2 会改变结果的插补
  • 如果插补对某一组的影响系统性地大于另一组(处理组之间存在差异化插补),请标记
  • 如果插补假设(例如,缺失值 = 0)有利于研究假设,请标记
  • 对消费/支出变量,如果使用 replace x = 0 if missing(x),请标记(经济意义上的零值与真正的缺失值不同)
5.3 缺失数据处理
  • 如果通过逐行删除处理缺失数据,却未说明对样本量的影响,请标记
  • 如果将缺失指示变量(“缺失标记”)作为控制变量纳入回归,请标记(Angrist & Pischke 提醒不要这样做)
  • 如果对不同变量采用不同的缺失数据处理方法,却未说明理由,请标记

第 6 步:多重假设检验
6.1 多个结果
  • 统计检验的不同结果变量数量
  • 如果主要结果超过 3 个,且未进行多重检验校正(Bonferroni、Holm、FDR/BH、FWER),则标记
  • 如果检验了多个“结果族”,但未进行族错误率校正,则标记
  • 检查预分析计划是否规定了主要与次要结果——如有偏离,则标记
6.2 子组分析
  • 如果进行了大量子组分析,但未预注册或校正,则标记
  • 如果子组是使用处理后的变量定义的,则标记
  • 标记“寻宝”模式:检验了许多子组,却只报告显著的子组
6.3 规格搜索
  • 如果估计了许多规格,但只报告其中一部分,则标记
  • 如果报告的规格是控制变量/样本/固定效应的罕见组合,则标记
  • 如果稳健性检验均未通过,但主结果仍未加说明地呈现,则标记

步骤 7:权重与调查设计
7.1 抽样权重
  • 如果研究使用调查数据,但未出现 [pw=]、[aw=] 或 svyset,则标记
  • 如果某些规格使用了权重,而另一些未使用,且没有解释,则标记
  • 如果未讨论选择 pweight、aweight 还是 fweight,则标记
  • 如果使用 fweight 作为抽样权重,则标记(常见错误——fweight 用于频数,而非概率)
7.2 调查设计
  • 如果 svyset 的分层/聚类设置与回归的 cluster() 选项不同,则标记
  • 如果子组分析忽略了调查设计,则标记

步骤 8:删除的变量和观测值(完整模式)

full 模式下的增强检查——需要读取数据清理代码。

8.1 变量追踪
  • 如果有数据清理代码:追踪原始数据中的哪些变量进入了分析数据集
  • 标记在数据清理中构建、但在分析中从未使用的变量(可能是被遗漏的结果变量)
  • 标记出现在 PAP 中、但分析数据集中不存在的变量
  • 标记在数据清理与分析之间重命名、可能造成混淆的结果变量
8.2 观测值追踪
  • 追踪从原始数据到分析过程中的样本量:每个步骤丢失了多少观测值?
  • 如果某一步骤删除了超过 10% 的观测值,且没有明确说明理由,则标记
  • 如果最终分析样本不足符合条件样本的 80%,且未讨论样本流失,则标记
  • 将回归中的样本量与文档/PAP 中预期的样本量进行比较

步骤 9:PAP 合规性(提供 pap: 标记时)

除非设置了 pap: 标记,否则跳过。

9.1 注册的规格
  • 从 PAP 中提取主要规格
  • 将每个注册规格与实际估计的规格进行比较
  • 标记偏离之处:控制变量、函数形式、样本或聚类方式不同
  • 标记 PAP 中列出但未进行分析的结果
  • 标记已分析但未列入 PAP 的结果(注明为探索性结果)
9.2 注册的假设
  • 检查假设效应的方向是否与检验内容一致
  • 检查是否保持了主要与次要结果的区分
  • 如果论文的表述框架与 PAP 的表述框架不一致,则标记

第 10 步:生成报告

将报告保存到已审查文件所在的同一目录: econ_audit_[filename]_[YYYY-MM-DD].md

对于项目级审查: econ_audit_[project]_[YYYY-MM-DD].md

按严重程度对每项发现分类:

  • CRITICAL — 会导致推断错误。标准误有误、因果结论无效,或结论无法由分析得出。必须在任何演示或提交前修复。
  • HIGH — 存在导致推断错误的重大风险。设定选择值得质疑、缺少重要的稳健性检验,或关键假设未经检验。必须在提交前修复。
  • MEDIUM — 应当说明或检验的分析选择。可能是有意为之,但需要记录。应在修订中处理。
  • LOW — 次要问题或建议。属于标准做法,但并非绝对必要。

告知用户输出文件的完整路径。


输出格式

# Econ Audit: [filename or project name]

**Date:** [YYYY-MM-DD]
**Mode:** [spec / full / compare]
**Language:** [Stata / R / Python]
**Detected design:** [RCT / DiD / IV / RD / Panel / Cross-sectional]
**File(s) reviewed:** [path(s)]
**Reviewer:** /econ-audit v1.0

---

## Summary

**Overall assessment:** [Sound / Minor Issues / Needs Revision / Significant Concerns]
**Findings:** [N] critical, [N] high, [N] medium, [N] low

[2-3 sentence summary. Lead with the most important finding. State the design and whether the core identification strategy appears correctly implemented.]

---

## Identification & Design Assessment

[Brief assessment of whether the research design is correctly implemented in the code. This is the most important section.]

- **Treatment variable:** [name] — [assessment]
- **Clustering:** [level used] — [correct/incorrect and why]
- **Core specification:** [description] — [assessment]
- **Key assumption(s):** [parallel trends / exclusion restriction / continuity / etc.] — [tested? how?]

---

## Critical & High Findings

### F1: [Title]
- **Severity:** [CRITICAL / HIGH]
- **Category:** [Clustering / Specification / Controls / Sample / Imputation / Multiple Testing / Weights / Variable Construction / PAP Deviation]
- **Location:** [file:line_number]
- **Issue:** [What's wrong — be specific about the econometric problem]
- **Consequence:** [What goes wrong in the results — direction of bias if known]
- **Fix:** [Specific recommendation with code example if applicable]
- **Reference:** [Relevant methodological citation if applicable]

[Repeat for each critical/high finding]

---

## Medium Findings

### F[N]: [Title]
- **Severity:** MEDIUM
- **Category:** [category]
- **Location:** [location]
- **Issue:** [description]
- **Consequence:** [what could go wrong]
- **Fix:** [recommendation]

---

## Low Findings

- **F[N]:** [location] — [issue] → [recommendation]

---

## Specification Summary Table

| Spec | Outcome | Treatment | Controls | FE | Clustering | N | Flags |
|------|---------|-----------|----------|----|-----------|----|-------|
| (1) | [var] | [var] | [list] | [list] | [level] | [N] | [any] |
| (2) | ... | ... | ... | ... | ... | ... | ... |

---

## Audit Checklist

| Check | Status | Notes |
|-------|--------|-------|
| Clustering at correct level | [PASS/FAIL/WARN] | [details] |
| No bad controls | [PASS/FAIL/WARN] | [details] |
| Standard errors specified | [PASS/FAIL/WARN] | [details] |
| Treatment variable correct | [PASS/FAIL/WARN] | [details] |
| Sample consistent across specs | [PASS/FAIL/WARN] | [details] |
| No unauthorized imputation | [PASS/FAIL/WARN] | [details] |
| Multiple testing addressed | [PASS/FAIL/WARN/NA] | [details] |
| Weights appropriate | [PASS/FAIL/WARN/NA] | [details] |
| PAP compliance | [PASS/FAIL/WARN/NA] | [details] |
| Functional form appropriate | [PASS/FAIL/WARN] | [details] |
| Fixed effects correct | [PASS/FAIL/WARN/NA] | [details] |
| Outlier treatment documented | [PASS/FAIL/WARN/NA] | [details] |

---

## Next Steps

1. [Highest-priority fix]
2. [Second priority]
3. [Third priority]

原则

  • 推断优先于美观。 一份排版精美、却在错误层级进行聚类的 do 文件,比一份难看的代码却使用了正确标准误的代码更糟。始终优先处理会影响统计推断和因果结论的问题。
  • 持怀疑态度,而非敌对。 像会找出最薄弱环节的苛刻审稿人那样思考。每项标记的问题都是审稿人可能提出的质疑——最好现在就发现。
  • 理解计量经济学。 这不是通用代码审查。要理解聚类为何重要、错误控制变量如何造成估计偏误,以及缺失数据并非只是麻烦。运用 Angrist & Pischke / MHE / Mostly Harmless 的思维框架。
  • 尽可能说明偏误方向。 不要只说“这里有问题”——要说明它会使估计偏向发现效应还是远离发现效应,或者偏误方向无法确定。这能让审计结果切实可用。
  • 先询问,不要假定。 不寻常的设定可能是有意选择。如果某种选择有其合理性但并非常规做法,应标记为“请确认:这是有意为之吗?”,并解释风险,而不是说“错误:这是错的”。
  • 不要偏离到代码质量。 不要审查变量命名、缩进或注释——那是 /code-review 的工作。重点应放在分析是否会得出正确结论上。
  • 不审查数据。 不要审查数据分布、离群值或数据完整性——那是 /pipeline-audit 的工作。审查的是分析代码中所做的选择。
  • 说明依据。 标记方法问题时,请引用相关论文或教材概念(例如,讨论双重差分中的聚类时引用“Bertrand, Duflo & Mullainathan 2004”;讨论错误控制变量时引用“Angrist & Pischke 第 3 章”)。这样用户就能评估你的判断。

评论

支持 Markdown