2番目は、x+y < 20
ケースで使用されている計算の近似であるように見えますが、スターリング近似に基づいています。
通常、この種類の近似に使用されている場合、人々は少なくとも次の追加の用語(の近似ではの係数)を使用します。これにより、小さな相対近似が大幅に改善され。のn!ん2個のπん−−−√n !ん
たとえば、とが両方とも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)
実際には、スターリング概算によってが返されます。ログ(x !)
同様に、なぜ著者が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バツx + y
この時点で、確率の合計が1であるとは確信していません。
ここで言うことはまだまだたくさんありますが、問題は紙についてではなく、プログラムの実装についてです。
-
とにかく、少なくとも紙は、p値が式2のような確率の合計で構成されていることを正しく識別していますが、プログラムではそうではありません。(論文の「方法」セクションの式9aおよび9bを参照してください。)
その上でコードが間違っています。
[ pbinom
@whuberのコメントが示唆するように、を使用して個々の確率を計算することができます(ただし、構造化するので二項検定ではないため、テールではありません)。ただし、式2に余分な係数1/2があるため、論文の結果を再現したい場合は、それらを変更する必要があります。]
少しいじって、それをpnbinom
- から入手できます。
負の二項の通常の形態は、の試行回数のいずれかである成功または多数の障害に成功。2つは同等です。ウィキペディアはここに 2番目の形式を提供します。確率関数は次のとおりです。 k t hkトンの時間kトンの時間
( k + r − 1k) ⋅(1−p)rpk、
p4の方程式2(p3のeqn 1も同様)は負の二項式ですが、1 だけシフトしています、およびます。k = x r = y + 1p = N1/( N1+ N2)k = xr = y+ 1
これは、の制限が同様にシフトされていないので、それらの確率が1に追加されないことを心配します。y
それは悪いでしょう。
p2
はまったくありません。小さい方p1
とp2
の小さい方に対応x
し、y
それぞれ、 -非効率だという。考えられるバグは、条件の2番目のブランチがp2
まったく計算に失敗し、のみを使用することp1
です。また、コードがp値を計算していないように見えるため、コードが完全に誤っている可能性があることも疑っています。これは、二項確率の半分であり、おそらくテール確率であるべきです。なぜpbinom
/dbinom
を使ってそれで終わらせないのですか?