Як оцінити процес Пуассона за допомогою R? (Або: як використовувати пакет NHPoisson?)


15

У мене є база даних про події (тобто змінна дата) та пов'язані з ними коріаріати.

Події породжуються нестаціонарним процесом Пуассона, параметр якого є невідомою (але можливо лінійною) функцією деяких коваріатів.

Я думаю, що пакет NHPoisson існує саме для цієї мети; але після 15 годин невдалого дослідження я ще ніде не знаю, як ним користуватися.

Чорт забираю, я навіть спробував прочитати обидва посилання на книги: Coles, S. (2001). Вступ до статистичного моделювання екстремальних значень. Спрингер. Casella, G. and Berger, RL, (2002). Статистичний висновок. Брукс / Коул.

Один єдиний приклад в документації на fitPP.fun, схоже, не відповідає моїй настройці; У мене немає екстремальних значень! У мене просто голі події.

Чи можете мені хто-небудь допомогти простим прикладом встановлення процесу Пуассона з параметром з одним коваріатом X та припущенням, що λ = λ 0 + αλХ ? Мене цікавить оцінка λ 0 і α . Я надаю набір даних із двох стовпців із часом подій (скажімо, вимірюється в секундах через деякий довільний час t 0 ) та інший стовпець зі значеннями коваріату X ?λ=λ0+αХλ0αт0Х


Для тих, хто цікавиться, я працюю над переписанням цієї бібліотеки для підвищення зручності використання. github.com/statwonk/NHPoisson
Statwonk

Відповіді:


15

Встановлення стаціонарного процесу Пуассона

Перш за все важливо усвідомити, який тип вхідних даних потрібен NHPoisson.

Найперше, NHPoisson потребує переліку показників моментів події. Якщо ми записуємо проміжок часу та кількість подій у часовий інтервал, то я повинен перевести це в єдиний стовпчик дат, можливо, "змазуючи" дати через інтервал, на який вони записуються.

λ

λ=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))

simNHP.funРобить моделювання. Ми використовуємо для отримання aux$posNHзмінну з показниками моментів імітації стрільби подій. Ми бачимо, що приблизно у нас є 60 * 24 = 1440 подій, перевіривши `length (aux $ posNH).

λ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

Оскільки функція приймає лише індекси подій, вона також потребує вимірювання кількості можливих індексів. І це дуже заплутана частина , тому що в процесі справжнього Пуассона можна мати нескінченну кількість можливих подій (якщо тількиλ>0fitPP

Тож, що ми робимо насправді, це те, що ми наближаємо процес Пуассона гранульованою послідовністю біноміальних подій, кожна подія охоплює рівно одну одиницю часу, аналогічно механізму, в якому розподіл Пуассона в законі може розглядатися як межа біноміального розподілу рідкісних подій .

Як тільки ми це зрозуміємо, решта набагато простіше (принаймні, для мене).

λbetaexp(coef(out)[1])NHPoissonλλ

Встановлення нестаціонарного процесу Пуассона

NHPoisson відповідає такій моделі:

λ=досвід(ПТβ)

Пλ

Тепер давайте підготуємо нестаціонарний процес Пуассона.

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)

Як і раніше, aux$posNHце дало б нам індекси подій, але цього разу ми помітимо, що інтенсивність подій з часом зменшується експоненціально. І швидкість цього зменшення - це параметр, який ми хочемо оцінити.

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

Важливо зазначити, що нас потрібно ставити all.secondsяк коваріат, а не lambdas. Експоненціація / логаритмізація здійснюється внутрішньо fitPP.fun. BTW, окрім передбачених значень, функція складає два графіки за замовчуванням.

Останній фрагмент - функція швейцарського ножа для перевірки моделі, globalval.fun .

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

Крім усього іншого, функція ділить час на інтервали, кожен lintвибірки довгий, тому можна створити неочищені графіки, які порівнюють прогнозовану інтенсивність із спостережуваною інтенсивністю.


Чудові пояснення Адам, дуже дякую. Мені здається, що ми не можемо підходити до моделі з двома групами осіб та однією інтенсивністю на групу, я прав?
Стефан Лоран

@ StéphaneLaurent Ви можете моделювати членство в групі як коваріат, і - так, ви можете додавати коваріати. Інтенсивність подій може бути різною для однієї групи та різною для іншої. Я ніколи нічого подібного не робив.
Адам Річковський

λi(т)=досвід(аi+бт)бi

Адаме, можливо, я розгубився. Зараз я маю враження, що проблем немає. Я повернусь пізніше у разі потреби. Дуже дякую за увагу.
Стефан Лоран

дуже хороша відповідь! btw,> out <-fitPP.fun (posE = auxpосNН,н=тiме.сpан,бета=0)ЕrrоriнfiтПП.fун(pосЕ=аухposNH, n = time.span, beta = 0): аргумент "start" відсутній, без замовчування
vak
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.