Agent Systems / Empirical Research

StatsPAI 助力实证研究:从数据与问题到经过审计的因果估计

把“跑个回归”变成 agent-native 工作流:识别设计 → 推荐估计量 → 拟合(handle) → 审计稳健性 → 敏感性 → 可核验引用。

StatsPAI 是一个 agent-native 的因果推断工具集(MCP),把上百个因果与计量方法(DiD、IV、RD、合成控制、DML 等)暴露成可调用工具,并给出推荐工作流:先识别设计,再推荐估计量,拟合后拿到一个 result handle,用它接入审计、敏感性与引用工具。它的价值不是“替你想因果”,而是把执行、审计与出处管好,让你专注识别与解释。

先看这里

学完这一页你应该会什么

01

理解 agent-native 因果工作流:识别 → 推荐 → 拟合 → 审计 → 敏感性 → 引用。

02

会用 result handle(result_id)把估计串进下游工具,不用反复传 beta / sigma。

03

知道 audit 会枚举仍缺的稳健性检查,把识别从事后辩护变成清单。

04

会做至少一项敏感性分析(如 E-value),量化对未观测混淆的稳健程度。

05

坚持引用纪律:文献只来自可核验 bib,绝不让模型杜撰。

学习路径

学习路径:识别 → 推荐 → 拟合 → 审计 → 引用

按这条路径理解 StatsPAI:先识别设计,再推荐估计量,拟合拿到 handle,审计稳健性并做敏感性,最后用可核验引用收尾。

  1. Step 1

    Detect

    数据形态 → 设计。

  2. Step 2

    Recommend

    设计 → 稳健估计量。

  3. Step 3

    Fit

    拟合返回 result handle。

  4. Step 4

    Audit

    枚举缺失检查与覆盖率。

  5. Step 5

    Cite

    只引可核验 bib。

01 / 直觉

核心直觉

大多数人把统计软件当“命令集合”:记住一堆命令。StatsPAI 把它变成“工作流”:先问这是什么设计,再问该用什么估计量。

识别永远先于估计:同一份面板,错把交错 DiD 当普通 TWFE 会有偏;先判定设计,才谈估计量。

result handle 是关键抽象:拟合一次得到 result_id,后续审计、敏感性、出表都引用它,证据链不断。

可信不是“跑出一个星号”,而是“审计覆盖 + 敏感性 + 可核验引用”——这与整门课的因果精神一致。

02 / 数学

agent-native 因果工作流的形式化

01 / 识别设计

把数据形态映射到设计:面板+交错处理→DiD,断点→RD,工具→IV,否则可观测选择。

02 / 推荐估计量

每种设计对应稳健估计量,避免误用(如交错处理下 TWFE 有偏)。

03 / 估计量(ATT)

多数政策评估的目标是处理组的平均处理效应。

04 / 结果 handle

拟合返回一个句柄,封装系数、方差与诊断,供下游工具引用。

05 / 审计覆盖

审计把识别变成清单:已完成检查占推荐检查的比例。

06 / 敏感性(E-value)

E-value 衡量未观测混淆需多强才能解释掉效应;越大越稳健。

03 / 代码

代码案例:从识别到审计的工作流

下面用纯 Python 模拟 StatsPAI 工作流的逻辑:识别设计、推荐估计量、用 handle 串联、审计覆盖、E-value 敏感性、引用纪律。真实项目用 StatsPAI MCP 工具。

案例 1:按设计推荐稳健估计量

识别出设计后,让 StatsPAI 推荐匹配的估计量,避免方法误用。

RECOMMEND = {
    "staggered_did": "callaway_santanna",
    "regression_discontinuity": "rdrobust",
    "instrumental_variables": "ivreg",
    "selection_on_observables": "dml",
}
design = "staggered_did"
print(f"design={design} -> recommended estimator: {RECOMMEND[design]}")
print("reason: TWFE is biased under heterogeneous treatment timing")

预期输出

design=staggered_did -> recommended estimator: callaway_santanna
reason: TWFE is biased under heterogeneous treatment timing

怎么读这段代码

  • 交错处理下 TWFE 有偏,推荐 callaway_santanna。
  • 设计驱动估计,是“用对方法”的第一步。

案例 2:用 result handle 串联估计与审计

拟合返回一个 result_id,下游审计直接引用它,不必反复传 beta / sigma。

results = {}
def fit(estimator, as_handle=True):
    rid = f"res_{len(results)+1}"
    results[rid] = {"estimator": estimator, "att": 0.073, "se": 0.021}
    return rid

def audit_result(result_id):
    r = results[result_id]
    return {"id": result_id, "t_stat": round(r["att"] / r["se"], 2),
            "missing": ["pretrends_test", "honest_did", "sensitivity"]}

rid = fit("callaway_santanna", as_handle=True)
print("handle:", rid)
print("audit:", audit_result(rid))

预期输出

handle: res_1
audit: {'id': 'res_1', 't_stat': 3.48, 'missing': ['pretrends_test', 'honest_did', 'sensitivity']}

怎么读这段代码

  • handle 让证据链不断,多步分析不易出错。
  • audit 直接基于 handle 给出 t 值与仍缺的检查。

案例 3:审计覆盖率把识别变成清单

把推荐的稳健性检查列成清单,已完成 / 仍缺一目了然。

recommended = {"pretrends_test", "honest_did", "sensitivity", "placebo", "cluster_se"}
done = {"pretrends_test", "cluster_se"}
coverage = len(done) / len(recommended)
print(f"robustness coverage = {coverage:.0%}")
print("still missing:", sorted(recommended - done))

预期输出

robustness coverage = 40%
still missing: ['honest_did', 'placebo', 'sensitivity']

怎么读这段代码

  • 覆盖率 = 已做 / 推荐,识别从事后辩护变成飞行前清单。
  • 缺口明确,就知道下一步补什么。

案例 4:E-value 敏感性分析

E-value 衡量未观测混淆需多强才能解释掉效应,越大越稳健。

import math
def e_value(rr):
    if rr < 1:
        rr = 1 / rr
    return round(rr + math.sqrt(rr * (rr - 1)), 2)

for rr in (1.2, 1.5, 2.0):
    print(f"RR={rr} -> E-value = {e_value(rr)}")

预期输出

RR=1.2 -> E-value = 1.69
RR=1.5 -> E-value = 2.37
RR=2.0 -> E-value = 3.41

怎么读这段代码

  • E-value 随效应量增大而增大。
  • 它把“会不会有遗漏变量”变成一个可报告的数字。

案例 5:引用纪律——拒绝杜撰文献

所有引用只能来自可核验 bib;不在库里的 key 一律拒绝。

VERIFIED_BIB = {
    "callaway2021": "Callaway & Sant'Anna (2021), J. Econometrics",
    "goodmanbacon2021": "Goodman-Bacon (2021), J. Econometrics",
}
def cite(keys):
    out, bad = [], []
    for k in keys:
        (out if k in VERIFIED_BIB else bad).append(k)
    return {"cited": [VERIFIED_BIB[k] for k in out], "rejected_invented": bad}

print(cite(["callaway2021", "smith2099"]))

预期输出

{'cited': ["Callaway & Sant'Anna (2021), J. Econometrics"], 'rejected_invented': ['smith2099']}

怎么读这段代码

  • 模型最危险的不是“像机器”,而是杜撰看似真实的引用。
  • bibtex(paper.bib 单一来源)是唯一可信来源。

04 / 案例

案例:用 StatsPAI 工作流评估一个交错推行的政策

  • 问题:某政策在不同地区交错推行,想估计它对企业投资的平均处理效应,数据是地区-年面板。
  • detect_design 判定为 staggered DiD;recommend 建议 callaway_santanna,因为交错处理下 TWFE 会因负权重而有偏。
  • 拟合得到 result handle;audit_result 指出仍缺 pretrends、honest DiD、安慰剂等检查,并给出覆盖率。
  • 补做敏感性(E-value / honest DiD)后,报告估计 + 区间 + 审计覆盖 + 敏感性 + limitations;所有引用走 bibtex,杜绝杜撰。

05 / 因果

通向因果:把整门课收束成一条可审计的流水线

StatsPAI 把前三周学的设计(DiD / IV / RD / 合成控制 / DML)统一成一条 agent-native 流水线:识别在前、估计在中、审计与敏感性在后、引用收尾。它是“用 AI 做因果”的落地形态。

01 / 设计驱动估计(design → estimator)

先判定设计,再让 StatsPAI 推荐匹配的估计量,避免方法误用。

02 / 证据链不断(handle → downstream)

用 result_id 把估计、审计、敏感性、出表、引用串成可复跑的证据链。

03 / 审计即识别(audit → checklist)

把识别假设变成审计清单,覆盖率可量化,缺口可补。

04 / 可核验引用(claim → citation)

每个结论都对应可核验的文献与代码,杜绝杜撰。

三条红线:(1) 识别来自设计,工具只换函数形式,不替你辩护假设;(2) 估计未经审计与敏感性不得当作结论;(3) 引用只走可核验 bib,模型不得杜撰文献。

06 / 风险

常见误区

跳过识别直接选估计量:交错处理下用 TWFE 会因负权重有偏。
把统计显著当成因果证据:没有审计与敏感性的星号不可信。
反复手传 beta / sigma 到下游,容易出错;应使用 result handle 串联。
不做敏感性分析,无法回答“未观测混淆有多大威胁”。
让模型杜撰文献:引用必须来自可核验 bib(paper.bib 单一来源)。
把工具输出直接当结论:识别假设与结论边界仍需人工判断。

配套资源

下载实操资料

参考资料