¿Cómo estimar el proceso de Poisson usando R? (O: ¿cómo usar el paquete NHPoisson?)

15

Tengo una base de datos de eventos (es decir, una variable de fechas) y covariables asociadas.

Los eventos son generados por el proceso no estacionario de Poisson con parámetros que son una función desconocida (pero posiblemente lineal) de algunas covariables.

Creo que el paquete NHPoisson existe solo para este propósito; pero después de 15 horas de investigación sin éxito todavía no estoy cerca de saber cómo usarlo.

Diablos, incluso intenté leer los dos libros de referencia: Coles, S. (2001). Una introducción al modelado estadístico de valores extremos. Saltador. Casella, G. y Berger, RL, (2002). Inferencia estadística. Brooks / Cole.

El único ejemplo en la documentación de fitPP.fun no parece ajustarse a mi configuración; ¡No tengo valores extremos! Solo tengo eventos desnudos.

¿Alguien puede ayudarme con un ejemplo simple de ajustar un proceso de Poisson con el parámetro λ con una sola covariable X y suponer que λ=λ0+αX ? Estoy interesado en la estimación de λ0 y α . Proporciono un conjunto de datos de dos columnas con tiempos de eventos (digamos, medidos en segundos después de un tiempo arbitrario t0 ) y otra columna con valores de la covariable X ?

Adam Ryczkowski
fuente
Para aquellos interesados, estoy trabajando en una reescritura de esta biblioteca para mejorar la usabilidad. github.com/statwonk/NHPoisson
Statwonk

Respuestas:

15

Ajuste de un proceso estacionario de Poisson

En primer lugar, es importante darse cuenta de qué tipo de datos de entrada necesita NHPoisson.

Ante todo, NHPoisson necesita una lista de índices de momentos de eventos. Si registramos el intervalo de tiempo y el número de eventos en el intervalo de tiempo, entonces debemos traducirlo en una sola columna de fechas, posiblemente "difuminando" las fechas durante el intervalo en el que se registran.

Por simplicidad, supondré que usamos el tiempo medido en segundos y que el "segundo" es la unidad natural de .λ

Simulemos datos para un proceso de Poisson simple y estacionario, que tiene eventos por 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))

El simNHP.funhace la simulación. Usamos para obtener aux$posNH, una variable con índices de momentos de disparo de eventos simulados. Podemos ver que aproximadamente tenemos 60 * 24 = 1440 eventos, marcando `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

λ>0 0fitPP

Entonces, de hecho, lo que hacemos es aproximar el proceso de Poisson con una secuencia granular de eventos binomiales, cada evento abarca exactamente una unidad de tiempo, en analogía con el mecanismo en el que la distribución de Poisson puede verse como un límite de distribución binomial en la ley de eventos raros .

Una vez que lo entendemos, el resto es mucho más simple (al menos para mí).

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

Ajuste de un proceso de Poisson no estacionario

NHPoisson Se adapta al siguiente modelo:

λ=Exp(PAGTβ)

PAGλ

Ahora preparemos el proceso de Poisson no estacionario.

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)

Al igual que antes, aux$posNHnos daría índices de eventos, pero esta vez notaremos que la intensidad de los eventos disminuye exponencialmente con el tiempo. Y la tasa de esta disminución es un parámetro que queremos estimar.

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

Es importante tener en cuenta que debemos ponerlo all.secondscomo una covariable, no lambdas. La exponenciación / logaritmización se realiza internamente por el fitPP.fun. Por cierto, aparte de los valores pronosticados, la función crea dos gráficos por defecto.

La última pieza es una función navaja suiza para la validación del modelo globalval.fun.

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

Entre otras cosas, la función divide el tiempo en intervalos, cada lintmuestra es larga, por lo que es posible crear gráficos brutos que comparan la intensidad predicha con la intensidad observada.

Adam Ryczkowski
fuente
Grandes explicaciones Adam, muchas gracias. Tengo la impresión de que no podemos ajustar un modelo con dos grupos de individuos y una intensidad por grupo, ¿estoy en lo cierto?
Stéphane Laurent
@ StéphaneLaurent Puede modelar la pertenencia a grupos como una covariable y, sí, puede agregar covariables. Puede haber diferentes eventos de intensidad para un grupo y diferentes para el otro. Sin embargo, nunca he hecho algo así.
Adam Ryczkowski
λi(t)=exp(ai+bt)bi
Adam, tal vez estaba confundido. Ahora tengo la impresión de que no hay problema. Volveré más tarde en caso de necesidad. Muchas gracias por su atención.
Stéphane Laurent
pagosnorteH,norte=tyometromi.spagunnorte,simitun=0 0)mirroryonorteFyotPAGPAG.Ftunorte(pagosmi=untuX posNH, n = time.span, beta = 0): falta el argumento "inicio", sin valor predeterminado
vak