Come stimare il processo di Poisson usando R? (Oppure: come utilizzare il pacchetto NHPoisson?)


15

Ho un database di eventi (cioè una variabile di date) e covariate associate.

Gli eventi sono generati dal processo di Poisson non stazionario con il parametro che è una funzione sconosciuta (ma possibilmente lineare) di alcune covariate.

Penso che il pacchetto NHPoisson esista proprio per questo scopo; ma dopo 15 ore di ricerche infruttuose, non riesco ancora a capire come usarlo.

Cavolo, ho anche provato a leggere entrambi i libri di riferimento: Coles, S. (2001). Un'introduzione alla modellistica statistica di valori estremi. Springer. Casella, G. and Berger, RL, (2002). Inferenza statistica. Brooks / Cole.

L'unico esempio nella documentazione di fitPP.fun non sembra adattarsi alla mia configurazione; Non ho valori estremi! Ho solo eventi spogli.

Qualcuno può aiutarmi con un semplice esempio di adattamento di un processo di Poisson con il parametro con singola covariata , e supporre che ? Sono interessato alla stima diλXλ=λ0+αX e α . Fornisco un set di dati a due colonne con i tempi degli eventi (diciamo, misurato in secondi dopo un tempo arbitrario t 0 ) e un'altra colonna con i valori della covariata X ?λ0αt0X


Per chi è interessato, sto lavorando a una riscrittura di questa libreria per migliorare l'usabilità. github.com/statwonk/NHPoisson
Statwonk

Risposte:


15

Montaggio di un processo fisso di Poisson

Innanzitutto è importante capire quale tipo di dati di input necessita di NHPoisson.

Innanzitutto, NHPoisson ha bisogno di un elenco di indici dei momenti dell'evento. Se registriamo l'intervallo di tempo e il numero di eventi nell'intervallo di tempo, allora io dobbiamo tradurlo in una singola colonna di date, possibilmente "imbrattando" le date nell'intervallo in cui sono registrate.

Per semplicità supporrò che usiamo il tempo misurato in secondi e che il "secondo" sia l'unità naturale di .λ

Simuliamo i dati per un semplice processo fisso di Poisson, che ha eventi al minuto:λ=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))

Il simNHP.funrende la simulazione. Usiamo per ottenere aux$posNH, una variabile con indici di momenti di eventi simulati. Possiamo vedere che abbiamo approssimativamente 60 * 24 = 1440 eventi, controllando `lunghezza (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

Quindi, ciò che facciamo è che approssimiamo il processo di Poisson con una sequenza granulare di eventi binomiali, ogni evento copre esattamente un'unità di tempo, in analogia al meccanismo in cui la distribuzione di Poisson può essere vista come un limite di distribuzione binomiale nella legge di eventi rari .

Una volta capito, il resto è molto più semplice (almeno per me).

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

Applicazione di un processo di Poisson non stazionario

NHPoisson si adatta al seguente modello:

λ=exp(PTβ)

Pλ

Ora prepariamo il processo di Poisson non stazionario.

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)

Proprio come prima, aux$posNHci darebbe indici di eventi, ma questa volta noteremo che l'intensità degli eventi diminuisce esponenzialmente con il tempo. E il tasso di questa diminuzione è un parametro che vogliamo stimare.

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

È importante notare che non dobbiamo metterlo all.secondscome una covariata lambdas. L'esponenziazione / logaritmizzazione viene eseguita internamente dal fitPP.fun. A proposito, a parte i valori previsti, la funzione crea due grafici per impostazione predefinita.

L'ultimo pezzo è una funzione swiss-knife per la validazione del modello, globalval.fun.

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

Tra le altre cose, la funzione divide il tempo in intervalli, ciascuno dei quali è lintlungo, quindi è possibile creare grafici grezzi che confrontano l'intensità prevista con l'intensità osservata.


Grandi spiegazioni Adam, grazie mille. Ho l'impressione che non possiamo adattarci a un modello con due gruppi di individui e un'intensità per gruppo, giusto?
Stéphane Laurent,

@ StéphaneLaurent È possibile modellare l'appartenenza al gruppo come covariata e - sì, è possibile aggiungere covariate. Possono esserci intensità di eventi diversi per un gruppo e diversi per l'altro. Non ho mai fatto una cosa del genere, comunque.
Adam Ryczkowski,

λio(t)=exp(un'io+Bt)Bio

Adam, forse ero confuso. Ora ho l'impressione che non ci siano problemi. Tornerò più tardi in caso di necessità. Grazie per la vostra attenzione.
Stéphane Laurent,

poSNH,n=tiome.Spun'n,Betun'=0)ErrorionfiotPP.fun(poSE=un'uXposNH, n = time.span, beta = 0): manca l'argomento "start", senza impostazione predefinita
vak
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.