View source: R/forward_algorithms.R
| forward | R Documentation |
Calculates the log-likelihood of a sequence of observations under a hidden Markov model using the forward algorithm (Zucchini, MacDonald & Langrock, 2016).
forward(
delta,
Gamma,
allprobs,
trackID = NULL,
logspace = FALSE,
bw = NULL,
report = TRUE,
ad = NULL
)
delta |
initial distribution; either
|
Gamma |
transition probability matrix; either
|
allprobs |
matrix of state-dependent probabilities or density values of dimension |
trackID |
optional vector of length |
logspace |
logical; if |
bw |
optional positive integer specifying the bandwidth for a banded approximation of the forward algorithm, inducing a banded Hessian w.r.t. the observations.
Defaults to |
report |
logical; if |
ad |
logical; whether to use automatic differentiation. Determined automatically — for debugging only. |
If trackID is provided, the total log-likelihood is the sum of each track's likelihood
contribution. In this case, Gamma can be
a matrix (same transition probabilities for each track),
an array of dimension c(nStates, nStates, nTracks) (track-specific transition probability matrix), or
an array of dimension c(nStates, nStates, nObs) for time-varying transition probabilities, in which case forward_g is called internally.
Additionally, delta can be a vector (same initial distribution for each track) or a
matrix of dimension c(nTracks, nStates) (track-specific initial distributions).
Note: When there are multiple tracks, for compatibility with downstream functions like viterbi, stateprobs or pseudo_res,
forward should only be called once with a trackID argument.
HMM log-likelihood for given data and parameters
Zucchini, W., MacDonald, I.L., & Langrock, R. (2016). Hidden Markov Models for Time Series: An Introduction Using R (2nd ed.). Chapman & Hall/CRC.
Mews, Koslik, & Langrock (2025). How to build your latent Markov model: The role of time and space. Statistical Modelling, 25(6), 481–507.
Other forward algorithms:
forward_g(),
forward_hsmm(),
forward_ihsmm(),
forward_p(),
forward_phsmm()
## negative log likelihood function
nll = function(par, step) {
# parameter transformations for unconstrained optimisation
Gamma = tpm(par[1:2]) # multinomial logit link
delta = stationary(Gamma) # stationary HMM
mu = exp(par[3:4])
sigma = exp(par[5:6])
# calculate all state-dependent probabilities
allprobs = matrix(1, length(step), 2)
ind = which(!is.na(step))
for(j in 1:2) allprobs[ind,j] = dgamma2(step[ind], mu[j], sigma[j])
# simple forward algorithm to calculate log-likelihood
-forward(delta, Gamma, allprobs)
}
## fitting an HMM to the trex data
par = c(-2,-2, # initial tpm params (logit-scale)
log(c(0.3, 2.5)), # initial means for step length (log-transformed)
log(c(0.2, 1.5))) # initial sds for step length (log-transformed)
mod = nlm(nll, par, step = trex$step[1:1000])
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.