跳转至

7.4   显著性概率值

小率在科学社团的展示板上看到两份报告:

报告 p 值 结论
A 0.049 显著
B 0.051 不显著

两个数字只差 0.002,却被贴上完全不同的标签。小率觉得这很奇怪:难道 0.049 和 0.051 之间真的隔着一道科学分界线吗?

图 7.4.0 小率看到 p=0.049 与 p=0.051 的报告

p=0.049 和 p=0.051 几乎一样,为什么一个“显著”,一个“不显著”?
因为人们常把连续证据硬切成两半。p 值本身不是开关。

7.4.1   p 值是一块尾巴面积

p 值的定义是:

\[ p=P(\text{看到当前或更极端的数据}\mid H_0\text{ 为真}) \]

它总是在 \(H_0\) 的世界里算。若当前统计量落在分布尾部,尾巴面积小,p 值就小;若当前统计量不算极端,尾巴面积大,p 值就大。

图 7.4.1 p 值是 H0 世界里的尾巴面积

把 p 值翻译成人话

p 值小:如果 \(H_0\) 真的成立,这种结果不太常见。
p 值大:如果 \(H_0\) 真的成立,这种结果并不奇怪。


7.4.2   p 值不是 H0 为真的概率

最常见的误读是:

p=0.03,所以 \(H_0\) 为真的概率是 3%。

这是错的。p 值是:

\[ P(\text{数据}\mid H_0) \]

不是:

\[ P(H_0\mid \text{数据}) \]

这两个条件方向完全不同。若想讨论“假设为真的概率”,需要贝叶斯框架和先验概率。

也就是说,p 值只告诉我“如果 H0 为真,数据怪不怪”,不告诉我“H0 有多可能是真的”?
正是。条件概率方向一反,意思就变了。

7.4.3   p 值和 alpha 如何配合

显著性水平 \(\alpha\) 是实验前设好的阈值。决策规则是:

比较 决策
\(p<\alpha\) 拒绝 \(H_0\)
\(p\ge\alpha\) 不拒绝 \(H_0\)

但 p 值本身是连续的证据强弱。\(p=0.049\)\(p=0.051\) 很接近;\(p=0.0001\)\(p=0.049\) 都会拒绝 \(H_0\),但证据强度并不一样。

不要只写显著/不显著

报告里应给出具体 p 值,并同时报告效应大小和置信区间。只写“p<0.05”会丢掉很多信息。


7.4.4   八个常见误读

误读 为什么错
p 是 \(H_0\) 为真的概率 p 是 \(P(\text{数据}\mid H_0)\)
\(1-p\)\(H_1\) 为真的概率 p 不给 \(H_1\) 概率
p 小代表效应大 大样本下很小效应也可能 p 小
p 大代表没有效应 可能只是样本量太小、功效不足
p=0.05 是科学真理 0.05 是历史惯例
p 值能证明结果可重复 可重复性还受设计、样本、偏差影响
多试几次直到 p 小也可以 这是 p-hacking,会制造假阳性
只看 p 就能下结论 还要看效应大小、区间、研究设计

p-hacking 的直觉

如果反复换分组、换指标、换模型,直到某个 p 值小于 0.05,这个“显著”很可能只是筛出来的偶然波动。多重检验校正会在 §7.10 讨论。


7.4.5   Python 从 z 和 t 算 p 值

from scipy import stats

z = -1.92
print(f"z={z:.2f}, 左侧 p={stats.norm.cdf(z):.4f}")
print(f"z={z:.2f}, 双侧 p={2 * stats.norm.cdf(-abs(z)):.4f}")

t = -0.80
df = 15
print(f"t={t:.2f}, df={df}, 双侧 p={2 * stats.t.cdf(-abs(t), df):.4f}")

完整脚本见:

# docs/assets/scripts/ch07_hypothesis_testing/04_p_value/main.py

7.4.6   现代报告要三件套

一个更完整的写法是:

新方法平均提升 2.1 分,95% CI [0.4, 3.8],p=0.018。

这句话同时交代:

  • 效应大小:提升 2.1 分。
  • 不确定性:区间从 0.4 到 3.8。
  • 证据强弱:p=0.018。
现在我看到 p=0.049,不会只问显不显著,还会问效应有多大、区间多宽。
这才是现代统计报告的读法。

小率的笔记本

p 值是在 \(H_0\) 为真时,当前或更极端数据出现的概率。它不是 \(H_0\) 为真的概率,也不是效应大小。p 值要和 \(\alpha\) 比较做决策,但报告时应同时给具体 p 值、效应大小和置信区间。