mcpField
A
alterlab-test-selection-guard

alterlab-test-selection-guard

github.com/alterlab-ieu数据与数据库7859 次安装5 周前更新
代码仓库

关于 alterlab-test-selection-guard

alterlab-test-selection-guard 是一项统计规范技能,依据研究问题和数据结构约束检验选择,防止根据 P 值挑选检验。它面向需要选择或审查统计检验的研究者;实际计算和模型拟合交由配套技能完成。

主要功能

  1. 01按数据结构选择检验
  2. 02要求先做并报告假设检查
  3. 03识别根据结果换检验
  4. 04处理同一假设的多重检验
  5. 05提供命令行检验选择器

适用场景

  1. 01根据变量和研究设计确定检验
  2. 02评估因结果不显著而更换检验
  3. 03审查同一假设下的多次检验
  4. 04将已选检验交由配套技能执行

安装

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

$npx skills add https://github.com/alterlab-ieu/alterlab-academic-skills --skill alterlab-test-selection-guard

安装后在 Claude Code 中输入/alterlab-test-selection-guard确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

evals/
evals.json
references/
assumption_gate.md
decision_tree.md
multiplicity.md
rationalizations.md
scripts/
test_picker.py

详细介绍

检验选择守则——铁律:看到 P 值后不得选择检验

技能类型:强制纪律型。 这是一层轻量的纪律约束,不是统计引擎。它不会运行检验、拟合模型或计算功效——它强制规定操作的顺序,确保检验依据数据的形态来选择,而绝不依据检验结果。实际计算请交由以下技能完成。

必备背景——此技能负责协调,不会重新实现以下功能:

  • alterlab-statistical-analysis——运行所选检验、假设检查(其 assumption_checks.py:Shapiro-Wilk、Levene、Q-Q)、功效分析和 APA 格式报告。
  • alterlab-statsmodels——在检验确定后拟合模型(OLS/GLM/mixed/ARIMA)。
  • alterlab-scientific-thinking——从上游判断研究设计的有效性、偏差和混杂因素。
  • alterlab-preregistration-discipline——此关卡所依据的冻结分析计划。

用户需要执行时,请转交给相应技能。此技能的全部职责,是处理首次调用 scipy.stats 之前的事。


铁律

NO TEST CHOSEN AFTER SEEING THE P-VALUE.

检验是研究问题和数据结构的函数——包括结果类型、组数、是否配对以及假设检查结果——必须在看到任何 P 值之前确定。根据显著性来选择或更换检验,就是 P 值操纵。这会使 I 类错误率以未知幅度膨胀,并让报告的 P 值变成谎言。

违反预先指定检验的字面规定,就是违背推断的本意。

结果不显著,不是尝试另一种检验的理由。这本身就是一项发现。


何时使用此技能

每当有人要选择、论证或更换检验时,都应触发此守则:

  • “这种设计/这些变量应该用哪种统计检验?”
  • “我的 t 检验结果不显著——要不要改试 Mann-Whitney?”(← 典型陷阱)
  • “我针对同一假设做了 ANOVA、t 检验和回归;应该报告哪个?”
  • “能不能删掉这些离群值/加入这个协变量,然后重新运行,让结果低于 .05?”
  • “现在改用非参数检验可以吗?”

此技能会运行决策树、指出应使用的检验,并且——至关重要的是——追问任何检验更换的时间和动机。

不会触发

将以下相关请求转交给相应的兄弟技能。此守则负责选择和监督检验;不负责执行、建模、设计或撰写。

请求的实际内容是……转交给为什么不由此技能处理
实际运行选定的检验、假设检查、功效分析和 APA 格式撰写alterlab-statistical-analysis此守则选择检验;该技能负责计算。
拟合特定模型类别(OLS/GLM/mixed/ARIMA)、生成系数表、残差诊断alterlab-statsmodels这是程序化模型拟合,不是检验选择。
评估证据质量,发现混杂因素/设计有效性问题/偏差(GRADE、RoB)alterlab-scientific-thinking这是对研究的上游判断,不是选择检验。
在查看数据前冻结完整分析计划;HARKing、可选停止、冻结协变量纪律alterlab-preregistration-discipline这是分析计划层面的纪律;此守则只负责其中的检验选择部分。
在报告中说明所有已运行的分析、效应量和置信区间,以及偏离计划的情况alterlab-results-transparency这是报告纪律,发生在检验选择之后。
选择研究设计本身(RCT、观察性研究或准实验)alterlab-scientific-thinking设计选择先于检验选择。
开放科学/仓库/DMP/预注册的流程事务(OSF、AsPredicted、Zenodo)alterlab-open-science这是平台/工作流指导,不是检验选择逻辑。

决策树

从上到下依次判断。**每个分支都由数据结构决定,而不是由任何 p 值决定。**正态性由下面的假设检查关卡决定——而不是凭目测判断哪个检验“显著”。

digraph test_selection {
  rankdir=TB;
  node [shape=box, fontname="Helvetica"];
  q [shape=diamond, label="Outcome type?"];

  q -> cont [label="continuous / ordinal"];
  q -> cat  [label="categorical (counts)"];
  q -> rel  [label="association between\ntwo variables"];

  // --- group comparisons ---
  cont [shape=diamond, label="How many groups?"];
  cont -> two   [label="2"];
  cont -> three [label="3+"];

  two [shape=diamond, label="Paired /\nrepeated?"];
  two -> two_ind   [label="independent"];
  two -> two_pair  [label="paired"];
  two_ind  [shape=diamond, label="Normal?\n(see gate)"];
  two_ind  -> tt  [label="yes"];
  two_ind  -> mwu [label="no"];
  two_pair [shape=diamond, label="Normal\ndifferences?"];
  two_pair -> ptt [label="yes"];
  two_pair -> wil [label="no"];
  tt  [label="independent t-test\n(Welch if unequal variance)"];
  mwu [label="Mann-Whitney U"];
  ptt [label="paired t-test"];
  wil [label="Wilcoxon signed-rank"];

  three [shape=diamond, label="Paired /\nrepeated?"];
  three -> th_ind  [label="independent"];
  three -> th_pair [label="repeated"];
  th_ind  [shape=diamond, label="Normal?"];
  th_ind  -> anova [label="yes"];
  th_ind  -> kw    [label="no"];
  th_pair [shape=diamond, label="Normal?"];
  th_pair -> rm    [label="yes"];
  th_pair -> fried [label="no"];
  anova [label="one-way ANOVA\n(+ planned post-hoc)"];
  kw    [label="Kruskal-Wallis"];
  rm    [label="repeated-measures ANOVA"];
  fried [label="Friedman"];

  // --- categorical ---
  cat [shape=diamond, label="Expected cell\ncount >= 5?"];
  cat -> chi    [label="yes"];
  cat -> fisher [label="no / 2x2 small"];
  chi    [label="chi-square test"];
  fisher [label="Fisher's exact"];

  // --- association ---
  rel [shape=diamond, label="Both continuous?"];
  rel -> rel_norm [label="yes"];
  rel -> reg      [label="outcome + predictors"];
  rel_norm [shape=diamond, label="Linear & normal?"];
  rel_norm -> pearson  [label="yes"];
  rel_norm -> spearman [label="no / monotonic"];
  pearson  [label="Pearson r"];
  spearman [label="Spearman rho"];
  reg [shape=diamond, label="Outcome type?"];
  reg -> linreg [label="continuous"];
  reg -> logreg [label="binary"];
  linreg [label="linear regression"];
  logreg [label="logistic regression"];
}

此路由与 alterlab-statistical-analysis 中的检验选择指南(references/test_selection_guide.md)一致——该防护机制在此基础上增加了时机和反测试挑选纪律。完整的分支逻辑和边界情况:references/decision_tree.md。可运行的路由器会根据你的回答输出指定检验:scripts/test_picker.py。


假设检查关卡(强制——绝不可跳过)

正态性和方差齐性是决策树的输入,不能用作事后借口。顺序是固定的:

  1. 预先指定数据结构所指向的检验(默认走参数检验分支)。
  2. 通过 alterlab-statistical-analysis(其 assumption_checks.py)运行假设检查——Shapiro-Wilk(正态性)、Levene(方差齐性)、回归的残差/Q-Q 和线性关系。报告检查结果。
  3. 只有此时才能查看假设判定结果,以确认参数检验分支,或转向预先指定的非参数备选方案(例如,t 检验 → Mann-Whitney;ANOVA → Kruskal-Wallis)。备选方案由假设检查决定,绝不能由 p 值决定。

如果没有运行并报告假设检查,检验结果就无法解读。这相当于“在变绿前确认变红”:在证明假设成立之前,你不能相信绿色结果(p 值)。详情:references/assumption_gate.md。


杜绝挑选检验(借口与现实)

这些都是由 p 值驱动的检验切换之前常见的自我辩解。一旦出现——无论是你还是用户提出的——都要指出并制止。

借口现实
“t 检验不显著,我再试试 Mann-Whitney。”你在根据检验结果选择检验方法。这就是挑选检验。只有当假设检查(而非 p 值)指向非参数检验时,该检验才有效。
“看过数据后,我发现有个更合适的检验。”你在拟合噪声/事后提出假设。重新运行预先指定的检验;其他结果都应报告为探索性分析。
“我只要删掉这 3 个离群值再重新运行就行。”离群值处理规则必须预先指定,或作为敏感性分析报告——不能临时编造来跨过 .05。
“加上这个协变量显然能改进模型。”显然是事后决定的 = 研究者自由度。应预先指定,或将结果标记为探索性。
“非参数检验更保守,所以切换是安全的。”因为第一个检验未通过而切换,仍然是根据结果来决定选择。无论方向如何,膨胀都是真实存在的。
“反正这只是探索性分析。”那就明确说明,删去验证性 p 值相关措辞,也不要将其报告为对假设的检验。
“大家都会报告那个有效的检验。”在多个检验中只报告显著结果属于 p 值操纵;应报告所有运行过的检验,或进行校正。

更多模式和应对方法:references/rationalizations.md。


危险信号——停止

如果出现以下任何想法,立刻停止。你正要根据检验结果来决定检验方法。

  • “我再试个不同的检验,看看结果如何。”
  • “t 检验的 p = .07,所以我换成非参数检验。”
  • “我把这些离群值删掉再重新运行。”
  • “只要加上这个协变量,效应就出来了。”
  • “我多跑几个检验,报告显著的那个。”
  • “现在已经显著了,我们可以停止收集数据了。”
  • “这个子组看起来很有意思”(你没有预先指定它)。
  • “我先看按结果分组的描述性统计,再挑选检验方法。”

这些都意味着:立刻停止。你正在利用研究者自由度。回到预先指定的检验,或将分析标记为探索性分析并删去验证性结论。


升级门槛(多重检验)

将“修复 3 次后质疑架构”规则应用于假设检验:

Ran 3+ tests on the SAME hypothesis searching for significance? STOP.

这是多重比较/挑选检验。你有两个诚实的选项——绝不能进行第四次检验:

  1. 对所有检验进行校正。 对实际运行的全部检验(包括那些“没效果”的检验)应用 Bonferroni 校正(将 alpha 除以检验次数),或采用较不保守的 FDR 控制方法(Benjamini-Hochberg)。
  2. 声明分析具有探索性。 标注这一点,报告运行过的每项检验,并删除确认性 p 值措辞。

不要为了找到 p < .05 而运行检验 #4。校正计算和检验族定义: references/multiplicity.md


工作流

  1. 确定研究问题和数据结构——结果类型、分组、配对情况。
  2. 沿决策树进行判断(scripts/test_picker.py 可以根据你的回答完成这一操作),在查看任何结果 之前 选定具体检验。
  3. 使用 alterlab-statistical-analysis 运行并报告假设检验。根据 检验结果 采用预先指定的参数/非参数分支。
  4. 识别挑选检验行为——如果有人提议切换检验,请查看“借口/现实”表和警示信号。只有在 假设检验(而非 p 值)驱动切换时,这种切换才合理。
  5. 如果有 3 项或更多检验涉及同一个假设,应用升级门槛:进行校正或声明具有探索性。
  6. 将执行工作交给 alterlab-statistical-analysis/alterlab-statsmodels,将报告规范工作交给 alterlab-results-transparency。

报告前自查

  • 是否已在看到任何 p 值 之前,根据数据结构和假设检验确定检验方法?
  • 是否运行并报告了 Shapiro-Wilk/Levene/线性检验,而不是跳过?
  • 是否有检验切换是由 不显著结果 引发的?如果有,这就是挑选检验——请撤回切换。
  • 是否针对同一个假设运行了 3 项或更多检验,却没有进行校正或标注为探索性?
  • 是否披露了实际运行的每项检验(交由 alterlab-results-transparency 处理)?

参考资料

  • references/decision_tree.md — 完整的分支逻辑、边缘情况、Welch/事后检验说明(包括预先指定 Welch's t-test、而非先进行 Levene 预检的理由)。
  • references/assumption_gate.md — 解释前的检验顺序和回退规则。
  • references/rationalizations.md — 扩展版“借口与现实”对照表及反驳说明。
  • references/multiplicity.md — Bonferroni/Benjamini-Hochberg FDR,以及检验族的定义。
  • scripts/test_picker.py — 使用标准库的决策树路由器;根据回答输出具体检验名称。

属于 AlterLab Academic Skills 套件。

评论

支持 Markdown