Goodness of fit untuk histogram 2D

19

Saya memiliki dua set data yang mewakili parameter bintang: satu yang diamati dan yang dimodelkan. Dengan set ini saya membuat apa yang disebut diagram dua warna (TCD). Sampel dapat dilihat di sini:

histogram

A menjadi data yang diamati dan B data diekstraksi dari model (apalagi garis hitam, titik mewakili data) Saya hanya memiliki satu diagram A , tetapi dapat menghasilkan banyak diagram B yang berbeda seperti yang saya inginkan, dan yang saya butuhkan adalah untuk menjaga salah satu yang paling sesuai A .

Jadi yang saya butuhkan adalah cara yang dapat diandalkan untuk memeriksa kebaikan dari fit diagram B (model) ke diagram A (diamati).

Sekarang apa yang saya lakukan adalah saya membuat histogram 2D ​​atau kisi (itulah yang saya sebut, mungkin itu memiliki nama yang lebih tepat) untuk setiap diagram dengan binning kedua sumbu (100 nampan untuk masing-masing) Lalu saya pergi melalui setiap sel dari kisi dan saya menemukan perbedaan mutlak dalam hitungan antara A dan B untuk sel khusus itu. Setelah melalui semua sel, saya jumlah nilai-nilai untuk setiap sel dan jadi saya berakhir dengan parameter positif tunggal yang mewakili goodness of fit ( ) antara A dan B . Yang paling dekat dengan nol, semakin cocok. Pada dasarnya, ini adalah parameter yang terlihat seperti:gf

gf=sayaj|Sebuahsayaj-bsayaj|; di mana adalah jumlah bintang dalam diagram A untuk itu sel tertentu (ditentukan oleh ) dan adalah nomor B .Sebuahsayajsayajbsayaj

Inilah perbedaan dalam jumlah di setiap sel seperti di kisi yang saya buat (perhatikan bahwa saya tidak menggunakan nilai absolut dari di gambar ini tapi saya lakukan menggunakannya ketika menghitung parameter):(Sebuahsayaj-bsayaj)(Sebuahsayaj-bsayaj)gf

Hess

Masalahnya adalah saya sudah diberitahu bahwa ini mungkin bukan penaksir yang baik, terutama karena selain mengatakan ini lebih baik daripada yang lain karena parameternya lebih rendah , saya benar-benar tidak bisa mengatakan apa-apa lagi.


Penting :

(terima kasih @PeterEllis untuk membawa ini)

1- Poin di B tidak berhubungan satu-ke-satu dengan poin di A . Itu hal yang penting untuk diingat ketika mencari cocok: jumlah titik di A dan B adalah tidak tentu sama dan goodness of fit tes juga harus memperhitungkan perbedaan ini dan mencoba untuk menguranginya.

2- Jumlah poin di setiap B kumpulan data (output model) saya mencoba untuk fit untuk A adalah tidak tetap.


Saya telah melihat tes Chi-Squared yang digunakan dalam beberapa kasus:

saya(HAIsaya-Esaya)2/Esaya ; di mana diamati frekuensi (model) dan diharapkan frekuensi (pengamatan).HAIsayaEsaya

tetapi masalahnya adalah: apa yang harus saya lakukan jika nol? Seperti yang dapat Anda lihat pada gambar di atas, jika saya membuat kisi diagram tersebut dalam rentang itu akan ada banyak sel di mana adalah nol.EsayaEsaya

Juga, saya telah membaca beberapa orang merekomendasikan tes log Poisson kemungkinan untuk diterapkan dalam kasus-kasus seperti ini di mana histogram terlibat. Jika ini benar, saya akan sangat menghargai jika seseorang dapat mengajari saya tentang bagaimana menggunakan tes itu untuk kasus khusus ini (ingat, pengetahuan saya tentang statistik sangat buruk, jadi tolong sederhananya sesederhana mungkin :)

Gabriel
sumber
Apakah titik-titik dalam B memiliki hubungan satu-ke-satu dengan titik-titik dalam A (misalnya masing-masing adalah bintang tertentu) atau apakah lebih abstrak dari itu?
Peter Ellis
Hi @PeterEllis, tidak ada poin di B tidak berhubungan satu-ke-satu dengan poin di A . Bahkan itu hal lain yang penting untuk diingat ketika mencari cocok: jumlah titik di A dan B yang tidak selalu sama.
Gabriel
Hai - pertanyaan menarik, saya akan mencoba menulis jawaban yang tepat. Apakah setiap versi B jumlah poin yang sama, atau apakah mereka juga bervariasi?
Peter Ellis
Mereka juga bervariasi, hanya jumlah titik dalam A yang tetap konstan. Anda TIDAK tahu berapa banyak Anda akan membantu saya jika Anda membantu saya mencari tahu ini @PeterEllis.
Gabriel
Pertanyaan ini memiliki kemiripan yang kuat dengan topik ini: stats.stackexchange.com/questions/71036/… Di mana saya memberikan jawaban.
L Fischman

Jawaban:

14

OK, saya telah merevisi jawaban ini secara ekstensif. Saya pikir daripada membuang-buang data Anda dan membandingkan jumlah di setiap bin, saran yang telah saya tanamkan dalam jawaban asli saya tentang menyesuaikan perkiraan kepadatan kernel 2d dan membandingkannya adalah ide yang jauh lebih baik. Bahkan lebih baik, ada fungsi kde.test () dalam paket ks Tarn Duong untuk R yang melakukan ini semudah pie.

Periksa dokumentasi untuk kde.test untuk detail lebih lanjut dan argumen yang dapat Anda ubah. Tetapi pada dasarnya itu tidak persis apa yang Anda inginkan. Nilai p yang dikembalikan adalah probabilitas menghasilkan dua set data yang Anda bandingkan di bawah hipotesis nol bahwa mereka dihasilkan dari distribusi yang sama. Jadi semakin tinggi nilai-p, semakin baik kesesuaian antara A dan B. Lihat contoh saya di bawah ini di mana ini dengan mudah mengambil bahwa B1 dan A berbeda, tetapi B2 dan A secara masuk akal sama (yaitu bagaimana mereka dihasilkan) .

# generate some data that at least looks a bit similar
generate <- function(n, displ=1, perturb=1){
    BV <- rnorm(n, 1*displ, 0.4*perturb)
    UB <- -2*displ + BV + exp(rnorm(n,0,.3*perturb))
    data.frame(BV, UB)
}
set.seed(100)
A <- generate(300)
B1 <- generate(500, 0.9, 1.2)
B2 <- generate(100, 1, 1)
AandB <- rbind(A,B1, B2)
AandB$type <- rep(c("A", "B1", "B2"), c(300,500,100))

# plot
p <- ggplot(AandB, aes(x=BV, y=UB)) + facet_grid(~type) + 
    geom_smooth() +     scale_y_reverse() + theme_grey(9)
win.graph(7,3)
p +geom_point(size=.7)

masukkan deskripsi gambar di sini

> library(ks)
> kde.test(x1=as.matrix(A), x2=as.matrix(B1))$pvalue
[1] 2.213532e-05
> kde.test(x1=as.matrix(A), x2=as.matrix(B2))$pvalue
[1] 0.5769637

JAWABAN ASLI SAYA DI BAWAH INI, HANYA DISEDIAKAN KARENA ADA SEKALI LINK KE ITU DARI TEMPAT LAIN YANG TIDAK AKAN MEMBUAT SENSE

Pertama, mungkin ada cara lain untuk melakukannya.

Justel et al telah mengajukan ekstensi multivariat dari uji Kolmogorov-Smirnov tentang goodness of fit yang menurut saya dapat digunakan dalam kasus Anda, untuk menguji seberapa baik setiap set data yang dimodelkan cocok dengan aslinya. Saya tidak dapat menemukan implementasi dari ini (misalnya dalam R) tetapi mungkin saya tidak terlihat cukup keras.

Atau, mungkin ada cara untuk melakukan ini dengan memasang kopula pada data asli dan untuk setiap set data yang dimodelkan, dan kemudian membandingkan model-model tersebut. Ada implementasi dari pendekatan ini di R dan tempat lain tapi saya tidak terlalu akrab dengan mereka jadi belum mencoba.

Tetapi untuk menjawab pertanyaan Anda secara langsung, pendekatan yang Anda ambil adalah yang masuk akal. Beberapa poin menyarankan diri mereka sendiri:

  • Kecuali jika kumpulan data Anda lebih besar dari yang terlihat saya pikir kotak 100 x 100 terlalu banyak sampah. Secara intuitif, saya bisa membayangkan Anda menyimpulkan berbagai set data lebih berbeda daripada mereka hanya karena ketepatan tempat sampah Anda berarti Anda memiliki banyak tempat sampah dengan jumlah poin yang rendah di dalamnya, bahkan ketika kepadatan data tinggi. Namun ini pada akhirnya adalah masalah penilaian. Saya pasti akan memeriksa hasil Anda dengan pendekatan berbeda untuk binning.

  • Setelah Anda selesai melakukan binning dan Anda telah mengubah data Anda menjadi (pada dasarnya) sebuah tabel kontingensi dengan dua kolom dan jumlah baris yang sama dengan jumlah sampah (10.000 dalam kasus Anda), Anda memiliki masalah standar dalam membandingkan dua kolom hitungan. Entah uji Chi square atau pemasangan semacam model Poisson akan berhasil, tetapi seperti yang Anda katakan ada kecanggungan karena banyaknya jumlah nol. Salah satu dari model-model tersebut biasanya cocok dengan meminimalkan jumlah kuadrat perbedaan, dibobot oleh kebalikan dari jumlah yang diharapkan jumlah; ketika ini mendekati nol dapat menyebabkan masalah.

Sunting - sisa dari jawaban ini Saya sekarang tidak lagi percaya untuk menjadi pendekatan yang tepat.

Saya pikir uji pasti Fisher mungkin tidak berguna atau tidak sesuai dalam situasi ini, di mana total marginal dari baris di tab-silang tidak diperbaiki. Ini akan memberikan jawaban yang masuk akal tapi saya merasa sulit untuk mendamaikan penggunaannya dengan turunan aslinya dari desain eksperimental. Saya meninggalkan jawaban asli di sini sehingga komentar dan pertanyaan selanjutnya masuk akal. Selain itu, mungkin masih ada cara untuk menjawab pendekatan OP yang diinginkan untuk men-binning data dan membandingkan tempat sampah dengan beberapa tes berdasarkan pada perbedaan absolut atau kuadrat rata-rata. Pendekatan semacam itu masih akan menggunakan tab silang dirujuk di bawah dan menguji independensi yaitu mencari hasil di mana kolom A memiliki proporsi yang sama dengan kolom B.ng×2

Saya menduga bahwa solusi untuk masalah di atas adalah dengan menggunakan uji pasti Fisher , menerapkannya tab silang , di mana adalah jumlah total sampah. Meskipun perhitungan lengkap kemungkinan tidak praktis karena jumlah baris di tabel Anda, Anda bisa mendapatkan estimasi nilai p yang baik menggunakan simulasi Monte Carlo (implementasi R dari uji Fisher memberikan ini sebagai opsi untuk tabel yang lebih besar dari 2 x 2 dan saya kira begitu paket lain). Nilai-p ini adalah probabilitas bahwa set data kedua (dari salah satu model Anda) memiliki distribusi yang sama melalui nampan Anda seperti aslinya. Oleh karena itu semakin tinggi nilai p, semakin baik kesesuaiannya. ng×2ng

Saya mensimulasikan beberapa data agar terlihat seperti milik Anda dan menemukan bahwa pendekatan ini cukup efektif untuk mengidentifikasi set data "B" mana yang dihasilkan dari proses yang sama dengan "A" dan yang sedikit berbeda. Tentunya lebih efektif daripada mata telanjang.

  • ng×2masalah jika Anda hanya menggunakan jumlah perbedaan absolut atau perbedaan kuadrat, seperti yang Anda usulkan pada awalnya). Namun, penting bahwa setiap versi B Anda memiliki jumlah poin yang berbeda. Pada dasarnya, set data B yang lebih besar akan memiliki kecenderungan untuk mengembalikan nilai-p yang lebih rendah. Saya dapat memikirkan beberapa kemungkinan solusi untuk masalah ini. 1. Anda bisa mengurangi semua set B Anda ke ukuran yang sama (ukuran terkecil dari set B Anda), dengan mengambil sampel acak dari ukuran itu dari semua set B yang lebih besar dari ukuran itu. 2. Pertama-tama Anda bisa memasukkan perkiraan kepadatan kernel dua dimensi untuk setiap set B Anda, dan kemudian mensimulasikan data dari perkiraan itu yang berukuran sama. 3. Anda bisa menggunakan semacam simulasi untuk mengetahui hubungan nilai-p dengan ukuran dan menggunakannya untuk "memperbaiki" nilai-p yang Anda dapatkan dari prosedur di atas sehingga dapat dibandingkan. Mungkin ada alternatif lain juga. Yang mana yang Anda lakukan akan bergantung pada bagaimana data B dihasilkan, seberapa berbeda ukurannya, dll.

Semoga itu bisa membantu.

Peter Ellis
sumber
Saya membuat beberapa koreksi kesalahan ketik kecil; Saya harap kamu tidak keberatan. Mungkin ada cara memformat hal-hal untuk menarik ide-ide utama sedikit lebih menonjol, terutama di poin terakhir. Tapi, aku juga tidak ingin terlalu bersemangat. Bersulang. :)
kardinal
tidak masalah. Saya berjuang dengan cara yang baik untuk memformat titik peluru terakhir saya - yang saya inginkan adalah hierarki daftar bernomor di bawah titik peluru. Tetapi saya tidak dapat menemukan cara untuk melakukan itu.
Peter Ellis
Ya, saya mengotak-atik itu juga, secara singkat, karena itulah yang Anda maksudkan. Saya tidak tahu bagaimana melakukannya dengan cepat dan sangat ragu untuk membuat perubahan besar pada tata letak, jadi saya pikir saya hanya akan berkomentar saja. :)
kardinal
1
Saya merekomendasikan buku Wilcox sebagai teks statistik umum yang menggunakan R (lihat stat jawaban saya .stackexchange.com/questions/25632/… ). Meskipun ia tidak menutupi teks persis Fisher, ada cukup detail pada teks spesifik di web yang akan lebih masuk akal jika Anda memiliki latar belakang dalam buku itu tentang tes serupa. Mungkin ada teks yang lebih baik di luar sana tentang masalah khusus ini, tetapi saya pikir buku Wilcox bagus sebagai pengantar umum yang dengan cepat membawa Anda ke tingkat tinggi.
Peter Ellis
1
Wow. Anda menjawab sih dari hal ini. Jika ada "pertukaran stackex terbaik," ini akan ada di dalamnya.
Colin K