Barplot со значительными различиями и взаимодействиями?

Я хотел бы визуализировать свои данные и статистику ANOVA. Обычно это делается с помощью гистограммы с добавленными линиями, указывающими на существенные различия и взаимодействия. Как сделать такой сюжет с помощью R?

Это то, что я хотел бы:

Значительные различия:

существенные различия

Значимые взаимодействия:

значительные взаимодействия

Фон

В настоящее время я использую barplot2{ggplots} для построения столбцов и доверительных интервалов, но я готов использовать любой пакет/процедуру для выполнения этой работы. Чтобы получить статистику, я в настоящее время использую TukeyHSD{stats} или pairwise.t.test{stats} для различий и одну из функций анова (aov, ezANOVA{ez}, gls{nlme}) для взаимодействий.

Просто чтобы дать вам представление, это мой текущий график: barplot2 с CI


person Jonas Lindeløv    schedule 20.03.2013    source источник
comment
в multcomp есть функция plot.cld, где вы можете ставить буквы над полосами, указывающие на значимость. Возможно, это тоже что-то для вас...   -  person EDi    schedule 21.03.2013
comment
Также есть bar.group из пакета agricolae, который надевает буквы за вас.   -  person mnel    schedule 21.03.2013
comment
Если вы используете базу R barplot, вы можете хранить центральные точки стержней, например barstore <- barplot(1:3). Чтобы убедиться, что это работает, попробуйте abline(v=barstore) и обратите внимание, что все вертикальные линии пересекают центр столбцов. Используя segments, вы можете использовать эти сохраненные точки для построения линий сравнения/взаимодействия.   -  person thelatemail    schedule 21.03.2013
comment
Не гистограмма, а аккуратный способ визуализации результатов ANOVA находится здесь: stats.stackexchange.com/a/28155/ 7744   -  person Ben    schedule 21.03.2013
comment
stackoverflow.com/questions/2286085/   -  person Ben Bolker    schedule 21.03.2013


Ответы (3)


Поскольку вы используете функцию barplot2() из библиотеки gplots, приведем пример использования этого подхода.

Во-первых, сделал гистограмму, как указано в файле справки функции barplot2(). ci.l и ci.u являются поддельными значениями доверительного интервала. Barplot должен быть сохранен как объект.

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))

После того, как построена гистограмма, используйте 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)

введите здесь описание изображения

person Didzis Elferts    schedule 21.03.2013

Я предполагаю, что теперь ваш вопрос более или менее решен, поэтому вместо этого я рекомендую вам использовать другой метод, который намного лучше визуально представляет ваши данные - точечные диаграммы. В качестве примера сравните свою гистограмму с точечной диаграммой, построенной с аналогичными точками данных:

#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)))

введите здесь описание изображения

Сравните это с барплотом. На точечной диаграмме гораздо легче увидеть различия, если построить ее горизонтально, вам не нужны дополнительные легенды, столбцы или цвета, чтобы показать вам условия, вам не нужны направляющие линии и другие зашумленные элементы. У вас есть все, что содержится в этих трех панелях. Конечно, я понимаю, что вы можете захотеть выделить свои значительные эффекты, и что, возможно, это хорошо работает для небольшого количества условий. Но если число факторов увеличится, сюжет будет переполнен звездами и дерьмом.

Будь проще. Держите это точечной диаграммой. Прочтите книги Уильяма Кливленда и Эдварда Тафте, чтобы узнать больше об этом.

person Geek On Acid    schedule 21.03.2013

Я рекомендую использовать ggplot вместо barplot, и вы можете построить линии вручную следующим образом:

Это начинается с data.table, подобного следующему: data.table used

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

вывод графика

person Ian    schedule 11.01.2017