brms (version 2.21.0)

stanvar: User-defined variables passed to Stan

Description

Prepare user-defined variables to be passed to one of Stan's program blocks. This is primarily useful for defining more complex priors, for refitting models without recompilation despite changing priors, or for defining custom Stan functions.

Usage

stanvar(
  x = NULL,
  name = NULL,
  scode = NULL,
  block = "data",
  position = "start",
  pll_args = NULL
)

Value

An object of class stanvars.

Arguments

x

An R object containing data to be passed to Stan. Only required if block = 'data' and ignored otherwise.

name

Optional character string providing the desired variable name of the object in x. If NULL (the default) the variable name is directly inferred from x.

scode

Line of Stan code to define the variable in Stan language. If block = 'data', the Stan code is inferred based on the class of x by default.

block

Name of one of Stan's program blocks in which the variable should be defined. Can be 'data', 'tdata' (transformed data), 'parameters', 'tparameters' (transformed parameters), 'model', 'likelihood' (part of the model block where the likelihood is given), 'genquant' (generated quantities) or 'functions'.

position

Name of the position within the block where the Stan code should be placed. Currently allowed are 'start' (the default) and 'end' of the block.

pll_args

Optional Stan code to be put into the header of partial_log_lik functions. This ensures that the variables specified in scode can be used in the likelihood even when within-chain parallelization is activated via threading.

Details

The stanvar function is not vectorized. Instead, multiple stanvars objects can be added together via + (see Examples).

Special attention is necessary when using stanvars to inject code into the 'likelihood' block while having threading activated. In this case, your custom Stan code may need adjustments to ensure correct observation indexing. Please investigate the generated Stan code via stancode to see which adjustments are necessary in your case.

Examples

Run this code
bprior <- prior(normal(mean_intercept, 10), class = "Intercept")
stanvars <- stanvar(5, name = "mean_intercept")
stancode(count ~ Trt, epilepsy, prior = bprior,
         stanvars = stanvars)

# define a multi-normal prior with known covariance matrix
bprior <- prior(multi_normal(M, V), class = "b")
stanvars <- stanvar(rep(0, 2), "M", scode = "  vector[K] M;") +
  stanvar(diag(2), "V", scode = "  matrix[K, K] V;")
stancode(count ~ Trt + zBase, epilepsy,
         prior = bprior, stanvars = stanvars)

# define a hierachical prior on the regression coefficients
bprior <- set_prior("normal(0, tau)", class = "b") +
  set_prior("target += normal_lpdf(tau | 0, 10)", check = FALSE)
stanvars <- stanvar(scode = "real tau;",
                    block = "parameters")
stancode(count ~ Trt + zBase, epilepsy,
         prior = bprior, stanvars = stanvars)

# ensure that 'tau' is passed to the likelihood of a threaded model
# not necessary for this example but may be necessary in other cases
stanvars <- stanvar(scode = "real tau;",
                    block = "parameters", pll_args = "real tau")
stancode(count ~ Trt + zBase, epilepsy,
         stanvars = stanvars, threads = threading(2))

Run the code above in your browser using DataLab