跳到正文
百沐一下百沐一下
本节目录

t 检验还是非参数检验:怎么判

跟完这篇,面对「两组数据比差异」,您能自己走完一条判断流程:先分清配对还是独立,再核对正态与方差齐性,据此在 t 检验和非参数检验里选对方法,用 R 逐步跑出结果,并把结论按规范写清楚(含效应量)。

两组之间比较均值,t 检验是最常用的选择,但它有前提。前提不满足时硬套 t 检验,结论可能不可靠。这篇给您一套「先判断、再选方法」的固定顺序,而不是上来就 t.test()

前提与整体思路

独立样本 t 检验建立在三条假设上。判断该不该用它,本质就是逐条核对这三条:

前提含义不满足怎么办
观测独立样本之间互不影响,不是同一对象的重复测量属于配对或重复测量设计,改用配对方法
近似正态每组数据近似正态分布(配对检验看差值)换非参数检验,或依赖大样本的稳健性
方差齐两组方差相近改用 Welch t 检验(不要求方差齐)

有两点先说清楚,能省去很多纠结:

  • 「独立」这条最硬。它由实验设计决定,不是靠数据能补救的。设计上是配对/重复测量,就不能当独立样本处理。
  • 正态和方差齐这两条,t 检验都有一定容忍度,尤其样本量大的时候。所以判断时不必追求「完美满足」,而是看「偏离到什么程度」。

把这三条串起来,就是本篇要照着走的四步:

  1. 分清配对还是独立——由设计决定,先定这一步(下一节)。
  2. 判断正态——Shapiro-Wilk 检验配合 Q-Q 图;大样本可放宽。
  3. 查方差齐性——或干脆直接用对方差不敏感的 Welch t 检验。
  4. 选方法、跑出结果——满足前提用 t 检验,明显不满足换对应的非参数检验,最后加上效应量再报告。

第一步:分清配对还是独立

这一步要最先想清楚,因为它由实验设计决定,直接影响后面用哪个函数。

  • 独立样本:两组是不同的个体。例如「用药组 vs 对照组」,每人只属于一组。
  • 配对样本:同一批对象的两次测量,或天然配对。例如「同一批病人用药前 vs 用药后」「同一样本两种处理」。

用错类型会让结论失真:明明是配对设计却当独立样本比,会丢掉「同一对象前后相关」这一信息,往往低估差异、损失效能。

配对检验的做法是先算每对的差值,再判断差值——所以配对检验的正态性要看差值是否近似正态,而不是原始两组各自:

diff <- after - before
shapiro.test(diff)                          # 配对:正态性看差值,而不是两组原始数据

下面第二、三步以独立样本为主线展开;配对情形只需把「看两组」换成「看差值」,思路完全一致。

第二步:判断正态

有两个常用工具,建议一起看,别只看其中一个。

Shapiro-Wilk 检验

对每一组分别做正态性检验。它的原假设是「数据服从正态分布」:

shapiro.test(group_a)   # p > 0.05:不能拒绝「正态」,可近似当作正态
shapiro.test(group_b)

读这个 p 值有两个坑要注意:

  1. p > 0.05 只是「没有足够证据说它不正态」,不等于「证明了它正态」。样本小的时候检验力弱,很可能只是没检出来。
  2. 样本大的时候正好相反:极微小、对结论毫无影响的偏离也会被判成「显著不正态」(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() 默认就是 Welchvar.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 值与自由度 dfW 值
显著性p 值p 值
区间/方向均值差的 95% 置信区间——(可给中位数差)
效应量Cohen's d秩双列相关 r

到这里,一条完整的判断链就走通了:先分清配对还是独立 → 查正态(Shapiro-Wilk + Q-Q,大样本可放宽)→ 查方差齐性(或直接用 Welch)→ 满足则 t 检验、不满足换对应的非参数检验 → 加上效应量再报告。

在平台上跑一遍

上面这套判断您不必手动敲代码。在百沐一下的【智能统计】里,上传一张整洁数据表(每行一个样本、含一列分组),用一句话说清目的,例如「比较两组的表达量是否有显著差异」,它会自动帮您核对正态与方差齐性、在 t 检验和非参数检验之间选好方法、跑出结果并给出效应量,还附上可复现的 R 代码供您核对。用法见 智能统计使用指南,或直接登录 app.baimuyixia.com 试一遍。

相关