Title: | Fit Hidden Markov Models using Template Model Builder |
---|---|
Description: | Fitting hidden Markov models using automatic differentiation and Laplace approximation, allowing for fast inference and flexible covariate effects (including random effects and smoothing splines) on model parameters. The package is described by Michelot (2022) <arXiv:2211.14139>. |
Authors: | Theo Michelot [aut, cre], Richard Glennie [aut, ctb] |
Maintainer: | Theo Michelot <[email protected]> |
License: | GPL-3 |
Version: | 1.0.2 |
Built: | 2024-11-14 23:29:58 UTC |
Source: | https://github.com/theomichelot/hmmtmb |
Read formula with as.character without splitting
as_character_formula(x, ...)
as_character_formula(x, ...)
x |
R formula |
... |
Unused |
Citation: this function was taken from the R package formula.tools: Christopher Brown (2018). formula.tools: Programmatic Utilities for Manipulating Formulas, Expressions, Calls, Assignments and Other R Objects. R package version 1.7.1. https://CRAN.R-project.org/package=formula.tools
Transforms matrix to dgTMatrix
as_sparse(x)
as_sparse(x)
x |
Matrix or vector. If this is a vector, it is formatted into a single-column matrix. |
Sparse matrix of class dgTMatrix
This version of bdiag checks whether the matrices passed as arguments are NULL. This avoids errors that would arise if using bdiag directly.
bdiag_check(...)
bdiag_check(...)
... |
Matrix or list of matrices (only the first argument is used) |
Block diagonal matrix
Grid of covariates
cov_grid(var, data = NULL, obj = NULL, covs = NULL, formulas, n_grid = 1000)
cov_grid(var, data = NULL, obj = NULL, covs = NULL, formulas, n_grid = 1000)
var |
Name of variable |
data |
Data frame containing the covariates. If not provided, data are extracted from obj |
obj |
HMM model object containing data and formulas |
covs |
Optional named list for values of covariates (other than 'var') that should be used in the plot (or dataframe with single row). If this is not specified, the mean value is used for numeric variables, and the first level for factor variables. |
formulas |
List of formulas used in the model |
n_grid |
Grid size (number of points). Default: 1000. |
Data frame of covariates, with 'var' defined over a grid, and other covariates fixed to their mean (numeric) or first level (factor).
Contains the probability density/mass function, and the link and inverse link functions for a probability distribution.
new()
Create a Dist object
Dist$new( name, pdf, rng, cdf = NULL, link, invlink, npar, parnames, parapprox = NULL, fixed = NULL, name_long = name, par_alt = NULL )
name
Name of distribution
pdf
Probability density/mass function of the distribution
(e.g. dnorm
for normal distribution).
rng
Random generator function of the distribution (e.g.
rnorm
for normal distribution).
cdf
Cumulative distribution function of the distribution
(e.g., pnorm
for normal distribution). This is used to compute
pseudo-residuals.
link
Named list of link functions for distribution parameters
invlink
Named list of inverse link functions for distribution parameters
npar
Number of parameters of the distribution
parnames
Character vector with name of each parameter
parapprox
Function that takes a sample and produces approximate values for the unknown parameters
fixed
Vector with element for each parameter which is TRUE if parameter is fixed
name_long
Long version of the name of the distribution, possibly more user-readable than name.
par_alt
Function that takes a vector of the distribution parameters as input and returns them in a different format. Only relevant for some distributions (e.g., MVN, where the SDs and correlations can be reformatted into a covariance matrix)
A new Dist object
name()
Return name of Dist object
Dist$name()
pdf()
Return pdf of Dist object
Dist$pdf()
cdf()
Return cdf of Dist object
Dist$cdf()
rng()
Return random generator function of Dist object
Dist$rng()
link()
Return link function of Dist object
Dist$link()
invlink()
Return inverse link function of Dist object
Dist$invlink()
npar()
Return number of parameters of Dist object
Dist$npar()
parnames()
Return names of parameters
Dist$parnames()
parapprox()
Return function that approximates parameters
Dist$parapprox()
fixed()
Return which parameters are fixed
Dist$fixed()
code()
Return code of Dist object
Dist$code()
name_long()
Human-readable name of Dist object
Dist$name_long()
set_npar()
Set number of parameters this distribution has
Dist$set_npar(new_npar)
new_npar
Number of parameters
set_parnames()
Set parameter names
Dist$set_parnames(new_parnames)
new_parnames
Parameter names
set_code()
Set distribution code
Dist$set_code(new_code)
new_code
Distribution code
pdf_apply()
Evaluate probability density/mass function
This method is used in the Dist$obs_probs() method. It is a wrapper around Dist$pdf(), which prepares the parameters and passes them to the function.
Dist$pdf_apply(x, par, log = FALSE)
x
Value at which the function should be evaluated
par
Vector of parameters. The entries should be named if they are not in the same order as expected by the R function. (E.g. shape/scale rather than shape/rate for gamma distribution.)
log
Logical. If TRUE, the log-density is returned. Default: FALSE.
Probability density/mass function evaluated at x for parameters par
rng_apply()
Random number generator
This method is a wrapper around Dist$rng(), which prepares the parameters and passes them to the function.
Dist$rng_apply(n, par)
n
Number of realisations to generate
par
Vector of parameters. The entries should be named if they are not in the same order as expected by the R function. (E.g. shape/scale rather than shape/rate for gamma distribution.)
Vector of n
realisations of this distribution
par_alt()
Alternative parameter formatting
Dist$par_alt(par)
par
Vector of distribution parameters
Formatted parameters
n2w()
Natural to working parameter transformation
This method transforms parameters from the natural scale (i.e., their domain of definition) to the "working" or "linear predictor" scale (i.e., the real line). It is a wrapper for Dist$link().
Dist$n2w(par)
par
List of parameters
Vector of parameters on the working scale
w2n()
Working to natural parameter transformation
This method transforms parameters from the "working" or "linear predictor" scale (i.e., the real line) to the natural scale (i.e., their domain of definition). It is a wrapper for Dist$invlink().
Dist$w2n(wpar, as_matrix = FALSE)
wpar
Vector of working parameters
as_matrix
Logical. If TRUE, the natural parameters are returned as a matrix with one row for each state and one column for each parameter. If FALSE, the natural parameters are returned as a list (default).
List or matrix of parameters on natural scale
clone()
The objects of this class are cloneable with this method.
Dist$clone(deep = FALSE)
deep
Whether to make a deep clone.
This function is used to identify the variables "x" which are included as s(x, bs = "re") in the formula, in particular to check that they are factors.
find_re(form)
find_re(form)
form |
Model formula |
Vector of names of variables for which a random effect term is included in the model.
Generalized determinant = product of non-zero eigenvalues (see e.g., Wood 2017). Used for (log)determinant of penalty matrices, required in log-likelihood function.
gdeterminant(x, eps = 1e-10, log = TRUE)
gdeterminant(x, eps = 1e-10, log = TRUE)
x |
Numeric matrix |
eps |
Threshold below which eigenvalues are ignored (default: 1e-10) |
log |
Logical: should the log-determinant be returned? |
Generalized determinant of input matrix
Encapsulates the observation and hidden state models for a hidden Markov model.
new()
Create new HMM object
HMM$new(obs = NULL, hid = NULL, file = NULL, init = NULL, fixpar = NULL)
obs
Observation object, created with Observation$new()
.
This contains the formulation for the observation model.
hid
MarkovChain object, created with MarkovChain$new()
.
This contains the formulation for the state process model.
file
Path to specification file for HMM. If this argument is
used, then obs
and hid
are unnecessary.
init
HMM object, used to initialise the parameters for this model.
If init
is passed, then all parameters that are included in init
and in the present model are copied. This may be useful when fitting
increasingly complex models: start from a simple model, then pass it as
init to create a more complex model, and so on.
fixpar
Named list, with optional elements: 'hid', 'obs', 'delta0',
'lambda_obs', and 'lambda_hid'. Each element is a named vector of
parameters in coeff_fe that should either be fixed (if the corresponding
element is set to NA) or estimated to a common value (using integers or
factor levels).don See examples in the vignettes, and check the TMB
documentation to understand the inner workings (argument map
of TMB::MakeADFun()
).
A new HMM object
# Load data set (included with R) data(nottem) data <- data.frame(temp = as.vector(t(nottem))) # Create hidden state and observation models hid <- MarkovChain$new(data = data, n_states = 2) par0 <- list(temp = list(mean = c(40, 60), sd = c(5, 5))) obs <- Observation$new(data = data, n_states = 2, dists = list(temp = "norm"), par = par0) # Create HMM hmm <- HMM$new(hid = hid, obs = obs)
obs()
Observation object for this model
HMM$obs()
hid()
MarkovChain object for this model
HMM$hid()
out()
Output of optimiser after model fitting
HMM$out()
tmb_obj()
Model object created by TMB. This is the output of
the TMB function MakeADFun
, and it is a list including elements
fn
Objective function
gr
Gradient function of fn
par
Vector of initial parameters on working scale
HMM$tmb_obj()
tmb_obj_joint()
Model object created by TMB for the joint likelihood of
the fixed and random effects. This is the output of the TMB function
MakeADFun
, and it is a list including elements
fn
Objective function
gr
Gradient function of fn
par
Vector of initial parameters on working scale
HMM$tmb_obj_joint()
tmb_rep()
Output of the TMB function sdreport
, which includes
estimates and standard errors for all model parameters.
HMM$tmb_rep()
states()
Vector of estimated states, after viterbi
has
been run
HMM$states()
coeff_fe()
Coefficients for fixed effect parameters
HMM$coeff_fe()
coeff_re()
Coefficients for random effect parameters
HMM$coeff_re()
coeff_list()
List of all model coefficients
These are the parameters estimated by the model, including fixed and random effect parameters for the observation parameters and the transition probabilities, (transformed) initial probabilities, and smoothness parameters.
HMM$coeff_list()
fixpar()
Fixed parameters
HMM$fixpar(all = FALSE)
all
Logical. If FALSE, only user-specified fixed parameters are returned, but not parameters that are fixed by definition (e.g., size of binomial distribution).
coeff_array()
Array of working parameters
HMM$coeff_array()
lambda()
Smoothness parameters
HMM$lambda()
update_par()
Update parameters stored inside model object
HMM$update_par(par_list = NULL, iter = NULL)
par_list
List with elements for coeff_fe_obs, coeff_fe_hid, coeff_re_obs, coeff_re_hid, log_delta0, log_lambda_hid, and log_lambda_obs
iter
Optional argument to update model parameters based on MCMC iterations (if using rstan). Either the index of the iteration to use, or "mean" if the posterior mean should be used.
sd_re()
Standard deviation of smooth terms (or random effects)
This function transforms the smoothness parameter of each smooth term into a standard deviation, given by SD = 1/sqrt(lambda). It is particularly helpful to get the standard deviations of independent normal random effects.
HMM$sd_re()
List of standard deviations for observation model and hidden state model.
par()
Model parameters
HMM$par(t = 1)
t
returns parameters at time t, default is t = 1
A list with elements:
obspar
Parameters of observation model
tpm
Transition probability matrix of hidden state model
set_priors()
Set priors for coefficients
HMM$set_priors(new_priors = NULL)
new_priors
is a named list of matrices with optional elements coeff_fe_obs, coeff_fe_hid, log_lambda_obs, andlog_lambda_hid. Each matrix has two columns (first col = mean, second col = sd) specifying parameters for normal priors.
priors()
Extract stored priors
HMM$priors()
iters()
Iterations from stan MCMC fit
HMM$iters(type = "response")
type
Either "response" for parameters on the response (natural) scale, or "raw" for parameters on the linear predictor scale.
see output of as.matrix in stan
out_stan()
fitted stan object from MCMC fit
HMM$out_stan()
the stanfit object
llk()
Log-likelihood at current parameters
HMM$llk()
Log-likelihood
edf()
Effective degrees of freedom
HMM$edf()
Number of effective degrees of freedom (accounting for flexibility in non-parametric terms implied by smoothing)
suggest_initial()
Suggest initial parameter values
Uses K-means clustering to split the data into naive "states", and estimates observation parameters within each of these states. This is meant to help with selecting initial parameter values before model fitting, but users should still think about the values carefully, and try multiple set of initial parameter values to ensure convergence to the global maximum of the likelihood function.
HMM$suggest_initial()
List of initial parameters
setup()
TMB setup
This creates an attribute tmb_obj
, which can be used to
evaluate the negative log-likelihood function.
HMM$setup(silent = TRUE)
silent
Logical. If TRUE, all tracing outputs are hidden (default).
fit_stan()
Fit model using tmbstan
Consult documentation of the tmbstan package for more information.
After this method has been called, the Stan output can be accessed
using the method out_stan()
. This Stan output can for example
be visualised using functions from the rstan package. The parameters
stored in this HMM object are automatically updated to the mean
posterior estimate, although this can be changed using
update_par()
.
HMM$fit_stan(..., silent = FALSE)
...
Arguments passed to tmbstan
silent
Logical. If FALSE, all tracing outputs are shown (default).
fit()
Model fitting
The negative log-likelihood of the model is minimised using the
function nlminb()
. TMB uses the Laplace approximation to integrate
the random effects out of the likelihood.
After the model has been fitted, the output of nlminb()
can be
accessed using the method out()
. The estimated parameters can
be accessed using the methods par()
(for the HMM parameters,
possibly dependent on covariates), predict()
(for uncertainty
quantification and prediction of the HMM parameters for new covariate
values), coeff_fe()
(for estimated fixed effect coefficients on
the linear predictor scale), and coeff_re()
(for estimated random
effect coefficients on the linear predictor scale).
HMM$fit(silent = FALSE, ...)
silent
Logical. If FALSE, all tracing outputs are shown (default).
...
Other arguments to nlminb which is used to optimise the
likelihood. This currently only supports the additional argument
control
, which is a list of control parameters such as
eval.max
and iter.max
(see ?nlminb
)
# Load data set (included with R) data(nottem) data <- data.frame(temp = as.vector(t(nottem))) # Create hidden state and observation models hid <- MarkovChain$new(data = data, n_states = 2) par0 <- list(temp = list(mean = c(40, 60), sd = c(5, 5))) obs <- Observation$new(data = data, n_states = 2, dists = list(temp = "norm"), par = par0) # Create HMM hmm <- HMM$new(hid = hid, obs = obs) # Fit HMM hmm$fit(silent = TRUE)
mle()
Get maximum likelihood estimates once model fitted
HMM$mle()
list of maximum likelihood estimates as described as input for the function update_par()
forward_backward()
Forward-backward algorithm
The forward probability for time step t and state j
is the joint pdf/pmf of observations up to time t and of being in
state j at time t, p(Z[1], Z[2], ..., Z[t], S[t] = j).
The backward probability for time t and state j is the
conditional pdf/pmf of observations between time t + 1 and n,
given state j at time t, p(Z[t+1], Z[t+2], ..., Z[n] | S[t] = j).
This function returns their logarithm, for use in other methods
state_probs
, and sample_states
.
HMM$forward_backward()
Log-forward and log-backward probabilities
pseudores()
Pseudo-residuals
Compute pseudo-residuals for the fitted model. If the fitted model is the "true" model, the pseudo-residuals follow a standard normal distribution. Deviations from normality suggest lack of fit.
HMM$pseudores()
List (of length the number of variables), where each element is a vector of pseudo-residuals (of length the number of data points)
viterbi()
Viterbi algorithm
HMM$viterbi()
Most likely state sequence
sample_states()
Sample posterior state sequences using forward-filtering backward-sampling
The forward-filtering backward-sampling algorithm returns a sequence of states, similarly to the Viterbi algorithm, but it generates it from the posterior distribution of state sequences, i.e., accounting for uncertainty in the state classification. Multiple generated sequences will therefore generally not be the same.
HMM$sample_states(nsamp = 1, full = FALSE)
nsamp
Number of samples to produce
full
If TRUE and model fit by fit_stan then parameter estimates are sampled from the posterior samples before simulating each sequence
Matrix where each column is a different sample of state sequences, and each row is a time of observation
state_probs()
Compute posterior probability of being in each state
HMM$state_probs()
matrix with a row for each observation and a column for each state
post_coeff()
Posterior sampling for model coefficients
HMM$post_coeff(n_post)
n_post
Number of posterior samples
Matrix with one column for each coefficient and one row for each posterior draw
post_linpred()
Posterior sampling for linear predictor
HMM$post_linpred(n_post)
n_post
Number of posterior samples
List with elements obs and hid, where each is a matrix with one column for each predictor and one row for each posterior draw
post_fn()
Create posterior simulations of a function of a model component
HMM$post_fn(fn, n_post, comp = NULL, ..., level = 0, return_post = FALSE)
fn
Function which takes a vector of linear predictors as input and produces either a scalar or vector output
n_post
Number of posterior simulations
comp
Either "obs" for observation model linear predictor, or "hid" for hidden model linear predictor
...
Arguments passed to fn
level
Confidence interval level if required (e.g., 0.95 for 95 confidence intervals). Default is 0, i.e., confidence intervals are not returned.
return_post
Logical indicating whether to return the posterior samples. If FALSE (default), only mean estimates and confidence intervals are returned
A list with elements:
If return_post = TRUE, this is a vector (for scalar outputs of fn) or matrix (for vector outputs) with a column for each simulation
Mean over posterior samples
Lower confidence interval bound (if level !=0)
Upper confidence interval bound (if level !=0)
predict()
Predict estimates from a fitted model
By default, this returns point estimates of the HMM parameters for a new data frame of covariates. See the argument 'n_post' to also get confidence intervals.
HMM$predict( what, t = 1, newdata = NULL, n_post = 0, level = 0.95, return_post = FALSE, as_list = TRUE )
what
Which estimates to predict? Options include transition probability matrices "tpm", stationary distributions "delta", or observation distribution parameters "obspar"
t
Time points to predict at
newdata
New dataframe to use for prediction
n_post
If greater than zero then n_post posterior samples are produced, and used to create confidence intervals.
level
Level of the confidence intervals, e.g. CI = 0.95 will produce 95% confidence intervals (default)
return_post
Logical. If TRUE, a list of posterior samples is returned.
as_list
Logical. If confidence intervals are required for the
transition probabilities or observation parameters, this
argument determines whether the MLE, lower confidence limit and upper
confidence limit are returned as separate elements in a list (if
TRUE; default), or whether they are combined into a single array (if
FALSE). Ignored if what = "delta"
or if n_post = 0
.
...
Other arguments to the respective functions for hid$tpm, hid$delta, obs$par
Maximum likelihood estimates (mle
) of predictions,
and confidence limits (lcl
and ucl
) if requested. The
format of the output depends on whether confidence intervals are
required (specified through n_post
), and on the argument
as_list
.
# Load data set (included with R) data(nottem) data <- data.frame(temp = as.vector(t(nottem))) # Create hidden state and observation models hid <- MarkovChain$new(data = data, n_states = 2) par0 <- list(temp = list(mean = c(40, 60), sd = c(5, 5))) obs <- Observation$new(data = data, n_states = 2, dists = list(temp = "norm"), par = par0) # Create HMM hmm <- HMM$new(hid = hid, obs = obs) # Fit HMM hmm$fit(silent = TRUE) # Get transition probability matrix with confidence intervals hmm$predict(what = "tpm", n_post = 1000)
confint()
Confidence intervals for working parameters
This function computes standard errors for all fixed effect model parameters based on the diagonal of the inverse of the Hessian matrix, and then derives Wald-type confidence intervals.
HMM$confint(level = 0.95)
level
Level of confidence intervals. Defaults to 0.95, i.e., 95% confidence intervals.
List of matrices with three columns: mle (maximum likelihood estimate), lcl (lower confidence limit), ucl (upper confidence limit), and se (standard error). One such matrix is produced for the working parameters of the observation model, the working parameters of the hidden state model, the smoothness parameters of the observation model, and the smoothness parameters of the hidden state model.
simulate()
Simulate from hidden Markov model
HMM$simulate(n, data = NULL, silent = FALSE)
n
Number of time steps to simulate
data
Optional data frame including covariates
silent
if TRUE then no messages are printed
Data frame including columns of data (if provided), and simulated data variables
check()
Compute goodness-of-fit statistics using simulation
Many time series are simulated from the fitted model, and the statistic(s) of interest are calculated for each. A histogram of those values can for example be used to compare to the observed value of the statistic. An observation far in the tails of the distribution of simulated statistics suggests lack of fit.
HMM$check(check_fn, nsims = 100, full = FALSE, silent = FALSE)
check_fn
Goodness-of-fit function which accepts "data" as input and returns a statistic (either a vector or a single number) to be compared between observed data and simulations.
nsims
Number of simulations to perform
full
If model fitted with 'fit_stan', then full = TRUE will sample from posterior for each simulation
silent
Logical. If FALSE, simulation progress is shown. (Default: TRUE)
List with elements:
Vector of values of goodness-of-fit statistics for the observed data
Matrix of values of goodness-of-fit statistics for the simulated data sets (one row for each statistic, and one column for each simulation)
ggplot object
plot_ts()
Time series plot coloured by states
Creates a plot of the data coloured by the most likely state sequence, as estimated by the Viterbi algorithm. If one variable name is passed as input, it is plotted against time. If two variables are passed, they are plotted against each other.
HMM$plot_ts(var, var2 = NULL, line = TRUE)
var
Name of the variable to plot.
var2
Optional name of a second variable, for 2-d plot.
line
Logical. If TRUE (default), lines are drawn between successive data points. Can be set to FALSE if another geom is needed (e.g., geom_point).
A ggplot object
plot_dist()
Plot observation distributions weighted by frequency in Viterbi
This is a wrapper around Observation$plot_dist, where the distribution for each state is weighted by the proportion of time spent in that state (according to the Viterbi state sequence).
HMM$plot_dist(var = NULL)
var
Name of data variable. If NULL, a list of plots are returned (one for each observation variable)
Plot of distributions with data histogram
plot()
Plot a model component
HMM$plot( what, var = NULL, covs = NULL, i = NULL, j = NULL, n_grid = 50, n_post = 1000 )
what
Name of model component to plot: should be one of "tpm" (transition probabilities), "delta" (stationary state probabilities), or "obspar" (state-dependent observation parameters)
var
Name of covariate to plot on x-axis
covs
Optional named list for values of covariates (other than 'var') that should be used in the plot (or dataframe with single row). If this is not specified, the mean value is used for numeric variables, and the first level for factor variables.
i
If plotting tpm then rows of tpm; if plotting delta then indices of states to plot; if plotting obspar then full names of parameters to plot (e.g., obsvar.mean)
j
If plotting tpm then columnss of tpm to plot; if plotting delta then this is ignored,; if plotting obspar then indices of states to plot
n_grid
Number of points in grid over x-axis (default: 50)
n_post
Number of posterior simulations to use when computing
confidence intervals; default: 1000. See predict
function for
more detail.
A ggplot object
AIC_marginal()
Marginal Akaike Information Criterion
The marginal AIC is for example defined by Wood (2017), as AIC = - 2L + 2k where L is the maximum marginal log-likelihood (of fixed effects), and k is the number of degrees of freedom of the fixed effect component of the model
HMM$AIC_marginal()
Marginal AIC
AIC_conditional()
Conditional Akaike Information Criterion
The conditional AIC is for example defined by Wood (2017), as AIC = - 2L + 2k where L is the maximum joint log-likelihood (of fixed and random effects), and k is the number of effective degrees of freedom of the model (accounting for flexibility in non-parametric terms implied by smoothing)
HMM$AIC_conditional()
Conditional AIC
print_obspar()
Print observation parameters at t = 1
HMM$print_obspar()
print_tpm()
Print observation parameters at t = 1
HMM$print_tpm()
formulation()
Print model formulation
HMM$formulation()
print()
Print HMM object
HMM$print()
clone()
The objects of this class are cloneable with this method.
HMM$clone(deep = FALSE)
deep
Whether to make a deep clone.
## ------------------------------------------------ ## Method `HMM$new` ## ------------------------------------------------ # Load data set (included with R) data(nottem) data <- data.frame(temp = as.vector(t(nottem))) # Create hidden state and observation models hid <- MarkovChain$new(data = data, n_states = 2) par0 <- list(temp = list(mean = c(40, 60), sd = c(5, 5))) obs <- Observation$new(data = data, n_states = 2, dists = list(temp = "norm"), par = par0) # Create HMM hmm <- HMM$new(hid = hid, obs = obs) ## ------------------------------------------------ ## Method `HMM$fit` ## ------------------------------------------------ # Load data set (included with R) data(nottem) data <- data.frame(temp = as.vector(t(nottem))) # Create hidden state and observation models hid <- MarkovChain$new(data = data, n_states = 2) par0 <- list(temp = list(mean = c(40, 60), sd = c(5, 5))) obs <- Observation$new(data = data, n_states = 2, dists = list(temp = "norm"), par = par0) # Create HMM hmm <- HMM$new(hid = hid, obs = obs) # Fit HMM hmm$fit(silent = TRUE) ## ------------------------------------------------ ## Method `HMM$predict` ## ------------------------------------------------ # Load data set (included with R) data(nottem) data <- data.frame(temp = as.vector(t(nottem))) # Create hidden state and observation models hid <- MarkovChain$new(data = data, n_states = 2) par0 <- list(temp = list(mean = c(40, 60), sd = c(5, 5))) obs <- Observation$new(data = data, n_states = 2, dists = list(temp = "norm"), par = par0) # Create HMM hmm <- HMM$new(hid = hid, obs = obs) # Fit HMM hmm$fit(silent = TRUE) # Get transition probability matrix with confidence intervals hmm$predict(what = "tpm", n_post = 1000)
## ------------------------------------------------ ## Method `HMM$new` ## ------------------------------------------------ # Load data set (included with R) data(nottem) data <- data.frame(temp = as.vector(t(nottem))) # Create hidden state and observation models hid <- MarkovChain$new(data = data, n_states = 2) par0 <- list(temp = list(mean = c(40, 60), sd = c(5, 5))) obs <- Observation$new(data = data, n_states = 2, dists = list(temp = "norm"), par = par0) # Create HMM hmm <- HMM$new(hid = hid, obs = obs) ## ------------------------------------------------ ## Method `HMM$fit` ## ------------------------------------------------ # Load data set (included with R) data(nottem) data <- data.frame(temp = as.vector(t(nottem))) # Create hidden state and observation models hid <- MarkovChain$new(data = data, n_states = 2) par0 <- list(temp = list(mean = c(40, 60), sd = c(5, 5))) obs <- Observation$new(data = data, n_states = 2, dists = list(temp = "norm"), par = par0) # Create HMM hmm <- HMM$new(hid = hid, obs = obs) # Fit HMM hmm$fit(silent = TRUE) ## ------------------------------------------------ ## Method `HMM$predict` ## ------------------------------------------------ # Load data set (included with R) data(nottem) data <- data.frame(temp = as.vector(t(nottem))) # Create hidden state and observation models hid <- MarkovChain$new(data = data, n_states = 2) par0 <- list(temp = list(mean = c(40, 60), sd = c(5, 5))) obs <- Observation$new(data = data, n_states = 2, dists = list(temp = "norm"), par = par0) # Create HMM hmm <- HMM$new(hid = hid, obs = obs) # Fit HMM hmm$fit(silent = TRUE) # Get transition probability matrix with confidence intervals hmm$predict(what = "tpm", n_post = 1000)
hmmTMB colour palette
hmmTMB_cols
hmmTMB_cols
An object of class character
of length 6.
Multivarite inverse logit function
invmlogit(x)
invmlogit(x)
x |
Numeric vector |
Check if number of whole number
is_whole_number(x, tol = 1e-10)
is_whole_number(x, tol = 1e-10)
x |
number to check or vector of numbers |
tol |
how far away from whole number is ok? |
TRUE if it is a whole number within tolerance
This function makes it possible to call generic R methods such as AIC and BIC on HMM objects. It is based on the number of degrees of freedom of the *conditional* AIC (rather than marginal AIC), i.e., including degrees of freedom from the smooth/random effect components of the model.
## S3 method for class 'HMM' logLik(object, ...)
## S3 method for class 'HMM' logLik(object, ...)
object |
HMM model object |
... |
For compatibility with S3 method |
Maximum log-likelihood value for the model, with attributes
df
(degrees of freedom) and nobs
(number of observations)
Log of sum of exponentials
logsumexp(x)
logsumexp(x)
x |
Numeric vector |
Process formulas and store in nested list
make_formulas(input_forms, var_names, par_names, n_states)
make_formulas(input_forms, var_names, par_names, n_states)
input_forms |
Nested list of formulas, with two levels: observed variable, and parameter of the observation distribution. The formulas can contain state-specific terms, e.g. "~ state1(x1) + x2". |
var_names |
character vector name of each observation variable |
par_names |
list with element for each observation variable that contains character vector of name of each parameter in its distribution |
n_states |
Number of states |
Formulas for the observation parameters can be different for the different states, using special functions of the form "state1", "state2", etc. This method processes the list of formulas passed by the user to extract the state-specific formulas. Missing formulas are assumed to be intercept-only ~1.
Nested list of formulas, with three levels: observed variable, parameter of the observation distribution, and state.
input_forms <- list(step = list(shape = ~ state1(x1) + x2, scale = ~ x1), count = list(lambda = ~ state1(x1) + state2(s(x2, bs = "cs")))) make_formulas(input_forms = input_forms, var_names = names(input_forms), par_names = lapply(input_forms, names), n_states = 2)
input_forms <- list(step = list(shape = ~ state1(x1) + x2, scale = ~ x1), count = list(lambda = ~ state1(x1) + state2(s(x2, bs = "cs")))) make_formulas(input_forms = input_forms, var_names = names(input_forms), par_names = lapply(input_forms, names), n_states = 2)
Create model matrices
make_matrices(formulas, data, new_data = NULL)
make_matrices(formulas, data, new_data = NULL)
formulas |
List of formulas (possibly nested, e.g. for use within Observation) |
data |
Data frame including covariates |
new_data |
Optional new data set, including covariates for which
the design matrices should be created. This needs to be passed in addition
to the argument ' |
A list of
X_fe Design matrix for fixed effects
X_re Design matrix for random effects
S Smoothness matrix
log_det_S Vector of log-determinants of smoothness matrices
ncol_fe Number of columns of X_fe for each parameter
ncol_re Number of columns of X_re and S for each random effect
Contains the parameters and model formulas for the hidden process model.
new()
Create new MarkovChain object
MarkovChain$new( data = NULL, formula = NULL, n_states, tpm = NULL, initial_state = "estimated", fixpar = NULL, ref = 1:n_states )
data
Data frame, needed to create model matrices, and to identify the number of time series (which each have a separate initial distribution)
formula
Either (1) R formula, used for all transition probabilities,
or (2) matrix of character strings giving the formula for each transition
probability, with "." along the diagonal (or for reference elements; see
ref
argument). (Default: no covariate dependence.)
n_states
Number of states. If not specified, then formula
needs to be provided as a matrix, and n_states is deduced from its dimensions.
tpm
Optional transition probability matrix, to initialise the model parameters (intercepts in model with covariates). If not provided, the default is a matrix with 0.9 on the diagonal.
initial_state
Specify model for initial state distribution. There are five different options:
"estimated": a separate initial distribution is estimated for each ID (default)
"stationary": the initial distribution is fixed to the stationary distribution of the transition probability matrix for the first time point of each ID
"shared": a common initial distribution is estimated for all IDs
integer value between 1 and n_states: used as the known initial state for all IDs
vector of integers between 1 and n_states (of length the number of IDs): each element is used as the known initial state for the corresponding ID
fixpar
List with optional elements "hid" (fixed parameters for transition probabilities), "lambda_hid" (fixed smoothness parameters), and "delta0" (fixed parameters for initial distribution). Each element is a named vector of coefficients that should either be fixed (if the corresponding element is set to NA) or estimated to a common value (using integers or factor levels).
ref
Vector of indices for reference transition probabilities,
of length n_states
. The i-th element is the index for the
reference in the i-th row of the transition probability matrix. For
example, ref = c(1, 1) means that the first element of the first row
Pr(1>1) and the first element of the second row Pr(2>1) are used as
reference elements and are not estimated. If this is not provided,
the diagonal transition probabilities are used as references.
A new MarkovChain object
# Load data set from MSwM package data(energy, package = "MSwM") # Create 2-state covariate-free model and initialise transition # probability matrix hid <- MarkovChain$new(data = energy, n_states = 2, tpm = matrix(c(0.8, 0.3, 0.2, 0.7), 2, 2)) # Create 2-state model with non-linear effect of Oil on all transition # probabilities hid <- MarkovChain$new(data = energy, n_states = 2, formula = ~ s(Oil, k = 5, bs = "cs")) # Create 2-state model with quadratic effect of Oil on Pr(1 > 2) structure <- matrix(c(".", "~poly(Oil, 2)", "~1", "."), ncol = 2, byrow = TRUE) hid <- MarkovChain$new(data = energy, n_states = 2, formula = structure)
formula()
Formula of MarkovChain model
MarkovChain$formula()
formulas()
List of formulas for MarkovChain model
MarkovChain$formulas()
tpm()
Get transition probability matrices
MarkovChain$tpm(t = 1, linpred = NULL)
t
Time index or vector of time indices; default = 1. If t = "all" then all transition probability matrices are returned.
linpred
Optional custom linear predictor
Array with one slice for each transition probability matrix
ref()
Indices of reference elements in transition probability matrix
MarkovChain$ref()
ref_mat()
Matrix of reference elements in transition probability matrix
MarkovChain$ref_mat()
ref_delta0()
Indices of reference elements in initial distribution
MarkovChain$ref_delta0()
coeff_fe()
Current parameter estimates (fixed effects)
MarkovChain$coeff_fe()
delta()
Stationary distribution
MarkovChain$delta(t = NULL, linpred = NULL)
t
Time point(s) for which stationary distribution should be returned. If t = "all", all deltas are returned; else this should be a vector of time indices. If NULL (default), the stationary distribution for the first time step is returned.
linpred
Optional custom linear predictor
Matrix of stationary distributions. Each row corresponds to a row of the design matrices, and each column corresponds to a state.
delta0()
Initial distribution
MarkovChain$delta0(log = FALSE, as_matrix = TRUE)
log
Logical indicating whether to return the log of the initial probabilities (default: FALSE). If TRUE, then the last element is excluded, as it is not estimated.
as_matrix
Logical indicating whether the output should be formatted as a matrix (default). If as_matrix is FALSE and log is TRUE, the result is formatted as a column vector.
Matrix with one row for each time series ID, and one column for each state. For each ID, the i-th element of the corresponding row is the probability Pr(S[1] = i)
stationary()
Use stationary distribution as initial distribution?
MarkovChain$stationary()
fixpar()
Fixed parameters
MarkovChain$fixpar(all = FALSE)
all
Logical. If FALSE, only user-specified fixed parameters are returned, but not parameters that are fixed for some other reason (e.g., from '.' in formula)
coeff_re()
Current parameter estimates (random effects)
MarkovChain$coeff_re()
X_fe()
Fixed effect design matrix
MarkovChain$X_fe()
X_re()
Random effect design matrix
MarkovChain$X_re()
lambda()
Smoothness parameters
MarkovChain$lambda()
sd_re()
Standard deviation of smooth terms
This function transforms the smoothness parameter of each smooth term into a standard deviation, given by SD = 1/sqrt(lambda). It is particularly helpful to get the standard deviations of independent normal random effects.
MarkovChain$sd_re()
nstates()
Number of states
MarkovChain$nstates()
terms()
Terms of model formulas
MarkovChain$terms()
unique_ID()
Number of time series
MarkovChain$unique_ID()
initial_state()
Initial state (see constructor argument)
MarkovChain$initial_state()
empty()
Empty model? (for simulation only)
MarkovChain$empty()
update_tpm()
Update transition probability matrix
MarkovChain$update_tpm(tpm)
tpm
New transition probability matrix
update_coeff_fe()
Update coefficients for fixed effect parameters
MarkovChain$update_coeff_fe(coeff_fe)
coeff_fe
Vector of coefficients for fixed effect parameters
update_coeff_re()
Update coefficients for random effect parameters
MarkovChain$update_coeff_re(coeff_re)
coeff_re
Vector of coefficients for random effect parameters
update_X_fe()
Update design matrix for fixed effects
MarkovChain$update_X_fe(X_fe)
X_fe
new design matrix for fixed effects
update_X_re()
Update design matrix for random effects
MarkovChain$update_X_re(X_re)
X_re
new design matrix for random effects
update_delta0()
Update initial distribution
MarkovChain$update_delta0(delta0)
delta0
Either a matrix where the i-th row is the initial distribution for the i-th time series in the data, or a vector which is then used for all time series. Entries of each row of delta0 should sum to one.
update_lambda()
Update smoothness parameters
MarkovChain$update_lambda(lambda)
lambda
New smoothness parameter vector
update_fixpar()
Update information about fixed parameters
MarkovChain$update_fixpar(fixpar)
fixpar
New list of fixed parameters, in the same format expected by MarkovChain$new()
make_mat()
Make model matrices
MarkovChain$make_mat(data, new_data = NULL)
data
Data frame containing all needed covariates
new_data
Optional new data set, including covariates for which
the design matrices should be created. This needs to be passed in addition
to the argument 'data
', for cases where smooth terms or factor
covariates are included, and the original data set is needed to determine
the full range of covariate values.
A list with elements:
Design matrix for fixed effects
Design matrix for random effects
Smoothness matrix for random effects
Number of columns of X_fe for each parameter
Number of columns of X_re and S for each random effect
make_mat_grid()
Design matrices for grid of covariates
Used in plotting functions such as HMM$plot_tpm and HMM$plot_stat_dist
MarkovChain$make_mat_grid(var, data, covs = NULL, n_grid = 1000)
var
Name of variable
data
Data frame containing the covariates
covs
Optional named list for values of covariates (other than 'var') that should be used in the plot (or dataframe with single row). If this is not specified, the mean value is used for numeric variables, and the first level for factor variables.
n_grid
Grid size (number of points). Default: 1000.
A list with the same elements as the output of make_mat, plus a data frame of covariates values.
tpm2par()
Transform transition probabilities to working scale
Apply the multinomial logit link function to get the corresponding parameters on the working scale (i.e., linear predictor scale).
MarkovChain$tpm2par(tpm)
tpm
Transition probability matrix
Vector of parameters on linear predictor scale
par2tpm()
Transform working parameters to transition probabilities
Apply the inverse multinomial logit link function to transform the parameters on the working scale (i.e., linear predictor scale) into the transition probabilities.
MarkovChain$par2tpm(par)
par
Vector of parameters on working scale
Transition probability matrix
linpred()
Linear predictor for transition probabilities
MarkovChain$linpred()
simulate()
Simulate from Markov chain
MarkovChain$simulate(n, data = NULL, new_data = NULL, silent = FALSE)
n
Number of time steps to simulate
data
Optional data frame containing all needed covariates
new_data
Optional new data set, including covariates for which
the design matrices should be created. This needs to be passed in addition
to the argument 'data
', for cases where smooth terms or factor
covariates are included, and the original data set is needed to determine
the full range of covariate values.
silent
if TRUE then no messages are printed
Sequence of states of simulated chain
formulation()
Print model formulation
MarkovChain$formulation()
print()
Print MarkovChain object
MarkovChain$print()
clone()
The objects of this class are cloneable with this method.
MarkovChain$clone(deep = FALSE)
deep
Whether to make a deep clone.
## ------------------------------------------------ ## Method `MarkovChain$new` ## ------------------------------------------------ # Load data set from MSwM package data(energy, package = "MSwM") # Create 2-state covariate-free model and initialise transition # probability matrix hid <- MarkovChain$new(data = energy, n_states = 2, tpm = matrix(c(0.8, 0.3, 0.2, 0.7), 2, 2)) # Create 2-state model with non-linear effect of Oil on all transition # probabilities hid <- MarkovChain$new(data = energy, n_states = 2, formula = ~ s(Oil, k = 5, bs = "cs")) # Create 2-state model with quadratic effect of Oil on Pr(1 > 2) structure <- matrix(c(".", "~poly(Oil, 2)", "~1", "."), ncol = 2, byrow = TRUE) hid <- MarkovChain$new(data = energy, n_states = 2, formula = structure)
## ------------------------------------------------ ## Method `MarkovChain$new` ## ------------------------------------------------ # Load data set from MSwM package data(energy, package = "MSwM") # Create 2-state covariate-free model and initialise transition # probability matrix hid <- MarkovChain$new(data = energy, n_states = 2, tpm = matrix(c(0.8, 0.3, 0.2, 0.7), 2, 2)) # Create 2-state model with non-linear effect of Oil on all transition # probabilities hid <- MarkovChain$new(data = energy, n_states = 2, formula = ~ s(Oil, k = 5, bs = "cs")) # Create 2-state model with quadratic effect of Oil on Pr(1 > 2) structure <- matrix(c(".", "~poly(Oil, 2)", "~1", "."), ncol = 2, byrow = TRUE) hid <- MarkovChain$new(data = energy, n_states = 2, formula = structure)
Multivariate logit function
mlogit(x)
mlogit(x)
x |
Numeric vector |
Multivariate Normal inverse link function
mvnorm_invlink(x)
mvnorm_invlink(x)
x |
Vector of parameters on linear predictor scale (in the order: means, SDs, correlations) |
Multivariate Normal link function
mvnorm_link(x)
mvnorm_link(x)
x |
Vector of parameters on natural scale (in the order: means, SDs, correlations) |
Replace NA entries in a vector by the last non-NA value. If the first entry of the vector is NA, it is replaced by the first non-NA value. If the vector passed as input doesn't contain NAs, it is returned as is.
na_fill(x)
na_fill(x)
x |
Vector in which NAs should be removed |
Copy of x in which NAs have been replaced by nearest available value.
Contains the data, distributions, parameters, and formulas for the observation model from a hidden Markov model.
new()
Create new Observation object
Observation$new( data = NULL, dists, formulas = NULL, n_states = NULL, par, fixpar = NULL )
data
Data frame containing response variables (named in dists and par) and covariates (named in formulas)
dists
Named list of distribution names for each data stream, with the following options: beta, binom, cat, dir, exp, foldednorm, gamma, gamma2, lnorm, mvnorm, nbinom, norm, pois, t, truncnorm, tweedie, vm, weibull, wrpcauchy, zibinom, zigamma, zigamma2, zinbinom, zipois, zoibeta, ztnbinom, ztpois. See vignette about list of distributions for more details, e.g., list of parameters for each distribution.
formulas
List of formulas for observation parameters. This should be a nested list, where the outer list has one element for each observed variable, and the inner lists have one element for each parameter. Any parameter that is not included is assumed to have the formula ~1. By default, all parameters have the formula ~1 (i.e., no covariate effects).
n_states
Number of states (optional). If not provided, the number
of states is derived from the length of entries of par
.
par
List of initial observation parameters. This should
be a nested list, where the outer list has one element for each
observed variable, and the inner lists have one element for each
parameter. The choice of good initial values can be important, especially
for complex models; the package vignettes discuss approaches to selecting
them (e.g., see Observation$suggest_initial()
).
fixpar
List with optional elements "obs" (fixed coefficients for observation parameters), and "lambda_obs" (fixed smoothness parameters), Each element is a named vector of coefficients that should either be fixed (if the corresponding element is set to NA) or estimated to a common value (using integers or factor levels).
A new Observation object
# Load data set from MSwM package data(energy, package = "MSwM") # Initial observation parameters par0 <- list(Price = list(mean = c(3, 6), sd = c(2, 2))) # Model "energy" with normal distributions obs <- Observation$new(data = energy, dists = list(Price = "norm"), par = par0) # Model "energy" with gamma distributions obs <- Observation$new(data = energy, dists = list(Price = "gamma2"), par = par0) # Model with non-linear effect of EurDol on mean price f <- list(Price = list(mean = ~ s(EurDol, k = 5, bs = "cs"))) obs <- Observation$new(data = energy, dists = list(Price = "norm"), par = par0, formula = f)
data()
Data frame
Observation$data()
dists()
List of distributions
Observation$dists()
nstates()
Number of states
Observation$nstates()
par()
Parameters on natural scale
Observation$par(t = 1, full_names = TRUE, linpred = NULL, as_list = FALSE)
t
Time index or vector of time indices; default t = 1. If t = "all", then return observation parameters for all time points.
full_names
Logical. If TRUE, the rows of the output are named in the format "variable.parameter" (default). If FALSE, the rows are names in the format "parameter". The latter is used in various internal functions, when the parameters need to be passed on to an R function.
linpred
Optional custom linear predictor.
as_list
Logical. If TRUE, the output is a nested list with three levels: (1) time step, (2) observed variable, (3) observation parameter. If FALSE (default), the output is an array with one row for each observation parameter, one column for each state, and one slice for each time step.
Array of parameters with one row for each observation parameter, one column for each state, and one slice for each time step. (See as_list argument for alternative output format.)
# Load data set from MSwM package data(energy, package = "MSwM") # Initial observation parameters par0 <- list(Price = list(mean = c(3, 6), sd = c(2, 2))) # Model with linear effect of EurDol on mean price f <- list(Price = list(mean = ~ EurDol)) obs <- Observation$new(data = energy, dists = list(Price = "norm"), par = par0, n_states = 2, formula = f) # Set slope coefficients obs$update_coeff_fe(coeff_fe = c(3, 2, 6, -2, log(2), log(2))) # Observation parameter values for given data rows obs$par(t = c(1, 10, 20))
par_alt()
Alternative parameter output
This function is only useful for the categorical and multivariate normal distributions, and it formats the parameters in a slightly nicer way.
Observation$par_alt(var = NULL, t = 1)
var
Name of observation variable for which parameters are required. By default, the first variable in 'dists' is used.
t
Time index for covariate values. Only one value should be provided.
List of distribution parameters, with one element for each state
inipar()
Return initial parameter values supplied
Observation$inipar()
coeff_fe()
Fixed effect parameters on working scale
Observation$coeff_fe()
coeff_re()
Random effect parameters
Observation$coeff_re()
X_fe()
Fixed effect design matrix
Observation$X_fe()
X_re()
Random effect design matrix
Observation$X_re()
lambda()
Smoothness parameters
Observation$lambda()
sd_re()
Standard deviation of smooth terms
This function transforms the smoothness parameter of each smooth term into a standard deviation, given by SD = 1/sqrt(lambda). It is particularly helpful to get the standard deviations of independent normal random effects.
Observation$sd_re()
formulas()
List of model formulas for observation model
Observation$formulas(raw = FALSE)
raw
Logical. If FALSE, returns the nested list created by make_formulas (default). If TRUE, returns formulas passed as input.
terms()
Terms of model formulas
Observation$terms()
obs_var()
Data frame of response variables
Observation$obs_var(expand = FALSE)
expand
If TRUE, then multivariate variables in observations are expanded to be univariate, creating extra columns.
Data frame of observation variables
known_states()
Vector of known states
Observation$known_states(mat = TRUE)
mat
Logical.
fixpar()
Fixed parameters
Observation$fixpar(all = FALSE)
all
Logical. If FALSE, only user-specified fixed parameters are returned, but not parameters that are fixed for some other reason (e.g., size of binomial distribution)
empty()
Empty model? (for simulation only)
Observation$empty()
update_par()
Update parameters
Updates the 'par' attribute to the list passed as input, and updates the intercept elements of 'coeff_fe' using the list passed as input
Observation$update_par(par)
par
New list of parameters
update_coeff_fe()
Update coefficients for fixed effect parameters
Observation$update_coeff_fe(coeff_fe)
coeff_fe
New vector of coefficients for fixed effect parameters
update_coeff_re()
Update random effect parameters
Observation$update_coeff_re(coeff_re)
coeff_re
New vector of coefficients for random effect parameters
update_X_fe()
Update fixed effect design matrix
Observation$update_X_fe(X_fe)
X_fe
New fixed effect design matrix
update_X_re()
Update random effect design matrix
Observation$update_X_re(X_re)
X_re
New random effect design matrix
update_lambda()
Update smoothness parameters
Observation$update_lambda(lambda)
lambda
New smoothness parameter vector
update_data()
Update data
Observation$update_data(data)
data
New data frame
update_fixpar()
Update information about fixed parameters
Observation$update_fixpar(fixpar)
fixpar
New list of fixed parameters, in the same format expected by Observation$new()
make_mat()
Make model matrices
Observation$make_mat(new_data = NULL)
new_data
Optional new data set, including covariates for which the design matrices should be created. If this argument is not specified, the design matrices are based on the original data frame.
A list with elements:
Design matrix for fixed effects
Design matrix for random effects
Smoothness matrix for random effects
Number of columns of X_fe for each parameter
Number of columns of X_re and S for each random effect
make_newdata_grid()
Design matrices for grid of covariates
Observation$make_newdata_grid(var, covs = NULL, n_grid = 1000)
var
Name of variable
covs
Optional named list for values of covariates (other than 'var') that should be used in the plot (or dataframe with single row). If this is not specified, the mean value is used for numeric variables, and the first level for factor variables.
n_grid
Grid size (number of points). Default: 1000.
A list with the same elements as the output of make_mat, plus a data frame of covariates values.
n2w()
Natural to working parameter transformation
This function applies the link functions of the distribution parameters, to transform parameters from their natural scale to the working scale (i.e., linear predictor scale)
Observation$n2w(par)
par
List of parameters on natural scale
Vector of parameters on working scale
w2n()
Working to natural parameter transformation
This function applies the inverse link functions of the distribution parameters, to transform parameters from the working scale (i.e., linear predictor scale) to their natural scale.
Observation$w2n(wpar)
wpar
Vector of parameters on working scale
List of parameters on natural scale
linpred()
Compute linear predictor
Observation$linpred()
obs_probs()
Observation likelihoods
Observation$obs_probs(data = NULL)
data
Optional dataframe to include in form of obs_var() output
Matrix of likelihoods of observations, with one row for each time step, and one column for each state.
cdf()
Cumulative probabilities of observations
Observation$cdf()
List of cumulative probabilities, with one element for each observed variable. Matrix rows correspond to time steps, and columns correspond to states.
suggest_initial()
Suggest initial observation parameters
The K-means algorithm is used to define clusters of observations
(supposed to approximate the HMM states). Then, for each cluster,
the parapprox
function of the relevant Dist
object
is used to obtain parameter values.
Observation$suggest_initial()
List of initial parameters for each observation variable
# Load data set from MSwM package data(energy, package = "MSwM") # Initial observation parameters par0 <- list(Price = list(mean = c(3, 6), sd = c(2, 2))) # Model "energy" with normal distributions obs <- Observation$new(data = energy, dists = list(Price = "norm"), par = par0, n_states = 2) # Print observation parameters obs$par() # Suggest initial parameters par0_new <- obs$suggest_initial() par0_new # Update model parameters to suggested obs$update_par(par = par0_new) obs$par()
plot_dist()
Plot histogram of data and pdfs
Plot histogram of observations for the variable specified by the argument name, overlaid with the pdf of the specified distribution for that data stream. Helpful to select initial parameter values for model fitting, or to visualise fitted state-dependent distributions.
Observation$plot_dist(var = NULL, weights = NULL, t = 1)
var
Name of response variable for which the histogram and pdfs should be plotted.
weights
Optional vector of length the number of pdfs that are plotted. Useful to visualise a mixture of distributions weighted by the proportion of time spent in the different states.
t
Index of time step to use for covariates (default: 1).
A ggplot object
formulation()
Print model formulation
Observation$formulation()
print()
Print Observation object Check constructor arguments
Observation$print()
clone()
The objects of this class are cloneable with this method.
Observation$clone(deep = FALSE)
deep
Whether to make a deep clone.
## ------------------------------------------------ ## Method `Observation$new` ## ------------------------------------------------ # Load data set from MSwM package data(energy, package = "MSwM") # Initial observation parameters par0 <- list(Price = list(mean = c(3, 6), sd = c(2, 2))) # Model "energy" with normal distributions obs <- Observation$new(data = energy, dists = list(Price = "norm"), par = par0) # Model "energy" with gamma distributions obs <- Observation$new(data = energy, dists = list(Price = "gamma2"), par = par0) # Model with non-linear effect of EurDol on mean price f <- list(Price = list(mean = ~ s(EurDol, k = 5, bs = "cs"))) obs <- Observation$new(data = energy, dists = list(Price = "norm"), par = par0, formula = f) ## ------------------------------------------------ ## Method `Observation$par` ## ------------------------------------------------ # Load data set from MSwM package data(energy, package = "MSwM") # Initial observation parameters par0 <- list(Price = list(mean = c(3, 6), sd = c(2, 2))) # Model with linear effect of EurDol on mean price f <- list(Price = list(mean = ~ EurDol)) obs <- Observation$new(data = energy, dists = list(Price = "norm"), par = par0, n_states = 2, formula = f) # Set slope coefficients obs$update_coeff_fe(coeff_fe = c(3, 2, 6, -2, log(2), log(2))) # Observation parameter values for given data rows obs$par(t = c(1, 10, 20)) ## ------------------------------------------------ ## Method `Observation$suggest_initial` ## ------------------------------------------------ # Load data set from MSwM package data(energy, package = "MSwM") # Initial observation parameters par0 <- list(Price = list(mean = c(3, 6), sd = c(2, 2))) # Model "energy" with normal distributions obs <- Observation$new(data = energy, dists = list(Price = "norm"), par = par0, n_states = 2) # Print observation parameters obs$par() # Suggest initial parameters par0_new <- obs$suggest_initial() par0_new # Update model parameters to suggested obs$update_par(par = par0_new) obs$par()
## ------------------------------------------------ ## Method `Observation$new` ## ------------------------------------------------ # Load data set from MSwM package data(energy, package = "MSwM") # Initial observation parameters par0 <- list(Price = list(mean = c(3, 6), sd = c(2, 2))) # Model "energy" with normal distributions obs <- Observation$new(data = energy, dists = list(Price = "norm"), par = par0) # Model "energy" with gamma distributions obs <- Observation$new(data = energy, dists = list(Price = "gamma2"), par = par0) # Model with non-linear effect of EurDol on mean price f <- list(Price = list(mean = ~ s(EurDol, k = 5, bs = "cs"))) obs <- Observation$new(data = energy, dists = list(Price = "norm"), par = par0, formula = f) ## ------------------------------------------------ ## Method `Observation$par` ## ------------------------------------------------ # Load data set from MSwM package data(energy, package = "MSwM") # Initial observation parameters par0 <- list(Price = list(mean = c(3, 6), sd = c(2, 2))) # Model with linear effect of EurDol on mean price f <- list(Price = list(mean = ~ EurDol)) obs <- Observation$new(data = energy, dists = list(Price = "norm"), par = par0, n_states = 2, formula = f) # Set slope coefficients obs$update_coeff_fe(coeff_fe = c(3, 2, 6, -2, log(2), log(2))) # Observation parameter values for given data rows obs$par(t = c(1, 10, 20)) ## ------------------------------------------------ ## Method `Observation$suggest_initial` ## ------------------------------------------------ # Load data set from MSwM package data(energy, package = "MSwM") # Initial observation parameters par0 <- list(Price = list(mean = c(3, 6), sd = c(2, 2))) # Model "energy" with normal distributions obs <- Observation$new(data = energy, dists = list(Price = "norm"), par = par0, n_states = 2) # Print observation parameters obs$par() # Suggest initial parameters par0_new <- obs$suggest_initial() par0_new # Update model parameters to suggested obs$update_par(par = par0_new) obs$par()
The covariance matrix is the inverse of the precision matrix. By default,
the function solve
is used for inversion. If it fails (e.g.,
singular system), then MASS::ginv
is used instead, and returns the
Moore-Penrose generalised inverse of the precision matrix.
prec_to_cov(prec_mat)
prec_to_cov(prec_mat)
prec_mat |
Precision matrix (either of 'matrix' type or sparse matrix on which as.matrix can be used) |
Precision matrix
Solve for positive root of quadratic ax^2 + bx + c = 0 when it exists
quad_pos_solve(a, b, c)
quad_pos_solve(a, b, c)
a |
coefficient of x^2 |
b |
coefficient of x |
c |
scalar coefficient |
real positive root if it exists
Strip comments marked with a hash from a character vector
strip_comments(str)
strip_comments(str)
str |
the character vector |
character vector with comments removed (and lines with only comments completely removed)
Update a model to a new model by changing one formula
## S3 method for class 'HMM' update(object, type, i, j, change, fit = TRUE, silent = FALSE, ...)
## S3 method for class 'HMM' update(object, type, i, j, change, fit = TRUE, silent = FALSE, ...)
object |
HMM model object |
type |
Character string for the part of the model that is updated (either "hid" or "obs") |
i |
If type = "hid" then i is the row of the formula containing the change. If type = "obs" then i is the observation variable name. |
j |
If type = "hid" then j is the column of the formula containing the change. If type = "obs" then j is the parameter whose formula is to be changed. |
change |
The change to make to the formula, see ?update.formula for details. |
fit |
If FALSE then change is made but model is not re-fit. |
silent |
If TRUE then no model fitting output is given |
... |
Additional arguments are ignored (for compatibility with generic S3 method) |
# Load data set from MSwM package data(energy, package = "MSwM") # Create hidden state and observation models hid <- MarkovChain$new(data = energy, n_states = 2) par0 <- list(Price = list(mean = c(3, 6), sd = c(2, 3))) obs <- Observation$new(data = energy, n_states = 2, dists = list(Price = "norm"), par = par0) # Create HMM (no covariate effects) hmm <- HMM$new(hid = hid, obs = obs) hmm$hid()$formula() hmm$obs()$formulas() # Update transition probability formulas (one at a time) hmm <- update(hmm, type = "hid", i = 1, j = 2, change = ~ . + Oil, fit = FALSE) hmm <- update(hmm, type = "hid", i = 2, j = 1, change = ~ . + Gas + Coal, fit = FALSE) hmm$hid()$formula() # Update observation parameter formulas (one at a time) hmm <- update(hmm, type = "obs", i = "Price", j = "mean", change = ~ . + EurDol, fit = FALSE) hmm$obs()$formulas()
# Load data set from MSwM package data(energy, package = "MSwM") # Create hidden state and observation models hid <- MarkovChain$new(data = energy, n_states = 2) par0 <- list(Price = list(mean = c(3, 6), sd = c(2, 3))) obs <- Observation$new(data = energy, n_states = 2, dists = list(Price = "norm"), par = par0) # Create HMM (no covariate effects) hmm <- HMM$new(hid = hid, obs = obs) hmm$hid()$formula() hmm$obs()$formulas() # Update transition probability formulas (one at a time) hmm <- update(hmm, type = "hid", i = 1, j = 2, change = ~ . + Oil, fit = FALSE) hmm <- update(hmm, type = "hid", i = 2, j = 1, change = ~ . + Gas + Coal, fit = FALSE) hmm$hid()$formula() # Update observation parameter formulas (one at a time) hmm <- update(hmm, type = "obs", i = "Price", j = "mean", change = ~ . + EurDol, fit = FALSE) hmm$obs()$formulas()