Làm nổi bật các kết quả quan trọng từ nhiều so sánh không tham số trên các ô vuông


9

Tôi có các ô vuông gồm 13 nhóm mà tôi thể hiện trong một cốt truyện. Các nhóm có dân số không cân bằng và thường không được phân phối. Tôi muốn chỉ ra cặp nào giống nhau về mặt thống kê (nghĩa là có giá trị p kruskal.test <0,05) bằng cách đặt a, b, c, v.v. lên trên các hộp khớp. Đây là một mã giả để hiển thị những gì tôi có:

A = c(1, 5, 8, 17, 16, 3, 24, 19, 6) 
B = c(2, 16, 5, 7, 4, 7, 3) 
C = c(1, 1, 3, 7, 9, 6, 10, 13) 
D = c(2, 15, 2, 9, 7) 
junk = list(g1=A, g2=B, g3=C, g4=D) 
boxplot(junk) 

Đây là một cốt truyện tôi tìm thấy thực hiện những gì tôi muốn (ngoại trừ tôi có 13 nhóm liên tiếp):

Câu trả lời:


7

Mã đơn giản nhất mà tôi nghĩ đến được hiển thị dưới đây. Tôi khá chắc chắn có một số chức năng đã có sẵn để thực hiện điều đó trên CRAN nhưng tôi quá lười để tìm kiếm chúng, ngay cả trên R- search .

dd <- data.frame(y=as.vector(unlist(junk)), 
                 g=rep(paste("g", 1:4, sep=""), unlist(lapply(junk, length))))

aov.res <- kruskal.test(y ~ g, data=dd)
alpha.level <- .05/nlevels(dd$g)  # Bonferroni correction, but use 
                                  # whatever you want using p.adjust()

# generate all pairwise comparisons
idx <- combn(nlevels(dd$g), 2)

# compute p-values from Wilcoxon test for all comparisons
pval.res <- numeric(ncol(idx))
for (i in 1:ncol(idx))
  # test all group, pairwise
  pval.res[i] <- with(dd, wilcox.test(y[as.numeric(g)==idx[1,i]], 
                                      y[as.numeric(g)==idx[2,i]]))$p.value

# which groups are significantly different (arranged by column)
signif.pairs <- idx[,which(pval.res<alpha.level)]

boxplot(y ~ g, data=dd, ylim=c(min(dd$y)-1, max(dd$y)+1))
# use offset= to increment space between labels, thanks to vectorization
for (i in 1:ncol(signif.pairs))
    text(signif.pairs[,i], max(dd$y)+1, letters[i], pos=4, offset=i*.8-1)

Dưới đây là một ví dụ về những gì đoạn mã trên sẽ tạo ra (với sự khác biệt đáng kể giữa bốn nhóm):

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

Thay vì thử nghiệm Wilcoxon, người ta có thể dựa vào thủ tục được thực hiện trong kruskalmc()hàm từ gói pgirmess (xem mô tả về quy trình được sử dụng ở đây ).

Ngoài ra, hãy chắc chắn kiểm tra các mẹo R của Rudolf Cardinal về R: biểu đồ cơ bản 2 (đặc biệt, xem biểu đồ thanh khác, có chú thích ).


Cảm ơn, chl. Tôi không phải là một nhà thống kê nên tôi sẽ cần tìm hiểu câu trả lời của bạn nhiều hơn, nhưng có vẻ như nó làm những gì tôi cần.
Ilik

Nếu có điều gì đó không rõ ràng, đừng ngần ngại hỏi. Không có nhiều công cụ thống kê ở đây: Tôi đã sử dụng các xét nghiệm Wilcoxon để so sánh nhóm theo cặp và sửa các giá trị p riêng lẻ để hạn chế rủi ro tổng thể dương tính giả đến 5%. Các NPMC gói bao gồm cơ sở bổ sung để xử lý so sánh nhiều phi tham số, nhưng cũng có những đồng xu khuôn khổ. Phần còn lại hoàn toàn là mã R sử dụng đồ họa cơ sở R; nó có thể được thực hiện với mạng tinh thể hoặc ggplot2.
chl

Tôi xin lỗi vì sự thiếu hiểu biết của tôi trong số liệu thống kê. Vì vậy, tôi đã thử mã của bạn và lần đầu tiên tôi nhận thấy bạn tính toán kruskal.test nhưng không sử dụng kết quả (aov.res). Bây giờ tôi hiểu wilcox.test là trường hợp đặc biệt cho kruskal cho hai mẫu. Nhưng sau đó tôi đã cố gắng thay đổi các giá trị trong các nhóm của mình để làm cho chúng (theo trực giác) khác biệt và xem điều gì sẽ xảy ra. A = c (10, 50, 18, 17, 16, 31, 24, 19, 6) B = c (10, 50, 18, 17, 16, 30, 25, 18, 7) C = c (1, 1, 3, 7, 9, 6, 10, 13) D = c (200, 158, 206, 119, 77). g1 & g2 bây giờ khác nhau đáng kể ?? và g3 & g4 thì không? không chắc tại sao tôi hiểu
Ilik

@Ilik Đã xảy ra lỗi trong mã của tôi ( with(dd,hướng dẫn ở sai vị trí dẫn đến một bài kiểm tra kỳ lạ!). Cảm ơn vì đã bắt được nó! Có, tôi không sử dụng kết quả từ bài kiểm tra KW nhưng luôn luôn nên kiểm tra trước, nếu không, nhiều bài kiểm tra sau đại học sẽ là vô nghĩa (hoặc ít nhất, gợi ý về việc rình mò dữ liệu). Lưu ý Tôi đã sửa mã và không có gì đáng kể, nhưng tôi đã để lại hình ảnh gốc để rõ ràng với kết quả quan trọng.
chl

g))for(TôiTôin1:ncotôi(STôignTôif.pmộtTôirS))MyText[STôignTôif.pmộtTôirS[,Tôi]]= =pmộtSte(MyText[STôignTôif.pmộtTôirS[,Tôi]],tôietterS[Tôi],Sep= =")text(c(1:ntôievetôiS(ddy)+1,ntôievetôiS(dd
Ilik
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.