rm(list = ls()) gc() modelName <- "TwoCptModel" # modelName <- "LinTwoCptModel" # modelName <- "GenTwoCptModel" ## Adjust directories to your settings. scriptDir <- getwd() projectDir <- dirname(scriptDir) figDir <- file.path("deliv", "figure", modelName) tabDir <- file.path("deliv", "table", modelName) modelDir <- file.path(projectDir, modelName) outDir <- file.path(modelDir, modelName) toolsDir <- file.path("tools") library(rstan) library(ggplot2) library(plyr) library(dplyr) library(tidyr) library(parallel) source(file.path(toolsDir, "stanTools.R")) rstan_options(auto_write = TRUE) set.seed(11191951) ## not required but assures repeatable results ## read data data <- read_rdump(file.path(modelDir, paste0(modelName,".data.R"))) ## create initial estimates init <- function() { list(CL = exp(rnorm(1, log(10), 0.2)), Q = exp(rnorm(1, log(15), 0.2)), V1 = exp(rnorm(1, log(35), 0.2)), V2 = exp(rnorm(1, log(105), 0.2)), ka = exp(rnorm(1, log(2), 0.2)), sigma = runif(1, 0.5, 2)) } ## Specify the variables for which you want history and density plots parametersToPlot <- c("CL", "Q", "V1", "V2", "ka", "sigma") ## Additional variables to monitor otherRVs <- c("cObsPred") parameters <- c(parametersToPlot, otherRVs) parametersToPlot <- c("lp__", parametersToPlot) ################################################################################################ ## run Stan nChains <- 4 nPost <- 1000 ## Number of post-burn-in samples per chain after thinning nBurn <- 1000 ## Number of burn-in samples per chain after thinning nThin <- 1 nIter <- (nPost + nBurn) * nThin nBurnin <- nBurn * nThin fit <- stan(file = file.path(modelDir, paste0(modelName, ".stan")), data = data, pars = parameters, iter = nIter, warmup = nBurnin, thin = nThin, init = init, chains = nChains, cores = min(nChains, parallel::detectCores())) dir.create(outDir) save(fit, file = file.path(outDir, paste(modelName, "Fit.Rsave", sep = ""))) ################################################################################################ ## posterior distributions of parameters dir.create(figDir) dir.create(tabDir) ## open graphics device pdf(file = file.path(figDir, paste(modelName,"Plots%03d.pdf", sep = "")), width = 6, height = 6, onefile = F) mcmcHistory(fit, parametersToPlot) mcmcDensity(fit, parametersToPlot, byChain = TRUE) mcmcDensity(fit, parametersToPlot) pairs(fit, pars = parametersToPlot) ptable <- parameterTable(fit, parametersToPlot) write.csv(ptable, file = file.path(tabDir, paste(modelName, "ParameterTable.csv", sep = ""))) ################################################################################################ ## posterior predictive plot data <- data.frame(data$cObs, data$time[-1]) data <- plyr::rename(data, c("data.cObs" = "cObs", "data.time..1." = "time")) pred <- as.data.frame(fit, pars = "cObsPred") %>% gather(factor_key = TRUE) %>% group_by(key) %>% summarize(lb = quantile(value, probs = 0.05), median = quantile(value, probs = 0.5), ub = quantile(value, probs = 0.95)) %>% bind_cols(data) p1 <- ggplot(pred, aes(x = time, y = cObs)) p1 <- p1 + geom_point() + labs(x = "time (h)", y = "plasma concentration (mg/L)") + theme(text = element_text(size = 12), axis.text = element_text(size = 12), legend.position = "none", strip.text = element_text(size = 8)) p1 + geom_line(aes(x = time, y = median)) + geom_ribbon(aes(ymin = lb, ymax = ub), alpha = 0.25) dev.off()