Барплот со значительными различиями и взаимодействиями?
Я хотел бы визуализировать свои данные и статистику ANOVA. Обычно это делается с помощью барплота с добавленными линиями, указывающими на значительные различия и взаимодействия. Как вы делаете такой сюжет, используя R?
Вот что мне хотелось бы:
Значительные различия:
![significant differences]()
Значительные взаимодействия:
![significant interactions]()
Фон
В настоящее время я использую barplot2{ggplots}
для построения баров и доверительных интервалов, но я готов использовать любой пакет/процедуру для выполнения этой работы. Для получения статистики я использую TukeyHSD{stats}
или pairwise.t.test{stats}
для различий и одну из функций anova (aov
, ezANOVA{ez}
, gls{nlme}
) для взаимодействия.
Просто, чтобы дать вам представление, это мой текущий сюжет:
![barplot2 with CIs]()
Ответы
Ответ 1
Поскольку вы используете функцию barplot2()
в библиотеке gplots
, приведем пример, используя этот подход.
Сначала сделайте barplot, как указано в файле справки функции barplot2()
. ci.l
и ci.u
являются значениями ложного доверительного интервала. Барплот должен быть сохранен как объект.
hh <- t(VADeaths)[1:2, 5:1]
mybarcol <- "gray20"
ci.l <- hh * 0.85
ci.u <- hh * 1.15
mp <- barplot2(hh, beside = TRUE,
col = c("grey12", "grey82"),
legend = colnames(VADeaths)[1:2], ylim = c(0, 100),
cex.names = 1.5, plot.ci = TRUE, ci.l = ci.l, ci.u = ci.u)
Если вы посмотрите на объект mp
, он содержит координаты x для всех баров.
mp
[,1] [,2] [,3] [,4] [,5]
[1,] 1.5 4.5 7.5 10.5 13.5
[2,] 2.5 5.5 8.5 11.5 14.5
Теперь я использую значения верхнего доверительного интервала для вычисления координат для y значений сегментов. Сегменты начинаются с позиции, которая на 1 больше, чем конец доверительных интервалов. y.cord
содержит четыре строки: первая и вторая строки соответствуют первой строке и другим двум строкам во второй строке. Наивысшее значение y рассчитывается из максимальных значений доверительных интервалов для каждой пары баров.
Значения x.cord
просто повторяют те же значения, которые находятся в объекте mp
, каждые 2 раза.
y.cord<-rbind(c(ci.u[1,]+1),c(apply(ci.u,2,max)+5),
c(apply(ci.u,2,max)+5),c(ci.u[2,]+1))
x.cord<-apply(mp,2,function(x) rep(x,each=2))
После использования barplot используйте sapply()
, чтобы сделать пять сегментов линии (потому что на этот раз есть 5 групп) с использованием вычисленных координат.
sapply(1:5,function(x) lines(x.cord[,x],y.cord[,x]))
Для построения текстов над сегментами вычисляются координаты x и y, где x - средняя точка двух значений бара x, а значение y рассчитывается из максимальных значений доверительных интервалов для каждой пары баров плюс некоторая константа. Затем используйте функцию text()
для добавления информации.
x.text<-colMeans(mp)
y.text<-apply(ci.u,2,max)+7
text(c("*","**","***","NS","***"),x=x.text,y=y.text)
![enter image description here]()
Ответ 2
Я предполагаю, что теперь ваш вопрос более или менее адресован, поэтому я вместо этого рекомендую вам использовать другой метод, который намного лучше визуально отображает ваши данные - точки. В качестве примера сравните ваш штрих-код с точкой, построенной с похожими точками данных:
#example data similar to your barplot
d <- data.frame(group=rep(c("control","group1","group2"),each=4),
esker=c(1.6,1.4,1.8,1.5,2,1.8,1.6,1.4,2.3,2,1.7,1.4),
se=rep(0.1,12),
cond=rep(c("t1","t2","t3","t4"),3))
#dotplot - you need Hmisc library for version with error bars
library(Hmisc)
Dotplot(cond ~ Cbind(esker, esker+se, esker-se) | group, data=d, col=1,
layout=c(1,3), aspect="xy",
par.settings = list(dot.line=list(lwd=0), plot.line=list(col=1)))
![enter image description here]()
Сравните это с barplot. В dotplot гораздо легче увидеть различия при горизонтальном построении графика, вам не нужны дополнительные легенды или полосы или цвета, чтобы показать вам условия, вам не нужны рекомендации и другие шумные элементы. У вас есть все, что содержится в этих трех панелях. Конечно, я понимаю, что вы можете выделить свои значительные эффекты, и, возможно, он отлично подходит для небольшого количества условий. Но если число факторов возрастает, сюжет переполняется звездами и дерьмом.
Держите его простым. Удерживайте его в точке. Узнайте больше о книгах Уильяма Кливленда и Эдварда Туфте.
Ответ 3
Я рекомендую использовать ggplot вместо barplot, и вы можете построить строки вручную следующим образом:
Это начинается с таблицы data.table, как показано ниже:
data.table используется
gg <- ggplot(data, aes(x = time, y = mean, fill = type)) +
geom_bar(stat = "identity", position = "dodge") +
scale_fill_manual(values = c("RGX" = "royalblue2", "EX" = "tomato2")) +
xlab("Post-treatment Time Point (months)") +
ylab(paste("data", "Change Score")) +
scale_y_continuous(expand = c(0, 0)) +
ylim(c(0,max(data$mean*1.5)))
# add horizontal bars
gg <- gg + geom_errorbar(aes(ymax = hline, ymin = hline), width = 0.45)
# add vertical bars
gg <- gg + geom_linerange(aes(ymax = max(data$mean)+3, ymin = max(data$mean)+1), position = position_dodge(0.9))
# add asterisks
gg <- gg + geom_text(data = data[1:2], aes(y = max(data$mean)+4), label = ifelse(data$p_value[1:2] <= 0.4, "*", ifelse(data$p_value[1:2] <= 0.05, "*", "")), size = 8)
gg
вывод графика