| Type: | Package | 
| Title: | Plot Hidden Markov Models | 
| Version: | 2023.8.28 | 
| Description: | Hidden Markov Models are useful for modeling sequential data. This package provides several functions implemented in C++ for explaining the algorithms used for Hidden Markov Models (forward, backward, decoding, learning). | 
| License: | GPL-2 | GPL-3 [expanded from: GPL (≥ 2)] | 
| Imports: | Rcpp (≥ 1.0.7) | 
| LinkingTo: | Rcpp, RcppArmadillo | 
| Suggests: | testthat, knitr, markdown, R.utils, covr, depmixS4, data.table, ggplot2, neuroblastoma, microbenchmark | 
| VignetteBuilder: | knitr | 
| NeedsCompilation: | yes | 
| Packaged: | 2023-09-05 04:12:33 UTC; tdhock | 
| Author: | Toby Hocking [aut, cre] | 
| Maintainer: | Toby Hocking <toby.hocking@r-project.org> | 
| Repository: | CRAN | 
| Date/Publication: | 2023-09-05 22:10:02 UTC | 
Backward algorithm
Description
Efficient implementation of backward algorithm in C++ code, for N data and S states.
Usage
backward_interface(
  log_emission_mat, log_transition_mat)Arguments
| log_emission_mat | N x S numeric matrix of log likelihood of observing each data point in each state. | 
| log_transition_mat | S x S numeric matrix; log_transition_mat[i,j] is the log probability of going from state i to state j. | 
Value
N x S numeric matrix of backward log likelihood.
Author(s)
Toby Dylan Hocking
Examples
##simulated data.
seg.mean.vec <- c(2, 0, -1, 0)
data.mean.vec <- rep(seg.mean.vec, each=10)
set.seed(1)
N.data <- length(data.mean.vec)
y.vec <- rnorm(N.data, data.mean.vec)
##model.
n.states <- 3
log.A.mat <- log(matrix(1/n.states, n.states, n.states))
state.mean.vec <- c(-1, 0, 1)*0.1
sd.param <- 1
log.emission.mat <- dnorm(
  y.vec,
  matrix(state.mean.vec, N.data, n.states, byrow=TRUE),
  sd.param,
  log=TRUE)
plotHMM::backward_interface(log.emission.mat, log.A.mat)
Buggy data with 5 states
Description
Data was observed to error with depmixS4 and five states
Usage
data("buggy.5states")Format
The format is a data table.
Buggy data with one state
Description
This data set was known to produce an error with depmixS4 using one state.
Usage
data("buggy.data")Format
The format is a data table.
Log probability arithmetic
Description
Binary operators in log probability space, to avoid numerical underflow.
Usage
elnproduct(elnx, elny)
elnsum(elnx, elny)
logsumexp(exponents.vec)
Arguments
| elnx,elny,exponents.vec | numeric vectors of log probabilities. | 
Value
Numeric vector with one (logsumexp) or more (others) log probability value(s).
Author(s)
Toby Dylan Hocking
References
http://bozeman.genome.washington.edu/compbio/mbt599_2006/hmm_scaling_revised.pdf
Examples
px <- c(0.1, 0.5, 0.9)
py <- c(0.001, 0.123, 0.999)
lx <- log(px)
ly <- log(py)
library(plotHMM)
elnproduct(lx, ly)
elnsum(lx, ly)
logsumexp(ly)
Forward algorithm
Description
Efficient implementation of forward algorithm in C++ code, for N data and S states.
Usage
forward_interface(
  log_emission_mat, log_transition_mat, log_initial_prob_vec)Arguments
| log_emission_mat | N x S numeric matrix of log likelihood of observing each data point in each state. | 
| log_transition_mat | S x S numeric matrix; log_transition_mat[i,j] is the log probability of going from state i to state j. | 
| log_initial_prob_vec | S numeric vector of log probabilities of observing each state at the beginning of the sequence. | 
Value
list with two elements
| log_alpha | N x S numeric matrix of forward log likelihood at each data/state. | 
| log_lik | numeric scalar total log likelihood of data given model parameters. | 
Author(s)
Toby Dylan Hocking
Examples
##simulated data.
seg.mean.vec <- c(2, 0, -1, 0)
data.mean.vec <- rep(seg.mean.vec, each=10)
set.seed(1)
N.data <- length(data.mean.vec)
y.vec <- rnorm(N.data, data.mean.vec)
##model.
n.states <- 3
log.A.mat <- log(matrix(1/n.states, n.states, n.states))
state.mean.vec <- c(-1, 0, 1)*0.1
sd.param <- 1
log.pi.vec <- log(rep(1/n.states, n.states))
log.emission.mat <- dnorm(
  y.vec,
  matrix(state.mean.vec, N.data, n.states, byrow=TRUE),
  sd.param,
  log=TRUE)
plotHMM::forward_interface(log.emission.mat, log.A.mat, log.pi.vec)
Multiply algorithm
Description
Efficient implementation of multiply algorithm in C++ code, for N data and S states.
Usage
multiply_interface(
  log_alpha_mat, log_beta_mat)Arguments
| log_alpha_mat,log_beta_mat | N x S numeric matrices of log probabilities, from forward and backward algorithms. | 
Value
N x S numeric matrix of overall log likelihood.
Author(s)
Toby Dylan Hocking
Examples
##simulated data.
seg.mean.vec <- c(2, 0, -1, 0)
data.mean.vec <- rep(seg.mean.vec, each=10)
set.seed(1)
N.data <- length(data.mean.vec)
y.vec <- rnorm(N.data, data.mean.vec)
##model.
n.states <- 3
log.A.mat <- log(matrix(1/n.states, n.states, n.states))
state.mean.vec <- c(-1, 0, 1)*0.1
sd.param <- 1
log.emission.mat <- dnorm(
  y.vec,
  matrix(state.mean.vec, N.data, n.states, byrow=TRUE),
  sd.param,
  log=TRUE)
log.pi.vec <- log(rep(1/n.states, n.states))
f.list <- plotHMM::forward_interface(log.emission.mat, log.A.mat, log.pi.vec)
b.mat <- plotHMM::backward_interface(log.emission.mat, log.A.mat)
log.gamma.mat <- plotHMM::multiply_interface(f.list$log_alpha, b.mat)
prob.mat <- exp(log.gamma.mat)
rowSums(prob.mat)
Pairwise algorithm
Description
Efficient implementation of pairwise algorithm in C++ code, for N data and S states.
Usage
pairwise_interface(
  log_emission_mat, log_transition_mat, log_alpha_mat, log_beta_mat)Arguments
| log_emission_mat,log_alpha_mat,log_beta_mat | N x S numeric matrices of log likelihood. | 
| log_transition_mat | S x S numeric matrix; log_transition_mat[i,j] is the log probability of going from state i to state j. | 
Value
S x S x N-1 numeric array of log likelihood.
Author(s)
Toby Dylan Hocking
Examples
##simulated data.
seg.mean.vec <- c(2, 0, -1, 0)
data.mean.vec <- rep(seg.mean.vec, each=10)
set.seed(1)
N.data <- length(data.mean.vec)
y.vec <- rnorm(N.data, data.mean.vec)
##model.
n.states <- 3
log.A.mat <- log(matrix(1/n.states, n.states, n.states))
state.mean.vec <- c(-1, 0, 1)*0.1
sd.param <- 1
log.emission.mat <- dnorm(
  y.vec,
  matrix(state.mean.vec, N.data, n.states, byrow=TRUE),
  sd.param,
  log=TRUE)
log.pi.vec <- log(rep(1/n.states, n.states))
f.list <- plotHMM::forward_interface(log.emission.mat, log.A.mat, log.pi.vec)
b.mat <- plotHMM::backward_interface(log.emission.mat, log.A.mat)
log.gamma.mat <- plotHMM::multiply_interface(f.list$log_alpha, b.mat)
prob.mat <- exp(log.gamma.mat)
plotHMM::pairwise_interface(log.emission.mat, log.A.mat, f.list$log_alpha, b.mat)
Transition algorithm
Description
Efficient implementation of transition algorithm in C++ code, for T transitions and S states.
Usage
transition_interface(
  log_gamma_mat, log_xi_array)Arguments
| log_gamma_mat | T x S numeric matrix, taken by removing the last row from the log probabilities from multiply. | 
| log_xi_array | S x S x T numeric array of log probabilities from pairwise. | 
Value
S x S numeric array of log probabilities (new transition matrix).
Author(s)
Toby Dylan Hocking
Examples
##simulated data.
seg.mean.vec <- c(2, 0, -1, 0)
data.mean.vec <- rep(seg.mean.vec, each=10)
set.seed(1)
N.data <- length(data.mean.vec)
y.vec <- rnorm(N.data, data.mean.vec)
##model.
n.states <- 3
log.A.mat <- log(matrix(1/n.states, n.states, n.states))
state.mean.vec <- c(-1, 0, 1)*0.1
sd.param <- 1
log.emission.mat <- dnorm(
  y.vec,
  matrix(state.mean.vec, N.data, n.states, byrow=TRUE),
  sd.param,
  log=TRUE)
log.pi.vec <- log(rep(1/n.states, n.states))
f.list <- plotHMM::forward_interface(log.emission.mat, log.A.mat, log.pi.vec)
b.mat <- plotHMM::backward_interface(log.emission.mat, log.A.mat)
log.gamma.mat <- plotHMM::multiply_interface(f.list$log_alpha, b.mat)
prob.mat <- exp(log.gamma.mat)
log.xi.array <- plotHMM::pairwise_interface(
  log.emission.mat, log.A.mat, f.list$log_alpha, b.mat)
plotHMM::transition_interface(log.gamma.mat[-N.data,], log.xi.array)
Viterbi algorithm
Description
Efficient implementation of Viterbi algorithm in C++ code, for N data and S states.
Usage
viterbi_interface(
  log_emission_mat, log_transition_mat, log_initial_prob_vec)Arguments
| log_emission_mat | N x S numeric matrix of log likelihood of observing each data point in each state. | 
| log_transition_mat | S x S numeric matrix; log_transition_mat[i,j] is the log probability of going from state i to state j. | 
| log_initial_prob_vec | S numeric vector of log probabilities of observing each state at the beginning of the sequence. | 
Value
list with elements
| log_max_prob | N x S numeric matrix of max log probabilities. | 
| best_state | N x S integer matrix. First row is fixed at zero, other rows indicate best states (from 1 to S). | 
| state_seq | N integer vector, best overall state sequence (entries from 1 to S). | 
Author(s)
Toby Dylan Hocking
Examples
##simulated data.
seg.mean.vec <- c(2, 0, -1, 0)
data.mean.vec <- rep(seg.mean.vec, each=2)
N.data <- length(data.mean.vec)
sd.param <- 0.1
set.seed(1)
y.vec <- rnorm(N.data, data.mean.vec, sd.param)
##model.
state.mean.vec <- unique(seg.mean.vec)
n.states <- length(state.mean.vec)
log.A.mat <- log(matrix(1/n.states, n.states, n.states))
log.pi.vec <- log(rep(1/n.states, n.states))
log.emission.mat <- dnorm(
  y.vec,
  matrix(state.mean.vec, N.data, n.states, byrow=TRUE),
  sd.param,
  log=TRUE)
plotHMM::viterbi_interface(log.emission.mat, log.A.mat, log.pi.vec)