t 检验还是非参数检验:怎么判
跟完这篇,面对「两组数据比差异」,您能自己走完一条判断流程:先分清配对还是独立,再核对正态与方差齐性,据此在 t 检验和非参数检验里选对方法,用 R 逐步跑出结果,并把结论按规范写清楚(含效应量)。
两组之间比较均值,t 检验是最常用的选择,但它有前提。前提不满足时硬套 t 检验,结论可能不可靠。这篇给您一套「先判断、再选方法」的固定顺序,而不是上来就 t.test()。
前提与整体思路
独立样本 t 检验建立在三条假设上。判断该不该用它,本质就是逐条核对这三条:
| 前提 | 含义 | 不满足怎么办 |
|---|---|---|
| 观测独立 | 样本之间互不影响,不是同一对象的重复测量 | 属于配对或重复测量设计,改用配对方法 |
| 近似正态 | 每组数据近似正态分布(配对检验看差值) | 换非参数检验,或依赖大样本的稳健性 |
| 方差齐 | 两组方差相近 | 改用 Welch t 检验(不要求方差齐) |
有两点先说清楚,能省去很多纠结:
- 「独立」这条最硬。它由实验设计决定,不是靠数据能补救的。设计上是配对/重复测量,就不能当独立样本处理。
- 正态和方差齐这两条,t 检验都有一定容忍度,尤其样本量大的时候。所以判断时不必追求「完美满足」,而是看「偏离到什么程度」。
把这三条串起来,就是本篇要照着走的四步:
- 分清配对还是独立——由设计决定,先定这一步(下一节)。
- 判断正态——Shapiro-Wilk 检验配合 Q-Q 图;大样本可放宽。
- 查方差齐性——或干脆直接用对方差不敏感的 Welch t 检验。
- 选方法、跑出结果——满足前提用 t 检验,明显不满足换对应的非参数检验,最后加上效应量再报告。
第一步:分清配对还是独立
这一步要最先想清楚,因为它由实验设计决定,直接影响后面用哪个函数。
- 独立样本:两组是不同的个体。例如「用药组 vs 对照组」,每人只属于一组。
- 配对样本:同一批对象的两次测量,或天然配对。例如「同一批病人用药前 vs 用药后」「同一样本两种处理」。
用错类型会让结论失真:明明是配对设计却当独立样本比,会丢掉「同一对象前后相关」这一信息,往往低估差异、损失效能。
配对检验的做法是先算每对的差值,再判断差值——所以配对检验的正态性要看差值是否近似正态,而不是原始两组各自:
diff <- after - before
shapiro.test(diff) # 配对:正态性看差值,而不是两组原始数据
下面第二、三步以独立样本为主线展开;配对情形只需把「看两组」换成「看差值」,思路完全一致。
第二步:判断正态
有两个常用工具,建议一起看,别只看其中一个。
Shapiro-Wilk 检验
对每一组分别做正态性检验。它的原假设是「数据服从正态分布」:
shapiro.test(group_a) # p > 0.05:不能拒绝「正态」,可近似当作正态
shapiro.test(group_b)
读这个 p 值有两个坑要注意:
p > 0.05只是「没有足够证据说它不正态」,不等于「证明了它正态」。样本小的时候检验力弱,很可能只是没检出来。- 样本大的时候正好相反:极微小、对结论毫无影响的偏离也会被判成「显著不正态」(
p < 0.05),反而容易误导。R 里shapiro.test()也只接受 3 到 5000 之间的样本量。
所以别把这个 p 值当成开关,配合看图更靠谱。
Q-Q 图
Q-Q 图把您的数据分位数和理论正态分位数对比,点越贴近参考线,越接近正态:
qqnorm(group_a); qqline(group_a)
看图时关注整体趋势和两端:点大致沿直线走,就可以接受;若明显弯曲、或两端翘起(重尾、偏态),说明偏离正态。
大样本更稳健
有一个常被忽略的事实能帮您减负:样本量较大时,t 检验对正态性偏离相当稳健(源于中心极限定理,均值的抽样分布会趋近正态)。因此每组样本较多、又只是轻度偏态时,直接用 t 检验通常也站得住。真正需要谨慎的是小样本 + 明显偏态或有极端值的情况——这时优先考虑非参数检验。
「样本量多大算大」没有统一数字,常见的经验参考是每组几十个以上;这只是惯例、非硬性门槛,请结合偏态程度一起判断。
第三步:查方差齐性
确认了正态(或大样本),下一步看两组方差齐不齐。常用两个检验:
# F 检验:直接比两组方差,但对正态偏离敏感
var.test(value ~ group, data = df)
# Levene 检验:对正态偏离更稳健,实际中更常用(需要 car 包,默认按中位数中心化)
library(car)
leveneTest(value ~ group, data = df)
两者原假设都是「各组方差相等」,p < 0.05 提示方差不齐。因为 F 检验很依赖正态假设,数据不太正态时,Levene 检验更值得信。
判断结果对应两种做法:
- 方差齐 → 可用经典 Student t 检验(
var.equal = TRUE)。 - 方差不齐 → 用 Welch t 检验,它不要求方差相等。
一个实用建议:R 里 t.test() 默认就是 Welch(var.equal = FALSE)。Welch 在方差齐时几乎不损失效能、方差不齐时更稳,所以很多人索性默认用 Welch,省去先检验方差这一步。
t.test(value ~ group, data = df) # 默认 Welch,不假定方差齐
t.test(value ~ group, data = df, var.equal = TRUE) # 经典 Student t,假定方差齐
第四步:选方法、跑出结果
前三步走完,选哪种检验就一目了然了。按设计和前提对照下表:
| 设计 | 前提满足(近似正态/大样本) | 前提明显不满足(小样本 + 偏态/极端值) | R 函数 |
|---|---|---|---|
| 两独立组 | 独立样本 t 检验 | Mann-Whitney U(即 Wilcoxon 秩和) | t.test() / wilcox.test() |
| 配对/前后 | 配对 t 检验 | Wilcoxon 符号秩检验 | t.test(..., paired = TRUE) / wilcox.test(..., paired = TRUE) |
下面用一份可复现的小例子把整条链跑一遍。为便于照做,先用 set.seed() 造两组数据(真实分析里换成您自己的数据表即可):
set.seed(1)
df <- data.frame(
group = rep(c("A", "B"), each = 30),
value = c(rnorm(30, mean = 10, sd = 2), # A 组
rnorm(30, mean = 12, sd = 2)) # B 组
)
# 前提检查
by(df$value, df$group, shapiro.test) # 分组看正态
leveneTest(value ~ group, data = df) # 看方差齐性
# 前提满足 → 独立样本 t 检验(默认 Welch)
t.test(value ~ group, data = df)
t.test() 打印出的结果按固定格式排布,重点看这几行(下方数字为示意,实际以您的数据为准):
Welch Two Sample t-test
data: value by group
t = -3.8, df = 57.4, p-value = 0.0003 ← p < 0.05:两组均值差异显著
95 percent confidence interval: ← 均值差的置信区间;不跨 0 同样支持有差异
-3.1 -0.9
sample estimates:
mean in group A mean in group B ← 两组均值,用来看差异的方向与大小
10.1 12.0
读这份输出的顺序建议是:先看 p-value 判断「有没有差异」,再看 95 percent confidence interval 和两组均值判断「差多大、往哪边差」。只盯着 p 值容易漏掉后半句。
如果第二步发现是小样本且明显偏离正态,就把最后一行换成非参数检验:
wilcox.test(value ~ group, data = df) # Mann-Whitney U:两独立组
wilcox.test(before, after, paired = TRUE) # Wilcoxon 符号秩:配对/前后
用非参数检验有两点边界要心里有数:
- 它不是「零假设」。Mann-Whitney 比较的是两组的整体分布(秩),只有在两组分布形状相近时,才好解释成「中位数差异」。
- 有代价。当数据确实近似正态时,非参数检验的效能通常略低于 t 检验。所以不是「拿不准就一律用非参数」,而是「t 检验前提明显不满足时才换」。
(上面 p < 0.05 判显著是常用惯例、非铁律,请按研究场景与多重比较情况调整。)
报告结果:效应量与写法
p 值只回答「有没有差异」,且会随样本量变大而变小;它不回答「差多大」。规范的组间比较,应同时报告效应量。
- 参数检验用 Cohen's d:均值差除以合并标准差。约定
0.2 / 0.5 / 0.8大致对应小、中、大效应——这是 Cohen 提出的经验约定,非硬门槛,请结合专业背景解读。
library(effsize)
cohen.d(value ~ group, data = df) # 也可写成 cohen.d(group_a, group_b)
- 非参数检验报告中位数与 IQR,效应量可用秩双列相关 r:
library(rstatix)
df %>% wilcox_effsize(value ~ group) # Wilcoxon 的效应量 r
一份让读者一看就懂的组间比较结果,通常包含下面这些要素:
| 要素 | 参数(t 检验) | 非参数(Wilcoxon) |
|---|---|---|
| 样本量 | 每组 n | 每组 n |
| 集中/离散趋势 | 均值 ± 标准差 | 中位数 [IQR] |
| 检验统计量 | t 值与自由度 df | W 值 |
| 显著性 | p 值 | p 值 |
| 区间/方向 | 均值差的 95% 置信区间 | ——(可给中位数差) |
| 效应量 | Cohen's d | 秩双列相关 r |
到这里,一条完整的判断链就走通了:先分清配对还是独立 → 查正态(Shapiro-Wilk + Q-Q,大样本可放宽)→ 查方差齐性(或直接用 Welch)→ 满足则 t 检验、不满足换对应的非参数检验 → 加上效应量再报告。
在平台上跑一遍
上面这套判断您不必手动敲代码。在百沐一下的【智能统计】里,上传一张整洁数据表(每行一个样本、含一列分组),用一句话说清目的,例如「比较两组的表达量是否有显著差异」,它会自动帮您核对正态与方差齐性、在 t 检验和非参数检验之间选好方法、跑出结果并给出效应量,还附上可复现的 R 代码供您核对。用法见 智能统计使用指南,或直接登录 app.baimuyixia.com 试一遍。