2013-03-20 7 views
10

Chciałbym wizualizować moje dane i statystyki ANOVA. Zwykle robi się to za pomocą siatki z dodanymi liniami wskazującymi na znaczące różnice i interakcje. Jak zrobić fabułę w ten sposób za pomocą R?Barplot ze znaczącymi różnicami i interakcjami?

To co chciałbym:

Znaczące różnice:

significant differences

istotnych interakcji:

significant interactions

Tło

Jestem curre ntly przy użyciu barplot2{ggplots} do kreślenia słupków i przedziałów ufności, ale jestem gotów użyć dowolnego pakietu/procedury, aby wykonać zadanie. Aby uzyskać statystyki, używam obecnie TukeyHSD{stats} lub pairwise.t.test{stats} dla różnic i jednej z funkcji anova (aov, , gls{nlme}) do interakcji.

Wystarczy dać wyobrażenie, to mój obecny działki: barplot2 with CIs

+2

Istnieje funkcja plot.cld w multcomp, w której można umieścić litery powyżej słupków, co wskazuje na istotność. Perhabs to także coś dla ciebie ... – EDi

+0

Istnieje również 'bar.group' z pakietu' agricolae', który umieszcza litery dla ciebie. – mnel

+0

Jeśli użyjesz 'barplot' bazy R, możesz przechowywać środkowe punkty taktów, jak' barstore <- barplot (1: 3) '. Aby sprawdzić, czy to działa, spróbuj 'abline (v = barstore)' i zwróć uwagę, że pionowe linie przecinają cały środek pasków. Używając "segmentów", możesz wykorzystać te zapisane punkty, aby narysować linie porównania/interakcji. – thelatemail

Odpowiedz

9

Gdy używasz funkcji barplot2() z biblioteki gplots, da przykład przy użyciu tej metody.

Najpierw utworzono plagę, jak podano w pliku pomocy funkcji barplot2(). ci.l i ci.u są fałszywymi wartościami przedziału ufności. Barplot powinien zostać zapisany jako obiekt.

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) 

Jeśli spojrzeć na obiekt mp, zawiera współrzędne x dla wszystkich barów.

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 

Teraz używam górnych przedziałów ufności do obliczania współrzędnych dla wartości y segmentów. Segmenty rozpoczną się w pozycji o 1 wyższej niż koniec przedziałów ufności. y.cord zawiera cztery rzędy - pierwszy i drugi wiersz odpowiadają pierwszemu prętowi, a pozostałe dwa rzędy drugiemu prętowi. Najwyższa wartość y jest obliczana na podstawie maksymalnych wartości przedziałów ufności dla każdej pary prętów. x.cord wartości po prostu powtarzaj te same wartości, które są w obiekcie mp, co 2 razy.

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

Po barplot jest stosowanie sapply() do pięciu odcinków (ponieważ ten czas jest 5 grupy) z użyciem obliczonych współrzędnych.

sapply(1:5,function(x) lines(x.cord[,x],y.cord[,x])) 

Aby wykreślić teksty nad segmentami obliczenie współrzędnych x i y, gdzie x jest środkowym punktem dwóch prętów wartości x i y to wartości obliczono z wartości maksymalnych przedziałów ufności dla każdej pary bar oraz niektóre stałe. Następnie użyj funkcji text(), aby dodać informacje.

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

myślę, że teraz Twoje pytanie zostało skierowane bardziej lub mniej, więc będzie zamiast zachęcać do korzystania z innej metody, która jest o wiele lepiej w reprezentacji wizualnej swoich danych - dotplots. Jako przykład porównać barplot do dotplot zbudowane z podobnych punktów danych:

#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

porównać go do barplot. W dotplot znacznie łatwiej dostrzec różnice przy wykreślaniu w poziomie, nie potrzebujesz dodatkowej legendy ani pasków lub kolorów, aby pokazać ci warunki, nie potrzebujesz wytycznych i innych hałaśliwych elementów. Masz wszystko zawarte w tych trzech panelach. Oczywiście rozumiem, że możesz chcieć podkreślić swoje znaczące efekty, i że być może to działa dobrze dla niewielkiej liczby warunków. Ale jeśli liczba czynników wzrośnie, fabuła będzie przepełniona gwiazdami i gównem.

Zachowaj to proste. Zachowaj to dotplot. Sprawdź książki William Cleveland i Edward Tufte, aby uzyskać więcej informacji na ten temat.

0

polecam korzystania ggplot zamiast barplot i można budować linie ręcznie tak:

to począwszy data.table tak: 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 

plot output

Powiązane problemy