Kiểm tra chính xác của Fisher cho giá trị p không đồng nhất


12

Tôi đang cố gắng áp dụng thử nghiệm chính xác của Fisher trong một vấn đề di truyền mô phỏng, nhưng các giá trị p dường như bị lệch sang phải. Là một nhà sinh vật học, tôi đoán rằng tôi chỉ thiếu một cái gì đó rõ ràng cho mọi nhà thống kê, vì vậy tôi sẽ đánh giá rất cao sự giúp đỡ của bạn.

Thiết lập của tôi là thế này: (thiết lập 1, lề không cố định)
Hai mẫu 0 và 1 được tạo ngẫu nhiên trong R. Mỗi mẫu n = 500, xác suất lấy mẫu 0 và 1 bằng nhau. Sau đó, tôi so sánh tỷ lệ 0/1 trong mỗi mẫu với thử nghiệm chính xác của Fisher (chỉ fisher.test; cũng đã thử các phần mềm khác có kết quả tương tự). Lấy mẫu và thử nghiệm được lặp lại 30 000 lần. Các giá trị p kết quả được phân phối như thế này: phân phối giá trị p

Giá trị trung bình của tất cả các giá trị p là khoảng 0,55, phần trăm thứ 5 ở 0,0577. Ngay cả phân phối xuất hiện không liên tục ở phía bên phải.

Tôi đã đọc mọi thứ tôi có thể, nhưng tôi không tìm thấy bất kỳ dấu hiệu nào cho thấy hành vi này là bình thường - mặt khác, nó chỉ là dữ liệu mô phỏng, vì vậy tôi không thấy nguồn nào cho bất kỳ sự thiên vị nào. Có điều chỉnh nào tôi bỏ lỡ? Cỡ mẫu quá nhỏ? Hoặc có lẽ nó không được phân phối đồng đều và các giá trị p được diễn giải khác nhau?
Hay tôi chỉ nên lặp lại điều này một triệu lần, tìm định lượng 0,05 và sử dụng nó làm mức cắt giảm ý nghĩa khi tôi áp dụng điều này vào dữ liệu thực tế?

Cảm ơn!


Cập nhật:

Michael M đề nghị sửa các giá trị biên của 0 và 1. Bây giờ các giá trị p cung cấp phân phối đẹp hơn nhiều - thật không may, nó không đồng nhất, cũng không có hình dạng nào khác tôi nhận ra:

p-vals w lề cố định

thêm mã R thực tế: (thiết lập 2, cố định lề)

samples=c(rep(1,500),rep(2,500))
alleles=c(rep(0,500),rep(1,500))
p=NULL
for(i in 1:30000){
  alleles=sample(alleles)
  p[i]=fisher.test(samples,alleles)$p.value
}
hist(p,breaks=50,col="grey",xlab="p-values",main="")

Chỉnh sửa cuối cùng:
Như whuber chỉ ra trong các bình luận, các khu vực chỉ trông bị méo do đóng thùng. Tôi đang đính kèm các lô QQ cho thiết lập 1 (lề miễn phí) và thiết lập 2 (lề cố định). Các sơ đồ tương tự được nhìn thấy trong các mô phỏng của Glen bên dưới, và tất cả các kết quả này trên thực tế có vẻ khá thống nhất. Cảm ơn đã giúp đỡ!

pval-qqplot


2
Cố gắng lặp lại mô phỏng của bạn trong khi giữ không chỉ các kích thước nhóm (500 mỗi kích thước) mà cả tổng số "1" (trên mẫu gộp). Giá trị p của thử nghiệm chính xác của Fisher được lấy theo cài đặt "phân phối biên cố định" này. Hình ảnh có đẹp hơn không? Btw. bạn không thể mong đợi phân phối giá trị p là đồng nhất chính xác bởi tính chất rời rạc của phân phối lấy mẫu (tức là siêu bội).
Michael M

1
Có thể hữu ích khi xem mã R của bạn.
liên hợp chiến

1
@Glen có vẻ như với tôi rằng trong mỗi lần lặp, cả hai mẫu đều có cùng số 0 và 1 (tức là giả thuyết null nên giữ) hoặc tôi sai?
bdeonovic

5
Những biểu đồ này trông đồng nhất đáng kể với tôi. Bạn phải nhớ rằng biểu đồ hiển thị xác suất (hoặc tần số) theo khu vực . Khoảng cách ngày càng tăng về phía bên phải (do sự chênh lệch không thể tránh khỏi của phân phối giá trị p của bất kỳ thử nghiệm dữ liệu rời rạc nào của dữ liệu rời rạc) làm cho độ cao của thanh tăng lên, nhưng các khu vực của chúng dường như gần như không đổi. Thay vì sử dụng biểu đồ để đánh giá tính đồng nhất, hãy vẽ biểu đồ CDF theo kinh nghiệm.
whuber

2
Ngoài phân phối cụ thể, câu hỏi này dường như được trả lời hoàn toàn ở đây
Glen_b -Reinstate Monica

Câu trả lời:


10

Vấn đề là dữ liệu rời rạc nên biểu đồ có thể bị đánh lừa. Tôi đã mã hóa một mô phỏng với qqplots hiển thị phân phối đồng đều gần đúng.

library(lattice)
set.seed(5545)
TotalNo=300
TotalYes=450

pvalueChi=rep(NA,10000)
pvalueFish=rep(NA,10000)

for(i in 1:10000){
  MaleAndNo=rbinom(1,TotalNo,.3)
  FemaleAndNo=TotalNo-MaleAndNo
  MaleAndYes=rbinom(1,TotalYes,.3)
  FemaleAndYes=TotalYes-MaleAndYes
  x=matrix(c(MaleAndNo,FemaleAndNo,MaleAndYes,FemaleAndYes),nrow=2,ncol=2)
  pvalueChi[i]=chisq.test(x)$p.value
  pvalueFish[i]=fisher.test(x)$p.value
}

dat=data.frame(pvalue=c(pvalueChi,pvalueFish),type=rep(c('Chi-Squared','Fishers'),each=10000))
histogram(~pvalue|type,data=dat,breaks=10)
qqmath(~pvalue|type,data=dat,distribution=qunif,
       panel = function(x, ...) {
         panel.qqmathline(x, ...)
         panel.qqmath(x, ...)
       })

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

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


5
Các gai và dấu chấm như vậy trong biểu đồ hoặc biểu đồ thanh của dữ liệu rời rạc thường là các tạo tác của quy trình tạo thùng. Đừng tin tưởng họ: sử dụng các lô phân phối sáng suốt hơn, chẳng hạn như các ô QQ hoặc đồ thị của ECDF. Ngay cả khi chúng là có thật, không ai quan tâm đến việc phân phối các giá trị p xấp xỉ đồng đều và mật độ phù hợp khi đưa ra quyết định: trong khoảng gần bằng 0 (và chắc chắn nhỏ hơn 0,5).
whuber

Điểm tuyệt vời @whuber, tôi sẽ cập nhật với qqplots.
Glen

2
@whuber, Glen, cảm ơn rất nhiều! Trên thực tế, việc đóng thùng là lừa đảo, vì chỉ cần chia biểu đồ của Glen thành nhiều lần phá vỡ hơn đã tạo ra một mô hình tương tự như của tôi. Và tôi cũng nhận được CDF / QQ theo kinh nghiệm tuyến tính với các mô phỏng của mình, vì vậy vấn đề dường như đã được giải quyết.
juod

@juod: nó sẽ được đánh giá cao nếu bạn có thể thêm qqplot để minh họa, thậm chí có thể cho cả hai mô phỏng?
Michael M

Các lô qq thực sự giúp đỡ - cảm ơn bạn. Bạn không muốn thay đổi đoạn đầu tiên của câu trả lời của bạn, mặc dù? Bạn vẫn duy trì có vấn đề với mô phỏng và rằng có một "đột biến" trong phân phối giá trị p?
whuber
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.