Точный критерий Фишера дает неоднородные p-значения

12

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

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

Среднее значение всех значений р составляет около 0,55, 5-й процентиль 0,0577. Даже распределение кажется прерывистым на правой стороне.

Я читал все, что мог, но я не нахожу никаких признаков того, что это нормальное поведение - с другой стороны, это просто симулированные данные, поэтому я не вижу источников какого-либо смещения. Есть ли какие-то корректировки, которые я пропустил? Слишком маленький размер выборки? Или, может быть, он не должен быть равномерно распределен, а значения p интерпретируются по-разному?
Или я должен просто повторить это миллион раз, найти квантиль 0,05 и использовать это в качестве предела значимости, когда я применяю это к фактическим данным?

Благодаря!


Обновить:

Майкл М предложил исправить предельные значения 0 и 1. Теперь 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 (фиксированные маргиналы). Подобные графики видны при моделировании Глена ниже, и все эти результаты на самом деле кажутся довольно однородными. Спасибо за помощь!

ПВС-qqplot

juod
источник
2
Попробуйте повторить симуляцию, удерживая не только размеры группы (по 500), но и сумму константы «1» (по объединенной выборке). Значение p точного критерия Фишера определяется в соответствии с этим параметром «фиксированное предельное распределение». Картинка выглядит лучше? Btw. Вы не можете ожидать, что распределение p-значений будет точно однородным по дискретному характеру распределения выборки (то есть гипергеометрического).
Майкл М,
1
Возможно, было бы полезно взглянуть на ваш код R.
conjugateprior
1
@ Глен из кода мне кажется, что в каждой итерации оба образца имеют одинаковое число 0 и 1 (т. Е. Должна быть нулевая гипотеза) или я ошибаюсь?
Бдеонович
5
Эти гистограммы выглядят на удивление единообразно для меня. Вы должны помнить, что гистограммы отображают вероятность (или частоту) посредством площади . Увеличивающиеся промежутки справа (из-за неизбежной дискретности распределения p-значений любого нерандомизированного теста дискретных данных) приводят к увеличению высоты стержней, но их площади кажутся почти постоянными. Вместо того, чтобы использовать гистограмму для оценки однородности, построите график эмпирического 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: было бы очень полезно, если бы вы могли добавить qqplot для иллюстрации, может быть, даже для обеих симуляций?
Michael M
Сюжеты qq действительно помогают - спасибо. Разве вы не хотите изменить первый абзац своего ответа? Вы по-прежнему утверждаете, что есть проблема с симуляцией и что есть "пик" в распределении p-значения?
whuber