Menguji perangkat lunak statistik

10

Teknik / pendekatan apa yang berguna dalam menguji perangkat lunak statistik? Saya sangat tertarik pada program yang melakukan estimasi parametrik menggunakan kemungkinan maksimum.

Membandingkan hasil dengan yang dari program lain atau sumber yang diterbitkan tidak selalu mungkin karena sebagian besar waktu ketika saya menulis program sendiri itu karena perhitungan yang saya butuhkan belum diterapkan dalam sistem yang ada.

Saya tidak bersikeras pada metode yang dapat menjamin kebenaran. Saya akan senang dengan teknik yang dapat menangkap sebagian kecil kesalahan.

Jyotirmoy Bhattacharya
sumber

Jawaban:

8

Salah satu teknik yang berguna adalah pengujian monte carlo. Jika ada dua algoritma yang melakukan hal yang sama, terapkan keduanya, beri mereka data acak, dan periksa (dalam toleransi kecil untuk fuzz numerik) mereka menghasilkan jawaban yang sama. Saya sudah melakukan ini beberapa kali sebelumnya:

  • Saya menulis implementasi Kendall's Tau B. yang efisien tapi sulit untuk mengimplementasikan . Untuk mengujinya saya menulis implementasi 50-line mati-sederhana yang berjalan di . O ( N 2 )O(N log N)O(N2)

  • Saya menulis beberapa kode untuk melakukan regresi ridge. Algoritma terbaik untuk melakukan ini tergantung pada apakah Anda berada dalam case atau , jadi saya butuh dua algoritma. p > nn>pp>n

Dalam kedua kasus ini saya menerapkan teknik yang relatif terkenal dalam bahasa pemrograman D (yang tidak ada implementasi), jadi saya juga memeriksa beberapa hasil terhadap R. Meskipun demikian, pengujian monte carlo menangkap bug yang tidak akan pernah saya tangkap kalau tidak .

Tes bagus lainnya adalah menegaskan . Anda mungkin tidak tahu persis apa hasil yang benar dari perhitungan Anda seharusnya, tetapi itu tidak berarti bahwa Anda tidak dapat melakukan pemeriksaan kewarasan pada berbagai tahap perhitungan. Dalam praktiknya, jika Anda memiliki banyak ini dalam kode Anda dan semuanya lulus, maka kode itu biasanya benar.

Sunting: Metode ketiga adalah memberi makan data algoritma (sintetis atau nyata) di mana Anda tahu setidaknya tentang apa jawaban yang benar, bahkan jika Anda tidak tahu persis, dan melihat dengan inspeksi jika jawabannya masuk akal. Misalnya, Anda mungkin tidak tahu persis perkiraan parameter Anda, tetapi Anda mungkin tahu yang mana yang dianggap "besar" dan mana yang seharusnya "kecil".

dsimcha
sumber
5

Tidak yakin apakah ini benar-benar jawaban untuk pertanyaan Anda, tetapi setidaknya terkait secara tangensial.

Saya memelihara paket Statistik di Maple . Contoh menarik dari kode yang sulit untuk diuji adalah pembuatan sampel acak berdasarkan distribusi yang berbeda; mudah untuk menguji bahwa tidak ada kesalahan yang dihasilkan, tetapi lebih sulit untuk menentukan apakah sampel yang dihasilkan sesuai dengan distribusi yang diminta "cukup baik". Karena Maple memiliki fitur simbolik dan numerik, Anda dapat menggunakan beberapa fitur simbolik untuk menguji pembuatan sampel (murni numerik):

  1. Kami telah menerapkan beberapa jenis pengujian hipotesis statistik, salah satunya adalah uji model chi square cocok - uji chi square dari jumlah sampel dalam sampah ditentukan dari CDF terbalik dari distribusi probabilitas yang diberikan. Jadi misalnya, untuk menguji pembuatan sampel distribusi Cauchy, saya menjalankan sesuatu seperti

    with(Statistics):
    infolevel[Statistics] := 1:
    distribution := CauchyDistribution(2, 3):
    sample := Sample(distribution, 10^6):
    ChiSquareSuitableModelTest(sample, distribution, 'bins' = 100, 'level' = 0.001);
    

    Karena saya dapat menghasilkan sampel sebesar yang saya inginkan, saya dapat membuat cukup kecil.α

  2. Untuk distribusi dengan momen yang terbatas, saya menghitung di satu sisi sejumlah momen sampel, dan di sisi lain, saya secara simbolis menghitung momen distribusi yang sesuai dan kesalahan standar mereka. Jadi untuk mis. Distribusi beta:

    with(Statistics):
    distribution := BetaDistribution(2, 3):
    distributionMoments := Moment~(distribution, [seq(1 .. 10)]);
    standardErrors := StandardError[10^6]~(Moment, distribution, [seq(1..10)]);
    evalf(distributionMoments /~ standardErrors);
    

    Ini menunjukkan daftar angka yang menurun, yang terakhir adalah 255.1085766. Jadi bahkan untuk momen ke-10, nilai momen lebih dari 250 kali nilai kesalahan standar momen sampel untuk sampel berukuran . Ini berarti saya dapat menerapkan tes yang berjalan kurang lebih sebagai berikut:106

    with(Statistics):
    sample := Sample(BetaDistribution(2, 3), 10^6):
    sampleMoments := map2(Moment, sample, [seq(1 .. 10)]);
    distributionMoments := [2/5, 1/5, 4/35, 1/14, 1/21, 1/30, 4/165, 1/55, 2/143, 1/91];
    standardErrors := 
      [1/5000, 1/70000*154^(1/2), 1/210000*894^(1/2), 1/770000*7755^(1/2), 
       1/54600*26^(1/2), 1/210000*266^(1/2), 7/5610000*2771^(1/2), 
       1/1567500*7809^(1/2), 3/5005000*6685^(1/2), 1/9209200*157366^(1/2)];
    deviations := abs~(sampleMoments - distributionMoments) /~ standardErrors;
    

    Angka-angka masuk distributionMomentsdan standardErrorsberasal dari jalankan pertama di atas. Sekarang jika generasi sampel sudah benar, angka dalam penyimpangan harus relatif kecil. Saya berasumsi mereka kira-kira terdistribusi normal (yang sebenarnya tidak, tetapi cukup dekat - ingat ini adalah versi skala saat sampel, bukan sampel itu sendiri) dan dengan demikian saya dapat, misalnya, menandai kasus di mana penyimpangan adalah lebih besar dari 4 - sesuai dengan momen sampel yang menyimpang lebih dari empat kali kesalahan standar dari momen distribusi. Ini sangat tidak mungkin terjadi secara acak jika generasi sampel baik. Di sisi lain, jika 10 momen sampel pertama cocok dengan momen distribusi hingga kurang dari setengah persen, kami memiliki perkiraan distribusi yang cukup baik.

Kunci mengapa kedua metode ini bekerja adalah bahwa kode pembuatan sampel dan kode simbolik hampir sepenuhnya terpisah. Jika akan ada tumpang tindih antara keduanya, maka kesalahan dalam tumpang tindih itu dapat memanifestasikan dirinya baik dalam generasi sampel dan dalam verifikasi, dan dengan demikian tidak ditangkap.

Erik P.
sumber
Terima kasih atas jawaban anda. Saya "menerima" jawaban yang lain karena saya hanya diperbolehkan memilih satu dan itu sepertinya lebih cocok dengan situasi saya saat ini. Tetapi jawaban Anda juga sangat membantu.
Jyotirmoy Bhattacharya
2

Bruce McCullough memiliki sedikit industri rumahan dalam menilai perangkat lunak statistik (dalam arti luas; ia juga menguji Microsoft Excel. Dan ternyata menginginkannya). Dua makalah yang menggambarkan bagian dari pendekatannya ada di sini dan di sini.

Stephan Kolassa
sumber
2

Banyak detail diberikan oleh Presiden StataCorp, William Gould, dalam artikel Stata Journal ini. 1 Ini adalah artikel yang sangat menarik tentang kontrol kualitas perangkat lunak statistik.

pmgjones
sumber