R ggplot2 boxplots - ggpubr stat_compare_means не работает должным образом
Я пытаюсь добавить уровни значимости к своим блокпостам в виде звездочек, используя ggplot2 и пакет ggpubr, но у меня много сравнений, и я хочу показать только значимые.
Я пытаюсь использовать опцию hide.ns=TRUE в stat_compare_means, но она явно не работает, это может быть ошибка в пакете ggpubr.
Кроме того, вы видите, что я исключаю группу "PGMC4" из парных сравнений wilcox.test; как я могу оставить эту группу и на kruskal.test?
Последний вопрос, который у меня есть, как работает уровень значимости? Как в * значимо ниже 0,05, ** ниже 0,025, *** ниже 0,01? какое соглашение использует ggpubr? Это показывает p-значения или скорректированные p-значения? Если последнее, какой метод корректировки? BH?
Пожалуйста, проверьте мой MWE ниже и эту ссылку и эту другую для справки
##############################
##MWE
set.seed(5)
#test df
mydf <- data.frame(ID=paste(sample(LETTERS, 163, replace=TRUE), sample(1:1000, 163, replace=FALSE), sep=''),
Group=c(rep('C',10),rep('FH',10),rep('I',19),rep('IF',42),rep('NA',14),rep('NF',42),rep('NI',15),rep('NS',10),rep('PGMC4',1)),
Value=rnorm(n=163))
#I don't want to compare PGMC4 cause I have only onw sample
groups <- as.character(unique(mydf$Group[which(mydf$Group!="PGMC4")]))
#function to make combinations of groups without repeating pairs, and avoiding self-combinations
expand.grid.unique <- function(x, y, include.equals=FALSE){
x <- unique(x)
y <- unique(y)
g <- function(i){
z <- setdiff(y, x[seq_len(i-include.equals)])
if(length(z)) cbind(x[i], z, deparse.level=0)
}
do.call(rbind, lapply(seq_along(x), g))
}
#all pairs I want to compare
combs <- as.data.frame(expand.grid.unique(groups, groups), stringsAsFactors=FALSE)
head(combs)
my.comps <- as.data.frame(t(combs), stringsAsFactors=FALSE)
colnames(my.comps) <- NULL
rownames(my.comps) <- NULL
#pairs I want to compare in list format for stat_compare_means
my.comps <- as.list(my.comps)
head(my.comps)
pdf(file="test.pdf", height=20, width=25)
print(#or ggsave()
ggplot(mydf, aes(x=Group, y=Value, fill=Group)) + geom_boxplot() +
stat_summary(fun.y=mean, geom="point", shape=5, size=4) +
scale_fill_manual(values=myPal) +
ggtitle("TEST TITLE") +
theme(plot.title = element_text(size=30),
axis.text=element_text(size=12),
axis.text.x = element_text(angle=45, hjust=1),
axis.ticks = element_blank(),
axis.title=element_text(size=20,face="bold"),
legend.text=element_text(size=16)) +
stat_compare_means(comparisons=my.comps, method="wilcox.test", label="p.signif", size=14) + #WHY DOES hide.ns=TRUE NOT WORK??? WHY DOES size=14 NOT WORK???
stat_compare_means(method="kruskal.test", size=14) #GLOBAL COMPARISON ACROSS GROUPS (HOW TO LEAVE PGMC4 OUT OF THIS??)
)
dev.off()
##############################
MWE будет производить следующие боксы:
Вопросы будут:
1- Как заставить hide.ns=TRUE работать?
2- Как увеличить размер *?
3- Как исключить группу из сравнения kruskal.test?
4- Какое * соглашение используется ggpubr, и корректируются ли показанные p-значения или нет?
Большое спасибо!!
РЕДАКТИРОВАТЬ
Кроме того, при выполнении
stat_compare_means(comparisons=my.comps, method="wilcox.test", p.adjust.method="BH")
Я не получаю те же значения р, что и при
wilcox.test(Value ~ Group, data=mydf.sub)$p.value
где mydf.sub является подмножеством () mydf для данного сравнения 2 групп.
Что здесь делает ggpubr? Как рассчитывается значение p.values?
РЕДАКТИРОВАТЬ 2
Пожалуйста, помогите, решение не должно быть с ggpubr (но оно должно быть с ggplot2), мне просто нужно иметь возможность скрыть NS и сделать размер звездочек больше, а также вычисление p-значения идентично to wilcox.test() + p.adjust(метод "BH").
Спасибо!
1 ответ
Вы можете попробовать следующее. Идея в том, что вы рассчитываете статистику самостоятельно, используя pairwise.wilcox.test
, Затем вы используете ggsignif
функция geom_signif
добавить предварительно рассчитанные значения. С y_position
Вы можете разместить скобки, чтобы они не перекрывали друг друга.
library(tidyverse)
library(ggsignif)
library(broom)
# your list of combinations you want to compare
CN <- combn(levels(mydf$Group)[-9], 2, simplify = FALSE)
# the pvalues. I use broom and tidy to get a nice formatted dataframe. Note, I turned off the adjustment of the pvalues.
pv <- tidy(with(mydf[ mydf$Group != "PGMC4", ], pairwise.wilcox.test(Value, Group, p.adjust.method = "none")))
# data preparation
CN2 <- do.call(rbind.data.frame, CN)
colnames(CN2) <- colnames(pv)[-3]
# subset the pvalues, by merging the CN list
pv_final <- merge(CN2, pv, by.x = c("group2", "group1"), by.y = c("group1", "group2"))
# fix ordering
pv_final <- pv_final[order(pv_final$group1), ]
# set signif level
pv_final$map_signif <- ifelse(pv_final$p.value > 0.05, "", ifelse(pv_final$p.value > 0.01,"*", "**"))
# the plot
ggplot(mydf, aes(x=Group, y=Value, fill=Group)) + geom_boxplot() +
stat_compare_means(data=mydf[ mydf$Group != "PGMC4", ], aes(x=Group, y=Value, fill=Group), size=5) +
ylim(-4,30)+
geom_signif(comparisons=CN,
y_position = 3:30, annotation= pv_final$map_signif) +
theme_bw(base_size = 16)
Аргументы vjust
, textsize
, а также size
не работают должным образом. Кажется, это ошибка в последней версии ggsignif_0.3.0
,
Редактировать: чтобы показать только существенные сравнения, вы можете легко подмножество наборов данных. vjust
а также textsize
работают сейчас, как я обновил до ggsignif_0.4.0
а также R version 3.4.1
, Вместо y_position
Вы можете также попробовать step_increase
# subset
gr <- pv_final$p.value <= 0.05
CN[gr]
ggplot(mydf, aes(x=Group, y=Value, fill=Group)) + geom_boxplot() +
stat_compare_means(data=mydf[ mydf$Group != "PGMC4", ], aes(x=Group, y=Value, fill=Group), size=5) +
geom_signif(comparisons=CN[gr], textsize = 12, vjust = 0.7,
step_increase=0.12, annotation= pv_final$map_signif[gr]) +
theme_bw(base_size = 16)
Вы также можете использовать ggpubr. Добавлять:
stat_compare_means(comparisons=CN[gr], method="wilcox.test", label="p.signif", color="red")