Cách bạn đã làm bài kiểm tra chi bình phương là không chính xác. Có một số vấn đề. Đầu tiên, khung dữ liệu của bạn trông như thế này:
variable frequency
1 0 20
2 1 10
3 2 5
4 3 3
5 4 2
6 5 1
Vì vậy, khi bạn chạy mean(df$variable)
, bạn nhận được 2.5
, đó chỉ là ý nghĩa của 0:5
. Đó là, nó không có trọng số. Thay vào đó, hãy tạo biến của bạn như thế này:
x = rep(0:5, times=c(20, 10, 5, 3, 2, 1))
table(x)
# x
# 0 1 2 3 4 5
# 20 10 5 3 2 1
mean(x)
# [1] 1.02439
Cuộc table()
gọi cho thấy mã cung cấp cho chúng tôi những gì chúng tôi muốn và do đó mean()
ước tính lambda chính xác.
Tiếp theo, xác suất ước tính của bạn chỉ đi đến 5
, nhưng phân phối Poisson đi đến vô cùng. Vì vậy, bạn cần tính đến xác suất của các giá trị mà bạn không có trong tập dữ liệu của mình. Điều này không khó để làm, bạn chỉ cần tính toán bổ sung:
probs = dpois(0:5, lambda=mean(x))
probs
# [1] 0.359015310 0.367771781 0.188370912 0.064321775 0.016472650 0.003374884
comp = 1-sum(probs)
# [1] 0.0006726867
Cuối cùng, trong R
's chisq.test()
chức năng, x=
và y=
lập luận không chính xác cho các giá trị mong đợi và quan sát theo cách bạn thiết lập này. Đối với một điều, những gì bạn đang gọi là "mong đợi" thực sự là xác suất (nghĩa là đầu ra từ dpois()
), để tạo ra các giá trị dự kiến này, bạn sẽ phải nhân các xác suất đó (và chắc chắn bao gồm lời khen) với tổng số. Nhưng ngay cả sau đó, bạn sẽ không sử dụng chúng cho y=
. Ở bất cứ giá nào, bạn thực sự không phải làm điều đó, bạn chỉ có thể gán xác suất cho p=
đối số. Ngoài ra, bạn sẽ cần thêm một 0
vectơ giá trị quan sát của mình để thể hiện tất cả các giá trị có thể không hiển thị trong tập dữ liệu của bạn:
chisq.test(x=c(20, 10, 5, 3, 2, 1, 0), p=c(probs, comp))
# Chi-squared test for given probabilities
#
# data: c(20, 10, 5, 3, 2, 1, 0)
# X-squared = 12.6058, df = 6, p-value = 0.04974
#
# Warning message:
# In chisq.test(x = c(20, 10, 5, 3, 2, 1, 0), p = c(probs, comp)) :
# Chi-squared approximation may be incorrect
Thông báo cảnh báo cho thấy chúng tôi có thể thích mô phỏng hơn, vì vậy chúng tôi thử lại:
chisq.test(x=c(20, 10, 5, 3, 2, 1, 0), p=c(probs, comp), simulate.p.value=TRUE)
# Chi-squared test for given probabilities with simulated p-value
# (based on 2000 replicates)
#
# data: c(20, 10, 5, 3, 2, 1, 0)
# X-squared = 12.6058, df = NA, p-value = 0.07046
Đây có lẽ là một giá trị p chính xác hơn, nhưng nó đặt ra một câu hỏi về cách nó nên được giải thích. Bạn hỏi "Vì giá trị P> 0,05, tôi đã kết luận bên dưới rằng phân phối biến tuân theo phân phối Poisson - ai đó có thể xác nhận điều này không?" Sử dụng phương pháp đúng, chúng tôi lưu ý rằng giá trị p đầu tiên chỉ là <.05, nhưng giá trị p thứ hai (mô phỏng) chỉ là> 0,05. Mặc dù giá trị p sau này chính xác hơn, tôi sẽ không vội kết luận rằng dữ liệu đã đến từ phân phối Poisson. Dưới đây là một số sự thật cần ghi nhớ: