フィッシャーの正確確率検定は不均一なp値を与える


12

シミュレートされた遺伝学の問題にフィッシャーの正確確率検定を適用しようとしていますが、p値が右に歪んでいるようです。生物学者である私は、すべての統計学者にとって明らかなものを見逃しているだけだと思います。

私のセットアップはこれです:(セットアップ1、限界は固定されていません)
0と1の2つのサンプルがRでランダムに生成されます。各サンプルn = 500、サンプリング0と1の確率は等しいです。次に、各サンプルの0/1の割合をフィッシャーの正確確率検定と比較します(ちょうどfisher.test;他のソフトウェアでも同様の結果を試しました)。サンプリングとテストは30 000回繰り返されます。結果のp値は次のように分布します。 p値の分布

すべてのp値の平均は約0.55、0.0577の5パーセンタイルです。右側の分布も不連続に見えます。

私はできる限りすべてを読んでいますが、この動作が正常であるという兆候は見つかりません-一方、これは単なるシミュレーションデータであるため、バイアスの原因がわかりません。見逃した調整はありますか?サンプルサイズが小さすぎる?それとも、均一に分布されているとは限らず、p値の解釈が異なるのでしょうか。
または、これを100万回繰り返し、0.05分位点を見つけて、これを実際のデータに適用するときの有意差カットオフとして使用する必要がありますか?

ありがとう!


更新:

マイケルMは0と1の限界値を修正することを提案しました。p値はより良い分布を与えます-残念ながら、それは均一ではなく、私が認識している他の形状でもありません。

p値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


2
グループサイズ(各500)だけでなく、(プールされたサンプル全体で) "1"の合計も保持しながら、シミュレーションを繰り返してみてください。フィッシャーの正確確率検定のp値は、この「固定限界分布」設定の下で導出されます。その時、絵は良く見えますか?ところで サンプリング分布の離散的な性質(つまり、超幾何)によってp値分布が正確に均一になるとは期待できません。
マイケルM

1
Rコードを確認すると役立つ場合があります。
共役

1
@Glenコードから、各反復で両方のサンプルに同じ数の0と1がある(つまり、帰無仮説が成り立つ)ように思えますが、それとも間違っていますか?
bdeonovic 2015

5
これらのヒストグラムは、私には非常に均一に見えます。ヒストグラムは、面積によって確率(または頻度)を表示することを覚えておく必要があります。右へのギャップの増加(離散データの任意の非ランダム化テストのp値分布の不可避の離散のため)は、バーの高さを増加させますが、それらの面積はほぼ一定のようです。 ヒストグラムを使用して均一性を評価する代わりに、経験的CDFをグラフ化します。
whuber

2
特定の配布を除いて、この質問はここ
Glen_b -Reinstate Monica '22

回答:


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
離散データのヒストグラムまたは棒グラフのそのようなスパイクとディップは、多くの場合、ビニング手順のアーティファクトです。それらを信頼しないでください。QDFプロットやECDFのグラフなど、分布のより目立つプロットを使用してください。それらが現実であっても、p値の分布がほぼ均一であり、意思決定に重要な適切な密度である場合、誰も気にしません。
whuber

素晴らしいポイント@whuber、私はqqplotsで更新します。
グレン

2
@whuber、グレン、どうもありがとう!実際、Glenのヒストグラムをより多くの区切りに分割するだけで、同様のパターンが得られたため、ビニングは不正でした。また、シミュレーションで線形の経験的CDF / QQも得られるため、問題は解決したようです。
2015

@juod:例としてqqplotを追加できれば、両方のシミュレーションでも可能であると高く評価されますか?
マイケルM

qqプロットは本当に役に立ちます-ありがとう。ただし、回答の最初の段落を変更したくないですか?シミュレーションに問題があり、p値の分布に「スパイク」があることをまだ維持していますか?
whuber
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.