---
title: "BayesRTMB Quick Start"
description: "A short introduction to the minimal BayesRTMB workflow, MCMC checks, wrapper functions, visualization, and t tests."
output:
  rmarkdown::html_vignette:
    toc: true
    toc_depth: 3
vignette: >
  %\VignetteIndexEntry{BayesRTMB Quick Start}
  %\VignetteEncoding{UTF-8}
  %\VignetteEngine{knitr::rmarkdown}
editor_options:
  chunk_output_type: console
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE, eval = FALSE)
```

# Purpose of This Page

This page walks through the minimal workflow needed to start using BayesRTMB.

It covers the following topics.

1. Write a small model with `rtmb_code()`
2. Create a model object with `rtmb_model()`
3. Estimate the model with `optimize()` and `sample()`
4. Visualize the posterior distribution from MCMC
5. Use wrapper functions for multiple regression and interactions
6. Run a frequentist t test with `classic()`
7. Compute a Bayes factor using a JZS prior and MCMC

Detailed model writing, mixed models, GLMMs, and model comparison are covered in other vignettes.

# 0. Installation and Environment Check

BayesRTMB can be installed from CRAN.

```{r eval=FALSE}
install.packages("BayesRTMB")
```

The development version can be installed from GitHub.
If you use `pak`, install it as follows.

```{r eval=FALSE}
install.packages("pak")
pak::pak("norimune/BayesRTMB")
```

If you use `remotes`, install it as follows.

```{r eval=FALSE}
install.packages("remotes")
remotes::install_github("norimune/BayesRTMB")
```

## Windows Users

BayesRTMB uses RTMB / TMB internally.
For ordinary use, Windows users can install the CRAN binary package without Rtools.
Rtools is only needed for source installation, development, or compiling custom TMB C++ templates.

If you install BayesRTMB from source, you can check whether Rtools is available with the following code.

```{r eval=FALSE}
pkgbuild::check_build_tools(debug = TRUE)
```

If this returns `TRUE`, or reports that build tools are available, your source-install setup is ready.
If Rtools is not found, install the Rtools version that matches your R version, then restart R or RStudio.

# 1. Write a Minimal Model

We start with a small binomial model.
Suppose that 6 successes were observed out of 10 trials.

```{r eval=FALSE}
library(BayesRTMB)

Trial <- 10
Y <- 6

dat <- list(Trial = Trial, Y = Y)

code <- rtmb_code(
  parameters = {
    theta <- Dim(lower = 0, upper = 1)
  },
  model = {
    Y ~ binomial(Trial, theta)
    theta ~ beta(1, 1)
  }
)
```

The `parameters` block declares the parameters to estimate.
Here, `theta` is defined as a parameter constrained between 0 and 1.

The `model` block specifies the sampling distribution and prior distribution.
`Y ~ binomial(Trial, theta)` says that the number of successes `Y` follows a binomial distribution.

# 2. Create a Model Object

Pass the data and model code to `rtmb_model()` to create a model object for estimation.

```{r eval=FALSE}
mdl <- rtmb_model(dat, code)
```

```text
## Pre-checking model code...
## Checking RTMB setup...
```

At this stage, estimation has not yet been run.
`mdl` is an `RTMB_Model` object that stores the model definition and data.

# 3. Run MAP Estimation

Use `optimize()` when you want a fast point estimate.
In BayesRTMB, this is treated as MAP estimation when priors are present, and as something close to maximum likelihood estimation when flat priors are used.

```{r eval=FALSE}
fit_map <- mdl$optimize()
fit_map
```

```text
## Starting RTMB optimization...
## 
## 
## Call:
## MAP Estimation via RTMB
## 
## Negative Log-Posterior: 1.38
## Approx. Log Marginal Likelihood (Laplace): -2.33
## 
## Point Estimates and 95% Wald CI:
## variable  Estimate  Std. Error  Lower 95%  Upper 95% 
## theta      0.60000     0.15492    0.29740    0.84166 
```

In this example, the estimated success probability `theta` is 0.60.

# 4. Inspect the Posterior with MCMC

Use `sample()` when you want to inspect the full posterior distribution.
The settings below are intentionally short for a quick start. For real analyses, use more iterations.

```{r eval=FALSE}
set.seed(1)

fit_mcmc <- mdl$sample(
  sampling = 200,
  warmup = 200,
  chains = 2
)

fit_mcmc$summary()
```

```text
## Starting sequential sampling (chains = 2)...
## chain 1 started... 
## chain 1: iter 100 warmup 
## chain 1: iter 200 warmup 
## chain 1: iter 300 sampling 
## chain 1: iter 400 sampling 
## chain 2 started... 
## chain 2: iter 100 warmup 
## chain 2: iter 200 warmup 
## chain 2: iter 300 sampling 
## chain 2: iter 400 sampling 
## variable   mean    sd    map   q2.5  q97.5  ess_bulk  ess_tail  rhat 
## lp        -3.30  0.69  -2.88  -5.25  -2.80       132       188  1.00 
## theta      0.58  0.13   0.60   0.32   0.83       165       177  1.01 
```

The MCMC summary reports the mean, standard deviation, posterior quantiles, ESS, and R-hat.
As a rough diagnostic, R-hat should be close to 1 and ESS should be sufficiently large.

## Parallel MCMC

Ordinary MCMC can be run without additional setup.
However, if you use parallel MCMC with `sample(parallel = TRUE)`, the suggested packages `future`, `future.apply`, and `progressr` are required.
The `progressr` package is also used internally through `progressr::progressor()` for progress reporting.

```{r eval=FALSE}
install.packages(c("future", "future.apply", "progressr"))
```

These packages are listed in Suggests, so they are not required unless you use parallel execution.

```{r eval=FALSE}
fit_mcmc <- mdl$sample(
  sampling = 1000,
  warmup = 1000,
  chains = 4,
  parallel = TRUE
)
```

# 5. Visualize MCMC Results

MCMC results should be checked visually as well as numerically.
Use `draws()` to extract samples for a target parameter, then inspect densities, traces, autocorrelation, and intervals.

```{r eval=FALSE}
theta_draws <- fit_mcmc$draws("theta")

plot_dens(theta_draws)
plot_trace(theta_draws)
plot_acf(theta_draws)
```

Each plot has a different role.

- `plot_dens()` shows the shape of the posterior distribution.
- `plot_trace()` checks whether the chains mix well.
- `plot_acf()` checks whether autocorrelation is too strong.

For example, these functions produce plots like the following.

![Posterior density plot](plot_dens.png)

![Trace plot](plot_trace.png)

![Autocorrelation plot](plot_acf.png)

# 6. Multiple Regression with a Wrapper Function

For standard analyses, you can start from a wrapper function instead of writing `rtmb_code()` yourself.

Here we use the `debate` data and fit a multiple regression model in which satisfaction `sat` is explained by `talk`, `perf`, and their interaction.

```{r eval=FALSE}
data(debate)

mdl_lm <- rtmb_lm(
  sat ~ talk * perf,
  data = debate,
  gmc = "all",
  prior = prior_normal()
)

fit_lm <- mdl_lm$optimize(
  se_method = "sampling",
  num_samples = 1000,
  seed = 1
)
fit_lm
```

```text
## Starting RTMB optimization...
## 
## Using simulation-based error propagation (1000 samples)...
## 
## 
## Call:
## MAP Estimation via RTMB
## 
## Negative Log-Posterior: 402.24
## Approx. Log Marginal Likelihood (Laplace): -414.02
## 
## Point Estimates and 95% Sampling-based CI:
##     variable  Estimate  Std. Error  Lower 95%  Upper 95% 
## Intercept_c    3.43325     0.05232    3.33253    3.53604 
## b[talk]        0.26572     0.05305    0.15585    0.36839 
## b[perf]        0.14054     0.02924    0.08274    0.19857 
## b[talk:perf]   0.13022     0.03063    0.06780    0.19111 
## sigma          0.87135     0.03629    0.80181    0.94375 
## Intercept      3.41638     0.05254    3.31562    3.51660 
```

Use `plot_forest()` when you want to view the coefficients at a glance.

```{r eval=FALSE}
fit_lm$draws(c("b[talk]", "b[perf]", "b[talk:perf]")) |>
  plot_forest(point_estimate = "MAP")
```

![Regression coefficient forest plot](lm_forest.png)

# 7. Plot an Interaction

Interactions are often difficult to interpret from a coefficient table alone.
Use `conditional_effects()` to visualize predicted values.

```{r eval=FALSE}
ce <- conditional_effects(fit_lm, effect = "talk:perf")
plot(ce)
```

![Conditional effect plot](conditional_effect.png)

With `effect = "talk:perf"`, you can see how the effect of `talk` changes depending on the value of `perf`.

For a more detailed look, use `simple_effects()` to calculate simple slopes.

```{r eval=FALSE}
simple_effects(fit_lm, effect = "talk:perf")
```

# 8. Run a Frequentist t Test

BayesRTMB wrapper functions can also be used for frequentist analyses.
Calling `classic()` on a t test with `prior_flat()` displays results in a form close to an ordinary t test.

```{r eval=FALSE}
mdl_t <- rtmb_ttest(
  sat ~ cond,
  data = debate,
  prior = prior_flat()
)

fit_t_classic <- mdl_t$classic()
fit_t_classic
```

```text
## Pre-checking model code...
## Checking RTMB setup...
## Starting RTMB optimization...
## 
## 
## Call:
## Classical estimation via ttest 
## 
## Log-Likelihood: -421.320, AIC: 848.640, BIC: 842.640
## 
## Point Estimates and Confidence Intervals:
##            Estimate Std. Error Lower 95% Upper 95%  df  t value     Pr
## diff       -0.37333    0.11297  -0.59564  -0.15102 298 -3.30484 .00107  **
## delta      -0.38161    0.11652  -0.61092  -0.15230 298       NA
## total_mean  3.43333    0.05648   3.32218   3.54449 298       NA
## sd          0.97831    0.04007   0.90254   1.06044 298       NA
## mean0       3.24667    0.07988   3.08947   3.40386 298       NA
## mean1       3.62000    0.07988   3.46280   3.77720 298       NA
```

Here, `diff` is the difference between the two group means, and `delta` is the standardized effect size.
Use `classic()` when you want to inspect a BayesRTMB model as a frequentist analysis.

# 9. Compute a Bayes Factor with a JZS Prior

The same t test can also be used to compute a Bayes factor by placing a Cauchy prior on the effect size `delta` through the JZS prior.

```{r eval=FALSE}
mdl_t_jzs <- rtmb_ttest(
  sat ~ cond,
  data = debate,
  prior = prior_jzs()
)

set.seed(2)

fit_t_jzs <- mdl_t_jzs$sample()

bf <- fit_t_jzs$bayes_factor(fixed = list(delta = 0))
bf
```

```text
## --- Bayes Factor Analysis (Bridge Sampling) ---
## Bayes Factor (BF12) : 21.4323
## Log Bayes Factor    : 3.0649 (Approx. Error = 0.0022)
## Evidence            : Strong evidence for Model 1 
## Comparison model    : Parameters fixed at list(delta = 0) 
```

`fixed = list(delta = 0)` specifies a comparison against the null model where the effect size is fixed at 0.
In this example, `Model 1`, the model that estimates the effect size, is supported.

For real analyses, use more MCMC samples than shown here and check that the Bayes factor is stable.

# Next Steps

This page covered only the entry points to BayesRTMB.
Continue with the page that matches your purpose.

1. **[Wrapper Functions](wrapper_functions.html)**  
   Learn how to run standard analyses such as regression, GLM, mixed models, t tests, correlations, factor analysis, and IRT with wrapper functions.

2. **[Hierarchical Models and GLMMs](rtmb_glmer.html)**  
   Learn how to use `rtmb_glmer()` for hierarchical models, GLMMs, residual correlation, conditional effects, priors, and ANOVA-style workflows.

3. **[Writing Model Codes](writing_models.html)**  
   Learn how to write custom models with the `setup`, `parameters`, `transform`, `model`, and `generate` blocks.

4. **[RTMB Internals and Inference Algorithms](rtmb_internals.html)**  
   Learn about internal processing such as MAP estimation, Laplace approximation, MCMC, and variational inference.
