Perhitungan nilai p tidak diketahui


9

Saya baru-baru ini men-debug skrip R dan saya menemukan sesuatu yang sangat aneh, penulis mendefinisikan fungsi p-value mereka sendiri

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)
}

Di mana X dan Y adalah nilai-nilai nilai positif lebih besar dari 0. Kasus <20 tampaknya merupakan perhitungan untuk beberapa jenis distribusi hypergeometric (sesuatu yang mirip dengan uji Fisher?) Dan apakah ada yang tahu apa perhitungan lainnya? Sebagai sidenote, saya mencoba untuk mengoptimalkan kode ini sehingga mencoba mencari tahu fungsi R yang tepat untuk memanggil dan mengganti ini dengan.

Sunting: Rumus perincian kertas untuk perhitungan nilai-p dapat ditemukan di sini (perlu mengklik pdf untuk melihat formula) Metode dimulai pada halaman 8 dari pdf dan rumus yang dimaksud dapat ditemukan pada halaman 9 di bawah (1). Distribusi yang mereka anggap adalah Poisson.

Jawaban:


15

Hal kedua sepertinya itu adalah perkiraan untuk perhitungan yang digunakan untuk x+y < 20kasus 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πnn!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 lgammafungsi 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 choosefungsi bawaan pada bagian pertama, fungsi yang datang dalam distribusi standar R. Untuk masalah ini, fungsi distribusi yang relevan mungkin juga built-in.

lgammachoosechoose(1000,500)lgammaxy

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-

kthkth

(k+r-1k)(1-hal)rhalk,

hal=N1/(N1+N2)k=xr=y+1

y

Itu akan buruk.


1
+1 Penjelasan yang bagus. Ada beberapa masalah tambahan dengan kode ini. Tidak perlu menghitung p2sama sekali; semakin kecil p1dan p2sesuai dengan yang lebih kecil dari xdan y, masing-masing - itu inefisiensi. Bug yang mungkin adalah bahwa cabang kedua dari conditional gagal menghitung p2sama sekali dan hanya menggunakan p1. 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 menggunakan pbinom/ dbinomdan selesai dengan itu?
Whuber

Terima kasih atas jawaban yang bagus, saya dapat melacak sumber rumus: genome.cshlp.org/content/7/10/986.short saya ingin mengubahnya menjadi lebih cepat dan lebih mudah untuk mempertahankan / membaca.
yingw

Terima kasih untuk kertasnya; itu membantu dalam mencari tahu apa yang sedang terjadi dalam kode. Apa shemozzle.
Glen_b -Reinstate Monica

1
+1. Ini adalah pos yang seharusnya bukan wiki komunitas! Saya pikir ini karena ke-14 revs, tetapi dalam hal ini semuanya milik Anda. Ketekunan Anda telah dihukum!
Darren Cook

Terima kasih atas mosi percaya. Ya, saya terus kembali dan melakukan perbaikan ketika saya membaca makalah, tapi saya kira itu sebagian kesalahan saya sendiri karena tidak mencapai hasil akhir dengan lebih efisien.
Glen_b -Reinstate Monica
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.