Sự không nhất quán nhẹ giữa chức năng R tích hợp Kruskal-Wallis và tính toán thủ công


9

Tôi bối rối bởi những điều sau đây, và tôi đã không thể tìm ra câu trả lời ở nơi khác.

Tôi đang cố gắng học R trong khi thực hiện một số thống kê và, như một bài tập, tôi cố gắng kiểm tra kỹ kết quả của các hàm R tích hợp bằng cách thực hiện những điều này 'bằng tay', như đã từng, trong R. Tuy nhiên , đối với thử nghiệm Kruskal-Wallis, tôi tiếp tục nhận được các kết quả khác nhau và tôi không thể hiểu tại sao.

Ví dụ: tôi đang xem các dữ liệu sau đây được đưa ra trong một bài tập

activity <- c(2, 4, 3, 2, 3, 3, 4, 0, 4, 3, 4, 0, 0, 1, 3, 1, 2, 0, 3, 1, 0, 3, 4, 0, 1, 2, 2, 2, 3, 2) 
group <- c(rep("A", 11), rep("B", 10), rep("C", 9))
group <- factor(group)
data.raw <- data.frame(activity, group)

Và tôi muốn phân tích hoạt động theo nhóm. Đầu tiên tôi chạy thử nghiệm Kruskal-Wallis bằng hàm R dựng sẵn

kruskal.test(activity ~ group, data = data.raw)

Mà trả về .H=8.9056

Để kiểm tra kỹ, tôi thử thực hiện cùng một cách 'bằng tay' trong R, với mã sau (không nghi ngờ gì là bất lực)

rank <- rank(activity)
data.rank <- data.frame(rank, group)
rank.sum <- aggregate(rank ~ group, data = data.rank, sum)

x <- rank.sum[1,2]^2 / 11 + rank.sum[2,2]^2 / 10 + rank.sum[3,2]^2 / 9
H <- (12 / (length(activity) * (length(activity) + 1))) * x - 3 * (length(activity) + 1)
H

Điều này có nghĩa là để phản ánh công thức sau đây:

H=12N(N+1)i=1g(Ri2ni)3(N+1)

Trong đó là tổng số quan sát, là số lượng nhóm, là số lượng quan sát trong nhóm thứ và là tổng các cấp bậc của nhóm thứ .g n i i R i iNgniiRii

Và bây giờ tôi nhận được , trong đó, thêm vào sự nhầm lẫn của tôi, cũng là câu trả lời được đưa ra cho bài tập được đề cập. Tôi đã thử điều này cho một vài bộ dữ liệu khác nhau và tôi có xu hướng nhận được giá trị cao hơn một chút cho bằng cách sử dụng hàm dựng sẵn.HH=8.499H

Tôi đã cố gắng tìm kiếm để tìm ra những gì tôi đang làm sai hoặc không hiểu, nhưng không có kết quả. Bất cứ ai có thể giúp tôi hiểu tại sao kruskal.testhàm inbuilt trả về một giá trị khác với giá trị tôi nhận được bằng cách đánh vần mọi thứ?

Câu trả lời:


12

kruskal.testáp dụng một sự điều chỉnh cho các mối quan hệ như được mô tả trong bài viết Wikipedia này (điểm 4):

Việc hiệu chỉnh các mối quan hệ nếu sử dụng công thức cắt ngắn được mô tả ở điểm trước có thể được thực hiện bằng cách chia H cho , ...1i=1G(ti3ti)N3N

Tiếp tục từ mã của bạn:

TIES <- table(activity)
H / (1 - sum(TIES^3 - TIES)/(length(activity)^3 - length(activity)))
#[1] 8.9056

Bạn có thể tìm hiểu hàm R làm gì bằng cách nghiên cứu kỹ mã mà bạn có thể thấy bằng cách sử dụng getAnywhere(kruskal.test.default).


4
@MichaelCécick Không, không phải vậy. Vấn đề là OP đã được dạy đơn giản hóa bài kiểm tra chỉ nên được sử dụng nếu không có mối quan hệ nào.
Roland

4
@MichaelCécick Tôi không nói rằng nó sẽ không phù hợp với Stack Overflow. Nhưng tôi cho rằng nó phù hợp như nhau ở CV. Rõ ràng, sẽ rất hữu ích nếu OP không chỉ chia sẻ mã của họ mà còn cả các công thức họ đang sử dụng.
Roland

3
@Michael Trạng thái của chủ đề này là một cuộc gọi dễ dàng: nó hoàn toàn nằm trong phạm vi quan điểm của chúng tôi bởi vì nó tìm cách hiểu một bài kiểm tra thống kê.
whuber

2
Chỉnh sửa để bao gồm các công thức được phản ánh trong mã. Lần đầu tiên nên nghĩ như vậy. Lời xin lỗi.
MSR

3
Xem thêm chức năng Hmiscgói R spearman2sử dụng midranks cho các mối quan hệ và Fkiểm tra để có được Kruskal-Wallis. Tôi nghĩ rằng điều này là chính xác hơn so với một số phương pháp.
Frank Harrell
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.