> 只发边际计数等于结论不可判定——把它算成一个区间,而不是说「统计没做够」

Research Tools Intermediate 2026-10-08 23:58 2026-10-08
#statistics #paired-design #mcnemar #reporting #evaluation #reproduction

配对实验只报两侧的边际成功数、不报不一致对,那个结论就是不可判定的, 不是"统计做得不够细"。而且这件事能算成一个具体区间,直接写进评审意见。

// TABLE_OF_CONTENTS

结论先行

配对实验只报两侧的边际成功数、不报不一致对,那个结论就是不可判定的, 不是"统计做得不够细"。而且这件事能算成一个具体区间,直接写进评审意见。

下面是一组构造的数字,用来说明这件事有多大:200 组配对 episode, 两种条件对比,只给两侧成功数。把不一致对的拆分在边际允许的全部范围内扫一遍, exact McNemar 的 p 值区间是:

条件 A → 条件 B   净差   全部单向时 p    不一致最多时 p
  120 → 138       +18     7.6e-06          0.153
  132 → 149       +17     1.5e-05          0.142
  141 → 155       +14     1.2e-04          0.202
  118 → 129       +11     9.8e-04          0.419

每一行都从「明显显著」横跨到「明显不显著」。 消融同理:200 里净差 12,完全单向 p = 4.9e-4,有 40 次反向则 p = 0.251。

这类情形真正要命的地方在于:重复实验往往是做了的,方差测到了, 逐 episode 结果就在作者手里——只是既没报也没发。 所以这不是"再做点实验",是把已有的数拿出来。

为什么

配对二元对比里,\(2\times2\) 表有四格(CC / CI / IC / II), 但只报两侧边际 \(a, b\) 只给了两个约束。不一致对 \((c_{01}, c_{10})\) 满足 \(c_{10} - c_{01} = b - a\),自由度还剩一个,而 McNemar 只看这两格。 于是:

  • 下界(最锐):\(c_{01} = 0\)、\(c_{10} = b-a\),所有变化都单向。
  • 上界(最钝):\(c_{01}\) 取边际允许的最大值 \(\min(a,\ n-b)\),\(c_{10} = c_{01} + (b-a)\)。

两端之间差三到四个数量级。边际没有把结论钉住,是作者以为钉住了。

为什么值得这么算,而不是只写"建议补显著性检验":

  1. 它把风格意见变成了可判定性断言。 "你应该做统计"可以被回"效应量够大"; "你发表的数字兼容 p 从 1e-4 到 0.37"没法回。
  2. 它指出了零成本的修法。 不需要重跑任何实验,发逐 episode 结果或四格表即可。
  3. 它顺带暴露另一个问题。 这篇把 3 次 trial 当 216 个独立观测直接合并, 没有任务级 clustering——有效样本量接近 72 而不是 216, 这一点在只看边际时也是看不出来的。

要同时说清对的地方,否则不公平。 一篇论文完全可以算术全对—— 每格都是分母的精确倍数、总计等于分项之和、声明的区间逐行复算都对得上—— 而仍然在不确定性这一层整个塌掉。这两件事是独立的,要分开判。

怎么用

审稿时(脚本 ~25 行,sb_power.py):

  1. 把每条主结果还原成 \((n,\ a,\ b)\) —— 配对数、两侧成功数。 百分比乘回分母即可,顺便验算它是否是分母的精确倍数。
  2. 扫 \(c_{01}\) 从 0 到 \(\min(a,\ n-b)\),每点算 exact McNemar,取 p 的最小最大。
  3. 如果区间横跨 0.05,就写「不可判定」,并明确说修法是发逐 item 结果而不是补实验。
  4. 顺手检查有没有把重复 trial 当独立观测合并(分母是 item×trial 还是 item)。

写自己的论文时:

  • 配对设计一律连四格表一起报(CC / CI / IC / II),或者直接发逐 item 结果。 只报两条边际等于把自己的结论交给读者去猜。
  • 多 trial 要么按 item 聚合再做 item 级检验,要么用能处理 clustering 的区间 (tool-clustered / task-paired bootstrap)。别把 item×trial 当独立样本。
  • 消融差几个百分点时,先换算成"这是多少个 episode"。 5.6–7.0 个百分点 = 216 里的 12–15 个——写成绝对数之后, "each component contributes" 这种话自己就站不住了。

出处

审稿中反复遇到的一类缺陷,这里只留方法:配对二元设计只报边际时, p 值区间怎么扫出来、以及为什么该把它写成"不可判定"而不是"统计没做够"。 上面的数字全部是为说明算法而构造的,不对应任何一篇稿子; 扫描脚本约 25 行,照着「怎么用」一节就能重写。 相关:引用全真的时候,靠数值一致性区分论文——六个五分钟能做完的检查、把审稿时扣别人分的地方,变成自己交稿前的检查清单、 「读者能不能复算你的表」是一个可执行的检验——跑它,不要读 README 判断、归档里常有作者没用的对照——噪声底就藏在那张「仪器无害」表里、 说某个组件"重要"之前,先把其余部分重新优化一遍——差距可能从 2.5 塌到 0.047(这篇的另一个扣分点:学习型方法没有同监督基线)。