scientific-agent-skills:hypothesis-generation 技能的因果推断与声明纪律(Estimand、偏差路径与声明语言规范)
【免费下载链接】scientific-agent-skillsTurn any AI agent into an AI Scientist. The #1 Agent Skills library for science, used by 190,000+ scientists worldwide. 165 ready-to-use validated skills plus 100+ scientific databases covering biology, chemistry, medicine, and drug discovery. Compatible with Cursor, Claude Code, Codex, Pi, Antigravity, and the open Agent Skills standard.项目地址: https://gitcode.com/GitHub_Trending/cl/scientific-agent-skills
本文基于 scientific-agent-skills 仓库中hypothesis-generation技能的参考文档 causal_inference_and_claims.md,系统讲解该技能如何约束"从观察走向因果"的全部环节:先区分五类科学目标,再定义因果 estimand(估计目标),然后逐一排查混杂、选择、碰撞、反向因果与测量偏差,最后用受约束的声明语言和配套的本地 linter(lint_causal_claims.py)对 Markdown 草稿做词法级审计。读完后,你将掌握一套可复制的因果声明纪律:如何在写作前固定 estimand、如何为每一行因果语言标注识别逻辑与风险状态、以及如何用确定性 CLI 工具自查声明语言与证据强度是否匹配。
五类科学目标:先回答"你在问什么"
该文档的核心立场是:关联、预测、干预效应与机制回答的是不同的问题,在动笔之前必须先明确自己的科学目标属于哪一类:
- 描述性(Descriptive):分布或模式是什么?
- 关联性(Associational):观测数据中测量到的变量如何共同变化?
- 预测性(Predictive):在目标场景中,信息对结局的预测能力如何?
- 因果性(Causal):在指定的干预或暴露条件下,什么会不同?
- 机制性(Mechanistic):因果变化通过什么过程发生?
文档特别指出一个常见误区:模型可以预测得很准,却没有识别出任何因果效应;一个随机化效应估计可以识别干预对比,却远未建立完整机制。这与技能主文件 SKILL.md 中"绝不从关联、时间顺序、预测准确度或模型输出推断因果"的硬性边界(Non-negotiable boundaries)一脉相承——五类目标正是该边界在分析层面的具体展开。
对应地,SKILL.md 的工作流第 6 步"声明声明类型与 estimand"要求把每个目标归类为 descriptive / associational / predictive / causal / mechanistic 五类之一,再进入本文后续的 estimand 与偏差风险流程。
定义因果 Estimand:先于估计量存在的估计目标
文档遵循因果问题框架与 ICH E9(R1) 原则(在适用时),要求在选择任何估计量或模型之前,先书面固定因果 estimand 的八个要素:
- 总体/系统(Population/system):该对比适用于谁、适用于什么系统?
- 干预/暴露(Intervention/exposure):设定、分配或对比的条件是什么?
- 比较(Comparator):与之对比的替代条件是什么?
- 结局(Outcome):什么变量受到影响、如何测量?
- 时间范围(Time horizon):结局在何时评估?
- 总体摘要(Population summary):均值差、风险比、分位数对比、生存摘要或其他目标量。
- 中间事件(Intercurrent events):当分配后事件影响解释或测量时,如何处理?
- 治疗版本(Treatment versions):干预是否被充分良好地定义?
这条"estimand 先于 estimator"的纪律在仓库的 schema 校验器中得到了强制:模板记录 hypothesis_record_template.json 的顶层键包含causal_estimands,而测试 test_scripts.py 中的test_causal_question_requires_estimand验证了:一旦causal_estimands为空,校验报告即报CAUSAL_QUESTION_REQUIRES_ESTIMAND错误,记录被判为无效。也就是说,"提出因果问题却没有 estimand" 在工具链层面是结构性不通过,而不只是写作建议。
反事实对比与观测数据下的识别假设
因果效应比较的是同一目标单元在不同条件下的结局,而同一单元通常不可能同时观测两种条件,因此识别依赖设计与假设。对观测性数据,文档要求明确列出七类声明:
- 目标试验模拟(target-trial analogue)或其他设计逻辑;
- 一致性/良好定义干预假设;
- 可交换性/无未测混杂假设;
- 正值性/重叠(positivity/overlap);
- 干扰假设(interference);
- 测量与缺失假设;
- 估计过程引入的模型假设。
文档还有一句关键的写作禁令:不要写"已控制混杂(controlled for confounding)"仿佛调整就证明了可交换性。统计调整只能消除已测量、已正确纳入的混杂路径,它不能自证无未测混杂。
偏差路径逐一排查
文档把偏差风险拆成五条路径,每条都给出了具体的风险点与应对手段。这是本技能在"候选解释生成"(SKILL.md 工作流第 5 步)中的核心清单——rival 候选解释必须覆盖混杂、选择、碰撞、反向因果与测量这几类偏误。
混杂(Confounding)
暴露/干预与结局的共同原因可以制造或掩盖关联。文档列出的应对包括:设计、可行的伦理下随机化、限制、匹配、测量并调整有依据的共同原因、阴性对照、敏感性分析或三角验证。具体风险有四类:
- 未测量或测量粗糙的共同原因;
- 受先前治疗影响的时间依变量混杂;
- 对工具变量、中介变量或碰撞变量的不当调整;
- 粗糙分类后的残余混杂。
选择偏差(Selection bias)
样本进入、分析进入、随访或结局观测本身可能同时依赖于暴露与结局的原因。文档要求记录以下信息:抽样与纳入标准、参与与知情同意、剔除、失访与删失、完整病例限制、测量可得性,以及数据链接引入的条件化。
碰撞偏差(Collider bias)
碰撞变量是两变量的共同结果,对其或其后代变量做条件化会打开非因果路径。文档列举的常见来源:进入研究或亚组的筛选;限制为已诊断、住院、已检测或存活者;调整暴露后受结局另一原因影响的变量;在缺失机制共同受因时使用完整病例。协变量越多并不自动更好——这一句直接反对"把所有变量塞进模型"的默认做法。
反向因果(Reverse causation)
结局或其前驱因素可能反过来影响暴露或测量;横断面顺序对方向性的证据尤其弱。文档给出的对策是时间序列设计、滞后测量、新发结局、干预、阴性对照,或必要时显式保留双向候选。
测量偏差(Measurement bias)
测量误差可以:衰减或膨胀估计值、随暴露或结局不同而不同、诱导表观交互、扭曲协变量调整、影响进入分析的筛选。文档强调:操作化与验证是因果设计的一部分,不是事后的文档任务——这一点与 SKILL.md 第 8 步"操作化并验证测量"及其检查脚本check_operationalization.py的分工相吻合。
中介、效应修饰与混杂:先标注角色,再分析
文档用三条规则区分三种极易混淆的角色:
- **中介(mediator)**位于因果路径上;对它做调整会把目标从总效应改为直接效应或受控效应,并引入额外假设;
- **效应修饰(effect modifier)**描述因果对比在分层间的差异,它与统计交互并非在所有尺度上同义;
- 混杂(confounder)是相对于目标因果对比与设计定义的,而不是"与结局相关"这么简单。
文档要求在分析之前标注每个变量的预期角色,并用领域知识与因果结构(如 DAG)给出依据。
阴性对照:不是装饰性的未处理组
文档依据 Lipsitch、Tchetgen Tchetgen 和 Cohen 的框架区分两类阴性对照:
- 阴性对照暴露:不应通过所提议机制引起目标结局,但应与目标暴露共享相关混杂/偏差路径;
- 阴性对照结局:不应被目标暴露通过所提议机制引起,但应共享相关偏差路径。
每个阴性对照必须书面回答五个问题:为何目标机制不可能起作用、应共享哪些偏差、预期结果是什么、对照失败意味着什么、对照非零结果的替代解释有哪些。文档同时划定能力边界:阴性对照在假设下能检测部分偏差,但不能证明偏差的缺席。这与 SKILL.md 工作流第 7 步"阴性对照必须是无法通过目标机制起效、且共享相关偏差路径的对照,而非装饰性未处理组"的表述一致,并在资产模板 falsification_controls_template.json 中以结构化字段落地。
声明语言规则:关联、因果、机制三档措辞
文档给出三档声明语言的使用条件:
关联性声明可使用:
- "was associated with"(与……相关);
- "co-varied with"(与……共同变化);
- "predicted in the evaluated dataset"(在所评估数据集中做出预测);
- "the adjusted association"(调整后的关联)。
并且必须同时说明设计、总体、时间点、效应/摘要度量、不确定性与局限。
因果动词(causes、reduces、prevents 等)只有在同时满足五个条件时才能使用:因果 estimand 明确、设计/识别逻辑已陈述、假设与敏感性分析可见、混杂/选择/碰撞/反向因果/测量风险均已被处理、语言与证据强度校准。对观测性研究,文档建议用"在所述假设下估计的因果效应"(estimated causal effect under the stated assumptions)替代不加限定的因果断言。
机制性声明需要区分五类证据:对过程步骤的直接证据、中介或中间测量、扰动/救援证据、时间顺序、以及仅凭类比或合理性。文档的总结句是:一个因果干预效应本身并不验证所提议的路径。
Markdown 声明标注与本地 Linter
该技能把上述语言规则落成了一套行内标注语法,并配套一个纯词法、本地、确定性的 linter:lint_causal_claims.py。
标注示例(来自参考文档,逐行生效):
[claim:associational] Exposure X was associated with outcome Y in the observed cohort. [claim:causal][estimand:E1][identification:observational_assumption_dependent][confounding:unresolved][selection:assessed][collider:assessed][reverse-causation:assessed] Under the stated assumptions, intervention X would reduce outcome Y over 12 months.运行方式:
python3 scripts/lint_causal_claims.py local-draft.md该命令在技能目录内以相对路径执行;-o可选输出 JSON 报告,--force允许覆盖已有输出文件。
从源码看标注语法与校验规则
阅读 lint_causal_claims.py 可以确认文档中规则的完整实现细节:
- 允许的标注键由正则
TAG_RE限定为六个:claim、estimand、identification、confounding、selection、collider、reverse-causation(大小写不敏感); - 允许的声明类型
CLAIM_TYPES为causal、associational、descriptive、predictive、mechanistic,与五类科学目标一一对应; - 允许的识别类型
IDENTIFICATION_TYPES包括randomized、quasi_experimental、observational_assumption_dependent、mechanistic_experiment、other_assumption_dependent——注意后两个明确保留了"假设依赖"这一状态; - 风险状态
RISK_STATES只有三个:assessed、unresolved、not_applicable。文档对此有一句重要澄清:"assessed" 只记录存在人工评估,并不意味着风险不存在; - 因果声明的必备标注
REQUIRED_CAUSAL_TAGS为estimand、identification以及四个风险标注(confounding / selection / collider / reverse-causation),任一缺失都会报CAUSAL_CLAIM_MISSING_*_TAG错误。
触发词与错误码
linter 用两个词法正则驱动核心检查(见 lint_causal_claims.py):
CAUSAL_RE匹配 causes/caused/causal effect/effect of/leads to/results in/increases/reduces/prevents/improves/worsens/drives/mediates/produces 等因果动词;ASSOCIATION_RE匹配 associated with/association/correlates with/correlation/co-varied with/predicts/linked to 等关联表述。
由此产生的主要错误/警告语义包括:
| 代码 | 级别 | 含义 |
|---|---|---|
UNMARKED_CAUSAL_LANGUAGE | 错误 | 行内出现因果动词但没有[claim:...]标注 |
CAUSAL_LANGUAGE_IN_NONCAUSAL_CLAIM | 错误 | 标注为associational等却使用了因果动词——即"用标签掩盖因果语言" |
CAUSAL_CLAIM_MISSING_*_TAG | 错误 | 因果声明缺少六个必备标注之一 |
INVALID_CLAIM_TYPE/INVALID_IDENTIFICATION_TAG/INVALID_*_STATE | 错误 | 标注取值不在允许集合内 |
DUPLICATE_*_TAG | 错误 | 同一标注键在一行重复 |
UNRESOLVED_*_RISK | 警告 | 某风险状态为unresolved——报告仍有效,但风险被显式暴露 |
ESTIMAND_TAG_ON_NONCAUSAL_CLAIM | 警告 | 非因果声明携带 estimand 标注 |
报告结构(lint_causal_claims.py)包含schema_version: "2.0"、valid、status(VALID_LEXICAL_LINT或INVALID_CLAIM_MARKUP)、errors、warnings、各声明类型计数、因果/关联触发行计数,以及一段固定notice:该确定性词法 lint不能判定某语言是否真正因果、estimand 是否定义良好、识别假设是否成立,所有被标记与未被标记的声明都需人工复核。这与文档"linter 是词法的,可能漏掉因果语言、可能误报良性短语、无法判断设计是否识别了效应"的声明完全一致。
测试 test_scripts.py 固化了三条关键行为:
test_unmarked_causal_language_is_invalid:"Condition X causes outcome Y."一行直接报UNMARKED_CAUSAL_LANGUAGE,且报告中不含原文片段(只输出规则码与行号);test_fully_annotated_causal_claim_is_structurally_valid:文档中的完整标注示例行校验通过,同时因[confounding:unresolved]产生UNRESOLVED_CONFOUNDING_RISK警告——"结构有效"与"风险未解决"并存,这正是文档所倡导的表达方式;test_associational_tag_cannot_hide_causal_verb:[claim:associational]标签下使用causes动词被CAUSAL_LANGUAGE_IN_NONCAUSAL_CLAIM拒绝,即标签不能用来"洗白"因果语言。
退出码遵循技能约定的三段式:0结构有效、1完成校验但存在错误、2输入格式错误/不安全(见 SKILL.md 的本地工具索引与 tool_reference.md 的完整 schema 说明)。
干预试验语境:报告规范不等于有效性证明
文档最后为干预类假设划定试验语境清单:
- 目标、estimand、结局、时间点、伤害与分析保持一致;
- 方案报告采用 SPIRIT 2025、试验结果报告采用 CONSORT 2025;
- 保留对方案与统计分析计划的访问;
- 报告启动后的重要变更与非预设结局/分析;
- 在适用时包含伤害与参与者/公众参与。
文档同时给出能力边界:报告完整性不是伦理批准、设计有效性、监管合规或治疗有效性的证明。这一句与 SKILL.md 中"脚本批准不是伦理、安全、监管或科学批准"的原则互相呼应,也提醒读者:本文讨论的全部工具链(schema 校验、词法 lint、对照审计)都是结构与一致性检查,判定科学结论的责任始终在人工。
小结:把"声明纪律"做成可执行流水线
该参考文档的价值在于把因果推断中通常只存在于专家头脑里的纪律,拆解为三层可验证工件:
- estimand 清单——八个要素在分析前固定,schema 层面强制(
CAUSAL_QUESTION_REQUIRES_ESTIMAND); - 偏差路径清单——混杂、选择、碰撞、反向因果、测量五类风险各自有识别信号与记录项,候选 rival 必须覆盖;
- 声明语言 + 行内标注 + 词法 linter——三类语言各有使用条件,标注语法与风险状态由 lint_causal_claims.py 确定性校验,测试 test_scripts.py 固化其行为。
需要始终记住的适用前提:这些工具是无网络、无外部依赖、本地确定性运行(SKILL.md 声明要求 Python 3.11+ 标准库),它们校验的是"声明是否与其声称的证据等级匹配",而非科学真值;linter 本身也是词法的,最终判断必须保留给人工复核。
【免费下载链接】scientific-agent-skillsTurn any AI agent into an AI Scientist. The #1 Agent Skills library for science, used by 190,000+ scientists worldwide. 165 ready-to-use validated skills plus 100+ scientific databases covering biology, chemistry, medicine, and drug discovery. Compatible with Cursor, Claude Code, Codex, Pi, Antigravity, and the open Agent Skills standard.项目地址: https://gitcode.com/GitHub_Trending/cl/scientific-agent-skills
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考