Làm thế nào để vẽ một âm mưu tương tác với khoảng tin cậy?


11

Nỗ lực của tôi:

  1. Tôi không thể có được khoảng tin cậy trong interaction.plot()

  2. và mặt khác plotmeans()từ gói 'gplot' sẽ không hiển thị hai biểu đồ. Hơn nữa, tôi không thể đặt hai plotmeans()biểu đồ chồng lên nhau vì mặc định trục này khác nhau.

  3. Tôi đã có một số thành công khi sử dụng plotCI()từ gói 'gplot' và áp dụng hai biểu đồ nhưng kết quả khớp trục không hoàn hảo.

Bất kỳ lời khuyên về cách thực hiện một âm mưu tương tác với khoảng tin cậy? Hoặc bởi một chức năng, hoặc lời khuyên về cách xếp chồng plotmeans()hoặc plotCI()biểu đồ.

mẫu mã

br=structure(list(tangle = c(140L, 50L, 40L, 140L, 90L, 70L, 110L, 
150L, 150L, 110L, 110L, 50L, 90L, 140L, 110L, 50L, 60L, 40L, 
40L, 130L, 120L, 140L, 70L, 50L, 140L, 120L, 130L, 50L, 40L, 
80L, 140L, 100L, 60L, 70L, 50L, 60L, 60L, 130L, 40L, 130L, 100L, 
70L, 110L, 80L, 120L, 110L, 40L, 100L, 40L, 60L, 120L, 120L, 
70L, 80L, 130L, 60L, 100L, 100L, 60L, 70L, 90L, 100L, 140L, 70L, 
100L, 90L, 130L, 70L, 130L, 40L, 80L, 130L, 150L, 110L, 120L, 
140L, 90L, 60L, 90L, 80L, 120L, 150L, 90L, 150L, 50L, 50L, 100L, 
150L, 80L, 90L, 110L, 150L, 150L, 120L, 80L, 80L), gtangles = c(141L, 
58L, 44L, 154L, 120L, 90L, 128L, 147L, 147L, 120L, 127L, 66L, 
118L, 141L, 111L, 59L, 72L, 45L, 52L, 144L, 139L, 143L, 73L,  
59L, 148L, 141L, 135L, 63L, 51L, 88L, 147L, 110L, 68L, 78L, 63L, 
64L, 70L, 133L, 49L, 129L, 100L, 78L, 128L, 91L, 121L, 109L, 
48L, 113L, 50L, 68L, 135L, 120L, 85L, 97L, 136L, 59L, 112L, 103L, 
62L, 87L, 92L, 116L, 141L, 70L, 121L, 92L, 137L, 85L, 117L, 51L, 
84L, 128L, 162L, 102L, 127L, 151L, 115L, 57L, 93L, 92L, 117L, 
140L, 95L, 159L, 57L, 65L, 130L, 152L, 90L, 117L, 116L, 147L, 
140L, 116L, 98L, 95L), up = c(-1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
-1L, -1L, 1L, 1L, 1L, 1L, -1L, -1L, -1L, -1L, 1L, 1L, -1L, -1L, 
1L, 1L, -1L, 1L, 1L, -1L, 1L, 1L, 1L, 1L, 1L, -1L, -1L, 1L, 1L, 
1L, 1L, -1L, -1L, 1L, 1L, -1L, -1L, -1L, -1L, -1L, -1L, -1L, 
1L, -1L, -1L, -1L, -1L, -1L, 1L, -1L, 1L, 1L, -1L, -1L, -1L, 
-1L, 1L, -1L, 1L, -1L, -1L, -1L, 1L, -1L, 1L, -1L, 1L, 1L, 1L, 
-1L, -1L, -1L, -1L, -1L, -1L, 1L, -1L, 1L, 1L, -1L, -1L, 1L, 
1L, 1L, -1L, 1L, 1L, 1L)), .Names = c("tangle", "gtangles", "up"
), class = "data.frame", row.names = c(NA, -96L))

plotmeans2 <- function(br, alph) {
dt=br;   tmp   <- split(br$gtangles, br$tangle);   
means <- sapply(tmp, mean);  stdev <- sqrt(sapply(tmp, var));  
n <- sapply(tmp,length);  
ciw   <- qt(alph, n) * stdev / sqrt(n)
plotCI(x=means, uiw=ciw, col="black", barcol="blue", lwd=1,ylim=c(40,150),  xlim=c(1,12)); 
par(new=TRUE) dt= subset(br,up==1);   
tmp   <- split(dt$gtangles, dt$tangle);  
means <- sapply(tmp, mean);  
stdev <- sqrt(sapply(tmp, var));  
n <- sapply(tmp,length); 
ciw  <- qt(0.95, n) * stdev / sqrt(n)
plotCI(x=means, uiw=ciw, type='l',col="black", barcol="red", lwd=1,ylim=c(40,150), xlim=c(1,12),pch='+');
abline(v=6);abline(h=90);abline(30,10); par(new=TRUE);
dt=subset(br,up==-1);   
tmp <- split(dt$gtangles, dt$tangle);  
means <- sapply(tmp, mean);  
stdev <- sqrt(sapply(tmp, var));  
n <- sapply(tmp,length); 
ciw <- qt(0.95, n) * stdev / sqrt(n)
plotCI(x=means, uiw=ciw, type='l', col="black", barcol="blue",   lwd=1,ylim=c(40,150), xlim=c(1,12),pch='-');abline(v=6);abline(h=90);
abline(30,10);
}

plotmeans2(br,.95)

Câu trả lời:


21

Nếu bạn sẵn sàng sử dụng ggplot , bạn có thể thử đoạn mã sau.

Với một công cụ dự đoán liên tục

library(ggplot2)
gp <- ggplot(data=br, aes(x=tangle, y=gtangles)) 
gp + geom_point() + stat_smooth(method="lm", fullrange=T) + facet_grid(. ~ up)

cho một cốt truyện tương tác

nhập mô tả hình ảnh ở đây

Đối với một âm mưu tương tác tiêu chuẩn (như âm mưu được tạo ra bởi interaction.plot()), bạn chỉ cần loại bỏ các khía cạnh.

gp <- ggplot(data=br, aes(x=tangle, y=gtangles, colour=factor(up))) 
gp + geom_point() + stat_smooth(method="lm")

nhập mô tả hình ảnh ở đây

Với một công cụ dự đoán rời rạc

Sử dụng ToothGrowthbộ dữ liệu (xem help(ToothGrowth)),

ToothGrowth$dose.cat <- factor(ToothGrowth$dose, labels=paste("d", 1:3, sep=""))
df <- with(ToothGrowth , aggregate(len, list(supp=supp, dose=dose.cat), mean))
df$se <- with(ToothGrowth , aggregate(len, list(supp=supp, dose=dose.cat), 
              function(x) sd(x)/sqrt(10)))[,3]

opar <- theme_update(panel.grid.major = theme_blank(),
                     panel.grid.minor = theme_blank(),
                     panel.background = theme_rect(colour = "black"))
gp <- ggplot(df, aes(x=dose, y=x, colour=supp, group=supp))
gp + geom_line(aes(linetype=supp), size=.6) + 
     geom_point(aes(shape=supp), size=3) + 
     geom_errorbar(aes(ymax=x+se, ymin=x-se), width=.1)
theme_set(opar)

nhập mô tả hình ảnh ở đây


Cảm ơn bạn rất nhiều vì đã trả lời chi tiết. Tôi muốn hỏi, có cách nào để tạo khoảng tin cậy dọc ở mỗi cấp độ của biến độc lập không? Có cách nào để xóa nền và trở lại biểu đồ 'kiểu cũ' không?
Adam SA

1
@Adam Tôi đã cập nhật phản hồi của mình với trường hợp 2 biến phân loại + biến phản ứng liên tục - hy vọng đây là ý của bạn. Tôi cũng đã thêm mã để hiển thị cách tùy chỉnh ggplotchủ đề. Nói chung, bạn có thể nói gp + theme_bw()chỉ cần loại bỏ nền màu xám; Ở đây, tôi cũng gỡ lưới.
chl

12

Ngoài ra còn có gói hiệu ứng của Fox và Hong trong R. Xem J. Stat. Mềm mại. giấy tờ ở đâyở đây cho các ví dụ với khoảng tin cậy và tạo mã R.

Nó không hoàn toàn đẹp như một giải pháp ggplot, nhưng tổng quát hơn một chút và là cứu cánh cho các GLM phức tạp vừa phải.


1
(+1) Tôi phải thừa nhận tôi thích cách tiếp cận này :-)
chl

@chl và / hoặc Conjugate, bạn có thể nói thêm về lý do tại sao bạn thích phương pháp này không? Nó sẽ giúp những người như tôi quyết định đầu tư thời gian vào phương pháp nào.
Michael Giám mục

1
@MichaelBishop Về cơ bản vì nó kết thúc rất nhiều điều khó khăn (âm mưu liên kết so với thang đo phản hồi, hiển thị 95% CI cho GLMMM, ngoài lề đối với các điều khoản tương tác, v.v.) sẽ khó xử lý trong vài lệnh R (và cá nhân, Tôi rất thích latticeđồ họa :)
chl
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.