Menguji data yang dihasilkan secara acak terhadap distribusi yang diinginkan

17

Saya telah menulis sebuah program yang menghasilkan data acak. Jika program bekerja dengan benar, data tersebut harus mengikuti distribusi probabilitas khusus yang diketahui. Saya ingin menjalankan program, melakukan perhitungan pada hasilnya, dan menghasilkan nilai-p.

Sebelum orang lain mengatakannya: Saya mengerti bahwa pengujian hipotesis tidak dapat mendeteksi kapan program beroperasi dengan benar. Itu hanya dapat mendeteksi ketika beroperasi secara tidak benar dengan cara tertentu. (Dan bahkan kemudian, tes "harus" gagal X% dari waktu, tergantung pada tingkat signifikansi apa yang Anda pilih ...)

Jadi, saya mencoba untuk mendapatkan pemahaman tentang alat apa yang mungkin sesuai. Khususnya:

  • Saya dapat menghasilkan data acak sebanyak yang saya inginkan. Yang harus saya lakukan adalah membiarkan program berjalan cukup lama. Jadi saya tidak terbatas pada ukuran sampel tertentu.

  • Saya tertarik pada teknik yang menghasilkan nilai-p. Jadi menatap grafik dan berkata "ya, itu terlihat agak linier" bukanlah pilihan yang menarik. Kecuali ada beberapa cara untuk menempatkan angka keras pada "ketidakberuntungan" dari sebuah grafik. ;-)

Apa yang saya ketahui sejauh ini:

  • Saya telah melihat tiga jenis tes yang disebutkan yang sepertinya mungkin berlaku: uji chi-squared [Pearson], tes Kolmogorov-Smirnov dan tes Anderson-Darling.

  • Tampaknya tes chi-squared cocok untuk distribusi diskrit , sedangkan dua lainnya lebih sesuai untuk distribusi kontinu . (?)

  • Berbagai sumber mengisyaratkan bahwa tes AD "lebih baik" daripada tes KS, tetapi gagal masuk ke detail lebih lanjut.

Pada akhirnya, semua tes ini mungkin mendeteksi "berbagai cara" penyimpangan dari distribusi nol yang ditentukan. Tapi saya belum benar-benar tahu apa perbedaannya ... Singkatnya, saya sedang mencari semacam gambaran umum tentang di mana masing-masing jenis tes paling dapat diterapkan, dan masalah apa yang paling baik dideteksi.

Matematika Matematika
sumber
Jika Anda telah menulis sendiri itu hampir pasti 'gagal' setelah Anda melewati batas pengetahuan Anda (bahwa Anda telah tertanam dalam desain). Lihat random.org/analysis yang mencantumkan beberapa metode pemeriksaan, dan jelas stackoverflow.com/q/2130621/717355 . Secara filosofis, Jika program bersifat deterministik, maka program tersebut tidak dapat dilakukan secara acak ;-) Ini adalah pelajaran yang layak untuk dipelajari (dan jangan lupa diskusi peretasan kata sandi crypo)
Philip Oakley

Jawaban:

21

Berikut ini adalah gambaran umum tentang bagaimana 3 metode yang disebutkan bekerja.

Metode Chi-Squared bekerja dengan membandingkan jumlah pengamatan di tempat sampah dengan jumlah yang diharapkan berada di tempat sampah berdasarkan distribusi. Untuk distribusi diskrit, tempat sampah biasanya merupakan kemungkinan atau kombinasi diskrit dari semuanya. Untuk distribusi kontinu Anda dapat memilih titik potong untuk membuat tempat sampah. Banyak fungsi yang mengimplementasikan ini akan secara otomatis membuat nampan, tetapi Anda harus dapat membuat nampan sendiri jika Anda ingin membandingkan dalam area tertentu. Kerugian dari metode ini adalah bahwa perbedaan antara distribusi teoretis dan data empiris yang masih menempatkan nilai-nilai dalam nampan yang sama tidak akan terdeteksi, contohnya adalah pembulatan, jika secara teoritis angka antara 2 dan 3 harus tersebar ke seluruh rentang (kami berharap melihat nilai seperti 2.34296),

Statistik uji KS adalah jarak maksimum antara 2 Fungsi Distribusi Kumulatif yang dibandingkan (seringkali teoretis dan empiris). Jika distribusi 2 probabilitas hanya memiliki 1 titik persimpangan maka 1 minus jarak maksimum adalah area tumpang tindih antara distribusi 2 probabilitas (ini membantu beberapa orang memvisualisasikan apa yang sedang diukur). Pikirkan merencanakan pada plot yang sama fungsi distribusi teoretis dan EDF kemudian mengukur jarak antara 2 "kurva", perbedaan terbesar adalah statistik uji dan dibandingkan dengan distribusi nilai untuk ini ketika nol benar. Perbedaan menangkap ini adalah bentuk distribusi atau 1 distribusi bergeser atau membentang dibandingkan dengan yang lain.1n

Tes Anderson-Darling juga menggunakan perbedaan antara kurva CDF seperti tes KS, tetapi alih-alih menggunakan perbedaan maksimum, ia menggunakan fungsi area total antara 2 kurva (itu sebenarnya menguadratkan perbedaan, menimbang mereka sehingga ekor memiliki lebih banyak pengaruh, kemudian diintegrasikan ke domain distribusi). Ini memberikan bobot lebih untuk outlier daripada KS dan juga memberi bobot lebih jika ada beberapa perbedaan kecil (dibandingkan dengan 1 perbedaan besar yang akan ditekankan KS). Ini mungkin akan sangat menyulitkan tes untuk menemukan perbedaan yang Anda anggap tidak penting (pembulatan ringan, dll.). Seperti uji KS, ini mengasumsikan bahwa Anda tidak memperkirakan parameter dari data.

Berikut ini adalah grafik untuk menunjukkan ide umum dari 2 terakhir:

masukkan deskripsi gambar di sini

berdasarkan pada kode R ini:

set.seed(1)
tmp <- rnorm(25)
edf <- approxfun( sort(tmp), (0:24)/25, method='constant', 
    yleft=0, yright=1, f=1 )

par(mfrow=c(3,1), mar=c(4,4,0,0)+.1)
curve( edf, from=-3, to=3, n=1000, col='green' )
curve( pnorm, from=-3, to=3, col='blue', add=TRUE)

tmp.x <- seq(-3, 3, length=1000)
ediff <- function(x) pnorm(x) - edf(x)
m.x <- tmp.x[ which.max( abs( ediff(tmp.x) ) ) ]
ediff( m.x )  # KS stat
segments( m.x, edf(m.x), m.x, pnorm(m.x), col='red' )  # KS stat

curve( ediff, from=-3, to=3, n=1000 )
abline(h=0, col='lightgrey')    

ediff2 <- function(x) (pnorm(x) - edf(x))^2/( pnorm(x)*(1-pnorm(x)) )*dnorm(x)
curve( ediff2, from=-3, to=3, n=1000 )
abline(h=0)

Grafik atas menunjukkan EDF sampel dari standar normal dibandingkan dengan CDF standar normal dengan garis yang menunjukkan stat KS. Grafik tengah kemudian menunjukkan perbedaan dalam 2 kurva (Anda dapat melihat di mana stat KS terjadi). Bagian bawah kemudian kuadrat, perbedaan tertimbang, tes AD didasarkan pada area di bawah kurva ini (dengan asumsi saya mendapatkan semuanya benar)

Tes lain melihat korelasi dalam qqplot, melihat kemiringan dalam qqplot, membandingkan rata-rata, var, dan statistik lainnya berdasarkan momen.

Greg Snow
sumber
+1, ini adalah jawaban yang bagus untuk pertanyaan aktual (tidak seperti milik saya ...). Deskripsi yang berjalan di pertengahan paragraf 3 hanya meminta angka ilustrasi, jika Anda merasa ingin membuatnya.
gung - Reinstate Monica
Itu jawaban yang sangat bagus. Hanya untuk memastikan saya mengerti sepenuhnya: Tes KS mengembalikan deviasi terbesar antara CDF dan EDF, sementara AD mengembalikan area [terbobot] total antara dua kurva?
MathematicalOrchid
@MathematicalOrchid, sebagian besar benar, AD kuadratkan jaraknya, kemudian bobotnya, kemudian diintegrasikan, sehingga agak berbeda dari area (meskipun untuk memahami, memikirkannya sebagai area mungkin ok dan lebih sederhana).
Greg Snow
1
Saya berharap bahwa jika distribusi teoretis Anda memiliki titik massa (lompatan vertikal dalam CDF pada titik tertentu) dan distribusi aktual data Anda memiliki titik massa di hampir, tetapi tidak cukup, tempat yang sama maka tes KS mungkin lebih unggul untuk tes AD. Tapi kasus itu mungkin sedikit dibuat-buat. Tes KS memang memungkinkan untuk 1 tes sisi di mana AD selalu 2 sisi, sehingga akan menjadi perbedaan lain (tidak umum).
Greg Snow
2
Saya tidak suka karakterisasi @MathematicalOrchid bahwa statistik KS hanya bergantung pada "satu titik ekstrim". Lokasi "satu titik" (sering di tengah-tengah distribusi) dalam CDF tergantung pada nilai-nilai titik-titik lain dalam set dan karenanya tidak terisolasi atau soliter seperti yang disarankan oleh bahasa kepada pendengar yang naif.
DWin
12

+1 untuk menulis pertanyaan yang jelas dan terperinci. Saya harap jawaban saya tidak terlalu membuat frustrasi. Saya percaya bahwa pengujian hipotesis bukan pendekatan yang tepat dalam kasus Anda. Pengujian signifikansi hipotesis nol adalah hal yang wajar untuk dilakukan ketika jawabannya bisa ya atau tidak, tetapi Anda tidak tahu yang mana . (Sayangnya, itu tidak benar-benar memberi tahu Anda mana, tetapi ini adalah masalah yang berbeda.) Dalam kasus Anda, saya kumpulkan, Anda ingin tahu apakah algoritme Anda baik. Namun, diketahui (dengan pasti), bahwa tidak ada program komputer yang dapat menghasilkan data acak dari distribusi probabilitas. Ini benar pertama, karena semua komputer adalah mesin negara terbatas , dan dengan demikian hanya dapat menghasilkan angka pseudorandom. Selain itu (mengesampingkan kurangnya keacakan benar), tidak mungkin bahwa nilai-nilai yang dihasilkan sempurna mengikuti distribusi kontinu. Ada beberapa cara untuk memahami hal ini, tetapi mungkin yang paling mudah adalah bahwa akan ada 'kesenjangan' dalam garis bilangan, yang tidak berlaku untuk variabel acak kontinu. Selain itu, celah-celah ini tidak semuanya memiliki lebar yang sama atau jarak yang sama baiknya. Di antara para ilmuwan komputer yang bekerja pada generasi nomor pseudorandom, nama gim ini adalah untuk meningkatkan algoritme sehingga kesenjangan lebih kecil, lebih merata, dengan periode yang lebih lama (dan juga yang dapat menghasilkan nilai lebih cepat). Bagaimanapun, fakta-fakta ini membuktikan bahwa pengujian hipotesis adalah pendekatan yang salah untuk menentukan apakah algoritma Anda benar mengikuti "distribusi probabilitas yang diketahui secara spesifik", karena tidak. (Maaf.)

Sebagai gantinya, kerangka kerja yang lebih tepat adalah untuk menentukan seberapa dekat data Anda dengan distribusi teoretis. Untuk ini, saya akan merekomendasikan plot kembali, khususnya plot qq dan pp-plot1-βr=1

Pada satu catatan lain, berkenaan dengan mengevaluasi kualitas algoritma Anda, Anda mungkin ingin mengatur waktu relatif terhadap standar pRNG lainnya.

Semoga ini membantu.

gung - Reinstate Monica
sumber
Tidak persis apa yang saya minta, tetapi tidak kurang wawasan. Saya kira dengan "tidak terus menerus" pada dasarnya Anda mengacu pada fakta bahwa komputer tidak menerapkan aritmatika presisi tak terbatas?
MathematicalOrchid
Itu bagian besar dari itu, tetapi tidak keseluruhan masalahnya. Ini adalah topik yang sangat kompleks.
gung - Reinstate Monica
1
Beberapa ide dari paragraf @ gung diimplementasikan dalam fungsi SnowsPenultimateNormalityTestdalam TeachingDemospaket untuk R. Saya setuju dengan gagasan @ gung untuk melihat ukuran kedekatan daripada berfokus pada nilai-p. Satu masalah dengan menggunakan korelasi dalam plot qq untuk ini adalah bahwa jika data Anda memiliki bentuk yang benar, tetapi perbedaan rata-rata, varian, dll. Anda masih bisa mendapatkan korelasi yang sangat tinggi. Alternatifnya adalah menggunakan statistik KS atau statistik AD sebagai ukuran perbedaan dari teori.
Greg Snow
@ung, terima kasih atas jawabannya. Bisakah Anda menjelaskan sedikit lebih lanjut tentang "telah mengkonversi data Anda dengan tepat untuk merencanakan, dan setelah menghitung nilai-nilai yang sesuai dari distribusi teoritis yang bersangkutan, Anda dapat menghubungkannya"? Sudah menghitung data untuk pp-atau qq-plotting, apa langkah selanjutnya untuk mendapatkan r-score yang Anda sebutkan? Apakah ini tes yang terkenal? Bisakah Anda memberikan referensi? Terima kasih!
Ivan
1

Saya belum benar-benar membaca semua jawaban tetapi saya melihat mereka cukup menyeluruh dan akurat. Menjalankan risiko bahwa saya mengulangi sesuatu yang terkubur dalam jawaban panjang saya hanya ingin mengatakan bahwa v = uji chi square dapat digunakan untuk data kontinu. Ini mungkin bukan tes terbaik dan seperti banyak tes itu bergantung pada teori asimptotik dan jadi mungkin tidak akurat dalam sampel kecil dengan sel jarang (ini tergantung juga pada bagaimana Anda melakukan binning). Anderson-Darling lebih kuat untuk menguji normalitas daripada tes KS tetapi KS mungkin lebih baik untuk distribusi kontinu lainnya. Lillefors memiliki tes yang dirancang untuk distribusi eksponensial.

Michael R. Chernick
sumber