Ajustando um processo estacionário de Poisson
Antes de tudo, é importante perceber que tipo de dados de entrada o NHPoisson precisa.
Em primeiro lugar, o NHPoisson precisa de uma lista de índices de momentos do evento. Se registrarmos o intervalo de tempo e o número de eventos no intervalo de tempo, então devemos traduzi-lo em uma única coluna de datas, possivelmente "manchando" as datas no intervalo em que estão gravadas.
Pela simplicidade, assumirei que usamos o tempo medido em segundos e que o "segundo" é a unidade natural de .λ
Vamos simular dados para um processo Poisson simples e estacionário, que possui 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))
O simNHP.fun
faz a simulação. Usamos get aux$posNH
, uma variável com índices de momentos de disparo simulado de eventos. Podemos ver que temos aproximadamente 60 * 24 = 1440 eventos, verificando `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
Então, o que fazemos de fato é que aproximamos o processo de Poisson com uma sequência granular de eventos binomiais, cada evento abrange exatamente uma unidade de tempo, em analogia ao mecanismo pelo qual a distribuição de Poisson pode ser vista como um limite da distribuição binomial na lei de eventos raros .
Uma vez que entendemos, o resto é muito mais simples (pelo menos para mim).
λbeta
exp(coef(out)[1])
NHPoisson
λλ
Ajustando um processo Poisson não estacionário
NHPoisson
se encaixa no seguinte modelo:
λ=exp(P⃗ T⋅β⃗ )
P⃗ λ
Agora vamos preparar o processo Poisson não estacionário.
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)
Assim como antes, aux$posNH
nos daria índices de eventos, mas desta vez perceberemos que a intensidade dos eventos diminui exponencialmente com o tempo. E a taxa dessa diminuição é um 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)
É importante notar que precisamos colocar all.seconds
como covariável, não lambdas
. A exponenciação / logaritmização é feita internamente pelo fitPP.fun
. Aliás, além dos valores previstos, a função cria dois gráficos por padrão.
A última peça é uma função de faca suíça para validação de modelo globalval.fun
,.
aux<-globalval.fun(obFPP=out,lint=2000,
covariates=cbind(all.seconds),typeI='Disjoint',
typeRes='Raw',typeResLV='Raw',resqqplot=FALSE)
Entre outras coisas, a função divide o tempo em intervalos, cada uma das lint
amostras, para que seja possível criar gráficos brutos que comparem a intensidade prevista com a intensidade observada.