## functions for starting, transition, and emission probabilities
stFn <- function(par,fx.par,data,nstates) rep(1/nstates,nstates)
trFn <- function(par,fx.par,data,nstates) {
A <- matrix(1/(nstates*10),ncol=nstates,nrow=nstates)
diag(A) <- 1 - rowSums(A)
A
}
emFn <- function(par,fx.par,data,nstates) {
t(sapply(1:nstates,function(j) dnorm(data$O,par$means[j],fx.par$sdev)))
}
## simulate some observations from two states
Q <- c(rep(1,100),rep(2,100),rep(1,100),rep(2,100))
T <- length(Q)
means <- c(-0.5,0.5)
sdev <- 1
O <- rnorm(T,means[Q],sdev)
## use viterbiPath() to recover the state chain using parameters
viterbi.path <- viterbiPath(par=list(means=means),
fx.par=list(sdev=sdev), data=list(O=O), nstates=2,stFn,trFn,emFn)
plot(O,pch=Q,col=c("darkgreen","orange")[viterbi.path])
Run the code above in your browser using DataLab