不明なp値の計算


9

私は最近Rスクリプトをデバッグしていて、非常に奇妙な何かを見つけました、著者は独自のp値関数を定義しました

pval <- function(x, y){
    if (x+y<20) { # x + y is small, requires R.basic
        p1<- nChooseK(x+y,x) * 2^-(x+y+1);
        p2<- nChooseK(x+y,y) * 2^-(x+y+1);
        pvalue = max(p1, p2)
    }
    else { # if x+y is large, use approximation
        log_p1 <- (x+y)*log(x+y) - x*log(x) - y*log(y) - (x+y+1)*log(2);
        pvalue<-exp(log_p1);
    }
    return(pvalue)
}

XとYは0より大きい正の値です。<20のケースは、ある種の超幾何分布(フィッシャー検定に似たもの)の計算であるように見え、他の計算が何か知っている人はいますか?補足として、私はこのコードを最適化しようとしているので、これを呼び出してこれを置き換える適切なR関数を理解しようとしています。

編集:p値計算の詳細な式はここにあります(PDFをクリックして式を表示する必要があります)。方法はPDFの8ページから始まり、問題の式は9ページの(1)にあります。彼らが仮定する分布はポアソンです。

回答:


15

2番目は、x+y < 20ケースで使用されている計算の近似であるように見えますが、スターリング近似に基づいています

通常、この種類の近似に使用されている場合、人々は少なくとも次の追加の用語(の近似ではの係数)を使用します。これにより、小さな相対近似が大幅に改善され。のn2π

たとえば、とが両方とも10の場合、最初の計算では約0.088が得られますが、の係数がすべての項に含まれている場合の近似は約0.089であり、ほとんどの目的に十分に近いものです...しかし、近似でその項を省略すると0.5になります-これは実際には十分に近くありません!その関数の作者は、境界ケースでの彼の近似の正確さをチェックすることを明らかに気にしていません。、Y バツy2π

この目的のために、作者はおそらく単に組み込みlgamma関数を呼び出したはずです-特に、彼が持っているものの代わりにこれを使用することによってlog_p1

log_p1 <- lgamma(x+y+1)-lgamma(x+1)-lgamma(y+1)-(x+y+1)*log(2)

これにより、彼が概算しようとしている答えが得られlgamma(x+1)実際には、スターリング概算によってが返されます。ログバツ

同様に、なぜ著者がchoose最初の部分で組み込み関数(Rの標準配布に含まれる関数)を使用しないのかわかりません。さらに言えば、関連する配布関数もおそらく組み込みです。

実際には2つの個別のケースは必要ありません。lgamma一つは、右下の最小値にうまく動作します。一方、このchoose関数はかなり大きな値で機能します(たとえば、正常に機能しますchoose(1000,500))。より安全なオプションは、おそらくlgammaあなたは非常に大きく持っている必要があると思いますけれども、と、それが問題だったの前に。yバツy

より多くの情報があれば、テストのソースを特定することが可能になるはずです。私の推測では、作者はどこかからそれを取得したので、それを追跡することが可能になるはずです。このためのコンテキストはありますか?

「最適化」とは、より速く、より短く、より保守しやすくすることを意味しますか?


論文をすばやく読んだ後、編集します。

著者はいくつかの点で間違っているようです。フィッシャーの正確検定では、マージンが固定されているとは想定されていません。マージンに条件を付けるだけであり、これは、たとえば、ここで参照して説明したように、まったく同じではありません。実際、彼らはマージンの条件付けについての議論とそれがなぜ行われたのかについてまったく知らないようです。そこにあるリンクは読む価値があります。

[彼らは「フィッシャーのテストは常に私たちのテストよりも保守的です」から、フィッシャーのテストが保守的すぎるという主張まで進んでいます... 条件付けが間違っていない限り、必ずしも従うわけではありません。彼らはそれを確立する必要がありますが、それは統計学者が約80年間議論していることであり、これらの著者は条件付けが行われる理由を知らないように思われるので、これらの人たちはその問題の根底に達しているとは思いません。]

論文の著者は少なくとも、p値を与えるために彼らが与える確率は累積されなければならないことを理解しているようです。たとえば、5ページの最初の列の中央付近(強調は私のもの):

このような結果に対するフィッシャーの正確確率検定による統計的有意性は4.6%です(両側のP値、つまり、アクチンESTの頻度がcDNAライブラリーから独立しているという仮説でこのような表が発生する確率)。比較すると、 式2 の累積形式(式9、メソッドを参照)から計算されたP値(つまり、アクチンESTの相対頻度が両方のライブラリで同じになる場合、少なくとも11の同族ESTが2つが脳ライブラリで観察された後の肝臓ライブラリ)は1.6%です。

(そこでの値の計算に同意するかどうかはわかりませんが、他のテールで実際に何が行われているかを注意深く確認する必要があります。)

プログラムがそうすることはないと思います。

ただし、それらの分析は標準的な二項検定ではないことに注意してください。彼らは、ベイジアン引数を使用して、その他の頻度テストでp値を導き出します。それらはまた-奇妙なことに、私の心にではなくで条件付けするように見えます。つまり、二項式ではなく負の二項式のようなものになってしまう必要があるということですが、この論文は非常に体系化され、ひどく説明が不十分であることがわかります(そして、統計論文で何が起こっているかを理解するのに慣れています)。慎重に通さないと確信が持てません。x + yバツバツ+y

この時点で、確率の合計が1であるとは確信していません。

ここで言うことはまだまだたくさんありますが、問題は紙についてではなく、プログラムの実装についてです。

-

とにかく、少なくとも紙は、p値が式2のような確率の合計で構成されていることを正しく識別していますが、プログラムではそうではありません。(論文の「方法」セクションの式9aおよび9bを参照してください。)

その上でコードが間違っています。

[ pbinom@whuberのコメントが示唆するように、を使用して個々の確率を計算することができます(ただし、構造化するので二項検定ではないため、テールではありません)。ただし、式2に余分な係数1/2があるため、論文の結果を再現したい場合は、それらを変更する必要があります。]

少しいじって、それをpnbinom- から入手できます。

負の二項の通常の形態は、の試行回数のいずれかである成功または多数の障害に成功。2つは同等です。ウィキペディアはここに 2番目の形式を提供します。確率関数は次のとおりです。 k t hkthkth

k+r1k1prpk

p4の方程式2(p3のeqn 1も同様)は負の二項式ですが、1 だけシフトしています、およびます。k = x r = y + 1p=N1/N1+N2k=バツr=y+1

これは、の制限が同様にシフトされていないので、それらの確率が1に追加されないことを心配します。y

それは悪いでしょう。


1
+1いい説明。このコードにはさらにいくつかの問題があります。計算する必要p2はまったくありません。小さい方p1p2の小さい方に対応xし、yそれぞれ、 -非効率だという。考えられるバグは、条件の2番目のブランチがp2まったく計算に失敗し、のみを使用することp1です。また、コードがp値を計算していないように見えるため、コードが完全に誤っている可能性があることも疑っています。これは、二項確率の半分であり、おそらくテール確率であるべきです。なぜpbinom/ dbinomを使ってそれで終わらせないのですか?
whuber

すばらしい返信をありがとう、式の出所を追跡することができました:genome.cshlp.org/content/7/10/986.shortより速く、より簡単に維持/読み取りできるように変更したいと思いました。
yingw

論文をありがとう。コードで何が起こっているのかを理解するのに役立ちました。なんとshemozle。
Glen_b-2013

1
+1。これはコミュニティWikiであってはならない投稿です!私はそれが14回転によるものだと思いますが、この場合、それらはすべてあなた次第です。あなたの勤勉さは罰せられました!
ダレンクック2013年

信頼の投票をありがとう。はい、私は紙を読みながら戻ってきて改善を続けましたが、最終結果をより効率的に達成しないのは私の部分的な責任だと思います。
Glen_b-モニカを2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.