Есть ли функция добавления результатов тестирования aov post-hoc в ggplot2 boxplot?
Я хотел бы добавить результаты Tukey.HSD post-hoc тест на ggplot2
коробчатой диаграммы. это так ответ содержит ручной пример того, что я хочу (т. е. буквы на графике были добавлены вручную; группы, которые разделяют букву, неразличимы, p>что угодно).
есть ли автоматическая функция добавления таких букв в boxplot, основанная на aov и tukey HSD post-hoc analyis?
Я думаю, было бы не слишком сложно написать такое функция. Это выглядело бы примерно так:--8-->
set.seed(0)
lev <- gl(3, 10)
y <- c(rnorm(10), rnorm(10) + 0.1, rnorm(10) + 3)
d <- data.frame(lev=lev, y=y)
p_base <- ggplot(d, aes(x=lev, y=y)) + geom_boxplot()
a <- aov(y~lev, data=d)
tHSD <- TukeyHSD(a)
# Function to generate a data frame of factor levels and corresponding labels
generate_label_df <- function(HSD, factor_levels) {
comparisons <- rownames(HSD$l)
p.vals <- HSD$l[ , "p adj"]
## Somehow create a vector of letters
labels <- # A vector of letters, one for each factor level, generated using `comparisons` and `p.vals`
letter_df <- data.frame(lev=factor_levels, labels=labels)
letter_df
}
# Add the labels to the plot
p_base +
geom_text(data=generate_label_df(tHSD), aes(x=l, y=0, label=labels))
Я понимаю, что
1 ответов
вы можете использовать "multcompLetters" из пакета "multcompView" для создания букв гомологичных групп после теста Tukey HSD. Оттуда нужно извлечь метки групп, соответствующие каждому фактору, проверенному в HSD Tukey, а также верхний квантиль, отображаемый в boxplot, чтобы поместить метку чуть выше этого уровня.
library(plyr)
library(ggplot2)
library(multcompView)
set.seed(0)
lev <- gl(3, 10)
y <- c(rnorm(10), rnorm(10) + 0.1, rnorm(10) + 3)
d <- data.frame(lev=lev, y=y)
a <- aov(y~lev, data=d)
tHSD <- TukeyHSD(a, ordered = FALSE, conf.level = 0.95)
generate_label_df <- function(HSD, flev){
# Extract labels and factor levels from Tukey post-hoc
Tukey.levels <- HSD[[flev]][,4]
Tukey.labels <- multcompLetters(Tukey.levels)['Letters']
plot.labels <- names(Tukey.labels[['Letters']])
# Get highest quantile for Tukey's 5 number summary and add a bit of space to buffer between
# upper quantile and label placement
boxplot.df <- ddply(d, flev, function (x) max(fivenum(x$y)) + 0.2)
# Create a data frame out of the factor levels and Tukey's homogenous group letters
plot.levels <- data.frame(plot.labels, labels = Tukey.labels[['Letters']],
stringsAsFactors = FALSE)
# Merge it with the labels
labels.df <- merge(plot.levels, boxplot.df, by.x = 'plot.labels', by.y = flev, sort = FALSE)
return(labels.df)
}
создать ggplot
p_base <- ggplot(d, aes(x=lev, y=y)) + geom_boxplot() +
geom_text(data = generate_label_df(tHSD, 'lev'), aes(x = plot.labels, y = V1, label = labels))