2013-03-20 31 views
10

Tôi muốn hình dung dữ liệu và thống kê ANOVA của mình. Nó được phổ biến để làm điều này bằng cách sử dụng một barplot với dòng bổ sung cho thấy sự khác biệt đáng kể và tương tác. Làm thế nào để bạn thực hiện âm mưu như thế này bằng cách sử dụng R?Barplot có sự khác biệt và tương tác đáng kể?

Đây là những gì tôi muốn:

khác biệt đáng kể:

significant differences

tương tác đáng kể:

significant interactions

nền

Tôi curre ntly sử dụng barplot2{ggplots} để âm mưu thanh và khoảng tin cậy, nhưng tôi sẵn sàng sử dụng bất kỳ gói/thủ tục để hoàn thành công việc. Để có được số liệu thống kê, tôi hiện đang sử dụng TukeyHSD{stats} hoặc pairwise.t.test{stats} cho sự khác biệt và một trong các chức năng của anova (aov, ezANOVA{ez}, gls{nlme}) để tương tác.

Chỉ cần để cung cấp cho bạn một ý tưởng, đây là cốt truyện hiện tại của tôi: barplot2 with CIs

+2

có một hàm plot.cld trong multcomp, nơi bạn có thể đặt các chữ cái phía trên các thanh của bạn cho biết ý nghĩa. Perhabs này cũng là một cái gì đó cho bạn ... – EDi

+0

Ngoài ra còn có 'bar.group' từ gói' agricolae' đặt các chữ cái cho bạn. – mnel

+0

Nếu bạn sử dụng 'barplot' của cơ sở R, bạn có thể lưu trữ các điểm trung tâm của các thanh như' barstore <- barplot (1: 3) '. Để xác minh, điều này hoạt động, hãy thử 'abline (v = barstore)' và lưu ý rằng các đường thẳng đứng tất cả cắt qua trung tâm của các thanh. Sử dụng 'phân đoạn', bạn có thể sử dụng các điểm được lưu trữ này để vẽ các đường so sánh/tương tác của mình. – thelatemail

Trả lời

9

Khi bạn đang sử dụng chức năng barplot2() từ thư viện gplots, sẽ cho ví dụ sử dụng phương pháp này.

Phông chữ đầu tiên, được làm như được đưa ra trong tệp trợ giúp của hàm barplot2(). ci.lci.u là các giá trị khoảng tin cậy giả. Barplot nên được lưu dưới dạng đối tượng.

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) 

Nếu bạn nhìn vào đối tượng mp, nó chứa x tọa độ cho tất cả các thanh.

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 

Bây giờ tôi sử dụng giá trị khoảng tin cậy trên để tính tọa độ cho giá trị y của phân đoạn. Các phân đoạn sẽ bắt đầu ở vị trí cao hơn 1 lần rồi kết thúc khoảng tin cậy. y.cord chứa bốn hàng - hàng đầu tiên và hàng thứ hai tương ứng với thanh đầu tiên và hai hàng khác vào thanh thứ hai. Giá trị y cao nhất được tính từ các giá trị tối đa của khoảng tin cậy cho mỗi cặp thanh. Giá trị x.cord chỉ lặp lại các giá trị giống nhau trong đối tượng mp, mỗi 2 lần.

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

Sau khi sử dụng vạch được tạo thành sapply() để tạo năm phân đoạn (vì lần này có 5 nhóm) sử dụng tọa độ được tính toán.

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

Để vẽ văn bản trên các phân đoạn tính toán tọa độ x và y, trong đó x là điểm giữa của hai thanh x giá trị và giá trị y được tính từ giá trị tối đa của khoảng tin cậy cho mỗi cặp thanh cộng với một số không đổi. Sau đó, sử dụng chức năng text() để thêm thông tin.

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

Tôi đoán rằng bây giờ câu hỏi của bạn đã được ít nhiều đề cập, vì vậy thay vào đó tôi sẽ khuyến khích bạn sử dụng phương pháp khác nhau mà là tốt hơn nhiều trong hình ảnh của dữ liệu của bạn - dotplots. Như một ví dụ so sánh barplot của bạn vào dotplot xây dựng với các điểm dữ liệu tương tự:

#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

So sánh nó với barplot. Trong dotplot, nó dễ dàng hơn nhiều để xem sự khác biệt khi vẽ theo chiều ngang, bạn không cần thêm huyền thoại hoặc thanh hoặc màu sắc để hiển thị cho bạn các điều kiện, bạn không cần các nguyên tắc và các yếu tố ồn ào khác. Bạn có mọi thứ chứa trong ba bảng đó. Tất nhiên, tôi hiểu rằng bạn có thể muốn làm nổi bật các hiệu ứng đáng kể của mình và có thể nó hoạt động tốt cho một số ít điều kiện. Nhưng nếu số lượng nhân tố tăng lên, cốt truyện sẽ tràn ngập các ngôi sao và shit.

Giữ đơn giản. Giữ nó dotplot. Kiểm tra sách William Cleveland và Edward Tufte để biết thêm về điều này.

0

tôi khuyên bạn nên sử dụng ggplot thay vì barplot, và bạn có thể xây dựng các dây chuyền bằng tay như thế này:

này được bắt đầu với một data.table như sau: 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

Các vấn đề liên quan