## ----knitr_setup, include=FALSE, message=FALSE-------------------------------- library(knitr) opts_chunk$set(echo = TRUE, eval = identical(Sys.getenv("NOT_CRAN"), "true")) rc <- knitr::read_chunk rc(system.file("vignette_data","mcmc.R",package="glmmTMB")) ## ----libs,message=FALSE------------------------------------------------------- # library(glmmTMB) # library(coda) ## MCMC utilities # library(reshape2) ## for melt() # ## graphics # library(lattice) # library(ggplot2); theme_set(theme_bw()) ## ----fit1--------------------------------------------------------------------- # data("sleepstudy",package="lme4") # fm1 <- glmmTMB(Reaction ~ Days + (Days|Subject), # sleepstudy) ## ----setup-------------------------------------------------------------------- # ## FIXME: is there a better way for user to extract full coefs? # rawcoef <- with(fm1$obj$env,last.par[-random]) # names(rawcoef) <- make.names(names(rawcoef),unique=TRUE) # ## log-likelihood function # ## (MCMCmetrop1R wants *positive* log-lik) # logpost_fun <- function(x) -fm1$obj$fn(x) # ## check definitions # stopifnot(all.equal(c(logpost_fun(rawcoef)), # c(logLik(fm1)), # tolerance=1e-7)) # V <- vcov(fm1,full=TRUE) ## ----run_MCMC----------------------------------------------------------------- # ##' @param start starting value # ##' @param V variance-covariance matrix of MVN candidate distribution # ##' @param iterations total iterations # ##' @param nsamp number of samples to store # ##' @param burnin number of initial samples to discard # ##' @param thin thinning interval # ##' @param tune tuning parameters; expand/contract V # ##' @param seed random-number seed # run_MCMC <- function(start, # V, # logpost_fun, # iterations = 10000, # nsamp = 1000, # burnin = iterations/2, # thin = floor((iterations-burnin)/nsamp), # tune = NULL, # seed=NULL # ) { # ## initialize # if (!is.null(seed)) set.seed(seed) # if (!is.null(tune)) { # tunesq <- if (length(tune)==1) tune^2 else outer(tune,tune) # V <- V*tunesq # } # chain <- matrix(NA, nsamp+1, length(start)) # chain[1,] <- cur_par <- start # postval <- logpost_fun(cur_par) # j <- 1 # for (i in 1:iterations) { # proposal = MASS::mvrnorm(1,mu=cur_par, Sigma=V) # newpostval <- logpost_fun(proposal) # accept_prob <- exp(newpostval - postval) # if (runif(1) < accept_prob) { # cur_par <- proposal # postval <- newpostval # } # if ((i>burnin) && (i %% thin == 1)) { # chain[j+1,] <- cur_par # j <- j + 1 # } # } # chain <- na.omit(chain) # colnames(chain) <- names(start) # chain <- coda::mcmc(chain) # return(chain) # } ## ----do_run_MCMC,eval=FALSE--------------------------------------------------- # t1 <- system.time(m1 <- run_MCMC(start=rawcoef, # V=V, logpost_fun=logpost_fun, # seed=1001)) ## ----load_MCMC, echo=FALSE, eval=TRUE----------------------------------------- L <- load(system.file("vignette_data", "mcmc.rda", package="glmmTMB")) ## ----add_names---------------------------------------------------------------- # colnames(m1) <- c(names(fixef(fm1)[[1]]), # "log(sigma)", # c("log(sd_Intercept)","log(sd_Days)","cor")) # m1[,"cor"] <- sapply(m1[,"cor"], get_cor) ## ----traceplot,fig.width=7---------------------------------------------------- # xyplot(m1,layout=c(2,3),asp="fill") ## ----effsize------------------------------------------------------------------ # print(effectiveSize(m1),digits=3) ## ----violins,echo=FALSE------------------------------------------------------- # ggplot(reshape2::melt(as.matrix(m1[,-1])),aes(x=Var2,y=value))+ # geom_violin(fill="gray")+coord_flip()+labs(x="") ## ----do_tmbstan,eval=FALSE---------------------------------------------------- # ## install.packages("tmbstan") # library(tmbstan) # t2 <- system.time(m2 <- tmbstan(fm1$obj)) ## ----show_traceplot,echo=FALSE,fig.width=8,fig.height=5----------------------- # library(png) # library(grid) # img <- readPNG(system.file("vignette_data","tmbstan_traceplot.png",package="glmmTMB")) # grid.raster(img)