Hal kedua sepertinya itu adalah perkiraan untuk perhitungan yang digunakan untuk x+y < 20
kasus ini, tetapi didasarkan pada perkiraan Stirling .
Biasanya ketika sedang digunakan untuk pendekatan semacam ini, orang akan menggunakan setidaknya istilah tambahan berikutnya (faktor dalam perkiraan untuk ), Yang akan meningkatkan perkiraan relatif secara substansial untuk kecil .2 πn---√n !n
Sebagai contoh, jika dan keduanya 10, perhitungan pertama memberikan sekitar 0,088 sedangkan perkiraan ketika faktor dimasukkan dalam semua istilah adalah sekitar 0,089, cukup dekat untuk sebagian besar tujuan ... tetapi menghilangkan istilah itu dalam perkiraan memberikan 0,5 - yang benar-benar tidak cukup dekat! Penulis fungsi itu jelas tidak repot untuk memeriksa keakuratan perkiraannya pada kasus batas.xy2 πn---√
Untuk tujuan ini, penulis mungkin seharusnya hanya memanggil lgamma
fungsi bawaan - khususnya, dengan menggunakan ini alih-alih untuk apa log_p1
:
log_p1 <- lgamma(x+y+1)-lgamma(x+1)-lgamma(y+1)-(x+y+1)*log(2)
yang menghasilkan jawaban yang dia coba perkirakan (karena lgamma(x+1)
sebenarnya mengembalikan , hal yang dia coba perkirakan - kurang - melalui perkiraan Stirling).catatan( x ! )
Demikian pula, saya tidak yakin mengapa penulis tidak menggunakan choose
fungsi bawaan pada bagian pertama, fungsi yang datang dalam distribusi standar R. Untuk masalah ini, fungsi distribusi yang relevan mungkin juga built-in.
lgamma
choose
choose(1000,500)
lgamma
xy
Dengan lebih banyak informasi, sumber tes mungkin dapat diidentifikasi. Dugaan saya adalah penulis telah mengambilnya dari suatu tempat, jadi mungkin untuk melacaknya. Apakah Anda memiliki beberapa konteks untuk ini?
Ketika Anda mengatakan 'optimalkan', maksud Anda membuatnya lebih cepat, lebih pendek, lebih mudah dikelola, atau sesuatu yang lain?
Edit setelah membaca kertas dengan cepat:
Para penulis keliru dalam beberapa hal. Uji eksak Fisher tidak mengasumsikan margin tetap, itu hanya kondisi pada mereka, yang sama sekali tidak sama, seperti yang dibahas, misalnya, di sini , dengan referensi. Memang, mereka tampaknya sama sekali tidak tahu tentang perdebatan tentang pengondisian pada margin dan mengapa hal itu dilakukan. Tautan di sana layak dibaca.
[Mereka melanjutkan dari 'Tes Fisher selalu lebih konservatif daripada tes kami' ke pernyataan bahwa tes Fisher terlalu konservatif ... yang tidak harus mengikuti kecuali jika salah dengan kondisi . Mereka harus membuktikan hal itu, tetapi mengingat bahwa ini adalah sesuatu yang telah diperdebatkan oleh para ahli statistik selama sekitar 80 tahun, dan para penulis ini tampaknya tidak menyadari mengapa pengkondisian dilakukan, saya tidak berpikir orang-orang ini telah sampai ke dasar masalah itu .]
Penulis makalah setidaknya tampaknya memahami bahwa probabilitas yang mereka berikan harus diakumulasikan untuk memberikan nilai-p; misalnya di dekat bagian tengah kolom pertama halaman 5 (tambang penekanan):
Signifikansi statistik menurut uji eksak Fisher untuk hasil seperti itu adalah 4,6% (nilai P dua-ekor, yaitu, probabilitas untuk tabel tersebut terjadi dalam hipotesis bahwa frekuensi EST aktin bebas dari perpustakaan cDNA). Sebagai perbandingan, nilai-P dihitung dari bentuk kumulatif
(Persamaan 9, lihat Metode) dari Persamaan 2 (yaitu, untuk frekuensi relatif EST aktin menjadi sama di kedua perpustakaan, mengingat setidaknya 11 EST serumpun diamati dalam perpustakaan hati setelah dua diamati di perpustakaan otak) adalah 1,6%.
(Meskipun saya tidak yakin saya setuju dengan perhitungan nilai di sana; saya harus memeriksa dengan cermat untuk melihat apa yang sebenarnya mereka lakukan dengan ekor lainnya.)
Saya tidak berpikir program melakukan itu.
xx + y
Saya bahkan tidak yakin bahwa jumlah probabilitas mereka adalah 1 pada titik ini.
Ada banyak lagi yang bisa dikatakan di sini, tetapi pertanyaannya bukan tentang makalah, ini tentang implementasi dalam program.
-
Bagaimanapun, hasilnya adalah, setidaknya kertas dengan benar mengidentifikasi bahwa nilai-p terdiri dari sejumlah probabilitas seperti yang ada dalam persamaan 2, tetapi program tidak . (Lihat Persamaan 9a dan 9b di bagian Metode pada makalah ini.)
Kode itu salah tentang itu.
[Anda bisa menggunakan pbinom
, seperti komentar @ whuber akan menyiratkan, untuk menghitung probabilitas individu (tapi bukan ekornya, karena itu bukan tes binomial saat mereka menyusunnya) tetapi kemudian ada faktor tambahan 1/2 dalam persamaan mereka 2 jadi jika Anda ingin mereplikasi hasil di koran, Anda perlu mengubahnya.]
Anda dapat memperolehnya, dengan mengutak-atik, dari pnbinom
-
kt hkt h
( k+r-1k) ⋅(1-p)rhalk,
p = N1/ ( N1+ N2)k = xr = y+ 1
y
Itu akan buruk.
p2
sama sekali; semakin kecilp1
danp2
sesuai dengan yang lebih kecil darix
dany
, masing-masing - itu inefisiensi. Bug yang mungkin adalah bahwa cabang kedua dari conditional gagal menghitungp2
sama sekali dan hanya menggunakanp1
. Saya juga curiga bahwa kode itu mungkin sepenuhnya salah, karena tampaknya tidak menghitung nilai-p: itu hanya setengah dari probabilitas binomial dan mungkin seharusnya menjadi probabilitas ekor . Mengapa tidak hanya menggunakanpbinom
/dbinom
dan selesai dengan itu?