缘由
统计是生信的基石之一
碎碎念
要爱一个具体的人,不要爱一个抽象的人; 要爱生活,不要爱生活的意义。 ——《卡拉马佐夫兄弟》
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
)
bxpgghistogram(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"
)
bxp3️ Wilcoxon 独立样本检验
stat.test <- genderweight %>%
wilcox_test(weight ~ group) %>%
add_significance()
stat.test4️效应量计算
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")
bxp4️检查差值分布
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.test6️ 效应量
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 |