2013-03-20 63 views
10

Vorrei visualizzare i miei dati e le statistiche ANOVA. È comune farlo usando un barplot con linee aggiunte che indicano differenze e interazioni significative. Come fai trama come questa usando R?Barplot con differenze e interazioni significative?

Questo è quello che vorrei:

differenze significative:

significant differences

interazioni significative:

significant interactions

Sfondo

Sono curre utilizzando n. barplot2{ggplots} per tracciare barre e intervalli di confidenza, ma sono disposto a utilizzare qualsiasi pacchetto/procedura per portare a termine il lavoro. Per ottenere le statistiche che attualmente sto usando TukeyHSD{stats} o pairwise.t.test{stats} per le differenze e una delle funzioni di anova (aov, ezANOVA{ez}, gls{nlme}) per le interazioni.

solo per darvi un'idea, questo è il mio grafico corrente: barplot2 with CIs

+2

c'è una funzione plot.cld in multcomp, in cui è possibile inserire lettere sopra le barre che indicano significato. Perhabs questo è anche qualcosa per te ... – EDi

+0

C'è anche 'bar.group' dal pacchetto' agricolae' che mette le lettere per te. – mnel

+0

Se si utilizza il 'barplot 'della base R, è possibile memorizzare i punti centrali di barre come' barstore <- barplot (1: 3) '. Per verificare che funzioni, prova 'abline (v = barstore)' e nota che le linee verticali tagliano tutte il centro delle barre. Usando 'segmenti' potresti essere in grado di usare questi punti memorizzati per disegnare le tue linee di confronto/interazione. – thelatemail

risposta

9

Come si utilizza la funzione barplot2() dalla libreria gplots, darà esempio utilizzando questo approccio.

Innanzitutto, reso barplot come indicato nel file della guida della funzione barplot2(). ci.l e ci.u sono valori di intervallo di confidenza falsi. Il barattolo dovrebbe essere salvato come oggetto.

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) 

Se si guarda sul oggetto mp, contiene x coordinate per tutti i bar.

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 

Ora utilizzo i valori dell'intervallo di confidenza superiore per calcolare le coordinate per i valori y dei segmenti. I segmenti inizieranno a una posizione che è 1 più alta della fine degli intervalli di confidenza. y.cord contiene quattro righe: prima e seconda riga corrispondono alla prima barra e altre due righe alla seconda barra. Il valore y più alto viene calcolato dai valori massimi degli intervalli di confidenza per ciascuna coppia di barre. I valori x.cord ripetono semplicemente gli stessi valori che si trovano nell'oggetto mp, ogni 2 volte.

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

Dopo barplot è fatto uso sapply() fare cinque segmenti (perché questa volta ci sono 5 gruppi) utilizzando le coordinate calcolate.

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

Per tracciare testi sopra i segmenti calcolare coordinate xey, dove x è punto di mezzo di due barre valori x ed y valore viene calcolato dai valori massimi di intervalli di confidenza per ciascuna coppia bar più alcuni costante. Quindi utilizzare la funzione text() per aggiungere informazioni.

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

Credo che adesso la tua domanda è stata più o meno indirizzata, quindi mi sarà invece vi incoraggio a utilizzare il metodo diverso che è molto meglio in rappresentazione visiva dei dati - dotplots. A titolo di esempio confrontare la vostra barplot al grafico a punti costruito con punti di dati simili:

#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

confrontarlo con barplot. Nel dotplot, è molto più facile vedere le differenze quando tracciate orizzontalmente, non hai bisogno di legende o barre o colori extra per mostrarti le condizioni, non hai bisogno delle linee guida e di altri elementi rumorosi. Hai tutto contenuto in questi tre pannelli. Naturalmente, capisco che potresti voler evidenziare i tuoi effetti significativi e che forse funziona bene per un piccolo numero di condizioni. Ma se il numero di fattori aumenta, la trama traboccherebbe di stelle e merda.

Semplicità. Mantieni il dotplot. Controlla i libri di William Cleveland e Edward Tufte per ulteriori informazioni.

0

mi consiglia di utilizzare ggplot invece di barplot, e si può costruire le linee manualmente in questo modo:

Questo sta cominciando con un data.table come la seguente: 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