对于多组数据间比较差异,我们常会想到使用方差分析(ANOVA)来实现。不过由于ANOVA的前提假设条件比较严格,要求数据必须满足正态性、方差齐性等,而很多情况下我们的数据并不符合方差分析的条件。通常情况下,我们可以考虑转换数据,例如,使用log转换等或许可以使非正态分布的原始数据转变为正态分布类型(当然,我们需要确保转换后的数据能够被合理解释,否则将无意义);另一种合适的选择是使用非参数的检验方法,替代ANOVA。
在R语言中,常见ANOVA的非参数替代方法例如:
单因素方差分析(单因素ANOVA) => Kruskal-Wallis检验,kruskal.test();Friedman检验,friedman.test();
head(chao1)
image.png
查看整体差异
#Kruskal-Wallis Test,可使用 ?kruskal.test 查看帮助
kruskal.test(chao1~site, data = chao1)
p值远低于0.05水平,说明具有显著差异。
以下用Wilcoxon秩和检验继续探究两两差异。当分组水平较多时,多次的Wilcoxon秩和检验容易提升I类错误的风险,因此推荐引入p值校正过程。
##此时若想继续探寻两两分组间的差异,可使用 Wilcoxon 秩和检验,如果分组较多,可以使用循环来完成
#继续在上述 Kruskal-Wallis 检验的基础上,探究两两分组间差异,一个示例如下
group <- levels(chao1$site)
group1 <- NULL
group2 <- NULL
median1 <- NULL
median2 <- NULL
p <- NULL
for (i in 1:(length(group) - 1)) {
for (j in (i + 1):length(group)) {
group1 <- c(group1, group[i])
group2 <- c(group2, group[j])
group_ij <- subset(chao1, site %in% c(group[i], group[j]))
group_ij$site <- factor(group_ij$site, levels = c(group[i], group[j]))
wilcox_test <- wilcox.test(chao1~site, data = group_ij, alternative = 'two.sided', conf.level = 0.95)
p <- c(p, wilcox_test$p.value)
median1 <- c(median1, median(subset(group_ij, site == group[i])$chao1))
median2 <- c(median2, median(subset(group_ij, site == group[j])$chao1))
}
}
result <- data.frame(group1, group2, median1, median2, p)
result$padj <- p.adjust(result$p, method = 'BH') #推荐加上 p 值校正,这里使用 Benjamini 方法校正 p 值
result
#write.table(result, 'Wilcoxon.txt', sep = '\t', row.names = FALSE, quote = FALSE)
image.png
示例结果如下,展示两组比较的组名、中位数、Wilcoxon检验p值以及Benjamini校正后的p值。这样,我们就获得了两组间的差异了。你可以在后续根据p值(或校正后p值)以及中位数(非参数方法比较的普遍是中位数的差异,而非均值差异)数值,手动标注显著性“abc”或者“*”等,不再多说。
参考: 小白鱼的生统笔记(微信公众号)
网友评论