Fisher 精确检验给出非均匀 p 值

机器算法验证 p 值 渔民精确测试
2022-03-02 06:51:02

我试图在模拟遗传学问题中应用 Fisher 的精确检验,但 p 值似乎向右倾斜。作为一名生物学家,我想我只是错过了对每个统计学家来说显而易见的东西,所以我非常感谢你的帮助。

我的设置是这样的:(设置 1,边际不固定)
在 R 中随机生成 0 和 1 的两个样本。每个样本 n = 500,采样 0 和 1 的概率相等。然后,我将每个样本中 0/1 的比例与 Fisher 精确检验进行比较(只是fisher.test; 还尝试了具有类似结果的其他软件)。采样和测试重复 30 000 次。生成的 p 值分布如下: p 值分布

所有 p 值的平均值约为 0.55,第 5 个百分位为 0.0577。甚至分布在右侧也显得不连续。

我一直在阅读我所能阅读的所有内容,但我没有发现任何迹象表明这种行为是正常的——另一方面,它只是模拟数据,所以我看不到任何偏见的来源。有什么我错过的调整吗?样本量太小?或者它不应该是均匀分布的,并且 p 值的解释不同?
或者我应该重复一百万次,找到 0.05 分位数,并在将其应用于实际数据时将其用作显着性截止值?

谢谢!


更新:

Michael M 建议修复 0 和 1 的边际值。现在 p 值给出了更好的分布 - 不幸的是,它不是统一的,也不是我认识的任何其他形状:

p-vals w 固定边际

添加实际的 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="")

最终编辑:
正如 whuber 在评论中指出的那样,由于分箱,这些区域看起来只是扭曲了。我附上了设置 1(自由边际)和设置 2(固定边际)的 QQ 图。在下面的格伦模拟中可以看到类似的图,所有这些结果实际上看起来相当一致。谢谢您的帮助!

pval-qqplot

1个回答

问题是数据是离散的,因此直方图可能具有欺骗性。我用显示近似均匀分布的 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, ...)
       })

在此处输入图像描述

在此处输入图像描述