Skip to content
Back to skills

Econ Audit

ASecurity

对抗性计量经济学审查:检查 Stata、R、Python 实证分析代码中的设定错误、聚类层级错误、坏控制变量与静默分析失误——那些代码能跑通却会得出错误经济结论的问题。 Triggers: 帮我审查这份计量代码、检查一下我的回归设定有没有问题、这段 Stata 代码的聚类层级对吗、帮我看看标准误处理得对不对、如果我是审稿人会挑什么毛病、对照预分析计划检查一下我的代码。

  • 11 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added October 20, 2026
ai-agentspythongocode-reviewgit

Security analysis

A100/100

Pro scans all 2 files and shows the line behind each finding

Scanned October 20, 2026

npx -y skills add EtherealMingo/university-teacher-skills --skill econ-audit --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Econ Audit?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Econ Audit
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/etherealmingo-econ-audit/badge)](https://www.skillsdirectory.com/skills/etherealmingo-econ-audit)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: econ-audit
description: "对抗性计量经济学审查:检查 Stata、R、Python 实证分析代码中的设定错误、聚类层级错误、坏控制变量与静默分析失误——那些代码能跑通却会得出错误经济结论的问题。 Triggers: 帮我审查这份计量代码、检查一下我的回归设定有没有问题、这段 Stata 代码的聚类层级对吗、帮我看看标准误处理得对不对、如果我是审稿人会挑什么毛病、对照预分析计划检查一下我的代码。"
---

# Econ Audit —— 对抗性计量经济学审查

*v1.0 —— 对抗性审稿人,专抓计量设定错误、估计失误与静默分析失败。它问的是:"这段代码能得出正确的经济学结论吗?"*

审查计量经济学代码(Stata、R 或 Python),找出设定错误、估计失误,以及那些即使代码无报错运行也可能导致错误结论的分析选择。它是你的分析代码的"敌意审稿人"(hostile referee)。

**参数:** `$ARGUMENTS`
- 某个文件(`.do`、`.R`、`.py`)或某个目录的路径

**模式**(附加在参数后):
- `spec`(默认)—— 单文件设定审查:聚类、控制变量、函数形式、样本
- `full` —— 结合项目上下文的深度审查:读取数据文档、相关文件、预分析计划
- `compare` —— 对比两个设定文件或修改前后版本,检查设定漂移(specification drift)

**标志(Flags):**
- `pap:path/to/pap.pdf` —— 对照预分析计划(pre-analysis plan, PAP)检查
- `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 文件(master do-file),了解流水线上下文
   - 任何文件名或内容含 "pre-analysis plan"、"PAP" 或 "protocol" 的 `.pdf` 或 `.md` 文件
   - 变量标签或代码手册(codebook,如有)
4. 若提供了 `pap:` 标志:读取 PAP 并提取已注册的设定

根据文件扩展名判断语言。从 `$ARGUMENTS` 解析模式、标志与研究设计。

**自动识别研究设计**(未指定时):
- 出现 `treatment`、`treat`、`T`、`arm` 变量 → 可能是 RCT(随机对照试验)
- 出现 `post`、`time`、`after` 与组别交互 → 可能是 DiD(双重差分)
- 出现 `ivregress`、`ivreg2`、`2sls` → 可能是 IV(工具变量)
- 出现 `rd`、`bandwidth`、`running variable`、`cutoff` → 可能是 RD(断点回归)
- 出现 `xtreg`、`xtset`、`plm`、`fe` → 可能是面板(panel)

---

### 第 1 步:聚类与标准误

**这是应用经济学中推断出错最常见的单一来源。**

#### 1.1 聚类层级
- **确定处理分配的层级**(个人、家庭、村庄、区县、学校等)
- **检查标准误是否聚类在处理分配层级或更高层级**
  - 标记:处理在村庄层面分配,却用 `reg y treatment, robust`(需要 `cluster(village)`)
  - 标记:处理在村庄层面分配,却用 `reg y treatment, cluster(household)`(聚类层级过低)
  - 标记:任何回归中聚类层级低于处理分配层级
- **DiD**:按 Bertrand, Duflo & Mullainathan (2004),检查是否聚类在个体单元层面(而非时间层面)
- **多层级设计**:检查是否需要双向聚类(two-way clustering,如 `cluster(village year)`)

#### 1.2 聚类数量过少
- 根据上下文/文档数出或估计聚类数量
- 标记:聚类数可能 < 50 且未做小样本校正(wild cluster bootstrap、CR2/CR3 标准误)
- 标记:聚类变量的基数(不同取值个数)可疑地低

#### 1.3 标准误一致性
- 标记:同一文件内不同回归的标准误设定不一致且无解释
- 标记:同样本下有的回归用 `robust`、有的用 `cluster()`
- 标记:`reghdfe` 吸收组固定效应时使用 `vce(robust)`(应聚类到被吸收的层级)

#### 1.4 异方差
- 标记:OLS 写成 `reg y x`(完全没有 `robust` 或 `vce()`)—— 在应用研究中几乎从不合适
- 例外:明确假设同方差的模型(罕见,必须给出理由)

---

### 第 2 步:变量解释与构造

#### 2.1 处理变量
- 核实处理变量是二值(0/1)或对多组处理(multi-arm)正确编码
- 标记:处理变量看似连续却被当作二值使用(或反之)
- 标记:把 ITT(意向处理)分配与实际接受处理(TOT)混为一谈
- 标记:处理变量存在缺失值,导致观测被静默丢弃
- 多组试验:标记不加检验就把所有处理组合并的做法(除非有理由)

#### 2.2 结果变量
- 标记:按惯例应取对数的变量(收入、支出、工资)却用水平值 —— 或反之
- 标记:看似指数的变量,却没有构造方法的文档说明
- 标记:结果变量是比率/比值,但分母可能为零或缺失
- 标记:二值结果用 OLS 估计而未说明这是 LPM(线性概率模型)的选择(不一定错,但应明确交代)

#### 2.3 控制变量
- **坏控制(Bad controls,Angrist & Pischke)**:标记本身受处理影响的控制变量(处理后变量、中介变量)
  - 模式:`reg y treatment post_treatment_var`,其中 `post_treatment_var` 可能位于因果路径上
  - 常见雷区:教育 RCT 中控制当前收入、培训项目中控制当前就业、信息实验中控制态度
- **对撞偏倚(Collider bias)**:标记以"处理和结果的共同结果"为条件变量的做法
- **厨房水槽式回归(Kitchen sink)**:标记无正当理由、未讨论过度控制风险而放入 >15 个控制变量的设定

#### 2.4 变量混淆
- 标记:变量名暗示一回事而用法是另一回事(如 `age` 被当作年份用、`income_monthly` 被直接加总成年度值)
- 标记:同一变量名在不同设定中以不同变换出现,却未注明哪个是哪个
- 标记:对可能取零或负值的变量直接取对数,没有用 `log(x + 1)` 或 IHS(反双曲正弦变换),也未说明该问题

---

### 第 3 步:设定与函数形式

#### 3.1 核心设定检查
- **RCT**:核实基本设定为 `Y = a + b*Treatment + controls + e`
  - 标记:缺少分层/随机化控制(分层固定效应、结果变量的基线值)
  - 标记:为平衡性加入的基线协变量在不同设定间不一致
- **DiD**:核实包含个体固定效应 + 时间固定效应 + 交互项
  - 标记:平行趋势假设无法检验且未讨论
  - 标记:错位处理(staggered treatment)下使用朴素双向固定效应,却不承认 Goodman-Bacon / Sun & Abraham / Callaway & Sant'Anna 提出的问题
- **IV**:检查是否报告第一阶段、是否报告 F 统计量、是否讨论排他性约束
  - 标记:第一阶段 F < 10 且未讨论弱工具问题
  - 标记:工具个数多于内生变量个数却未做过度识别检验
- **RD**:检查带宽选择方法、核函数选择与多项式阶数
  - 标记:多项式阶数 > 2(Gelman & Imbens 2019)
  - 标记:未提及 McCrary 密度检验/操纵检验
  - 标记:稳健性未展示多种带宽下的结果

#### 3.2 固定效应
- 标记:个体/单元固定效应吸收了感兴趣的变异(如截面处理效应中加个体固定效应)
- 标记:时间固定效应吸收了共同的处理时点(所有个体同时被处理 + 年份固定效应 = 无法识别)
- 标记:用 `areg` 或手动去均值,而 `reghdfe` 更合适且能处理单例(singletons)
- 标记:固定效应在部分设定中加入、部分不加,且未讨论

#### 3.3 交互项
- 标记:交互项 `treatment#X` 缺少构成项(主效应)
- 标记:在非线性模型(logit/probit)中直接解释交互项系数,而未说明边际效应问题
- 标记:三重交互没有明确理由和解释讨论

#### 3.4 函数形式
- 标记:对接近 0 或 1 的结果变量使用线性概率模型(预测值很可能越出 [0,1])
- 标记:对数-水平或水平-对数设定的解释口径与叙述不符
- 标记:加入二次项却未检查拐点是否落在样本内

---

### 第 4 步:样本与选择

#### 4.1 样本一致性
- **标记:样本在不同设定间发生变化且无明确说明**
  - 各回归的 `if` 条件不同
  - `keep`/`drop` 语句不同
  - 因不同控制变量的缺失而缩减样本
- 标记:本应是同一张表的各列,观测数却不一致
- 核实每个回归都报告了或可计算出 N

#### 4.2 损耗与选择
- RCT:标记未处理损耗问题(attrition,应有 Lee bounds、损耗表或讨论)
- 标记:样本限制可能引入选择偏倚(如按处理后变量剔除观测)
- 标记:对多个变量使用 `drop if missing(x)`,却未检查缺失是否随处理状态而不同

#### 4.3 离群值处理
- 标记:离群值剔除或缩尾(winsorize)不对称(只缩上尾,或处理组与对照组分位点不同)
- 标记:缩尾阈值未报告
- 标记:结果只展示缩尾后数据而未同时展示原始数据(或反之)
- 标记:离群值处理在不同设定间不一致且无解释

---

### 第 5 步:插补与缺失数据

**"未被要求却激进插补"是一个专项关注点 —— 务必仔细检查。**

#### 5.1 未经授权的插补
- 标记:任何没有明确说明或论证的插补:
  - `replace x = 0 if missing(x)` —— 用零替换缺失就是一种插补
  - `mvencode _all, mv(0)` —— 一刀切地把缺失改为零几乎总是错的
  - 无文档说明的 `ipolate` 或 `mipolate`
  - 均值/中位数插补却不标记被插补的观测
- 标记:插补使样本量超过文档所述规模
- 标记:插补值进入回归却未做敏感性分析

#### 5.2 改变结果的插补
- 标记:插补系统性地对某一组影响更大(按处理组差异插补)
- 标记:插补假设(如缺失=零)恰好有利于待验假设
- 标记:对消费/支出变量使用 `replace x = 0 if missing(x)`(真零与真缺失在经济学上含义不同)

#### 5.3 缺失数据处理
- 标记:用列删法(listwise deletion)处理缺失却不说明样本量影响
- 标记:把缺失指示变量("missing flags")作为控制变量纳入(Angrist & Pischke 明确反对此做法)
- 标记:对不同变量采用不同的缺失处理方式且无理由

---

### 第 6 步:多重假设检验

#### 6.1 多个结果变量
- 数出被检验的不同结果变量个数
- 标记:主要结果变量 >3 个却未做多重检验校正(Bonferroni、Holm、FDR/BH、FWER)
- 标记:成"族"检验结果变量却不做族内校正(family-wise correction)
- 检查预分析计划是否区分了主要与次要结果 —— 标记偏离之处

#### 6.2 子组分析
- 标记:大量子组分析既未预注册也未校正
- 标记:用处理后变量定义子组
- 标记"寻宝"模式(treasure hunting):检验了大量子组,只报告显著的

#### 6.3 设定搜寻
- 标记:估计了很多设定但只报告其中一个子集
- 标记:所报告的设定是控制变量/样本/固定效应的罕见组合
- 标记:稳健性检查全部失败,主结果却不加保留地呈现

---

### 第 7 步:权重与调查设计

#### 7.1 抽样权重
- 标记:使用调查数据却没有 `[pw=]`、`[aw=]` 或 `svyset`
- 标记:部分设定用权重、部分不用且无解释
- 标记:未讨论 `pweight`、`aweight`、`fweight` 的选择
- 标记:用 `fweight` 充当抽样权重(常见错误 —— `fweight` 是频数权重,不是概率权重)

#### 7.2 调查设计
- 标记:`svyset` 的分层/聚类与回归中的 `cluster()` 选项不一致
- 标记:子组分析中忽略调查设计

---

### 第 8 步:被丢弃的变量与观测(full 模式)

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

#### 8.1 变量追踪
- 若有清理代码:追踪原始数据中哪些变量进入了分析数据集
- 标记:在清理中构造却从未在分析中使用的变量(可能是被遗忘的结果变量)
- 标记:出现在 PAP 中却不在分析数据集中的变量
- 标记:结果变量在清理与分析之间被改名,可能造成混淆

#### 8.2 观测追踪
- 追踪从原始数据到分析样本的样本量:每一步丢失多少观测?
- 标记:任何无明确理由就丢弃 >10% 观测的步骤
- 标记:最终分析样本 < 合格样本的 80% 且无损耗讨论
- 将回归中的样本量与文档/PAP 中的预期样本量对比

---

### 第 9 步:PAP 合规性(提供 pap: 标志时)

*除非设置了 `pap:` 标志,否则跳过。*

#### 9.1 已注册设定
- 从 PAP 中提取主要设定
- 将每个已注册设定与实际估计的设定逐一对比
- 标记偏离:控制变量不同、函数形式不同、样本不同、聚类不同
- 标记:PAP 中列出却未分析的结果变量
- 标记:分析了却不在 PAP 中的结果变量(标注为探索性)

#### 9.2 已注册假设
- 检查假设的效应方向与所检验的是否一致
- 检查主要/次要的区分是否得到保持
- 标记:论文的叙述框架与 PAP 的框架不匹配

---

### 第 10 步:生成报告

**把报告保存到被审查文件所在目录:**
`econ_audit_[文件名]_[YYYY-MM-DD].md`

项目级审查:
`econ_audit_[项目名]_[YYYY-MM-DD].md`

**按严重度对每个发现分类:**
- **CRITICAL(致命)** —— 会导致错误推断。标准误错误、因果主张失效,或结论不能从分析中推出。在任何展示或投稿前必须修复。
- **HIGH(高)** —— 有显著的推断出错风险。设定选择可疑、缺少重要的稳健性检查,或关键假设未检验。投稿前修复。
- **MEDIUM(中)** —— 应当论证或检验的分析选择。可能是有意为之,但需要文档说明。在修改稿中处理。
- **LOW(低)** —— 小问题或建议。属于标准做法但非必需。

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

---

## 输出格式

```markdown
# Econ Audit: [文件名或项目名]

**日期:** [YYYY-MM-DD]
**模式:** [spec / full / compare]
**语言:** [Stata / R / Python]
**识别的设计:** [RCT / DiD / IV / RD / Panel / 截面]
**审查的文件:** [路径]
**审查工具:** /econ-audit v1.0

---

## 摘要

**总体评估:** [稳健 / 小问题 / 需要修改 / 重大疑虑]
**发现:** [N] 致命,[N] 高,[N] 中,[N] 低

[2-3 句话的摘要。先讲最重要的发现。说明研究设计,以及核心识别策略在代码中是否被正确实现。]

---

## 识别与设计评估

[简要评估研究设计是否在代码中被正确实现。这是最重要的一节。]

- **处理变量:** [名称] —— [评估]
- **聚类:** [所用层级] —— [正确/不正确及原因]
- **核心设定:** [描述] —— [评估]
- **关键假设:** [平行趋势 / 排他性约束 / 连续性 / 等] —— [是否检验?如何检验?]

---

## 致命与高严重度发现

### F1: [标题]
- **严重度:** [CRITICAL / HIGH]
- **类别:** [聚类 / 设定 / 控制变量 / 样本 / 插补 / 多重检验 / 权重 / 变量构造 / PAP 偏离]
- **位置:** [文件:行号]
- **问题:** [错在哪 —— 具体说明计量问题]
- **后果:** [结果会出什么问题 —— 已知时给出偏误方向]
- **修复:** [具体建议,适用时附代码示例]
- **参考:** [相关方法学文献(如适用)]

[对每个致命/高严重度发现重复]

---

## 中严重度发现

### F[N]: [标题]
- **严重度:** MEDIUM
- **类别:** [类别]
- **位置:** [位置]
- **问题:** [描述]
- **后果:** [可能出什么问题]
- **修复:** [建议]

---

## 低严重度发现

- **F[N]:** [位置] —— [问题] → [建议]

---

## 设定汇总表

| 设定 | 结果变量 | 处理变量 | 控制变量 | 固定效应 | 聚类 | N | 标记 |
|------|---------|-----------|----------|----|-----------|----|-------|
| (1) | [变量] | [变量] | [列表] | [列表] | [层级] | [N] | [如有] |
| (2) | ... | ... | ... | ... | ... | ... | ... |

---

## 审查清单

| 检查项 | 状态 | 备注 |
|-------|--------|-------|
| 聚类层级正确 | [PASS/FAIL/WARN] | [细节] |
| 无坏控制 | [PASS/FAIL/WARN] | [细节] |
| 标准误已设定 | [PASS/FAIL/WARN] | [细节] |
| 处理变量正确 | [PASS/FAIL/WARN] | [细节] |
| 各设定样本一致 | [PASS/FAIL/WARN] | [细节] |
| 无未经授权的插补 | [PASS/FAIL/WARN] | [细节] |
| 多重检验已处理 | [PASS/FAIL/WARN/NA] | [细节] |
| 权重使用恰当 | [PASS/FAIL/WARN/NA] | [细节] |
| PAP 合规 | [PASS/FAIL/WARN/NA] | [细节] |
| 函数形式恰当 | [PASS/FAIL/WARN] | [细节] |
| 固定效应正确 | [PASS/FAIL/WARN/NA] | [细节] |
| 离群值处理有说明 | [PASS/FAIL/WARN/NA] | [细节] |

---

## 下一步

1. [最高优先级的修复]
2. [第二优先级]
3. [第三优先级]
```

---

## 原则

- **推断重于美观。** 一个排版漂亮但聚类层级错误的 do 文件,比代码丑陋但标准误正确的文件更糟。始终把影响统计推断和因果结论的发现放在第一位。
- **对抗性,但不是敌人。** 像那个会找出最薄弱环节的敌意审稿人一样思考。每个标记都是审稿人可能提出的问题 —— 不如现在就发现它。
- **懂计量。** 这不是通用代码审查。要理解聚类为什么重要、坏控制为什么会带来偏误、缺失数据不只是麻烦事。运用 Angrist & Pischke / MHE / Mostly Harmless 的心智模型。
- **尽可能给出偏误方向。** 不要只说"这不对" —— 说明它会让结果偏向还是偏离发现效应,或者方向不明。这让审查具有可操作性。
- **询问,而非臆断。** 不寻常的设定可能是有意为之。若某个选择可辩护但不标准,标记为"待核实:这是有意为之吗?"并解释风险,而不是"Bug:这是错的。"
- **不越界到代码质量。** 不审查变量命名、缩进或注释 —— 那是 `/code-review` 的活。始终聚焦于分析能否得出正确结论。
- **不审查数据。** 不审查分布、数据中的离群值或数据完整性 —— 那是 `/pipeline-audit` 的活。审查的是*分析代码中做出的选择*。
- **引用你的依据。** 标记方法学问题时,引用相关论文或教科书概念(例如 DiD 聚类引 "Bertrand, Duflo & Mullainathan 2004",坏控制引 "Angrist & Pischke 第 3 章")。这给用户评估你的主张提供了依据。

---

## 来源与许可

上游 [eabeam/econ-skills](https://github.com/eabeam/econ-skills)(实证经济学研究可复用 AI 技能集,含 econ-audit / data-dictionary / lit-review 三个子技能),许可证见上游仓库,2026-09-10 收录(commit 1b0238d);原文英文,本包译为简体中文。

Files in this skill

  • LICENSE1.2 KB
  • SKILL.md19.5 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.