几个月前发表过有关通过R语言进行字母法显著性标记的方法,最近有反馈说:用
dunnTest()
进行多重比较之后,即使事先排序了,用这个方法标记出来的字母也不是从平均值最大的组开始的😢。其实在我自己进行数据分析的过程中有一次也出现了这个问题,但不知为啥,重新运行代码这个问题又消失了🤣,也就没有过多关注。
既然再次被提起,我就重新去看了一遍,换了一种实现的思路,暂时没有问题了(能力有限,大家发现我的推文有问题甚至是很明显的错误还请
留言反馈
😂)
问题来源:dunnTest()
这个函数在进行多重比较时会直接按照分类变量的首字母排序,而不会关注之前设置好的因子顺序以及各组平均值的大小。如果之间根据Z
值大小排序,会涉及到正负号的问题,当最大值字母靠后,则不会出现在两两比较的左边,进而影响后续字母标记。
cldList()
获得正确的字母后再替换回来。#导入数据,调用所需packages
library(rcompanion)#引入`cldList()`功能
library(FSA)#引入`dunnTest()`功能
library(dplyr)
dat <- mpg[,c("class","hwy")]
colnames(dat) <- c("x","y")
#备份原始数据,用于后续作图
dat1 <- dat
colnames(dat1) <- c("x","y")
重新根据均值大小排列分组变量顺序,并修改标签为A、B、C、D····
mean.y <- dat %>% group_by(x) %>% summarise(mean=mean(y))#求各组均值
mfactor <- mean.y[order(mean.y$mean,decreasing = TRUE),1] %>% data.frame()#重新排序
rownames(mfactor) <- mfactor$x
dat$x <- factor(dat$x,levels = rownames(mfactor),
labels = LETTERS[seq(1,7,1)])#7个组,所以这里数字为7,其余水平需作相应修改
多重比较及字母标记(这里就不需要再对数据进行排序了)
#多重比较
#Dunn (1964) Kruskal-Wallis multiple comparison
#p-values adjusted with the Bonferroni method.
mc <- dunnTest(y~x,data =dat,method ="bonferroni")
#Compact letter display
cld <- cldList(P.adj~Comparison,
data = mc$res,
threshold = 0.05 )
绘图部分代码:
#获得每一组的最大值
m <- dat %>% group_by(x) %>% summarise(y=max(y))#放弃使用top_n()函数
cld <- merge(cld,m,by.x = "Group",by.y = "x")#合并成一个数据框
#将各组标签替换回原始标签
rownames(cld) <- cld$Group
cld <- cld[levels(dat$x),]
cld$Group <- rownames(mfactor)
#绘图
library(ggplot2)
library(RColorBrewer)
display.brewer.all() #展示所有的色板
col <- colorRampPalette(brewer.pal(7,'Accent'))(7)#提前设置填充颜色
(p <- ggplot(data = dat1,aes(x=x,y=y))+#这里使用之前备份的原始数据,因为dat中的分组变量已经被修改了
geom_boxplot(aes(fill=x),color="black")+#以箱形图展示,按分类变量x填充不同的颜色
geom_text(data=cld,
aes(x=Group,y=y*1.3,label=Letter),#让字母位置比每组最大值高1.3倍,避免重叠
size=5,color="red",fontface="bold")+
scale_fill_manual(values = col)+#修改填充颜色
theme_bw()+theme(text = element_text(size = 18,face = "bold"))+
labs(x="class",y="hwy"))
结果如下,跟之前那篇推文结果一致
好了,今天的推文结束😅
联系客服