关于 alterlab-test-selection-guard
alterlab-test-selection-guard 是一项统计规范技能,依据研究问题和数据结构约束检验选择,防止根据 P 值挑选检验。它面向需要选择或审查统计检验的研究者;实际计算和模型拟合交由配套技能完成。
主要功能
- 01按数据结构选择检验
- 02要求先做并报告假设检查
- 03识别根据结果换检验
- 04处理同一假设的多重检验
- 05提供命令行检验选择器
适用场景
- 01根据变量和研究设计确定检验
- 02评估因结果不显著而更换检验
- 03审查同一假设下的多次检验
- 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.jsonreferences/assumption_gate.mddecision_tree.mdmultiplicity.mdrationalizations.mdscripts/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。
假设检查关卡(强制——绝不可跳过)
正态性和方差齐性是决策树的输入,不能用作事后借口。顺序是固定的:
- 预先指定数据结构所指向的检验(默认走参数检验分支)。
- 通过
alterlab-statistical-analysis(其assumption_checks.py)运行假设检查——Shapiro-Wilk(正态性)、Levene(方差齐性)、回归的残差/Q-Q 和线性关系。报告检查结果。 - 只有此时才能查看假设判定结果,以确认参数检验分支,或转向预先指定的非参数备选方案(例如,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.
这是多重比较/挑选检验。你有两个诚实的选项——绝不能进行第四次检验:
- 对所有检验进行校正。 对实际运行的全部检验(包括那些“没效果”的检验)应用 Bonferroni 校正(将 alpha 除以检验次数),或采用较不保守的 FDR 控制方法(Benjamini-Hochberg)。
- 声明分析具有探索性。 标注这一点,报告运行过的每项检验,并删除确认性 p 值措辞。
不要为了找到 p < .05 而运行检验 #4。校正计算和检验族定义:
references/multiplicity.md
工作流
- 确定研究问题和数据结构——结果类型、分组、配对情况。
- 沿决策树进行判断(
scripts/test_picker.py可以根据你的回答完成这一操作),在查看任何结果 之前 选定具体检验。 - 使用
alterlab-statistical-analysis运行并报告假设检验。根据 检验结果 采用预先指定的参数/非参数分支。 - 识别挑选检验行为——如果有人提议切换检验,请查看“借口/现实”表和警示信号。只有在 假设检验(而非 p 值)驱动切换时,这种切换才合理。
- 如果有 3 项或更多检验涉及同一个假设,应用升级门槛:进行校正或声明具有探索性。
- 将执行工作交给
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 套件。