## -----------------------------------------------------------------------------
library(bridgesampling)

### generate data ###
set.seed(12345)

mu <- 0
tau2 <- 0.5
sigma2 <- 1

n <- 20
theta <- rnorm(n, mu, sqrt(tau2))
y <- rnorm(n, theta, sqrt(sigma2))
  

## ----eval=FALSE---------------------------------------------------------------
#  ### set prior parameters ###
#  mu0 <- 0
#  tau20 <- 1
#  alpha <- 1
#  beta <- 1

## ---- eval=FALSE--------------------------------------------------------------
#  library("nimble")
#  
#  # models
#  codeH0 <- nimbleCode({
#    invTau2 ~ dgamma(1, 1)
#    tau2 <- 1/invTau2
#    for (i in 1:20) {
#      theta[i] ~ dnorm(0, sd = sqrt(tau2))
#      y[i] ~ dnorm(theta[i], sd = 1)
#    }
#  })
#  codeH1 <- nimbleCode({
#    mu ~ dnorm(0, sd = 1)
#    invTau2 ~ dgamma(1, 1)
#    tau2 <- 1/invTau2
#    for (i in 1:20) {
#      theta[i] ~ dnorm(mu, sd = sqrt(tau2))
#      y[i] ~ dnorm(theta[i], sd = 1)
#    }
#  })
#  
#  ## steps for H0:
#  modelH0 <- nimbleModel(codeH0)
#  modelH0$setData(y = y) # set data
#  cmodelH0 <- compileNimble(modelH0) # make compiled version from generated C++
#  
#  ## steps for H1:
#  modelH1 <- nimbleModel(codeH1)
#  modelH1$setData(y = y) # set data
#  cmodelH1 <- compileNimble(modelH1) # make compiled version from generated C++
#  

## ---- eval=FALSE--------------------------------------------------------------
#  
#  # build MCMC functions, skipping customization of the configuration.
#  mcmcH0 <- buildMCMC(modelH0,
#                      monitors = modelH0$getNodeNames(stochOnly = TRUE,
#                                                      includeData = FALSE))
#  mcmcH1 <- buildMCMC(modelH1,
#                      monitors = modelH1$getNodeNames(stochOnly = TRUE,
#                                                      includeData = FALSE))
#  # compile the MCMC function via generated C++
#  cmcmcH0 <- compileNimble(mcmcH0, project = modelH0)
#  cmcmcH1 <- compileNimble(mcmcH1, project = modelH1)
#  
#  # run the MCMC.  This is a wrapper for cmcmc$run() and extraction of samples.
#  # the object samplesH1 is actually not needed as the samples are also in cmcmcH1
#  samplesH0 <- runMCMC(cmcmcH0, niter = 1e5, nburnin = 1000, nchains = 2,
#                       progressBar = FALSE)
#  samplesH1 <- runMCMC(cmcmcH1, niter = 1e5, nburnin = 1000, nchains = 2,
#                       progressBar = FALSE)

## ---- echo=FALSE--------------------------------------------------------------
load(system.file("extdata/", "vignette_example_nimble.RData",
                     package = "bridgesampling"))

## ----eval=FALSE---------------------------------------------------------------
#  # compute log marginal likelihood via bridge sampling for H0
#  H0.bridge <- bridge_sampler(cmcmcH0, silent = TRUE)
#  
#  # compute log marginal likelihood via bridge sampling for H1
#  H1.bridge <- bridge_sampler(cmcmcH1, silent = TRUE)

## -----------------------------------------------------------------------------
print(H0.bridge)
print(H1.bridge)

## ----eval=FALSE---------------------------------------------------------------
#  # compute percentage errors
#  H0.error <- error_measures(H0.bridge)$percentage
#  H1.error <- error_measures(H1.bridge)$percentage

## -----------------------------------------------------------------------------
print(H0.error)
print(H1.error)

## -----------------------------------------------------------------------------
# compute Bayes factor
BF01 <- bf(H0.bridge, H1.bridge)
print(BF01)

## -----------------------------------------------------------------------------
# compute posterior model probabilities (assuming equal prior model probabilities)
post1 <- post_prob(H0.bridge, H1.bridge)
print(post1)

## -----------------------------------------------------------------------------
# compute posterior model probabilities (using user-specified prior model probabilities)
post2 <- post_prob(H0.bridge, H1.bridge, prior_prob = c(.6, .4))
print(post2)

