Cách sử dụng kiểm tra chi bình phương để xác định xem dữ liệu có tuân theo phân phối Poisson không


10

Hình dưới đây (Hình 1 từ trang 646 của bài viết này ) so sánh các giá trị quan sát được với các giá trị dự kiến ​​trong phân phối Poisson. Sau đó, nó chạy thử nghiệm chi bình phương để xem các giá trị quan sát có khác với các giá trị dự kiến ​​trong phân phối Poisson hay không.

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

Sử dụng R, làm thế nào có thể tạo ra các giá trị dự kiến ​​trong phân phối Poisson và so sánh các giá trị được quan sát bằng cách sử dụng kiểm tra chi bình phương?

BIÊN TẬP:

Đây là nỗ lực của tôi trong việc làm những gì họ đã làm trên giấy. Tôi muốn biết nếu phân phối quan sát variablekhác với phân phối Poisson. Tôi cũng muốn biết liệu những gì tôi đã làm dưới đây có phải là quy trình giống như những gì họ đã làm trên giấy hay không. Vì giá trị P> 0,05, tôi đã kết luận bên dưới rằng phân phối variabletheo sau phân phối Poisson - ai đó có thể xác nhận điều này không?

df <- data.frame(variable = 0:5, frequency = c(20, 10, 5, 3, 2, 1))

# estimate lambda
mean_df_variable <- mean(df$variable)

# calculate expected values if df$frequency follows a poisson distribution
library(plyr)
expected <- laply(0:5, function(x) dpois(x=x, lambda=mean_df_variable, log = FALSE))

# calculate actual distribution of df$frequency
observed <- df$frequency/sum(df$frequency)

# does distribution of df$frequency differ from a poisson distribution? Apparently 
#   not because P-value is > 0.05
chisq.test(expected, observed)

Tôi không hoàn toàn làm theo câu hỏi của bạn. Giá trị dự kiến ​​của phân phối Poisson là , giá trị trung bình. Điều đó không có gì để làm w / R. Nếu bạn có các giá trị được mong đợi & quan sát, bạn có thể thực hiện kiểm tra chi bình phương theo cách thủ công trong R; Tôi chỉ ra cách làm điều đó ở đây: Điều gì sai với phép tính chi bình phương này? λ
gung - Tái lập Monica

Câu trả lời:


12

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=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 0vectơ 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ớ:


3

Nếu tôi đã hiểu những gì bạn có nghĩa là bạn nên:

  1. ước tính tham số của phân phối Poisson cho dữ liệu của bạn, giả sử đó là phân phối Poisson, giả sử
lambdaEst = mean(x)
  1. tính toán, cho mỗi , xác suất lý thuyết của họ giả sử phân phối Poisson, ví dụ0,1,2,...
probTheo0 = dpois(x = 0, lambda = lambdaEst, log = FALSE)
  1. sau đó so sánh thực tế với xác suất lý thuyết thông qua kiểm tra chi bình phương theo phương pháp này ChiSapes Test CV
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.