inst/doc/tutorial-mhmm.R

## ----setup, include = FALSE---------------------------------------------------
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)

## ----load package and data, include = FALSE-----------------------------------
library(mHMMbayes)
nonverbal <- data.frame(nonverbal)
head(nonverbal)
old_par <- graphics::par(no.readonly =TRUE)

## ----plot observed data, fig.width = 7.2, fig.height = 3.5, echo = FALSE------
# set labels and colors for the observed behavioral categorical outcomes
library(RColorBrewer)
Voc_lab <- c("Not Speaking", "Speaking", "Back channeling")
Look_lab <-  c("Not looking", "Looking")
Voc_col <- c(brewer.pal(3,"PuBuGn")[c(1,3,2)])
Look_col <- c(brewer.pal(3,"YlOrRd")[-3])
cols = list(Voc_col, Look_col, Voc_col, Look_col)

time_s  <- seq(1,900)
couple1 <- cbind(nonverbal[nonverbal$id == 1,], time_s)

par(mar = c(4.3, 6.6, 2.1, 1.1))
plot(x = 1, xlim = c(0,300), ylim = c(0.5,6), type = "n", las = 1, xlab = "Time in minutes", xaxt = "n", yaxt = "n", ylab = "")
axis(2, at = seq(1,4), tick = FALSE, labels = c("P_vocalizing", "P_Looking", "T_vocalizing", "T_Looking"), las = 1)
axis(1, at = seq(0,300,60), tick = TRUE, las = 1, labels = FALSE)
axis(1, at = seq(0,300,60), tick = FALSE, las = 1, labels = seq(1,6,1))
abline(v = seq(0,300,60), col = "gray85")

for(j in 2:5){
  for(i in 1:max(nonverbal[,j])){
    points(x = couple1$time_s[1:300][couple1[1:300,j] == i], 
           y = rep(j-1, sum(couple1[1:300,j] == i)), 
           pch = "|", col = cols[[j-1]][i])
  }
}

legend("topright", bty = "n", fill = Voc_col, legend = Voc_lab)
legend("topleft", bty = "n", fill = Look_col, legend = Look_lab)

graphics::par(old_par)


## ----settings and load 2 state model, include = FALSE-------------------------
# specifying general model properties:
m <- 2
n_dep <- 4
q_emiss <- c(3, 2, 3, 2)

# specifying starting values
start_TM <- diag(.8, m)
start_TM[lower.tri(start_TM) | upper.tri(start_TM)] <- .2
start_EM <- list(matrix(c(0.05, 0.90, 0.05, 
                          0.90, 0.05, 0.05), byrow = TRUE,
                         nrow = m, ncol = q_emiss[1]), # vocalizing patient
                  matrix(c(0.1, 0.9, 
                           0.1, 0.9), byrow = TRUE, nrow = m,
                         ncol = q_emiss[2]), # looking patient
                  matrix(c(0.90, 0.05, 0.05, 
                           0.05, 0.90, 0.05), byrow = TRUE,
                         nrow = m, ncol = q_emiss[3]), # vocalizing therapist
                  matrix(c(0.1, 0.9, 
                           0.1, 0.9), byrow = TRUE, nrow = m,
                         ncol = q_emiss[4])) # looking therapist

load("nonv_2st_1000it.rda")
out_2st <- out1

## ----show specifying 2 state model, eval = FALSE------------------------------
#  library(mHMMbayes)
#  # specifying general model properties:
#  m <- 2
#  n_dep <- 4
#  q_emiss <- c(3, 2, 3, 2)
#  
#  # specifying starting values
#  start_TM <- diag(.8, m)
#  start_TM[lower.tri(start_TM) | upper.tri(start_TM)] <- .2
#  start_EM <- list(matrix(c(0.05, 0.90, 0.05,
#                            0.90, 0.05, 0.05), byrow = TRUE,
#                           nrow = m, ncol = q_emiss[1]), # vocalizing patient
#                    matrix(c(0.1, 0.9,
#                             0.1, 0.9), byrow = TRUE, nrow = m,
#                           ncol = q_emiss[2]), # looking patient
#                    matrix(c(0.90, 0.05, 0.05,
#                             0.05, 0.90, 0.05), byrow = TRUE,
#                           nrow = m, ncol = q_emiss[3]), # vocalizing therapist
#                    matrix(c(0.1, 0.9,
#                             0.1, 0.9), byrow = TRUE, nrow = m,
#                           ncol = q_emiss[4])) # looking therapist

## ----show fitting 2 state model, eval = FALSE---------------------------------
#  # Run a model without covariate(s) and default priors:
#  set.seed(14532)
#  out_2st <- mHMM(s_data = nonverbal,
#                      gen = list(m = m, n_dep = n_dep, q_emiss = q_emiss),
#                      start_val = c(list(start_TM), start_EM),
#                      mcmc = list(J = 1000, burn_in = 200))
#  

## ----show print model---------------------------------------------------------
out_2st

## ----show summary model-------------------------------------------------------
summary(out_2st)

## ----show obtain gamma function-----------------------------------------------
# When not specified, level defaults to "group"
gamma_pop <- obtain_gamma(out_2st)
gamma_pop

# To obtain the subject specific parameter estimates:
gamma_subj <- obtain_gamma(out_2st, level = "subject")
gamma_subj

## ----show plot posterior densities, fig.width = 7.2, fig.height = 4-----------
library(RColorBrewer)
Voc_col <- c(brewer.pal(3,"PuBuGn")[c(1,3,2)])
Voc_lab <- c("Not Speaking", "Speaking", "Back channeling")

plot(out_2st, component = "emiss", dep = 1, col = Voc_col, 
     dep_lab = c("Patient vocalizing"), cat_lab = Voc_lab)

## ----show plot transition prob, fig.show='hold'-------------------------------
# Transition probabilities at the group level and for subject number 1, respectively:
plot(gamma_pop, col = rep(rev(brewer.pal(3,"PiYG"))[-2], each = m))
plot(gamma_subj, subj_nr = 1, col = rep(rev(brewer.pal(3,"PiYG"))[-2], each = m))

## ----load 3 and 4 state models, include = FALSE-------------------------------
# load("nonv_3st_1000it.rda")
# out_3st <- out2
load("nonv_4st_1000it.rda")
out_4st <- out3

## ----show 4 state model, fig.width = 5, fig.height = 3------------------------
summary(out_4st)

m <- 4
plot(obtain_gamma(out_4st), cex = .5, col = rep(rev(brewer.pal(5,"PiYG"))[-3], each = m))

## ----using viterbi algorithm--------------------------------------------------
state_seq <- vit_mHMM(out_2st, s_data = nonverbal)
 head(state_seq)

## ----plotting observed data plus inferred states, fig.width = 7.2, fig.height = 4, echo = FALSE----
# set labels and colors for the observed behavioral categorical outcomes
Voc_lab <- c("Not Speaking", "Speaking", "Back channeling")
Look_lab <-  c("Not looking", "Looking")
Voc_col <- c(brewer.pal(3,"PuBuGn")[c(1,3,2)])
Look_col <- c(brewer.pal(3,"YlOrRd")[-3])
cols = list(Voc_col, Look_col, Voc_col, Look_col)

State_col <- c(rev(brewer.pal(3,"PiYG"))[-2])

time_s  <- seq(1,900)
couple1 <- cbind(nonverbal[nonverbal$id == 1,], time_s)

par(mar = c(4.3, 6.6, 2.1, 1.1))
plot(x = 1, xlim = c(0,300), ylim = c(-0.5,6), type = "n", las = 1, xlab = "Time in minutes", xaxt = "n", yaxt = "n", ylab = "")
axis(2, at = seq(0,4), tick = FALSE, labels = c("State", "P_vocalizing", "P_Looking", "T_vocalizing", "T_Looking"), las = 1)
axis(1, at = seq(0,300,60), tick = TRUE, las = 1, labels = FALSE)
axis(1, at = seq(0,300,60), tick = FALSE, las = 1, labels = seq(1,6,1))
abline(v = seq(0,300,60), col = "gray85")

for(j in 2:5){
  for(i in 1:max(nonverbal[,j])){
    points(x = couple1$time_s[1:300][couple1[1:300,j] == i], 
           y = rep(j-1, sum(couple1[1:300,j] == i)), 
           pch = "|", col = cols[[j-1]][i])
  }
}
for(i in 1:2){
  points(x = couple1$time_s[1:300][state_seq[1:300,1] == i], 
           y = rep(0, sum(state_seq[1:300,1] == i)), 
           pch = "|", col = State_col[i])
}

legend("topright", bty = "n", fill = c(Look_col, "white", Voc_col), legend = c(Look_lab, "",Voc_lab),
       ncol = 2, border = c(rep("black", 2), "white", rep("black", 3)))
legend("topleft", bty = "n", fill = State_col, legend = c("State 1", "State 2"))

graphics::par(old_par)


## ----loading model convergence, include = FALSE-------------------------------
# specifying general model properties
m <-2
n_dep <- 4
q_emiss <- c(3, 2, 3, 2)

# specifying different starting values
start_TM <- diag(.8, m)
start_TM[lower.tri(start_TM) | upper.tri(start_TM)] <- .2
start_EM_b <- list(matrix(c(0.2, 0.6, 0.2,
                            0.6, 0.2, 0.2), byrow = TRUE,
                        nrow = m, ncol = q_emiss[1]), # vocalizing patient
                 matrix(c(0.4, 0.6,
                          0.4, 0.6), byrow = TRUE, nrow = m,
                        ncol = q_emiss[2]), # looking patient
                 matrix(c(0.6, 0.2, 0.2,
                          0.2, 0.6, 0.2), byrow = TRUE,
                        nrow = m, ncol = q_emiss[3]), # vocalizing therapist
                 matrix(c(0.4, 0.6,
                          0.4, 0.6), byrow = TRUE, nrow = m,
                        ncol = q_emiss[4])) # looking therapist

load("nonv_2stb_1000it.rda")
out_2st_b <- out1b

## ----showing model convergence I, eval= FALSE---------------------------------
#  # specifying general model properties
#  m <-2
#  n_dep <- 4
#  q_emiss <- c(3, 2, 3, 2)
#  
#  # specifying different starting values
#  start_TM <- diag(.8, m)
#  start_TM[lower.tri(start_TM) | upper.tri(start_TM)] <- .2
#  start_EM_b <- list(matrix(c(0.2, 0.6, 0.2,
#                              0.6, 0.2, 0.2), byrow = TRUE,
#                          nrow = m, ncol = q_emiss[1]), # vocalizing patient
#                   matrix(c(0.4, 0.6,
#                            0.4, 0.6), byrow = TRUE, nrow = m,
#                          ncol = q_emiss[2]), # looking patient
#                   matrix(c(0.6, 0.2, 0.2,
#                            0.2, 0.6, 0.2), byrow = TRUE,
#                          nrow = m, ncol = q_emiss[3]), # vocalizing therapist
#                   matrix(c(0.4, 0.6,
#                            0.4, 0.6), byrow = TRUE, nrow = m,
#                          ncol = q_emiss[4])) # looking therapist
#  
#  # Run a model identical to out_2st, but with different starting values:
#  set.seed(9843)
#  out_2st_b <- mHMM(s_data = nonverbal,
#                        gen = list(m = m, n_dep = n_dep, q_emiss = q_emiss),
#                        start_val = c(list(start_TM), start_EM),
#                        mcmc = list(J = 1000, burn_in = 200))
#  

## ----showing model convergence II trace plots, fig.width = 7.2, fig.height = 7----
par(mfrow = c(m,q_emiss[2]))
for(i in 1:m){
  for(q in 1:q_emiss[2]){
     plot(x = 1:1000, y = out_2st$emiss_prob_bar[[2]][,(i-1) * q_emiss[2] + q], 
          ylim = c(0,1.4), yaxt = 'n', type = "l", ylab = "Transition probability",
          xlab = "Iteration", main = paste("Patient", Look_lab[q], "in state", i), col = "#8da0cb") 
    axis(2, at = seq(0,1, .2), las = 2)
    lines(x = 1:1000, y = out_2st_b$emiss_prob_bar[[2]][,(i-1) * q_emiss[2] + q], col = "#e78ac3")
    legend("topright", col = c("#8da0cb", "#e78ac3"), lwd = 2, 
           legend = c("Starting value set 1", "Starting value set 2"), bty = "n")
  }
}

## ---- include = FALSE---------------------------------------------------------
graphics::par(old_par)

Try the mHMMbayes package in your browser

Any scripts or data that you put into this service are public.

mHMMbayes documentation built on Oct. 2, 2023, 5:06 p.m.