Before diving into this vignette, we recommend reading the vignettesIntroductionto LaMa andContinuous-timeHMMs.
LaMa can also be used to fit so-calledMarkov-modulated Poisson processes. These are doublystochastic Poisson point processes where the intensity is directed by anunderlying continuous-time Markov chain. Such processes are useful formodellingarrival times, for example of calls in a callcenter, or patients in the hospital. The main difference compared tocontinuous-time HMMs is the arrival or observationtimes themselvescarry information onthelatent state process. To capture this information,we need to model them explicitely as random-variables.
A homogeneous Poisson process is mainly characterised by the factthat thenumber of arrivals within a fixed timeinterval isPoisson distributed with a mean that isproporional to the length of the interval. Thewaitingtimes between arrivals areexponentiallydistributed. While the latter is not true for non-homogeneousPoisson processes in general, we can interpret a Markov modulatedPoisson process asalternating between homogeneousPoisson processes, i.e. when the unobserved continuous-time Markov chainstays in a particular state for some interval, the associated Poissonrate in that interval is homogeneous and state-specific. To learn moreabout Poisson processes, seeDobrow (2016).
We choose to have a considerably higher rate and shorter stays of theunderlying Markov chain in state 2, i.e. state 2 isbursty.
set.seed(123)k=200# number of state switchestrans_times= s=rep(NA, k)# time points where the chain transitionss[1]=sample(1:2,1)# initial distribuion c(0.5, 0.5)# exponentially distributed waiting timestrans_times[1]=rexp(1,-Q[s[1],s[1]])# in a fixed interval, the number of arrivals is Pois(lambda * interval_length)n_arrivals=rpois(1, lambda[s[1]]*trans_times[1])# arrival times within fixed interval are uniformly distributedarrival_times=runif(n_arrivals,0, trans_times[1])for(tin2:k){ s[t]=c(1,2)[-s[t-1]]# for 2-states, always a state swith when transitioning# exponentially distributed waiting times trans_times[t]= trans_times[t-1]+rexp(1,-Q[s[t], s[t]])# in a fixed interval, the number of arrivals is Pois(lambda * interval_length) n_arrivals=rpois(1, lambda[s[t]]*(trans_times[t]-trans_times[t-1]))# arrival times within fixed interval are uniformly distributed arrival_times=c(arrival_times,runif(n_arrivals, trans_times[t-1], trans_times[t]))}arrival_times=sort(arrival_times)Let’s visualise the simulated MMPP
n=length(arrival_times)color=c("orange","deepskyblue")plot(arrival_times[1:100],rep(0.5,100),type ="h",bty ="n",ylim =c(0,1),yaxt ="n",xlab ="arrival times",ylab ="")segments(x0 =c(0,trans_times[1:98]),x1 = trans_times[1:99],y0 =rep(0,100),y1 =rep(0,100),col = color[s[1:99]],lwd =4)legend("top",lwd =2,col = color,legend =c("state 1","state 2"),box.lwd =0)What makes the MMPP special compared to a regular Poisson point processis itsburstiness when the Markov chain is in thesecond state.
The likelihood of a stationary MMPP for waiting times\(x_1, \dots, x_n\) is (Meier-Hellstern (1987),Langrock, Borchers, and Skaug (2013))\[L(\theta) = \pi \Bigl(\prod_{i=1}^n\exp\bigl((Q-\Lambda)x_i\bigr)\Lambda \Bigr)1,\] where\(Q\) is the generatormatrix of the continuous-time Markov chain,\(\Lambda\) is a diagonal matrix ofstate-dependent Poisson intensities,\(\pi\) is the stationary distribution of thecontinuous-time Markov chain, and\(1\)is a column vector of ones. For more details on continuous-time Markovchains, see the vignettecontinuous-time HMMs or alsoDobrow (2016).
We can easily calculate the log of the above expression using thestandard implementation of the general forward algorithmforward_g() when choosing the first matrix ofstate-dependent densities to be the identity (i.e.) the first row of theallprobs matrix to be one and all other matrices ofstate-dependent density matrices to be\(\Lambda\).
nll=function(par, timediff, N){ lambda=exp(par[1:N])# state specific rates Q=generator(par[N+1:(N*(N-1))]) Pi=stationary_cont(Q) Qube=tpm_cont(Q-diag(lambda), timediff)# exp((Q-Lambda) * dt) allprobs=matrix(lambda,nrow =length(timediff+1),ncol = N,byrow = T) allprobs[1,]=1-forward_g(Pi, Qube, allprobs)}Such processes can also carry additional information, so calledmarks, at every arrival time when we also observe therealisation of a different random variable that only depends on theunderlying states of the continuous-time Markov chain. For example forpatient arrivals in the hospital we could observe a biomarker at everyarrival time.Information on theunderlyinghealth status is then present in both thearrivaltimes (because sick patients visit more often) and thebiomarkers.
# state-dependent rateslambda=c(1,5,20)# generator matrix of the underlying Markov chainQ=matrix(c(-0.5,0.3,0.2,0.7,-1,0.3,1,1,-2),nrow =3,byrow =TRUE)# parmeters for distributions of state-dependent marks# (here normally distributed)mu=c(-5,0,5)sigma=c(2,1,2)color=c("orange","deepskyblue","seagreen2")curve(dnorm(x,0,1),xlim =c(-10,10),bty ="n",lwd =2,col = color[2],n =200,ylab ="density",xlab ="mark")curve(dnorm(x,-5,2),add =TRUE,lwd =2,col = color[1],n =200)curve(dnorm(x,5,2),add =TRUE,lwd =2,col = color[3],n =200)We now show how to simulate an MMMPP and additionally how togeneralise to more than two hidden states.
set.seed(123)k=200# number of state switchestrans_times= s=rep(NA, k)# time points where the chain transitionss[1]=sample(1:3,1)# initial distribuion uniformly# exponentially distributed waiting timestrans_times[1]=rexp(1,-Q[s[1],s[1]])# in a fixed interval, the number of arrivals is Pois(lambda * interval_length)n_arrivals=rpois(1, lambda[s[1]]*trans_times[1])# arrival times within fixed interval are uniformly distributedarrival_times=runif(n_arrivals,0, trans_times[1])# marks are iid in interval, given underlying statemarks=rnorm(n_arrivals, mu[s[1]], sigma[s[1]])for(tin2:k){# off-diagonal elements of the s[t-1] row of Q divided by the diagonal element# give the probabilites of the next state s[t]=sample(c(1:3)[-s[t-1]],1,prob = Q[s[t-1],-s[t-1]]/-Q[s[t-1],s[t-1]])# exponentially distributed waiting times trans_times[t]= trans_times[t-1]+rexp(1,-Q[s[t],s[t]])# in a fixed interval, the number of arrivals is Pois(lambda * interval_length) n_arrivals=rpois(1, lambda[s[t]]*(trans_times[t]-trans_times[t-1]))# arrival times within fixed interval are uniformly distributed arrival_times=c(arrival_times,runif(n_arrivals, trans_times[t-1], trans_times[t]))# marks are iid in interval, given underlying state marks=c(marks,rnorm(n_arrivals, mu[s[t]], sigma[s[t]]))}arrival_times=sort(arrival_times)Let’s visualise the simulated MMMPP
n=length(arrival_times)plot(arrival_times[1:100], marks[1:100],pch =16,bty ="n",ylim =c(-9,9),xlab ="arrival times",ylab ="marks")segments(x0 =c(0,trans_times[1:98]),x1 = trans_times[1:99],y0 =rep(-9,100),y1 =rep(-9,100),col = color[s[1:99]],lwd =4)legend("topright",lwd =2,col = color,legend =c("state 1","state 2","state 3"),box.lwd =0)The likelihood of a stationary MMMPP for waitingtimes\(x_1, \dots, x_n\) between marks\(y_0, y_1, \dotsc, y_n\) only changesslightly from the MMPP likelihood, as we include the matrix ofstate-specific densities (Lu (2012),Mewset al. (2023)):\[L(\theta) = \pi P(y_0) \Bigl(\prod_{i=1}^n \exp\bigl((Q-\Lambda)x_i\bigr)\Lambda P(y_i) \Bigr)1,\] where\(Q\),\(\Lambda\) and\(\pi\) are as above and\(P(y_i)\) is a diagonal matrix withstate-dependent densites for the observation at time\(t_i\). We can again easily calculate thelog of the above expression using the standard implementation of thegeneral forward algorithmforward_g() when firstcalculating theallprobs matrix with state-dependentdensities for the marks (as usual for HMMs) and then multiplying eachrow except the first one element-wise with the state-dependentrates.
nllMark=function(par, y, timediff, N){ lambda=exp(par[1:N])# state specific rates mu= par[N+1:N] sigma=exp(par[2*N+1:N]) Q=generator(par[3*N+1:(N*(N-1))]) Pi=stationary_cont(Q) Qube=tpm_cont(Q-diag(lambda), timediff)# exp((Q-Lambda)*deltat) allprobs=matrix(1,length(y), N)for(jin1:N) allprobs[,j]=dnorm(y, mu[j], sigma[j]) allprobs[-1,]= allprobs[-1,]*matrix(lambda,length(y)-1, N,byrow = T)-forward_g(Pi, Qube, allprobs)}N=3(lambda =exp(mod2$estimate[1:N]))#> [1] 0.9646715 4.8640549 19.5008964(mu = mod2$estimate[N+1:N])#> [1] -5.18540504 -0.09097056 4.80538783(sigma =exp(mod2$estimate[2*N+1:N]))#> [1] 1.7931063 0.9644485 2.0093266(Q =generator(mod2$estimate[3*N+1:(N*(N-1))]))#> S1 S2 S3#> S1 -0.5909289 0.2788642 0.3120648#> S2 0.9258937 -1.1798376 0.2539438#> S3 1.1933694 1.2097185 -2.4030879(Pi =stationary_cont(Q))#> S1 S2 S3#> 0.6296991 0.2609524 0.1093485