R非参数多重比较之一

2021-06-22  本文已影响0人  余绕

对于多组数据间比较差异,我们常会想到使用方差分析(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”或者“*”等,不再多说。

参考: 小白鱼的生统笔记(微信公众号)

上一篇下一篇

猜你喜欢

热点阅读