Bagaimana cara memperkirakan proses Poisson menggunakan R? (Atau: bagaimana cara menggunakan paket NHPoisson?)

15

Saya memiliki database peristiwa (yaitu variabel tanggal) dan kovariat terkait.

Peristiwa ini dihasilkan oleh proses Poisson non-stasioner dengan parameter menjadi fungsi yang tidak diketahui (tetapi mungkin linier) dari beberapa kovariat.

Saya pikir paket NHPoisson ada hanya untuk tujuan ini; tetapi setelah 15 jam penelitian yang gagal, saya masih belum tahu cara menggunakannya.

Heck, saya bahkan mencoba membaca kedua buku yang dirujuk: Coles, S. (2001). Pengantar pemodelan statistik nilai ekstrem. Peloncat. Casella, G. dan Berger, RL, (2002). Kesimpulan statistik. Brooks / Cole.

Satu-satunya contoh dalam dokumentasi fitPP.fun tampaknya tidak sesuai dengan pengaturan saya; Saya tidak memiliki nilai ekstrim! Saya hanya punya acara kosong.

Adakah yang bisa membantu saya dengan contoh sederhana pas proses Poisson dengan parameter λ dengan kovariat tunggal X, dan asumsi, bahwa λ=λ0+αX ? Saya tertarik pada estimasi λ0 dan . Saya memberikan kumpulan data dua kolom dengan waktu kejadian (misalkan, diukur dalam detik setelah beberapa waktu sewenang-wenang ) dan kolom lain dengan nilai kovariat ?αt0X

Adam Ryczkowski
sumber
Bagi yang berminat, saya sedang mengerjakan penulisan ulang perpustakaan ini untuk meningkatkan kegunaan. github.com/statwonk/NHPoisson
Statwonk

Jawaban:

15

Pas proses Poisson stasioner

Pertama-tama, penting untuk disadari, seperti apa input data yang dibutuhkan NHPoisson.

Terutama, NHPoisson membutuhkan daftar indeks momen acara. Jika kita mencatat interval waktu dan jumlah peristiwa dalam interval waktu, daripada I kita harus menerjemahkannya ke dalam satu kolom tanggal, mungkin "mengolesi" tanggal selama interval yang direkam.

Untuk kesederhanaan saya akan menganggap, bahwa kita menggunakan waktu yang diukur dalam detik, dan bahwa "kedua" adalah satuan alami .λ

Mari kita mensimulasikan data untuk proses Poisson stasioner sederhana, yang memiliki peristiwa per menit:λ=1

lambda=1/60 #1 event per minute
time.span=60*60*24 #24 hours, with time granularity one second

aux<-simNHP.fun(rep(lambda,time.span))

The simNHP.funmembuat simulasi. Kami menggunakan untuk mendapatkan aux$posNH, variabel dengan indeks saat-saat acara menembakkan simulasi. Kita dapat melihat bahwa kita memiliki sekitar 60 * 24 = 1440 acara, dengan memeriksa `length (aux $ posNH).

Sekarang mari kita rekayasa balik dengan :λfitPP.fun

out<-fitPP.fun(posE=aux$posNH,n=time.span,start=list(b0=0)) # b0=0 is our guess at initial value for optimization, which is internally made with `nlminb` function

Karena fungsi hanya mengambil indeks peristiwa, maka perlu juga mengukur berapa banyak indeks yang mungkin dimungkinkan. Dan ini adalah bagian yang sangat membingungkan , karena dalam proses Poisson yang sebenarnya dimungkinkan untuk memiliki jumlah kejadian yang tak terbatas (jika hanya ). Tetapi dari perspektif kita perlu memilih unit waktu yang cukup kecil. Kami memilihnya sangat kecil, sehingga kami dapat mengasumsikan maksimum satu peristiwa per unit waktu.λ>0fitPP

Jadi apa yang kita lakukan sebenarnya adalah bahwa kita mendekati proses Poisson dengan urutan granular peristiwa binomial, setiap peristiwa berlangsung tepat satu unit waktu, analogi dengan mekanisme di mana distribusi Poisson dapat dilihat sebagai batas distribusi binomial dalam hukum peristiwa langka .

Setelah kami memahaminya, sisanya jauh lebih sederhana (setidaknya untuk saya).

Untuk mendapatkan perkiraan kami saya perlu mengambil eksponen parameter dipasang , . Dan di sini datang sepotong informasi penting, yang hilang di manual : dengan kami cocok dengan logaritma dari λ , tidak λ itu sendiri.λbetaexp(coef(out)[1])NHPoissonλλ

Pas proses Poisson non-stasioner

NHPoisson cocok dengan model berikut:

λ=exp(PTβ)

Pλ

Sekarang mari kita siapkan proses Poisson non-stasioner.

time.span=60*60*24 #24 hours, with time granularity one second
all.seconds<-seq(1,time.span,length.out=time.span)
lambdas=0.05*exp(-0.0001*all.seconds) #we can't model a linear regression with NHPoisson. It must have the form with exp.
aux<-simNHP.fun(lambdas)

Sama seperti sebelumnya, aux$posNHakan memberi kita indeks peristiwa, tetapi kali ini kita akan melihat, bahwa intensitas peristiwa berkurang secara eksponensial dengan waktu. Dan laju penurunan ini adalah parameter yang ingin kami perkirakan.

out<-fitPP.fun(tind=TRUE,covariates=cbind(all.seconds),
        posE=aux$posNH,
        start=list(b0=0,b1=0),modSim=TRUE)

Penting untuk dicatat, bahwa kita perlu menempatkan all.secondssebagai kovariat, bukan lambdas. Eksponensial / logaritisasi dilakukan secara internal oleh fitPP.fun. BTW, terlepas dari nilai yang diprediksi, fungsi membuat dua grafik secara default.

Bagian terakhir adalah fungsi pisau swiss untuk validasi model globalval.fun,.

aux<-globalval.fun(obFPP=out,lint=2000,
        covariates=cbind(all.seconds),typeI='Disjoint',
        typeRes='Raw',typeResLV='Raw',resqqplot=FALSE)

Antara lain, fungsi membagi waktu menjadi interval, masing-masing lintsampel panjang, sehingga dimungkinkan untuk membuat grafik kasar yang membandingkan intensitas yang diprediksi dengan intensitas yang diamati.

Adam Ryczkowski
sumber
Penjelasan bagus Adam, terima kasih banyak. Saya mendapat kesan bahwa kami tidak dapat mencocokkan model dengan dua kelompok individu dan satu intensitas per kelompok, apakah saya benar?
Stéphane Laurent
@ StéphaneLaurent Anda dapat memodelkan keanggotaan grup sebagai kovariat, dan - ya, Anda dapat menambahkan kovariat. Mungkin ada intensitas acara yang berbeda untuk satu kelompok dan berbeda untuk yang lain. Tapi aku belum pernah melakukan hal seperti itu.
Adam Ryczkowski
λi(t)=exp(ai+bt)bi
Adam, mungkin aku bingung. Sekarang saya di bawah kesan tidak ada masalah. Saya akan kembali lagi nanti jika diperlukan. Terima kasih banyak atas perhatiannya.
Stéphane Laurent
posNH,n=time.span,beta=0)ErrorinfitPP.fun(posE=auxposNH, n = time.span, beta = 0): argumen "start" tidak ada, tanpa default
vak