Discrete Markov Chain


4.1 Introduction
4.2 Chapman-Kolmogorov Equations
4.3 Classification of States
Finite mixture model and HMM
4.4 Limiting Probabilities
4.5 Some Applications
4.6 Mean Time Spent in Transient States
4.7 Branching Processes
4.8 Time Reversible Markov Chains
- Theorem 4.2
An ergodic Markov chain for which Pij=0 whenever Pji=0 is time reversible iff starting in state i, any path back to i has the same probability as the reversed path.
- Proposition 4.6
Consider an irreducible Markov chain with transition probabilities Pij. If we can find positive numbers \pi_i,i 0, summing to one, and a transition probability matrix Q = [Qij] such that \pi_iPij = \pi_jQji, then the Qij are the transition probabilities of the reversed chain and the \pi_i are the stationary probabilities both for the original and reversed chain.

4.9 Markov Chain Monte Carlo Methods
4.10 Markov Decision Processes
4.11 Hidden Markov Chains

Inference of MC state and MLE

Viterbi algorithm: most likely sequence of states given a prescribed sequence of signals (decoding)


A numerical exmaple of HMM computation
## simulation set up
## MC
     1     2
1  0.8   0.2
2  0.7   0.3
## Signal
1  : (0,1,2) p=0.3
2  : (0,1,2) p=0.6

###
set.seed(17)
pes = c(0.3, 0.6)
pts = c(0.2, 0.3)
p0 = 0.25

M = 200; N = 10
x = s = matrix(0, N,M)
for(i in 1:N){
  x[i,1] = rbinom(1,1,p0)+1
  s[i,1] = rbinom(1, 2, pes[x[i,1]])
  for(k in 2:M){
    x[i,k] = rbinom(1, 1,pts[x[i,k-1]])+1
    s[i,k] = rbinom(1, 2,pes[x[i,k]])
  }
}

### forward prob
fwd = function(s,p0,pes,pts){
   M = length(s)
   fpr = matrix(0, 2,M)
   fpr[1,1] = (1-p0)*dbinom(s[1], 2,pes[1])
   fpr[2,1] = p0*dbinom(s[1], 2,pes[2])
   for(k in 2:M){
     fpr[1,k] = dbinom(s[k],2,pes[1])*(fpr[1,k-1]*(1-pts[1])+ fpr[2,k-1]*(1-pts[2]))
     fpr[2,k] = dbinom(s[k],2,pes[2])*(fpr[1,k-1]*pts[1]+ fpr[2,k-1]*pts[2])
   }
   return(list(fpr=fpr))
}
### backward prob
bwd = function(s,p0,pes,pts){
   M = length(s)
   bpr = matrix(1, 2,M)
   for(k in (M-1):1){
     bpr[1,k] = dbinom(s[k+1],2,pes[1])*bpr[1,k+1]*(1-pts[1]) + dbinom(s[k+1],2,pes[2])*bpr[2,k+1]*pts[1]
     bpr[2,k] = dbinom(s[k+1],2,pes[1])*bpr[1,k+1]*(1-pts[2]) + dbinom(s[k+1],2,pes[2])*bpr[2,k+1]*pts[2]
   }
   return(list(bpr=bpr))
}
## cond prob
cprs = function(s, p0,pes,pts){
  M = length(s)
  bpr = bwd(s, p0,pes,pts)$bpr
  fpr = fwd(s, p0,pes,pts)$fpr
  prsn = sum(bpr[,1]*fpr[,1])
  cpr1 = bpr*fpr/prsn
  cpr2 = array(0, dim=c(2,2,M-1))
  for(k in 1:(M-1)){
    cpr2[1,1, k] = fpr[1,k]*(1-pts[1])*dbinom(s[k+1],2,pes[1])*bpr[1,k+1]
    cpr2[1,2, k] = fpr[1,k]*pts[1]*dbinom(s[k+1],2,pes[2])*bpr[2,k+1]
    cpr2[2,1, k] = fpr[2,k]*(1-pts[2])*dbinom(s[k+1],2,pes[1])*bpr[1,k+1]
    cpr2[2,2, k] = fpr[2,k]*pts[2]*dbinom(s[k+1],2,pes[2])*bpr[2,k+1]
  }
  return(list(cpr1=cpr1,cpr2=cpr2/prsn))
}
## EM MLE
bwem = function(s, p0,pes,pts, itMax=1e2,eps=1e-3){
  it =1; pdiff=1
  while((it<itMax)&(pdiff>eps)){
    ### E-step
    bpr = bwd(s, p0,pes,pts)$bpr
    fpr = fwd(s, p0,pes,pts)$fpr
    prsn = sum(bpr[,1]*fpr[,1])
    pr1 = cprs(s,p0,pes,pts)
    cpr1 = pr1$cpr1; cpr2 = pr1$cpr2
    ### M-step: binomial MLE
    pts1 = pts
    pts1[1] = sum(cpr2[1,2,])/sum(cpr1[1,-M])
    pts1[2] = sum(cpr2[2,2,])/sum(cpr1[2,-M])
    pes1 = pes
    pes1[1] = sum(cpr1[1,]*s)/sum(cpr1[1,])/2
    pes1[2] = sum(cpr1[2,]*s)/sum(cpr1[2,])/2
    p01 = p0
    p01 = cpr1[2,1]
    ### update
    pdiff = mean(abs(pts-pts1))/3+mean(abs(pes-pes1))/3+abs(p0-p01)/3
    pts=pts1; pes=pes1; p0=p01
  }
  return(list(pts=pts,pes=pes,p0=p0))
}

## viterbi
vitb = function(s, p0, pes,pts){
  M = length(s)
  vj = matrix(0, 2,M)
  vj[1,1] = (1-p0)*dbinom(s[1],2,pes[1])
  vj[2,1] = p0*dbinom(s[1],2,pes[2])
  for(k in 2:M){
    a1 = dbinom(s[k],2,pes[1])
    a2 = dbinom(s[k],2,pes[2])
    vj[1,k] = a1*max((1-pts[1])*vj[1,k-1], (1-pts[2])*vj[2,k-1])
    vj[2,k] = a2*max(pts[1]*vj[1,k-1], pts[2]*vj[2,k-1])
  }
  return(list(vj=vj))
}

##
ks = 1
table(s[ks,])
bwem(s[ks,], p0,pes,pts)
cpr1 = cprs(s[ks,], p0,pes,pts)
plot(1:dim(s)[2], x[ks,], type='b')
points(1:dim(s)[2], apply(cpr1$cpr1, 2, which.max), pch=2, col=2)

## viterbi decoding
vj = vitb(s[ks,], p0,pes,pts)$vj
M = length(s[ks,])
vsq = rep(0, M)
vsq[M] = which.max(vj[,M])

for(k in M:2){
   jk = vsq[k]
   if(jk==1){
     tmp = c((1-pts[1])*vj[1,k-1], (1-pts[2])*vj[2,k-1])
     vsq[k-1] = which.max(tmp)
    } else{
     tmp = c(pts[1]*vj[1,k-1], pts[2]*vj[2,k-1])
     vsq[k-1] = which.max(tmp)
    }
}
points(1:dim(s)[2], vsq, pch=3, col=3)

table(x[ks,], apply(cpr1$cpr1, 2, which.max))
table(x[ks,], vsq)