如何使用R估计泊松过程?(或者:如何使用NHPoisson包?)


15

我有一个事件数据库(即日期变量)和相关的协变量。

这些事件是由非平稳泊松过程生成的,参数是某些协变量的未知(但可能是线性)函数。

我认为NHPoisson软件包仅用于此目的。但是经过15个小时的失败研究,我仍然不知道如何使用它。

哎呀,我什至尝试阅读两本参考书:Coles,S.(2001)。极值统计建模简介。施普林格。Casella,G.和Berger,RL,(2002年)。统计推断。布鲁克斯/科尔。

fitPP.fun文档中的一个示例似乎不适合我的设置;我没有极端的价值观!我只是裸露事件。

有人可以帮我举一个简单的例子,用单个协变量拟合参数的泊松过程,并假设吗?我对和估计很感兴趣。我提供了一个包含事件时间的两列数据集(假设是在任意时间之后以秒为单位测量),而另一列则提供了协变量?的值。λXλ=λ0+αXλ0αt0X


对于那些感兴趣的人,我正在重写该库以提高可用性。github.com/statwonk/NHPoisson
Statwonk

Answers:


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使得模拟。我们使用get aux$posNH,该变量具有模拟事件触发时刻的索引。通过检查`length(aux $ posNH)可以看到大约有60 * 24 = 1440个事件。

现在让我们对进行反向工程:λ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 符合以下模型:

λ=exp(PTβ)

Pλ

现在,让我们准备非平稳的泊松过程。

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。顺便说一句,除预测值外,该功能默认情况下还会制作两个图表。

最后一部分是用于模型验证的瑞士刀函数globalval.fun

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

除其他功能外,该函数将时间分为多个间隔,每个lint采样间隔很长,因此可以创建将预测强度与观察到的强度进行比较的粗略图形。


很好的解释亚当,非常感谢。我的印象是我们无法将模型分为两组,每组一个强度,是吗?
斯特凡·洛朗2014年

@StéphaneLaurent您可以将组成员资格建模为协变量,并且-是的,您可以添加协变量。一个组的事件强度可以不同,而另一组的事件强度可以不同。不过,我从未做过这样的事情。
亚当·里奇科夫斯基

λi(t)=exp(ai+bt)bi

亚当,也许我很困惑。现在,我的印象是没有问题。如有需要,我稍后再回来。非常感谢您的关注。
斯特凡洛朗

posNH,n=time.span,beta=0)ErrorinfitPP.fun(posE=auxposNH,n = time.span,beta = 0):参数“ start”缺失,没有默认值
vak 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.