Bagaimana cara menghitung probabilitas yang terkait dengan skor-Z yang sangat besar?

14

Paket perangkat lunak untuk deteksi motif jaringan dapat mengembalikan skor Z yang sangat tinggi (nilai tertinggi yang pernah saya lihat adalah 600.000+, tetapi skor Z lebih dari 100 cukup umum). Saya berencana untuk menunjukkan bahwa skor-Z ini palsu.

Skor Z besar sesuai dengan probabilitas terkait yang sangat rendah. Nilai-nilai probabilitas terkait diberikan pada misalnya halaman wikipedia distribusi normal (dan mungkin setiap buku teks statistik) untuk skor-Z hingga 6. Jadi ...

Pertanyaan : Bagaimana cara menghitung fungsi kesalahan 1erf(n/2)untuk n hingga 1.000.000, katakan?

Saya terutama setelah paket yang sudah diterapkan untuk ini (jika mungkin). Yang terbaik yang saya temukan sejauh ini adalah WolframAlpha, yang berhasil menghitungnya untuk n = 150 (di sini ).

Douglas S. Stones
sumber
6
Mungkin ini bukan pertanyaan yang tepat untuk ditanyakan. Z-score ini palsu karena mereka menganggap distribusi normal adalah pendekatan atau model yang jauh lebih baik daripada yang sebenarnya. Ini sedikit seperti mengasumsikan mekanika Newton baik untuk 600.000 tempat desimal. Jika Anda memang hanya tertarik pada komputasi erf untuk nilai ekstrim , maka pertanyaan ini milik matematika. SE, bukan di sini. n
whuber
6
Untuk nilai besar "tidak masuk akal", Anda tidak akan melakukan yang lebih baik daripada menggunakan batas atas untuk double-presisi floating point. Perkiraan itu dan yang lainnya dibahas di tempat lain di stats.SE. Pr(Z>z)(z2π)1ez2/2
kardinal
Terima kasih kardinal, ikatan itu tampaknya cukup akurat. Mengapa Anda tidak membuat ini jawaban?
Douglas S. Stones
@Douglas: Jika Anda masih tertarik, saya dapat mengumpulkan sesuatu di hari berikutnya atau mempostingnya sebagai jawaban yang lebih lengkap.
kardinal
1
Yah ... saya pikir itu akan bermanfaat menambahkannya sebagai jawaban. Mungkin batasannya adalah pengetahuan umum dalam prob + stats, tapi saya tidak mengetahuinya. Juga, Q dan A di sini bukan semata-mata untuk OP.
Douglas S. Stones

Jawaban:

19

Pertanyaannya menyangkut fungsi kesalahan komplementer

erfc(x)=2πxexp(t2)dt

untuk nilai "besar" ( = n / x dalam pertanyaan asli) - yaitu, antara 100 dan 700.000 atau lebih. (Dalam praktiknya, nilai apa pun yang lebih besar dari sekitar 6 harus dianggap "besar," seperti yang akan kita lihat.) Perhatikan bahwa karena ini akan digunakan untuk menghitung nilai-p, ada sedikit nilai dalam memperoleh lebih dari tiga digit signifikan (desimal) .=n/2

Untuk memulai, pertimbangkan perkiraan yang disarankan oleh @Iterator,

f(x)=1-1-exp(-x2(4+Sebuahx2π+Sebuahx2)),

dimana

a=8(π3)3(4π)0.439862.

Meskipun ini merupakan perkiraan yang sangat baik untuk fungsi kesalahan itu sendiri, ini merupakan perkiraan yang mengerikan untuk . Namun, ada cara untuk memperbaikinya secara sistematis.erfc

Untuk nilai-p yang terkait dengan nilai sedemikian besar , kami tertarik pada kesalahan relatif f ( x ) / erfc ( x ) - 1 : kami berharap nilai absolutnya akan kurang dari 0,001 untuk tiga digit presisi yang signifikan. Sayangnya ungkapan ini sulit dipelajari untuk x besarx f(x)/erfc(x)1x karena arus bawah dalam perhitungan presisi ganda. Berikut adalah satu upaya, yang menggambarkan kesalahan relatif versus untuk 0 x 5.8 :x0x5.8

Plot 1

Perhitungan menjadi tidak stabil setelah melebihi 5,3 atau lebih dan tidak dapat memberikan satu digit signifikan melewati 5,8. Ini tidak mengherankan: exp ( - 5.8x mendorong batas-batas aritmatika presisi ganda. Karena tidak ada bukti bahwa kesalahan relatif akan menjadi kecil untuk x yang lebih besar, kita perlu melakukan yang lebih baik.exp(5.82)1014.6x

Melakukan perhitungan dalam aritmatika diperpanjang (dengan Mathematica ) meningkatkan gambaran kita tentang apa yang terjadi:

Plot 2

Kesalahan meningkat dengan cepat dengan dan tidak menunjukkan tanda-tanda leveling off. Melewati x = 10 atau lebih, perkiraan ini bahkan tidak memberikan satu digit informasi yang dapat diandalkan!xx=10

Namun, alurnya mulai terlihat linier. Kami mungkin menduga bahwa kesalahan relatif berbanding lurus dengan . (Ini masuk akal dengan alasan teoritis: erfc secara nyata merupakan fungsi yang ganjil dan f adalah bahkan secara nyata, sehingga rasio mereka seharusnya merupakan fungsi yang ganjil. Dengan demikian kita akan mengharapkan kesalahan relatif, jika meningkat, untuk berperilaku seperti kekuatan aneh x .) Ini menuntun kita untuk mempelajari kesalahan relatif dibagi x . Setara, saya memilih untuk memeriksa x erfc ( x ) / f ( x )xerfcfx xxerfc(x)/f(x), karena harapannya adalah ini harus memiliki nilai pembatas yang konstan. Ini grafiknya:

Plot 3

Dugaan kami tampaknya terbukti: rasio ini tampaknya mendekati batas sekitar 8 atau lebih. Ketika ditanya, Mathematica akan menyediakannya:

a1 = Limit[x (Erfc[x]/f[x]), x -> \[Infinity]]

Nilainya adalah . Ini memungkinkan kami untuk meningkatkan taksiran:kami ambila1=2πe3(4+π)28(3+π)7.94325

f1(x)=f(x)a1x

sebagai penyempurnaan pertama aproksimasi. Ketika benar-benar besar - lebih besar dari beberapa ribu - perkiraan ini baik-baik saja. Karena itu masih tidak akan cukup baik untuk berbagai argumen yang menarik antara 5,3 dan 2000 atau lebih, mari kita beralih prosedur. Kali ini, kesalahan relatif terbalik - khususnya, ekspresi 1 - erfc ( x ) / f 1 ( x ) - harus berperilaku seperti 1 / x 2 untuk x besar (berdasarkan pertimbangan paritas sebelumnya). Dengan demikian, kita kalikan dengan x 2x5.320001erfc(x)/f1(x)1/x2xx2 dan temukan batas selanjutnya:

a2 = Limit[x^2 (a1 - x (Erfc[x]/f[x])), x -> \[Infinity]] 

Nilainya adalah

a2=132πe3(4+π)28(3+π)(329(4+π)3π(3+π)2)114.687.

Proses ini dapat berlangsung selama yang kita mau. Saya mengambilnya satu langkah lagi, menemukan

a3 = Limit[x^2 (a2 - x^2 (a1 - x (Erfc[x]/f[x]))), x -> \[Infinity]] 

dengan nilai sekitar 1623.67. (Ekspresi penuh melibatkan fungsi rasional tingkat delapan dari dan terlalu lama untuk berguna di sini.)π

Mengurai operasi ini menghasilkan perkiraan akhir kami

f3(x)=f(x)(a1a2/x2+a3/x4)/x.

Kesalahan sebanding dengan . Impor adalah konstanta proporsionalitas, jadi kami memplot x 6 ( 1 - erfc ( x ) / f 3 ( x ) ) :x6x6(1erfc(x)/f3(x))

Plot 4

Dengan cepat mendekati nilai pembatas sekitar 2660.59. Dengan menggunakan perkiraan , kami memperoleh estimasi erfc ( x ) yang akurasi relatifnya lebih baik dari 2661 / x 6 untuk semua x > 0 . Setelah x melebihi 20 atau lebih, kita memiliki tiga digit signifikan (atau lebih, karena x semakin besar). Sebagai tanda centang, berikut adalah tabel yang membandingkan nilai yang benar dengan perkiraan untuk x antara 10 dan 20f3erfc(x)2661/x6x>0xxx1020 :

 x  Erfc    Approximation      
10  2.088*10^-45    2.094*10^-45
11  1.441*10^-54    1.443*10^-54
12  1.356*10^-64    1.357*10^-64
13  1.740*10^-75    1.741*10^-75
14  3.037*10^-87    3.038*10^-87
15  7.213*10^-100   7.215*10^-100
16  2.328*10^-113   2.329*10^-113
17  1.021*10^-127   1.021*10^-127
18  6.082*10^-143   6.083*10^-143
19  4.918*10^-159   4.918*10^-159
20  5.396*10^-176   5.396*10^-176

Bahkan, perkiraan ini memberikan setidaknya dua angka presisi yang signifikan untuk pada, yang hanya tentang di mana perhitungan pejalan kaki (sepertifungsiExcel) peter out.x=8NormSDist

Akhirnya, orang mungkin khawatir tentang kemampuan kita untuk menghitung perkiraan awal . Namun, itu tidak sulit: ketika x cukup besar untuk menyebabkan arus bawah dalam eksponensial, akar kuadrat diperkirakan hampir separuh eksponensial,fx

f(x)12exp(x2(4+ax2π+ax2)).

x=1000 . Logaritma umum dari pendekatan ini adalah

log10(f(x))(10002(4+a10002π+a10002)log(2))/log(10)434295.63047.

Hasil yang eksponensial

f(1000)2.3416910434296.

f3

erfc(1000)1.86003 70486 3232810434298.

a1/x1%exp(x2)/(xπ)1.86003810434298

whuber
sumber
1
+1 Ini adalah jawaban yang bagus, entah bagaimana saya belum pernah menemukan utas ini sebelumnya.
Amuba mengatakan Reinstate Monica
15

Batas atas yang sederhana

z>0

S(z):=P(Z>z)=zφ(z)dz,
φ(z)=(2π)1/2ez2/2S(z)QQ(z)

S(z)φ(z)z=:S^u(z),

S(z)zz2+1φ(z)=:S^(z).

Sebuah gambar

S(z)

Upper-tail of normal and bounds

Seberapa baik itu?

z

E(z)=|S^u(z)S(z)S(z)|.
Ini memberi Anda kesalahan proporsional estimasi.

S^u(z)S^(z)

E(z)=S^u(z)S(z)S(z)S^u(z)S^(z)S^(z)=z2,
z10z28z100 itu benar dalam 0,01%.

Bahkan, bentuk batas yang sederhana memberikan pemeriksaan yang baik pada "perkiraan" lainnya. Jika, dalam perhitungan numerik perkiraan yang lebih rumit, kita mendapatkan nilai di luar batas ini, kita bisa "mengoreksi" itu untuk mengambil nilai, misalnya, batas atas yang disediakan di sini.

S(z)R(z)φ(z)R(z) adalah fungsi rasional.

Akhirnya, inilah pertanyaan dan jawaban yang agak terkait.

kardinal
sumber
1
Permintaan maaf untuk semua "kutipan diri". Suatu kali, beberapa tahun yang lalu, saya sangat tertarik, minat selama dua minggu dalam pertanyaan terkait dan mencoba belajar sebanyak mungkin tentang topik ini.
kardinal
+1 Setuju dengan whuber. Sangat bagus, dan saya menghargai tautan ke jawaban lain.
Iterator
5

Anda dapat memperkirakannya dengan fungsi yang lebih sederhana - lihat bagian Wikipedia ini untuk informasi lebih lanjut. Perkiraan dasarnya adalah ituerf(x)sgn(x)1-exp(-x24/π+Sebuahx21+Sebuahx2)

Artikel memiliki tautan yang salah untuk bagian itu. Referensi PDF dapat ditemukan dalam file Sergei Winitzki - atau di tautan ini .

Iterator
sumber
1
Beberapa amplifikasi ini akan diterima, karena dua alasan. Pertama, yang terbaik adalah ketika jawaban bisa berdiri sendiri. Kedua, artikel itu menulis secara ambigu tentang kualitas perkiraan "di lingkungan tak terhingga": seberapa akurat "sangat akurat"? (Anda secara implisit memiliki perasaan yang baik tentang hal ini, tetapi banyak yang diharapkan dari semua pembaca yang tertarik.) Nilai yang dinyatakan ".00035" tidak berguna di sini.
whuber
Terima kasih. Saya tidak memperhatikan bahwa ada dukungan berbasis Javascript untuk menggunakan TeX, yang membuat perbedaan dalam menuliskannya.
Iterator
1
Incidentally, the Wikipedia reference to that approximation is broken. Mathematica finds, though, that the relative error (1 - approx(x)/erf(x)) behaves like the reciprocal of 2exp(x2+3(π4)2/(8(π3))).
whuber
@whuber, can you post the Mathematica code for that? :) I haven't seen Mathematica in 15+ years, and never for this kind of purpose.
Iterator
I posted it in a separate reply.
whuber