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.fun
hace 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
λ > 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í).
λbeta
exp(coef(out)[1])
NHPoisson
λλ
Ajuste de un proceso de Poisson no estacionario
NHPoisson
Se adapta al siguiente modelo:
λ = exp( P⃗ T⋅ β⃗ )
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$posNH
nos 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.seconds
como 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 lint
muestra es larga, por lo que es posible crear gráficos brutos que comparan la intensidad predicha con la intensidad observada.