缘由

统计是生信的基石之一

碎碎念

要爱一个具体的人,不要爱一个抽象的人; 要爱生活,不要爱生活的意义。 ——《卡拉马佐夫兄弟》

Ref

Wilcoxon Test in R: The Ultimate Guide - Datanovia

解读

一、准备工作

library(tidyverse)
library(rstatix)
library(ggpubr)

二、单样本 Wilcoxon 检验(One-sample test)

1️ 数据准备

data(mice, package = "datarium")
head(mice, 3)

数据集 mice 含有实验鼠的体重数据。我们想要检验样本中位数是否等于 25g。


2️描述性统计:中位数与四分位距

mice %>% get_summary_stats(weight, type = "median_iqr")

median_iqr 输出 中位数(Median) 和 四分位距(IQR):

  • 中位数反映集中趋势(类似均值但抗异常值)
  • IQR = Q3 - Q1,用于描述数据的离散程度

3️可视化数据分布

bxp <- ggboxplot(
	mice$weight, width = 0.5, add = c("mean", "jitter"), 
	ylab = "Weight (g)", xlab = FALSE
)
bxp
gghistogram(mice, x = "weight", y = "..density..", 
			fill = "steelblue", bins = 4, add_density = TRUE)

4️ 进行 Wilcoxon 单样本检验

stat.test <- mice %>% wilcox_test(weight ~ 1, mu = 25)
stat.test

这里我们检验:

H₀:样本中位数 = 25
H₁:样本中位数 ≠ 25


5️ 计算效应量(Effect Size)

mice %>%  wilcox_effsize(weight ~ 1, mu = 25)

解释:
效应量(Effect size)表示差异的“强度”,与 p 值不同,它不受样本量影响。
常见标准(r值):

  • 0.1 = 小效应
  • 0.3 = 中等效应
  • 0.5 = 大效应

6️可视化结果

bxp + 
	labs(subtitle = get_test_label(stat.test, detailed = TRUE))

或查看密度分布:

ggdensity(mice, x = "weight", rug = TRUE, fill = "lightgray") +
	scale_x_continuous(limits = c(15, 27)) +
	stat_central_tendency(type = "median", color = "red", linetype = "dashed") +
	geom_vline(xintercept = 25, color = "blue", linetype = "dashed") + 
	labs(subtitle = get_test_label(stat.test, detailed = TRUE))

二、独立样本 Wilcoxon 检验(Mann–Whitney U test)

我们来比较男性与女性体重是否有显著差异。

data("genderweight", package = "datarium")
set.seed(123)
genderweight %>% sample_n_by(group, size = 2)

1️描述性统计

genderweight %>%
	group_by(group) %>%
	get_summary_stats(weight, type = "median_iqr")

2️ 可视化分组箱线图

bxp <- ggboxplot(
	genderweight, x = "group", y = "weight", 
	ylab = "Weight", xlab = "Groups", add = "jitter"
)
bxp

3️ Wilcoxon 独立样本检验

stat.test <- genderweight %>% 
	wilcox_test(weight ~ group) %>%
	add_significance()
stat.test

4️效应量计算

genderweight %>% wilcox_effsize(weight ~ group)

5️ 可视化结果 + 显著性标注

stat.test <- stat.test %>% add_xy_position(x = "group")
bxp + 
	stat_pvalue_manual(stat.test, tip.length = 0) +
	labs(subtitle = get_test_label(stat.test, detailed = TRUE))

三、配对样本 Wilcoxon 检验(Paired test)

用于前后测、左右配对等重复测量场景。


1️ 数据整理

data("mice2", package = "datarium")
head(mice2, 3)
 
mice2.long <- mice2 %>%
	gather(key = "group", value = "weight", before, after)
head(mice2.long, 3)

2️ 描述性统计

mice2.long %>%
	group_by(group) %>%
	get_summary_stats(weight, type = "median_iqr")

3️ 可视化配对箱线图

bxp <- ggpaired(mice2.long, x = "group", y = "weight", 
				order = c("before", "after"),
				ylab = "Weight", xlab = "Groups")
bxp

4️检查差值分布

mice2 <- mice2 %>% mutate(differences = after - before)
gghistogram(mice2, x = "differences", y = "..density..", 
			fill = "steelblue", bins = 5, add_density = TRUE)

5️ Wilcoxon 配对样本检验

stat.test <- mice2.long  %>%
	wilcox_test(weight ~ group, paired = TRUE) %>%
	add_significance()
stat.test

6️ 效应量

mice2.long  %>%
	wilcox_effsize(weight ~ group, paired = TRUE)

7️ 可视化 + 显著性标注

stat.test <- stat.test %>% add_xy_position(x = "group")
bxp + 
	stat_pvalue_manual(stat.test, tip.length = 0) +
	labs(subtitle = get_test_label(stat.test, detailed= TRUE))

四、总结

检验类型函数对应场景样本独立性数据类型检验假设
单样本wilcox_test(y ~ 1)与指定值比较单样本连续型中位数 = 常数
独立样本wilcox_test(y ~ group)两组独立比较独立连续型两组分布相同
配对样本wilcox_test(y ~ group, paired=TRUE)前后测或配对设计非独立连续型差值中位数 = 0