Точний тест Фішера дає неоднакові значення p


12

Я намагаюся застосувати точний тест Фішера в симульованій генетичній проблемі, але значення p, схоже, перекошені праворуч. Будучи біологом, я думаю, я просто пропускаю щось очевидне для кожного статистика, тому я дуже вдячний за вашу допомогу.

Моя установка така: (налаштування 1, маргінали не зафіксовані)
Два зразки 0s та 1s випадковим чином генеруються у R. Кожен зразок n = 500, ймовірності вибірки 0 та 1 рівні. Потім я порівнюю пропорції 0/1 у кожному зразку з точним тестом Фішера (просто fisher.test; також випробував інше програмне забезпечення з подібними результатами). Відбір проб та тестування повторюють 30 000 разів. Отримані p-значення розподіляються так: p-розподіл величини

Середнє значення всіх p-значень становить приблизно 0,55, 5-й перцентиль - 0,0577. Навіть розподіл здається розривним у правій частині.

Я читав усе, що можу, але не знаходжу жодної ознаки того, що така поведінка є нормальною - з іншого боку, це просто імітовані дані, тому я не бачу джерел для будь-яких упереджень. Чи є якесь коригування, яке я пропустив? Занадто малі розміри зразка? А може бути, воно не повинно бути рівномірно розподілене, а значення p трактуються по-різному?
Або мені просто повторити це мільйон разів, знайти квантил 0,05 і використовувати це як обмеження значущості, коли я застосовую це до фактичних даних?

Дякую!


Оновлення:

Майкл М запропонував фіксувати граничні значення 0 і 1. Тепер p-значення дають набагато приємніше розподіл - на жаль, це не рівномірно, ані будь-якої іншої форми, яку я визнаю:

p-вали з фіксованими маргіналами

додавання фактичного коду R: (налаштування 2, маргінали виправлені)

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="")

Остаточне редагування:
Як в коментарях зазначає Уубер, області просто виглядають спотвореними через бінінг. Я додаю QQ-графіки для установки 1 (вільних маргіналів) та установки 2 (фіксованих маргіналів). Подібні сюжети можна побачити в симуляціях Глена внизу, і всі ці результати насправді здаються досить рівномірними. Дякую за допомогу!

pval-qqplot


2
Спробуйте повторити своє моделювання, утримуючи не тільки розміри групи (по 500 у кожному), але й суму "1" (над об'єднаним зразком) постійною. Значення р точного випробування Фішера виводиться під цим параметром "фіксованого граничного розподілу". Чи краще тоді виглядає малюнок? Btw. не можна очікувати, що розподіл значення p буде точно рівномірним за дискретним характером розподілу вибірки (тобто гіпергеометричним).
Майкл М

1
Можливо, буде корисно подивитися ваш R-код.
кон'югатприор

1
@Glen мені здається, що в кожній ітерації обидва зразки мають однакову кількість 0s і 1s (тобто нульова гіпотеза повинна дотримуватися) чи я помиляюся?
бдеонович

5
Ці гістограми мені здаються надзвичайно рівномірними. Ви повинні пам'ятати, що гістограми відображають вірогідність (або частоту) за допомогою площі . Зростаючі прогалини праворуч (через неминучу дискретність розподілу величини р будь-якого не випадкового тесту дискретних даних) призводять до збільшення висоти смуги, але їх ділянки здаються майже постійними. Замість використання гістограми для оцінки рівномірності побудуйте графік емпіричного CDF.
whuber

2
Окрім конкретного поширення, на це питання, здається, тут
Glen_b -Встановити Моніку

Відповіді:


10

Проблема полягає в тому, що дані дискретні, тому гістограми можуть обманювати. Я кодував моделювання qqplots, які показують приблизний рівномірний розподіл.

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, ...)
       })

введіть тут опис зображення

введіть тут опис зображення


5
Такі сплески та занурення в гістограмах чи смужкових діаграмах дискретних даних часто є артефактами процедури бінінгу. Не довіряйте їм: використовуйте більш вибагливі сюжети розподілів, наприклад графіки QQ або графіки ECDF. Навіть якщо вони справжні, нікому не буде байдуже, якщо розподіл p-значень приблизно рівномірний і правильної щільності, коли це має значення для прийняття рішень: в інтервалі, близькому до нуля (і, звичайно, менше 0,5).
whuber

Відмінний момент @whuber, я оновлю qqplots.
Глен

2
@whuber, Глен, велике спасибі! Насправді бінінг був оманливим, оскільки просто розбиття гістограм Глена на більше перерв дало подібний малюнок до мого. І я також отримую лінійний емпіричний CDF / QQ зі своїми моделюваннями, тому проблема, здається, вирішена.
juod

@juod: було б дуже вдячно, якби ви могли додати qqplot для ілюстрації, можливо, навіть для обох симуляцій?
Майкл М

Ділянки qq справді допомагають - дякую. Ви не хочете змінити перший абзац своєї відповіді? Ви все ще стверджуєте, що існує проблема з моделюванням і що в розподілі p-значень є "сплеск"?
whuber
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.