Bagaimana cara mengetahui jika data mengikuti Distribusi Poisson di R?

25

Saya seorang mahasiswa sarjana dan saya memiliki proyek untuk kelas probabilitas saya. Pada dasarnya, saya memiliki dataset tentang badai yang berdampak pada negara saya selama beberapa tahun.

Dalam Buku probabilitas saya, (Probabilitas dan Statistik dengan R) ada contoh (tidak lengkap) tentang cara memeriksa apakah data mengikuti distribusi Poisson, mereka mulai mencoba membuktikan bahwa 3 kriteria ini diikuti: (Dari buku saya, halaman 120 (kriteria) halaman 122-123 contoh)

1- Jumlah hasil dalam interval yang tidak tumpang tindih adalah independen. Dengan kata lain, jumlah hasil dalam interval waktu (0, t] tidak tergantung dari jumlah hasil dalam interval waktu (t, t + h], h> 0

2- Probabilitas dua atau lebih hasil dalam interval yang cukup pendek hampir nol. Dengan kata lain, asalkan h cukup kecil, probabilitas untuk mendapatkan dua hasil atau lebih dalam interval (t, t + h] dapat diabaikan dibandingkan dengan kemungkinan mendapatkan satu atau nol hasil dalam interval waktu yang sama.

3- Probabilitas tepat satu hasil dalam interval yang cukup pendek atau wilayah kecil sebanding dengan panjang interval atau wilayah. Dengan kata lain, probabilitas satu hasil dalam interval panjang h adalah lambda * h.

Tetapi kriteria 3 dibiarkan "sebagai latihan".

A- Dapatkah seseorang memberi tahu saya jika ada cara yang lebih "mudah" untuk melihat apakah dataset saya mengikuti distribusi Poisson?

B- Dapatkah seseorang menjelaskan kriteria 1 dan 3 dengan beberapa contoh (jika dengan R, fantastis)?

Terima kasih!

Catatan: Maaf untuk posting lama. Juga, saya harus mengonversi data sehingga saya memiliki tabel seperti:

  number of hurricanes       | 0 | 1 | 2  etc.
  -----------------------------------------
  total years that have      |   |   |
  that number of hurricanes  |   |   |
Shariff
sumber
Kriteria dalam buku Anda adalah untuk data interval; itu akan berguna jika Anda memiliki tanggal di mana badai topan ... apalagi kriteria ini adalah untuk proses Poisson tingkat konstan , yang jelas (atau saya harap begitu) bukan kasus badai. Untuk memeriksa apakah data jumlah Anda mengikuti distribusi Poisson, pendekatan dasar pertama adalah uji chi-square.
Elvis

Jawaban:

33

Ada banyak cara agar distribusi sedikit berbeda dari distribusi Poisson; Anda tidak dapat mengidentifikasi bahwa satu set data yang diambil dari distribusi Poisson. Yang dapat Anda lakukan adalah mencari inkonsistensi dengan apa yang seharusnya Anda lihat dengan Poisson, tetapi kurangnya inkonsistensi yang jelas tidak menjadikannya Poisson.

Namun, apa yang Anda bicarakan di sana dengan memeriksa ketiga kriteria tersebut tidak memeriksa apakah data berasal dari distribusi Poisson dengan cara statistik (yaitu dengan melihat data), tetapi dengan menilai apakah proses data dihasilkan oleh memenuhi kondisi proses Poisson; jika semua kondisi dipegang atau hampir dipegang (dan itu merupakan pertimbangan dari proses pembuatan data), Anda dapat memiliki sesuatu dari atau sangat dekat dengan proses Poisson, yang pada gilirannya akan menjadi cara untuk mendapatkan data yang diambil dari sesuatu yang dekat dengan suatu Distribusi racun.

Tetapi kondisinya tidak berlaku dalam beberapa cara ... dan yang terjauh dari kebenaran adalah nomor 3. Tidak ada alasan khusus atas dasar itu untuk menegaskan proses Poisson, meskipun pelanggaran mungkin tidak begitu buruk sehingga data yang dihasilkan jauh dari Poisson.

Jadi kita kembali ke argumen statistik yang berasal dari memeriksa data itu sendiri. Bagaimana data menunjukkan bahwa distribusi itu Poisson, bukan sesuatu seperti itu?

Seperti yang disebutkan di awal, yang dapat Anda lakukan adalah memeriksa apakah data tersebut jelas tidak konsisten dengan distribusi yang mendasari Poisson, tetapi itu tidak memberi tahu Anda bahwa mereka diambil dari Poisson (Anda sudah dapat yakin bahwa mereka tidak).

Anda dapat melakukan pemeriksaan ini melalui tes goodness of fit.

Chi-square yang disebutkan adalah salah satunya, tetapi saya tidak akan merekomendasikan tes chi-square untuk situasi ini sendiri **; ia memiliki daya rendah terhadap penyimpangan yang menarik. Jika tujuan Anda adalah untuk memiliki kekuatan yang baik, Anda tidak akan mendapatkannya dengan cara itu (jika Anda tidak peduli dengan kekuatan, mengapa Anda menguji?). Nilai utamanya adalah dalam kesederhanaan, dan memiliki nilai pedagogis; di luar itu, itu tidak kompetitif sebagai uji goodness of fit.

** Ditambahkan di edit nanti: Sekarang jelas ini adalah pekerjaan rumah, kemungkinan Anda diharapkan untuk melakukan tes chi-squared untuk memeriksa data tidak konsisten dengan Poisson naik cukup banyak. Lihat contoh saya uji chi-square, uji kelayakan, dilakukan di bawah plot Poissonness pertama


Orang sering melakukan tes ini untuk alasan yang salah (misalnya karena mereka ingin mengatakan 'oleh karena itu tidak apa-apa untuk melakukan beberapa hal statistik lainnya dengan data yang mengasumsikan bahwa data tersebut adalah Poisson'). Pertanyaan sebenarnya adalah 'seberapa salahkah itu bisa terjadi?' ... dan tes kecocokan yang baik tidak banyak membantu dengan pertanyaan itu. Seringkali jawaban untuk pertanyaan itu adalah yang terbaik yang independen (/ hampir independen) dari ukuran sampel —— dan dalam beberapa kasus, satu dengan konsekuensi yang cenderung hilang dengan ukuran sampel ... sementara uji goodness of fit tidak berguna dengan sampel kecil (di mana risiko Anda dari pelanggaran asumsi sering kali terbesar).

Jika Anda harus menguji distribusi Poisson ada beberapa alternatif yang masuk akal. Satu akan melakukan sesuatu yang mirip dengan tes Anderson-Darling, berdasarkan statistik AD tetapi menggunakan distribusi simulasi di bawah nol (untuk menjelaskan masalah kembar dari distribusi diskrit dan bahwa Anda harus memperkirakan parameter).

Alternatif yang lebih sederhana mungkin adalah Tes Lancar untuk mendapatkan kecocokan - ini adalah kumpulan tes yang dirancang untuk distribusi individual dengan memodelkan data menggunakan keluarga polinomial yang ortogonal berkenaan dengan fungsi probabilitas dalam nol. Alternatif dengan urutan rendah (yaitu menarik) diuji dengan menguji apakah koefisien polinomial di atas basis satu berbeda dari nol, dan ini biasanya dapat berurusan dengan estimasi parameter dengan menghilangkan syarat urutan terendah dari pengujian. Ada ujian untuk Poisson. Saya dapat menggali referensi jika Anda membutuhkannya.

n(1-r2)log(xk)+log(k!)k

Berikut adalah contoh perhitungan itu (dan plot), dilakukan di R:

y=rpois(100,5)
n=length(y)
(x=table(y))
y
 0  1  2  3  4  5  6  7  8  9 10 
 1  2  7 15 19 25 14  7  5  1  4 

k=as.numeric(names(x))
plot(k,log(x)+lfactorial(k))

masukkan deskripsi gambar di sini

Berikut statistik yang saya sarankan dapat digunakan untuk uji kelayakan Poisson:

n*(1-cor(k,log(x)+lfactorial(k))^2)
[1] 1.0599

Tentu saja, untuk menghitung nilai-p, Anda juga perlu mensimulasikan distribusi statistik uji di bawah nol (dan saya belum membahas bagaimana orang mungkin berurusan dengan angka nol di dalam kisaran nilai). Ini harus menghasilkan tes yang cukup kuat. Ada banyak tes alternatif lainnya.

Berikut adalah contoh melakukan plot Poissonness pada sampel ukuran 50 dari distribusi geometrik (p = 0,3):

masukkan deskripsi gambar di sini

Seperti yang Anda lihat, ini menampilkan 'ketegaran' yang jelas, menunjukkan nonlinier


Referensi untuk plot Kemunafikan adalah:

David C. Hoaglin (1980),
"A Poissonness Plot",
The American Statistician
Vol. 34, No. 3 (Agustus,), hlm. 146-149

dan

Hoaglin, D. dan J. Tukey (1985),
"9. Memeriksa Bentuk Distribusi Diskrit",
Menjelajahi Tabel Data, Tren dan Bentuk ,
(Hoaglin, Mosteller & eduk Tukey)
John Wiley & Sons

Referensi kedua berisi penyesuaian plot untuk jumlah kecil; Anda mungkin ingin memasukkannya (tapi saya tidak punya referensi di tangan).


Contoh melakukan uji kelayakan chi-square:

Selain melakukan chi-square goodness of fit, cara itu biasanya diharapkan akan dilakukan di banyak kelas (meskipun bukan cara saya melakukannya):

1: dimulai dengan data Anda, (yang akan saya ambil sebagai data yang saya buat secara acak di 'y' di atas, buat tabel perhitungan:

(x=table(y))
y
 0  1  2  3  4  5  6  7  8  9 10 
 1  2  7 15 19 25 14  7  5  1  4 

2: menghitung nilai yang diharapkan di setiap sel, dengan asumsi Poisson dilengkapi oleh ML:

 (expec=dpois(0:10,lambda=mean(y))*length(y))
 [1]  0.7907054  3.8270142  9.2613743 14.9416838 18.0794374 17.5008954 14.1173890  9.7611661
 [9]  5.9055055  3.1758496  1.5371112

3: perhatikan bahwa kategori akhirnya kecil; ini membuat distribusi chi-square kurang baik sebagai perkiraan untuk distribusi statistik uji (aturan umum adalah Anda ingin nilai yang diharapkan minimal 5, meskipun banyak makalah telah menunjukkan bahwa aturan menjadi membatasi tidak perlu; saya akan mengambilnya dekat, tetapi pendekatan umum dapat disesuaikan dengan aturan yang lebih ketat). Perkecil kategori yang berdekatan, sehingga nilai minimum yang diharapkan setidaknya tidak terlalu jauh di bawah 5 (satu kategori dengan penghitungan mundur mendekati 1 dari lebih dari 10 kategori tidak terlalu buruk, dua merupakan batas yang cantik). Perhatikan juga bahwa kami belum memperhitungkan probabilitas di luar "10", jadi kami juga perlu memasukkan itu:

expec[1]=sum(expec[1:2])
expec[2:8]=expec[3:9]
expec[9]=length(y)-sum(expec[1:8])
expec=expec[1:9]
expec
sum(expec) # now adds to n

4: demikian pula, runtuh kategori pada yang diamati:

(obs=table(y))
obs[1]=sum(obs[1:2])
obs[2:8]=obs[3:9]
obs[9]=sum(obs[10:11])
obs=obs[1:9]

(HAIsaya-Esaya)2/Esaya

print(cbind(obs,expec,PearsonRes=(obs-expec)/sqrt(expec),ContribToChisq=(obs-expec)^2/expec),d=4)
  obs  expec PearsonRes ContribToChisq
0   3  4.618   -0.75282      0.5667335
1   7  9.261   -0.74308      0.5521657
2  15 14.942    0.01509      0.0002276
3  19 18.079    0.21650      0.0468729
4  25 17.501    1.79258      3.2133538
5  14 14.117   -0.03124      0.0009761
6   7  9.761   -0.88377      0.7810581
7   5  5.906   -0.37262      0.1388434
8   5  5.815   -0.33791      0.1141816

X2=saya(Esaya-HAIsaya)2/Esaya

(chisq = sum((obs-expec)^2/expec))
[1] 5.414413
(df = length(obs)-1-1) # lose an additional df for parameter estimate
[1] 7
(pvalue=pchisq(chisq,df))
[1] 0.3904736

Baik diagnostik dan nilai-p menunjukkan tidak ada kekurangan di sini ... yang kami harapkan, karena data yang kami hasilkan sebenarnya adalah Poisson.


Sunting: inilah tautan ke blog Rick Wicklin yang membahas plot Poissonness, dan berbicara tentang implementasi dalam SAS dan Matlab

http://blogs.sas.com/content/iml/2012/04/12/the-poissonness-plot-a-goodness-of-fit-diagnostic/


Sunting2: Jika saya benar, plot Poissonness yang dimodifikasi dari referensi 1985 adalah *:

y=rpois(100,5)
n=length(y)
(x=table(y))
k=as.numeric(names(x))
x=as.vector(x)
x1 = ifelse(x==0,NA,ifelse(x>1,x-.8*x/n-.67,exp(-1)))
plot(k,log(x1)+lfactorial(k))

* Mereka benar-benar menyesuaikan intersep juga, tapi saya belum melakukannya di sini; itu tidak mempengaruhi penampilan plot, tetapi Anda harus berhati-hati jika Anda menerapkan hal lain dari referensi (seperti interval kepercayaan) jika Anda melakukannya sama sekali berbeda dari pendekatan mereka.

(Untuk contoh di atas, penampilan hampir tidak berubah dari plot Poissonness pertama.)

Glen_b -Reinstate Monica
sumber
2
Terima kasih atas balasan Anda! Tetapi saya harus mengatakan bahwa saya tidak tahu topik apa pun yang Anda bicarakan. Saya bertanya-tanya apakah QQplot akan menjadi segelintir untuk ini. Apa yang kamu pikirkan? Dari alternatif yang Anda berikan, menurut Anda mana yang harus saya gunakan? kebaikan cocok? Di mana saya dapat menemukan informasi dan / atau tes yang sedang Anda bicarakan? (dari Tes Lancar untuk kesalehan cocok) Juga, apakah Anda tahu jika seseorang memiliki kode R untuk kode blog? (Saya tidak tahu Matlab atau SAS). Dan, terima kasih banyak atas jawaban Anda!
Shariff
Juga, sebaran mana menurut Anda bahwa data saya dapat "cocok"? (bukan bagian dari pekerjaan rumah saya, tetapi akan menyenangkan untuk mengetahui :))
Shariff
Bagaimana Anda menghasilkan QQplot untuk Poisson tanpa mengasumsikan parameternya? (Saya kira Anda mungkin bekerja dengan transformasi Poisson jika parameternya tidak terlalu kecil. Atau Anda bisa menggunakan MLE untuk parameter yang tidak diketahui, tetapi kemudian plotnya cenderung terlihat "lebih baik" daripada yang seharusnya - Anda perlu menyesuaikan penghakiman ketika Anda melakukan itu). Plot Poissonness dimaksudkan untuk bertindak seperti QQplot dan dimaksudkan untuk ditafsirkan dengan cara yang hampir sama. Jika Anda menginginkan penilaian diagnostik, saya sarankan plot itu (lebih disukai dengan penyesuaian yang disebutkan jika salah satu dari kami dapat menemukannya).
Glen_b -Reinstate Monica
Saya tidak bisa mengatakan data distribusi apa yang belum pernah saya lihat mungkin cocok - tetapi kecuali ada banyak, mungkin banyak distribusi yang menghasilkan data secara masuk akal.
Glen_b -Reinstate Monica
baik, mungkin saya bisa menggunakan lambda yang diperkirakan dari nilai yang diamati untuk data untuk QQplot tetapi saya membaca sedikit dan sepertinya QQplots lebih baik untuk data kontinu (tidak begitu baik untuk data diskrit). Bisakah Anda menerjemahkan kodenya? Itu akan sangat dihargai! Beri tahu saya jika Anda memiliki kode! (Saya akan memberi Anda kredit untuk kode itu, tentu saja :))
Shariff
5

Lakukan uji kelayakan chi-squared. Dalam hal data jumlah, kita dapat menggunakan yang goodfit()termasuk dalam paket vcd. Perhatikan bahwa jika nilai p lebih besar dari 0,05, kita tidak dapat menolak h0: prosesnya adalah proses Poisson. Atau yang lain, itu bukan proses Poisson.

# load the vcd package
library(vcd) ## loading vcd package

# generate two processes for test
set.seed(2014);y=rpois(200,5)
set.seed(2014);y=rnorm(100, 5, 0.3) # goodfit asks for non-negative values
# output the results
gf = goodfit(y,type= "poisson",method= "ML")
plot(gf,main="Count data vs Poisson distribution")
summary(gf)

# to automatically get the pvalue
gf.summary = capture.output(summary(gf))[[5]]
pvalue = unlist(strsplit(gf.summary, split = " "))
pvalue = as.numeric(pvalue[length(pvalue)]); pvalue

# to mannualy compute the pvalue
chisq = sum(  (gf$observed-gf$fitted)^2/gf$fitted )

df = length(gf$observed)-1-1
pvalue = pchisq(chisq,df)
pvalue
Frank Wang
sumber
3
pchisqP(Xx)P(Xx)pvalue=1-pchisq(chisq,df)