From cdccc21e73a179d691249aea5839eac6cfce9ec5 Mon Sep 17 00:00:00 2001 From: Ven Popov Date: Wed, 28 Feb 2024 14:49:57 +0100 Subject: [PATCH 1/8] transform get_prior to a generic S3 method --- DESCRIPTION | 4 +- NAMESPACE | 3 ++ R/priors.R | 51 +++++++++++++++++-- man/get_prior.Rd | 91 ++++++++------------------------- man/get_prior.brmsformula.Rd | 97 ++++++++++++++++++++++++++++++++++++ 5 files changed, 171 insertions(+), 75 deletions(-) create mode 100644 man/get_prior.brmsformula.Rd diff --git a/DESCRIPTION b/DESCRIPTION index 651107f86..b9a51983f 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -2,7 +2,7 @@ Package: brms Encoding: UTF-8 Type: Package Title: Bayesian Regression Models using 'Stan' -Version: 2.20.13 +Version: 2.20.14 Date: 2024-02-27 Authors@R: c(person("Paul-Christian", "Bürkner", email = "paul.buerkner@gmail.com", @@ -98,4 +98,4 @@ Additional_repositories: VignetteBuilder: knitr, R.rsp -RoxygenNote: 7.2.3 +RoxygenNote: 7.3.1 diff --git a/NAMESPACE b/NAMESPACE index 2aad35086..99fa744dd 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -116,6 +116,9 @@ S3method(get_group_vars,default) S3method(get_group_vars,mvbrmsterms) S3method(get_int_vars,brmsterms) S3method(get_int_vars,mvbrmsterms) +S3method(get_prior,brmsformula) +S3method(get_prior,formula) +S3method(get_prior,mvbrmsformula) S3method(get_re,brmsterms) S3method(get_re,btl) S3method(get_re,default) diff --git a/R/priors.R b/R/priors.R index 0c6c9c404..7f2989a5b 100644 --- a/R/priors.R +++ b/R/priors.R @@ -438,11 +438,50 @@ prior_string <- function(prior, ...) { set_prior(prior, ...) } +#' @title Get default priors for a Bayesian multilevel model +#' @description \code{get_prior} is a generic function that can be used to obtain the +#' default priors for a Bayesian multilevel model from various packages that +#' use the \pkg{brms} package for fitting the model. The function invokes +#' particular methods which depend on the class of the first argument. +#' +#' You can view the available methods by typing \code{methods(get_prior)}. +#' +#' The default method applied to a \code{formula} is \code{\link{get_prior.brmsformula}} +#' +#' @param formula A formula object whose class will determine which method will +#' be used. A symbolic description of the model to be fitted. +#' @param data An object of class data.frame, or one that can be coerced to that +#' class) containing data of all variables used in the model. +#' @param ... Further arguments passed to the specific method +#' +#' @return A data.frame with columns \code{prior}, \code{class}, \code{coef}, +#' and \code{group} and several rows, each providing information on a +#' parameter (or parameter class) on which priors can be specified. The prior +#' column is empty except for internal default priors. +#' +#' @examples +#' ## get all parameters and parameters classes to define priors on +#' (prior <- get_prior(count ~ zAge + zBase * Trt + (1|patient) + (1|obs), +#' data = epilepsy, family = poisson())) +#' +#' ## for more examples, see ?get_prior.brmsformula for \pkg{brms} and for the other +#' ## methods by first calling: +#' methods(get_prior) +#' +#' ## and then ?get_prior.* where * is the method name +#' +#' @seealso \code{\link{set_prior}} +#' @export +get_prior <- function(formula, data, ...) { + UseMethod('get_prior') +} + #' Overview on Priors for \pkg{brms} Models #' #' Get information on all parameters (and parameter classes) for which priors #' may be specified including default priors. #' +#' @name get_prior.brmsformula #' @inheritParams brm #' @param ... Other arguments for internal usage only. #' @@ -470,9 +509,9 @@ prior_string <- function(prior, ...) { #' prior = prior) #' #' @export -get_prior <- function(formula, data, family = gaussian(), autocor = NULL, - data2 = NULL, knots = NULL, drop_unused_levels = TRUE, - sparse = NULL, ...) { +get_prior.brmsformula <- function(formula, data, family = gaussian(), autocor = NULL, + data2 = NULL, knots = NULL, drop_unused_levels = TRUE, + sparse = NULL, ...) { if (is.brmsfit(formula)) { stop2("Use 'prior_summary' to extract priors from 'brmsfit' objects.") } @@ -493,6 +532,12 @@ get_prior <- function(formula, data, family = gaussian(), autocor = NULL, .get_prior(bterms, data, ...) } +#' @export +get_prior.formula <- get_prior.brmsformula + +#' @export +get_prior.mvbrmsformula <- get_prior.brmsformula + # internal work function of 'get_prior' # @param internal return priors for internal use? # @return a brmsprior object diff --git a/man/get_prior.Rd b/man/get_prior.Rd index 443a46ff6..5276af5c3 100644 --- a/man/get_prior.Rd +++ b/man/get_prior.Rd @@ -2,68 +2,18 @@ % Please edit documentation in R/priors.R \name{get_prior} \alias{get_prior} -\title{Overview on Priors for \pkg{brms} Models} +\title{Get default priors for a Bayesian multilevel model} \usage{ -get_prior( - formula, - data, - family = gaussian(), - autocor = NULL, - data2 = NULL, - knots = NULL, - drop_unused_levels = TRUE, - sparse = NULL, - ... -) +get_prior(formula, data, ...) } \arguments{ -\item{formula}{An object of class \code{\link[stats:formula]{formula}}, -\code{\link{brmsformula}}, or \code{\link{mvbrmsformula}} (or one that can -be coerced to that classes): A symbolic description of the model to be -fitted. The details of model specification are explained in -\code{\link{brmsformula}}.} +\item{formula}{A formula object whose class will determine which method will +be used. A symbolic description of the model to be fitted.} -\item{data}{An object of class \code{data.frame} (or one that can be coerced -to that class) containing data of all variables used in the model.} +\item{data}{An object of class data.frame, or one that can be coerced to that +class) containing data of all variables used in the model.} -\item{family}{A description of the response distribution and link function to -be used in the model. This can be a family function, a call to a family -function or a character string naming the family. Every family function has -a \code{link} argument allowing to specify the link function to be applied -on the response variable. If not specified, default links are used. For -details of supported families see \code{\link{brmsfamily}}. By default, a -linear \code{gaussian} model is applied. In multivariate models, -\code{family} might also be a list of families.} - -\item{autocor}{(Deprecated) An optional \code{\link{cor_brms}} object -describing the correlation structure within the response variable (i.e., -the 'autocorrelation'). See the documentation of \code{\link{cor_brms}} for -a description of the available correlation structures. Defaults to -\code{NULL}, corresponding to no correlations. In multivariate models, -\code{autocor} might also be a list of autocorrelation structures. -It is now recommend to specify autocorrelation terms directly -within \code{formula}. See \code{\link{brmsformula}} for more details.} - -\item{data2}{A named \code{list} of objects containing data, which -cannot be passed via argument \code{data}. Required for some objects -used in autocorrelation structures to specify dependency structures -as well as for within-group covariance matrices.} - -\item{knots}{Optional list containing user specified knot values to be used -for basis construction of smoothing terms. See -\code{\link[mgcv:gamm]{gamm}} for more details.} - -\item{drop_unused_levels}{Should unused factors levels in the data be -dropped? Defaults to \code{TRUE}.} - -\item{sparse}{(Deprecated) Logical; indicates whether the population-level -design matrices should be treated as sparse (defaults to \code{FALSE}). For -design matrices with many zeros, this can considerably reduce required -memory. Sampling speed is currently not improved or even slightly -decreased. It is now recommended to use the \code{sparse} argument of -\code{\link{brmsformula}} and related functions.} - -\item{...}{Other arguments for internal usage only.} +\item{...}{Further arguments passed to the specific method} } \value{ A data.frame with columns \code{prior}, \code{class}, \code{coef}, @@ -72,24 +22,25 @@ A data.frame with columns \code{prior}, \code{class}, \code{coef}, column is empty except for internal default priors. } \description{ -Get information on all parameters (and parameter classes) for which priors -may be specified including default priors. +\code{get_prior} is a generic function that can be used to obtain the + default priors for a Bayesian multilevel model from various packages that + use the \pkg{brms} package for fitting the model. The function invokes + particular methods which depend on the class of the first argument. + + You can view the available methods by typing \code{methods(get_prior)}. + + The default method applied to a \code{formula} is \code{\link{get_prior.brmsformula}} } \examples{ ## get all parameters and parameters classes to define priors on -(prior <- get_prior(count ~ zAge + zBase * Trt + (1|patient) + (1|obs), - data = epilepsy, family = poisson())) - -## define a prior on all population-level effects a once -prior$prior[1] <- "normal(0,10)" + (prior <- get_prior(count ~ zAge + zBase * Trt + (1|patient) + (1|obs), + data = epilepsy, family = poisson())) -## define a specific prior on the population-level effect of Trt -prior$prior[5] <- "student_t(10, 0, 5)" +## for more examples, see ?get_prior.brmsformula for \pkg{brms} and for the other +## methods by first calling: +methods(get_prior) -## verify that the priors indeed found their way into Stan's model code -make_stancode(count ~ zAge + zBase * Trt + (1|patient) + (1|obs), - data = epilepsy, family = poisson(), - prior = prior) +## and then ?get_prior.* where * is the method name } \seealso{ diff --git a/man/get_prior.brmsformula.Rd b/man/get_prior.brmsformula.Rd new file mode 100644 index 000000000..15b15e0f6 --- /dev/null +++ b/man/get_prior.brmsformula.Rd @@ -0,0 +1,97 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/priors.R +\name{get_prior.brmsformula} +\alias{get_prior.brmsformula} +\title{Overview on Priors for \pkg{brms} Models} +\usage{ +\method{get_prior}{brmsformula}( + formula, + data, + family = gaussian(), + autocor = NULL, + data2 = NULL, + knots = NULL, + drop_unused_levels = TRUE, + sparse = NULL, + ... +) +} +\arguments{ +\item{formula}{An object of class \code{\link[stats:formula]{formula}}, +\code{\link{brmsformula}}, or \code{\link{mvbrmsformula}} (or one that can +be coerced to that classes): A symbolic description of the model to be +fitted. The details of model specification are explained in +\code{\link{brmsformula}}.} + +\item{data}{An object of class \code{data.frame} (or one that can be coerced +to that class) containing data of all variables used in the model.} + +\item{family}{A description of the response distribution and link function to +be used in the model. This can be a family function, a call to a family +function or a character string naming the family. Every family function has +a \code{link} argument allowing to specify the link function to be applied +on the response variable. If not specified, default links are used. For +details of supported families see \code{\link{brmsfamily}}. By default, a +linear \code{gaussian} model is applied. In multivariate models, +\code{family} might also be a list of families.} + +\item{autocor}{(Deprecated) An optional \code{\link{cor_brms}} object +describing the correlation structure within the response variable (i.e., +the 'autocorrelation'). See the documentation of \code{\link{cor_brms}} for +a description of the available correlation structures. Defaults to +\code{NULL}, corresponding to no correlations. In multivariate models, +\code{autocor} might also be a list of autocorrelation structures. +It is now recommend to specify autocorrelation terms directly +within \code{formula}. See \code{\link{brmsformula}} for more details.} + +\item{data2}{A named \code{list} of objects containing data, which +cannot be passed via argument \code{data}. Required for some objects +used in autocorrelation structures to specify dependency structures +as well as for within-group covariance matrices.} + +\item{knots}{Optional list containing user specified knot values to be used +for basis construction of smoothing terms. See +\code{\link[mgcv:gamm]{gamm}} for more details.} + +\item{drop_unused_levels}{Should unused factors levels in the data be +dropped? Defaults to \code{TRUE}.} + +\item{sparse}{(Deprecated) Logical; indicates whether the population-level +design matrices should be treated as sparse (defaults to \code{FALSE}). For +design matrices with many zeros, this can considerably reduce required +memory. Sampling speed is currently not improved or even slightly +decreased. It is now recommended to use the \code{sparse} argument of +\code{\link{brmsformula}} and related functions.} + +\item{...}{Other arguments for internal usage only.} +} +\value{ +A data.frame with columns \code{prior}, \code{class}, \code{coef}, + and \code{group} and several rows, each providing information on a + parameter (or parameter class) on which priors can be specified. The prior + column is empty except for internal default priors. +} +\description{ +Get information on all parameters (and parameter classes) for which priors +may be specified including default priors. +} +\examples{ +## get all parameters and parameters classes to define priors on +(prior <- get_prior(count ~ zAge + zBase * Trt + (1|patient) + (1|obs), + data = epilepsy, family = poisson())) + +## define a prior on all population-level effects a once +prior$prior[1] <- "normal(0,10)" + +## define a specific prior on the population-level effect of Trt +prior$prior[5] <- "student_t(10, 0, 5)" + +## verify that the priors indeed found their way into Stan's model code +make_stancode(count ~ zAge + zBase * Trt + (1|patient) + (1|obs), + data = epilepsy, family = poisson(), + prior = prior) + +} +\seealso{ +\code{\link{set_prior}} +} From 3a23f7d6bbb3bb16cbc6bcbd0a4586b5f97494d5 Mon Sep 17 00:00:00 2001 From: Ven Popov Date: Wed, 28 Feb 2024 19:01:38 +0100 Subject: [PATCH 2/8] set get_prior.default, update docs - use \code{\link[brms:get_prior.default]{get_prior}} ueverywhere where [brms:get_prior] was previously used to ensure links point to the default method documentation rather than the S3 method --- NAMESPACE | 4 +-- R/brm.R | 4 +-- R/priors.R | 28 ++++++++----------- man/brm.Rd | 4 +-- man/brm_multiple.Rd | 2 +- man/get_prior.Rd | 6 ++-- ...or.brmsformula.Rd => get_prior.default.Rd} | 6 ++-- man/make_stancode.Rd | 2 +- man/make_standata.Rd | 2 +- man/set_prior.Rd | 4 +-- man/validate_prior.Rd | 4 +-- 11 files changed, 29 insertions(+), 37 deletions(-) rename man/{get_prior.brmsformula.Rd => get_prior.default.Rd} (97%) diff --git a/NAMESPACE b/NAMESPACE index 99fa744dd..1f066658d 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -116,9 +116,7 @@ S3method(get_group_vars,default) S3method(get_group_vars,mvbrmsterms) S3method(get_int_vars,brmsterms) S3method(get_int_vars,mvbrmsterms) -S3method(get_prior,brmsformula) -S3method(get_prior,formula) -S3method(get_prior,mvbrmsformula) +S3method(get_prior,default) S3method(get_re,brmsterms) S3method(get_re,btl) S3method(get_re,default) diff --git a/R/brm.R b/R/brm.R index e5207e644..c0892aa2f 100644 --- a/R/brm.R +++ b/R/brm.R @@ -31,7 +31,7 @@ #' \code{family} might also be a list of families. #' @param prior One or more \code{brmsprior} objects created by #' \code{\link{set_prior}} or related functions and combined using the -#' \code{c} method or the \code{+} operator. See also \code{\link{get_prior}} +#' \code{c} method or the \code{+} operator. See also \code{\link[brms:get_prior.default]{get_prior}} #' for more help. #' @param data2 A named \code{list} of objects containing data, which #' cannot be passed via argument \code{data}. Required for some objects @@ -271,7 +271,7 @@ #' \code{\link[brms:set_prior]{set_prior}} function. Its documentation #' contains detailed information on how to correctly specify priors. To find #' out on which parameters or parameter classes priors can be defined, use -#' \code{\link[brms:get_prior]{get_prior}}. Default priors are chosen to be +#' \code{\link[brms:get_prior.default]{get_prior}}. Default priors are chosen to be #' non or very weakly informative so that their influence on the results will #' be negligible and you usually don't have to worry about them. However, #' after getting more familiar with Bayesian statistics, I recommend you to diff --git a/R/priors.R b/R/priors.R index 7f2989a5b..d635b4388 100644 --- a/R/priors.R +++ b/R/priors.R @@ -62,7 +62,7 @@ #' set priors on. Often, it may not be immediately clear, which parameters are #' present in the model. To get a full list of parameters and parameter #' classes for which priors can be specified (depending on the model) use -#' function \code{\link{get_prior}}. +#' function \code{\link[brms:get_prior.default]{get_prior}}. #' #' 1. Population-level ('fixed') effects #' @@ -308,7 +308,7 @@ #' function, for example, \code{constant(1)} to fix a parameter to 1. #' Broadcasting to vectors and matrices is done automatically. #' -#' @seealso \code{\link{get_prior}} +#' @seealso \code{\link[brms:get_prior.default]{get_prior}} #' #' @examples #' ## use alias functions @@ -446,7 +446,8 @@ prior_string <- function(prior, ...) { #' #' You can view the available methods by typing \code{methods(get_prior)}. #' -#' The default method applied to a \code{formula} is \code{\link{get_prior.brmsformula}} +#' See \code{\link[brms:get_prior.default]{get_prior}} for default method applied for \pkg{brms} +#' #' #' @param formula A formula object whose class will determine which method will #' be used. A symbolic description of the model to be fitted. @@ -464,13 +465,13 @@ prior_string <- function(prior, ...) { #' (prior <- get_prior(count ~ zAge + zBase * Trt + (1|patient) + (1|obs), #' data = epilepsy, family = poisson())) #' -#' ## for more examples, see ?get_prior.brmsformula for \pkg{brms} and for the other +#' ## for more examples, see ?get_prior.default for \pkg{brms} and for the other #' ## methods by first calling: #' methods(get_prior) #' #' ## and then ?get_prior.* where * is the method name #' -#' @seealso \code{\link{set_prior}} +#' @seealso \code{\link{set_prior}} \code{\link{get_prior.default}} #' @export get_prior <- function(formula, data, ...) { UseMethod('get_prior') @@ -481,7 +482,6 @@ get_prior <- function(formula, data, ...) { #' Get information on all parameters (and parameter classes) for which priors #' may be specified including default priors. #' -#' @name get_prior.brmsformula #' @inheritParams brm #' @param ... Other arguments for internal usage only. #' @@ -509,9 +509,9 @@ get_prior <- function(formula, data, ...) { #' prior = prior) #' #' @export -get_prior.brmsformula <- function(formula, data, family = gaussian(), autocor = NULL, - data2 = NULL, knots = NULL, drop_unused_levels = TRUE, - sparse = NULL, ...) { +get_prior.default <- function(formula, data, family = gaussian(), autocor = NULL, + data2 = NULL, knots = NULL, drop_unused_levels = TRUE, + sparse = NULL, ...) { if (is.brmsfit(formula)) { stop2("Use 'prior_summary' to extract priors from 'brmsfit' objects.") } @@ -532,12 +532,6 @@ get_prior.brmsformula <- function(formula, data, family = gaussian(), autocor = .get_prior(bterms, data, ...) } -#' @export -get_prior.formula <- get_prior.brmsformula - -#' @export -get_prior.mvbrmsformula <- get_prior.brmsformula - # internal work function of 'get_prior' # @param internal return priors for internal use? # @return a brmsprior object @@ -1191,12 +1185,12 @@ def_scale_prior.brmsterms <- function(x, data, center = TRUE, df = 3, #' Validate priors supplied by the user. Return a complete #' set of priors for the given model, including default priors. #' -#' @inheritParams get_prior +#' @inheritParams get_prior.default #' @inheritParams brm #' #' @return An object of class \code{brmsprior}. #' -#' @seealso \code{\link{get_prior}}, \code{\link{set_prior}}. +#' @seealso \code{\link[brms:get_prior.default]{get_prior}}, \code{\link{set_prior}}. #' #' @examples #' prior1 <- prior(normal(0,10), class = b) + diff --git a/man/brm.Rd b/man/brm.Rd index d52e41c03..3f0083db0 100644 --- a/man/brm.Rd +++ b/man/brm.Rd @@ -70,7 +70,7 @@ linear \code{gaussian} model is applied. In multivariate models, \item{prior}{One or more \code{brmsprior} objects created by \code{\link{set_prior}} or related functions and combined using the -\code{c} method or the \code{+} operator. See also \code{\link{get_prior}} +\code{c} method or the \code{+} operator. See also \code{\link[brms:get_prior.default]{get_prior}} for more help.} \item{autocor}{(Deprecated) An optional \code{\link{cor_brms}} object @@ -363,7 +363,7 @@ Fit a generalized (non-)linear multivariate multilevel model via \code{\link[brms:set_prior]{set_prior}} function. Its documentation contains detailed information on how to correctly specify priors. To find out on which parameters or parameter classes priors can be defined, use - \code{\link[brms:get_prior]{get_prior}}. Default priors are chosen to be + \code{\link[brms:get_prior.default]{get_prior}}. Default priors are chosen to be non or very weakly informative so that their influence on the results will be negligible and you usually don't have to worry about them. However, after getting more familiar with Bayesian statistics, I recommend you to diff --git a/man/brm_multiple.Rd b/man/brm_multiple.Rd index 000057a27..efc49719b 100644 --- a/man/brm_multiple.Rd +++ b/man/brm_multiple.Rd @@ -51,7 +51,7 @@ linear \code{gaussian} model is applied. In multivariate models, \item{prior}{One or more \code{brmsprior} objects created by \code{\link{set_prior}} or related functions and combined using the -\code{c} method or the \code{+} operator. See also \code{\link{get_prior}} +\code{c} method or the \code{+} operator. See also \code{\link[brms:get_prior.default]{get_prior}} for more help.} \item{data2}{A \emph{list} of named lists each of which will be used to fit a diff --git a/man/get_prior.Rd b/man/get_prior.Rd index 5276af5c3..1845f215b 100644 --- a/man/get_prior.Rd +++ b/man/get_prior.Rd @@ -29,14 +29,14 @@ A data.frame with columns \code{prior}, \code{class}, \code{coef}, You can view the available methods by typing \code{methods(get_prior)}. - The default method applied to a \code{formula} is \code{\link{get_prior.brmsformula}} + See \code{\link[brms:get_prior.default]{get_prior}} for default method applied for \pkg{brms} } \examples{ ## get all parameters and parameters classes to define priors on (prior <- get_prior(count ~ zAge + zBase * Trt + (1|patient) + (1|obs), data = epilepsy, family = poisson())) -## for more examples, see ?get_prior.brmsformula for \pkg{brms} and for the other +## for more examples, see ?get_prior.default for \pkg{brms} and for the other ## methods by first calling: methods(get_prior) @@ -44,5 +44,5 @@ methods(get_prior) } \seealso{ -\code{\link{set_prior}} +\code{\link{set_prior}} \code{\link{get_prior.default}} } diff --git a/man/get_prior.brmsformula.Rd b/man/get_prior.default.Rd similarity index 97% rename from man/get_prior.brmsformula.Rd rename to man/get_prior.default.Rd index 15b15e0f6..178b2f725 100644 --- a/man/get_prior.brmsformula.Rd +++ b/man/get_prior.default.Rd @@ -1,10 +1,10 @@ % Generated by roxygen2: do not edit by hand % Please edit documentation in R/priors.R -\name{get_prior.brmsformula} -\alias{get_prior.brmsformula} +\name{get_prior.default} +\alias{get_prior.default} \title{Overview on Priors for \pkg{brms} Models} \usage{ -\method{get_prior}{brmsformula}( +\method{get_prior}{default}( formula, data, family = gaussian(), diff --git a/man/make_stancode.Rd b/man/make_stancode.Rd index 21a6a530c..4529b4a28 100644 --- a/man/make_stancode.Rd +++ b/man/make_stancode.Rd @@ -45,7 +45,7 @@ linear \code{gaussian} model is applied. In multivariate models, \item{prior}{One or more \code{brmsprior} objects created by \code{\link{set_prior}} or related functions and combined using the -\code{c} method or the \code{+} operator. See also \code{\link{get_prior}} +\code{c} method or the \code{+} operator. See also \code{\link[brms:get_prior.default]{get_prior}} for more help.} \item{autocor}{(Deprecated) An optional \code{\link{cor_brms}} object diff --git a/man/make_standata.Rd b/man/make_standata.Rd index 3f5bea9da..9828d36e3 100644 --- a/man/make_standata.Rd +++ b/man/make_standata.Rd @@ -41,7 +41,7 @@ linear \code{gaussian} model is applied. In multivariate models, \item{prior}{One or more \code{brmsprior} objects created by \code{\link{set_prior}} or related functions and combined using the -\code{c} method or the \code{+} operator. See also \code{\link{get_prior}} +\code{c} method or the \code{+} operator. See also \code{\link[brms:get_prior.default]{get_prior}} for more help.} \item{autocor}{(Deprecated) An optional \code{\link{cor_brms}} object diff --git a/man/set_prior.Rd b/man/set_prior.Rd index d163c9661..785ddeb29 100644 --- a/man/set_prior.Rd +++ b/man/set_prior.Rd @@ -104,7 +104,7 @@ Define priors for specific parameters or classes of parameters. set priors on. Often, it may not be immediately clear, which parameters are present in the model. To get a full list of parameters and parameter classes for which priors can be specified (depending on the model) use - function \code{\link{get_prior}}. + function \code{\link[brms:get_prior.default]{get_prior}}. 1. Population-level ('fixed') effects @@ -408,5 +408,5 @@ set_prior("normal(0, 2)", dpar = c("muX", "muY", "muZ")) } \seealso{ -\code{\link{get_prior}} +\code{\link[brms:get_prior.default]{get_prior}} } diff --git a/man/validate_prior.Rd b/man/validate_prior.Rd index 9272afe68..f1c54e919 100644 --- a/man/validate_prior.Rd +++ b/man/validate_prior.Rd @@ -19,7 +19,7 @@ validate_prior( \arguments{ \item{prior}{One or more \code{brmsprior} objects created by \code{\link{set_prior}} or related functions and combined using the -\code{c} method or the \code{+} operator. See also \code{\link{get_prior}} +\code{c} method or the \code{+} operator. See also \code{\link[brms:get_prior.default]{get_prior}} for more help.} \item{formula}{An object of class \code{\link[stats:formula]{formula}}, @@ -83,5 +83,5 @@ validate_prior(prior1, count ~ zAge + zBase * Trt + (1|patient), } \seealso{ -\code{\link{get_prior}}, \code{\link{set_prior}}. +\code{\link[brms:get_prior.default]{get_prior}}, \code{\link{set_prior}}. } From 8bb6bd1a43b5dd28dcbb2cffdaf69e402ff2e52c Mon Sep 17 00:00:00 2001 From: Ven Popov Date: Wed, 28 Feb 2024 19:43:17 +0100 Subject: [PATCH 3/8] transform make_standata to an S3 generic - assign previous function to make_standata.default - update links in docs to \code{\link[brms:make_standata.default]{make_standata} --- NAMESPACE | 1 + R/brms-package.R | 2 +- R/brmsfit-helpers.R | 2 +- R/make_standata.R | 51 ++++++++++++-- R/priors.R | 12 ++-- man/brms-package.Rd | 2 +- man/brmsfit_needs_refit.Rd | 2 +- man/get_prior.Rd | 12 ++-- man/make_standata.Rd | 129 +++++++---------------------------- man/make_standata.default.Rd | 126 ++++++++++++++++++++++++++++++++++ man/standata.brmsfit.Rd | 2 +- 11 files changed, 216 insertions(+), 125 deletions(-) create mode 100644 man/make_standata.default.Rd diff --git a/NAMESPACE b/NAMESPACE index 1f066658d..7a8619bd8 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -143,6 +143,7 @@ S3method(loo_moment_match,brmsfit) S3method(loo_predict,brmsfit) S3method(loo_predictive_interval,brmsfit) S3method(loo_subsample,brmsfit) +S3method(make_standata,default) S3method(marginal_effects,brmsfit) S3method(marginal_smooths,brmsfit) S3method(mcmc_plot,brmsfit) diff --git a/R/brms-package.R b/R/brms-package.R index 3bb88305d..54d475545 100644 --- a/R/brms-package.R +++ b/R/brms-package.R @@ -23,7 +23,7 @@ #' (see \code{\link{brmsformula}} for details). Based on the supplied #' formulas, data, and additional information, it writes the Stan code #' on the fly via \code{\link{make_stancode}}, prepares the data via -#' \code{\link{make_standata}}, and fits the model using +#' \code{\link[brms:make_standata.default]{make_standata}} and fits the model using #' \pkg{\link[rstan:rstan]{Stan}}. #' #' Subsequently, a large number of post-processing methods can be applied: diff --git a/R/brmsfit-helpers.R b/R/brmsfit-helpers.R index 88b7254ff..73795cf4f 100644 --- a/R/brmsfit-helpers.R +++ b/R/brmsfit-helpers.R @@ -871,7 +871,7 @@ validate_cores_post_processing <- function(cores) { #' and scripts should not use it. #' #' @param fit Old \code{brmsfit} object (e.g., loaded from file). -#' @param sdata New Stan data (result of a call to \code{\link{make_standata}}). +#' @param sdata New Stan data (result of a call to \code{\link[brms:make_standata.default]{make_standata}}). #' Pass \code{NULL} to avoid this data check. #' @param scode New Stan code (result of a call to \code{\link{make_stancode}}). #' Pass \code{NULL} to avoid this code check. diff --git a/R/make_standata.R b/R/make_standata.R index f20975a3e..e2a4a9712 100644 --- a/R/make_standata.R +++ b/R/make_standata.R @@ -1,3 +1,42 @@ +#' @title Data for a Bayesian multilevel model +#' +#' @description \code{make_standata} is a generic function that can be used to +#' generate the data to fit Bayesian multilevel models from various packages +#' with Stan. The function invokes particular methods which depend on the +#' class of the formula object. +#' +#' You can view the available methods by typing \code{methods(make_standata)}. +#' +#' See \code{\link[brms:make_standata.default]{make_standata}} for the default +#' method applied for \pkg{brms} +#' +#' @param formula A formula object whose class will determine which method will +#' be used. A symbolic description of the model to be fitted. +#' @param data An object of class data.frame, or one that can be coerced to that +#' class) containing data of all variables used in the model. +#' @param ... Further arguments passed to the specific method +#' +#' @return A named list of objects containing the required data to fit a +#' \pkg{brms} model with \pkg{Stan}. +#' +#' @examples +#' sdata1 <- make_standata(rating ~ treat + period + carry + (1|subject), +#' data = inhaler, family = "cumulative") +#' str(sdata1) +#' +#' ## for more examples, see ?make_standata.default for \pkg{brms} and for the other +#' ## methods by first calling: +#' methods(make_standata) +#' +#' ## and then ?make_standata.* where * is the method name +#' +#' @seealso \code{\link{make_standata.default}} +#' @export +make_standata <- function(formula, data, ...) { + UseMethod("make_standata") +} + + #' Data for \pkg{brms} Models #' #' Generate data for \pkg{brms} models to be passed to \pkg{Stan} @@ -20,11 +59,11 @@ #' str(sdata2) #' #' @export -make_standata <- function(formula, data, family = gaussian(), prior = NULL, - autocor = NULL, data2 = NULL, cov_ranef = NULL, - sample_prior = "no", stanvars = NULL, - threads = getOption("brms.threads", NULL), - knots = NULL, drop_unused_levels = TRUE, ...) { +make_standata.default <- function(formula, data, family = gaussian(), prior = NULL, + autocor = NULL, data2 = NULL, cov_ranef = NULL, + sample_prior = "no", stanvars = NULL, + threads = getOption("brms.threads", NULL), + knots = NULL, drop_unused_levels = TRUE, ...) { if (is.brmsfit(formula)) { stop2("Use 'standata' to extract Stan data from 'brmsfit' objects.") @@ -126,7 +165,7 @@ make_standata <- function(formula, data, family = gaussian(), prior = NULL, #' @aliases standata.brmsfit #' #' @param object An object of class \code{brmsfit}. -#' @param ... More arguments passed to \code{\link{make_standata}} +#' @param ... More arguments passed to \code{\link[brms:make_standata.default]{make_standata}} #' and \code{\link{validate_newdata}}. #' @inheritParams prepare_predictions #' diff --git a/R/priors.R b/R/priors.R index d635b4388..05d960246 100644 --- a/R/priors.R +++ b/R/priors.R @@ -439,14 +439,16 @@ prior_string <- function(prior, ...) { } #' @title Get default priors for a Bayesian multilevel model -#' @description \code{get_prior} is a generic function that can be used to obtain the -#' default priors for a Bayesian multilevel model from various packages that -#' use the \pkg{brms} package for fitting the model. The function invokes -#' particular methods which depend on the class of the first argument. +#' @description \code{get_prior} is a generic function that can be used to +#' obtain the default priors for a Bayesian multilevel model from various +#' packages that use the \pkg{brms} package for fitting the model. The +#' function invokes particular methods which depend on the class of the +#' formula object. #' #' You can view the available methods by typing \code{methods(get_prior)}. #' -#' See \code{\link[brms:get_prior.default]{get_prior}} for default method applied for \pkg{brms} +#' See \code{\link[brms:get_prior.default]{get_prior}} for the default method +#' applied for \pkg{brms} #' #' #' @param formula A formula object whose class will determine which method will diff --git a/man/brms-package.Rd b/man/brms-package.Rd index afc1c9a8e..bde65f468 100644 --- a/man/brms-package.Rd +++ b/man/brms-package.Rd @@ -24,7 +24,7 @@ formula syntax to specify a wide range of complex Bayesian models (see \code{\link{brmsformula}} for details). Based on the supplied formulas, data, and additional information, it writes the Stan code on the fly via \code{\link{make_stancode}}, prepares the data via -\code{\link{make_standata}}, and fits the model using +\code{\link[brms:make_standata.default]{make_standata}} and fits the model using \pkg{\link[rstan:rstan]{Stan}}. Subsequently, a large number of post-processing methods can be applied: diff --git a/man/brmsfit_needs_refit.Rd b/man/brmsfit_needs_refit.Rd index ab53343d2..35e6db2e8 100644 --- a/man/brmsfit_needs_refit.Rd +++ b/man/brmsfit_needs_refit.Rd @@ -17,7 +17,7 @@ brmsfit_needs_refit( \arguments{ \item{fit}{Old \code{brmsfit} object (e.g., loaded from file).} -\item{sdata}{New Stan data (result of a call to \code{\link{make_standata}}). +\item{sdata}{New Stan data (result of a call to \code{\link[brms:make_standata.default]{make_standata}}). Pass \code{NULL} to avoid this data check.} \item{scode}{New Stan code (result of a call to \code{\link{make_stancode}}). diff --git a/man/get_prior.Rd b/man/get_prior.Rd index 1845f215b..c15c623dd 100644 --- a/man/get_prior.Rd +++ b/man/get_prior.Rd @@ -22,14 +22,16 @@ A data.frame with columns \code{prior}, \code{class}, \code{coef}, column is empty except for internal default priors. } \description{ -\code{get_prior} is a generic function that can be used to obtain the - default priors for a Bayesian multilevel model from various packages that - use the \pkg{brms} package for fitting the model. The function invokes - particular methods which depend on the class of the first argument. +\code{get_prior} is a generic function that can be used to + obtain the default priors for a Bayesian multilevel model from various + packages that use the \pkg{brms} package for fitting the model. The + function invokes particular methods which depend on the class of the + formula object. You can view the available methods by typing \code{methods(get_prior)}. - See \code{\link[brms:get_prior.default]{get_prior}} for default method applied for \pkg{brms} + See \code{\link[brms:get_prior.default]{get_prior}} for the default method + applied for \pkg{brms} } \examples{ ## get all parameters and parameters classes to define priors on diff --git a/man/make_standata.Rd b/man/make_standata.Rd index 9828d36e3..0713f0668 100644 --- a/man/make_standata.Rd +++ b/man/make_standata.Rd @@ -2,125 +2,46 @@ % Please edit documentation in R/make_standata.R \name{make_standata} \alias{make_standata} -\title{Data for \pkg{brms} Models} +\title{Data for a Bayesian multilevel model} \usage{ -make_standata( - formula, - data, - family = gaussian(), - prior = NULL, - autocor = NULL, - data2 = NULL, - cov_ranef = NULL, - sample_prior = "no", - stanvars = NULL, - threads = getOption("brms.threads", NULL), - knots = NULL, - drop_unused_levels = TRUE, - ... -) +make_standata(formula, data, ...) } \arguments{ -\item{formula}{An object of class \code{\link[stats:formula]{formula}}, -\code{\link{brmsformula}}, or \code{\link{mvbrmsformula}} (or one that can -be coerced to that classes): A symbolic description of the model to be -fitted. The details of model specification are explained in -\code{\link{brmsformula}}.} +\item{formula}{A formula object whose class will determine which method will +be used. A symbolic description of the model to be fitted.} -\item{data}{An object of class \code{data.frame} (or one that can be coerced -to that class) containing data of all variables used in the model.} +\item{data}{An object of class data.frame, or one that can be coerced to that +class) containing data of all variables used in the model.} -\item{family}{A description of the response distribution and link function to -be used in the model. This can be a family function, a call to a family -function or a character string naming the family. Every family function has -a \code{link} argument allowing to specify the link function to be applied -on the response variable. If not specified, default links are used. For -details of supported families see \code{\link{brmsfamily}}. By default, a -linear \code{gaussian} model is applied. In multivariate models, -\code{family} might also be a list of families.} - -\item{prior}{One or more \code{brmsprior} objects created by -\code{\link{set_prior}} or related functions and combined using the -\code{c} method or the \code{+} operator. See also \code{\link[brms:get_prior.default]{get_prior}} -for more help.} - -\item{autocor}{(Deprecated) An optional \code{\link{cor_brms}} object -describing the correlation structure within the response variable (i.e., -the 'autocorrelation'). See the documentation of \code{\link{cor_brms}} for -a description of the available correlation structures. Defaults to -\code{NULL}, corresponding to no correlations. In multivariate models, -\code{autocor} might also be a list of autocorrelation structures. -It is now recommend to specify autocorrelation terms directly -within \code{formula}. See \code{\link{brmsformula}} for more details.} - -\item{data2}{A named \code{list} of objects containing data, which -cannot be passed via argument \code{data}. Required for some objects -used in autocorrelation structures to specify dependency structures -as well as for within-group covariance matrices.} - -\item{cov_ranef}{(Deprecated) A list of matrices that are proportional to the -(within) covariance structure of the group-level effects. The names of the -matrices should correspond to columns in \code{data} that are used as -grouping factors. All levels of the grouping factor should appear as -rownames of the corresponding matrix. This argument can be used, among -others to model pedigrees and phylogenetic effects. -It is now recommended to specify those matrices in the formula -interface using the \code{\link{gr}} and related functions. See -\code{vignette("brms_phylogenetics")} for more details.} - -\item{sample_prior}{Indicate if draws from priors should be drawn -additionally to the posterior draws. Options are \code{"no"} (the -default), \code{"yes"}, and \code{"only"}. Among others, these draws can -be used to calculate Bayes factors for point hypotheses via -\code{\link{hypothesis}}. Please note that improper priors are not sampled, -including the default improper priors used by \code{brm}. See -\code{\link{set_prior}} on how to set (proper) priors. Please also note -that prior draws for the overall intercept are not obtained by default -for technical reasons. See \code{\link{brmsformula}} how to obtain prior -draws for the intercept. If \code{sample_prior} is set to \code{"only"}, -draws are drawn solely from the priors ignoring the likelihood, which -allows among others to generate draws from the prior predictive -distribution. In this case, all parameters must have proper priors.} - -\item{stanvars}{An optional \code{stanvars} object generated by function -\code{\link{stanvar}} to define additional variables for use in -\pkg{Stan}'s program blocks.} - -\item{threads}{Number of threads to use in within-chain parallelization. For -more control over the threading process, \code{threads} may also be a -\code{brmsthreads} object created by \code{\link{threading}}. Within-chain -parallelization is experimental! We recommend its use only if you are -experienced with Stan's \code{reduce_sum} function and have a slow running -model that cannot be sped up by any other means. Can be set globally for -the current \R session via the \code{"brms.threads"} option (see -\code{\link{options}}).} - -\item{knots}{Optional list containing user specified knot values to be used -for basis construction of smoothing terms. See -\code{\link[mgcv:gamm]{gamm}} for more details.} - -\item{drop_unused_levels}{Should unused factors levels in the data be -dropped? Defaults to \code{TRUE}.} - -\item{...}{Other arguments for internal use.} +\item{...}{Further arguments passed to the specific method} } \value{ -A named list of objects containing the required data - to fit a \pkg{brms} model with \pkg{Stan}. +A named list of objects containing the required data to fit a + \pkg{brms} model with \pkg{Stan}. } \description{ -Generate data for \pkg{brms} models to be passed to \pkg{Stan} +\code{make_standata} is a generic function that can be used to + generate the data to fit Bayesian multilevel models from various packages + with Stan. The function invokes particular methods which depend on the + class of the formula object. + + You can view the available methods by typing \code{methods(make_standata)}. + + See \code{\link[brms:make_standata.default]{make_standata}} for the default + method applied for \pkg{brms} } \examples{ sdata1 <- make_standata(rating ~ treat + period + carry + (1|subject), data = inhaler, family = "cumulative") str(sdata1) -sdata2 <- make_standata(count ~ zAge + zBase * Trt + (1|patient), - data = epilepsy, family = "poisson") -str(sdata2) +## for more examples, see ?make_standata.default for \pkg{brms} and for the other +## methods by first calling: +methods(make_standata) + +## and then ?make_standata.* where * is the method name } -\author{ -Paul-Christian Buerkner \email{paul.buerkner@gmail.com} +\seealso{ +\code{\link{make_standata.default}} } diff --git a/man/make_standata.default.Rd b/man/make_standata.default.Rd new file mode 100644 index 000000000..368cc0641 --- /dev/null +++ b/man/make_standata.default.Rd @@ -0,0 +1,126 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/make_standata.R +\name{make_standata.default} +\alias{make_standata.default} +\title{Data for \pkg{brms} Models} +\usage{ +\method{make_standata}{default}( + formula, + data, + family = gaussian(), + prior = NULL, + autocor = NULL, + data2 = NULL, + cov_ranef = NULL, + sample_prior = "no", + stanvars = NULL, + threads = getOption("brms.threads", NULL), + knots = NULL, + drop_unused_levels = TRUE, + ... +) +} +\arguments{ +\item{formula}{An object of class \code{\link[stats:formula]{formula}}, +\code{\link{brmsformula}}, or \code{\link{mvbrmsformula}} (or one that can +be coerced to that classes): A symbolic description of the model to be +fitted. The details of model specification are explained in +\code{\link{brmsformula}}.} + +\item{data}{An object of class \code{data.frame} (or one that can be coerced +to that class) containing data of all variables used in the model.} + +\item{family}{A description of the response distribution and link function to +be used in the model. This can be a family function, a call to a family +function or a character string naming the family. Every family function has +a \code{link} argument allowing to specify the link function to be applied +on the response variable. If not specified, default links are used. For +details of supported families see \code{\link{brmsfamily}}. By default, a +linear \code{gaussian} model is applied. In multivariate models, +\code{family} might also be a list of families.} + +\item{prior}{One or more \code{brmsprior} objects created by +\code{\link{set_prior}} or related functions and combined using the +\code{c} method or the \code{+} operator. See also \code{\link[brms:get_prior.default]{get_prior}} +for more help.} + +\item{autocor}{(Deprecated) An optional \code{\link{cor_brms}} object +describing the correlation structure within the response variable (i.e., +the 'autocorrelation'). See the documentation of \code{\link{cor_brms}} for +a description of the available correlation structures. Defaults to +\code{NULL}, corresponding to no correlations. In multivariate models, +\code{autocor} might also be a list of autocorrelation structures. +It is now recommend to specify autocorrelation terms directly +within \code{formula}. See \code{\link{brmsformula}} for more details.} + +\item{data2}{A named \code{list} of objects containing data, which +cannot be passed via argument \code{data}. Required for some objects +used in autocorrelation structures to specify dependency structures +as well as for within-group covariance matrices.} + +\item{cov_ranef}{(Deprecated) A list of matrices that are proportional to the +(within) covariance structure of the group-level effects. The names of the +matrices should correspond to columns in \code{data} that are used as +grouping factors. All levels of the grouping factor should appear as +rownames of the corresponding matrix. This argument can be used, among +others to model pedigrees and phylogenetic effects. +It is now recommended to specify those matrices in the formula +interface using the \code{\link{gr}} and related functions. See +\code{vignette("brms_phylogenetics")} for more details.} + +\item{sample_prior}{Indicate if draws from priors should be drawn +additionally to the posterior draws. Options are \code{"no"} (the +default), \code{"yes"}, and \code{"only"}. Among others, these draws can +be used to calculate Bayes factors for point hypotheses via +\code{\link{hypothesis}}. Please note that improper priors are not sampled, +including the default improper priors used by \code{brm}. See +\code{\link{set_prior}} on how to set (proper) priors. Please also note +that prior draws for the overall intercept are not obtained by default +for technical reasons. See \code{\link{brmsformula}} how to obtain prior +draws for the intercept. If \code{sample_prior} is set to \code{"only"}, +draws are drawn solely from the priors ignoring the likelihood, which +allows among others to generate draws from the prior predictive +distribution. In this case, all parameters must have proper priors.} + +\item{stanvars}{An optional \code{stanvars} object generated by function +\code{\link{stanvar}} to define additional variables for use in +\pkg{Stan}'s program blocks.} + +\item{threads}{Number of threads to use in within-chain parallelization. For +more control over the threading process, \code{threads} may also be a +\code{brmsthreads} object created by \code{\link{threading}}. Within-chain +parallelization is experimental! We recommend its use only if you are +experienced with Stan's \code{reduce_sum} function and have a slow running +model that cannot be sped up by any other means. Can be set globally for +the current \R session via the \code{"brms.threads"} option (see +\code{\link{options}}).} + +\item{knots}{Optional list containing user specified knot values to be used +for basis construction of smoothing terms. See +\code{\link[mgcv:gamm]{gamm}} for more details.} + +\item{drop_unused_levels}{Should unused factors levels in the data be +dropped? Defaults to \code{TRUE}.} + +\item{...}{Other arguments for internal use.} +} +\value{ +A named list of objects containing the required data + to fit a \pkg{brms} model with \pkg{Stan}. +} +\description{ +Generate data for \pkg{brms} models to be passed to \pkg{Stan} +} +\examples{ +sdata1 <- make_standata(rating ~ treat + period + carry + (1|subject), + data = inhaler, family = "cumulative") +str(sdata1) + +sdata2 <- make_standata(count ~ zAge + zBase * Trt + (1|patient), + data = epilepsy, family = "poisson") +str(sdata2) + +} +\author{ +Paul-Christian Buerkner \email{paul.buerkner@gmail.com} +} diff --git a/man/standata.brmsfit.Rd b/man/standata.brmsfit.Rd index 79e5d7e56..24d821c42 100644 --- a/man/standata.brmsfit.Rd +++ b/man/standata.brmsfit.Rd @@ -40,7 +40,7 @@ used in autocorrelation structures, or \code{\link{stanvars}}.} specified via \code{autocor} should be included in the predictions. Defaults to \code{TRUE}.} -\item{...}{More arguments passed to \code{\link{make_standata}} +\item{...}{More arguments passed to \code{\link[brms:make_standata.default]{make_standata}} and \code{\link{validate_newdata}}.} } \value{ From 2fb8136e4f99c0e6cb4fb4fc1845b75e2db82ba3 Mon Sep 17 00:00:00 2001 From: Ven Popov Date: Wed, 28 Feb 2024 19:52:15 +0100 Subject: [PATCH 4/8] transform make_stancode to an S3 generic - assign previous function to make_stancode.default - update links in docs to \code{\link[brms:make_stancode.default]{make_stancode} - fix typo on line99 of make_standata.R incorrectly referring to make_stancode instead of make_standata --- NAMESPACE | 1 + R/brms-package.R | 2 +- R/brmsfit-helpers.R | 2 +- R/make_stancode.R | 78 +++++++++++++----- R/make_standata.R | 2 +- R/stanvars.R | 2 +- man/brms-package.Rd | 2 +- man/brmsfit_needs_refit.Rd | 2 +- man/make_stancode.Rd | 155 ++++++----------------------------- man/make_stancode.default.Rd | 149 +++++++++++++++++++++++++++++++++ man/stancode.brmsfit.Rd | 21 +++-- man/stanvar.Rd | 2 +- 12 files changed, 251 insertions(+), 167 deletions(-) create mode 100644 man/make_stancode.default.Rd diff --git a/NAMESPACE b/NAMESPACE index 7a8619bd8..c63e8ac63 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -143,6 +143,7 @@ S3method(loo_moment_match,brmsfit) S3method(loo_predict,brmsfit) S3method(loo_predictive_interval,brmsfit) S3method(loo_subsample,brmsfit) +S3method(make_stancode,default) S3method(make_standata,default) S3method(marginal_effects,brmsfit) S3method(marginal_smooths,brmsfit) diff --git a/R/brms-package.R b/R/brms-package.R index 54d475545..7c553dcb2 100644 --- a/R/brms-package.R +++ b/R/brms-package.R @@ -22,7 +22,7 @@ #' formula syntax to specify a wide range of complex Bayesian models #' (see \code{\link{brmsformula}} for details). Based on the supplied #' formulas, data, and additional information, it writes the Stan code -#' on the fly via \code{\link{make_stancode}}, prepares the data via +#' on the fly via \code{\link[brms:make_stancode.default]{make_stancode}}, prepares the data via #' \code{\link[brms:make_standata.default]{make_standata}} and fits the model using #' \pkg{\link[rstan:rstan]{Stan}}. #' diff --git a/R/brmsfit-helpers.R b/R/brmsfit-helpers.R index 73795cf4f..af35a64e6 100644 --- a/R/brmsfit-helpers.R +++ b/R/brmsfit-helpers.R @@ -873,7 +873,7 @@ validate_cores_post_processing <- function(cores) { #' @param fit Old \code{brmsfit} object (e.g., loaded from file). #' @param sdata New Stan data (result of a call to \code{\link[brms:make_standata.default]{make_standata}}). #' Pass \code{NULL} to avoid this data check. -#' @param scode New Stan code (result of a call to \code{\link{make_stancode}}). +#' @param scode New Stan code (result of a call to \code{\link[brms:make_stancode.default]{make_stancode}}). #' Pass \code{NULL} to avoid this code check. #' @param data New data to check consistency of factor level names. #' Pass \code{NULL} to avoid this data check. diff --git a/R/make_stancode.R b/R/make_stancode.R index 80f484b2e..f8574ac2f 100644 --- a/R/make_stancode.R +++ b/R/make_stancode.R @@ -1,3 +1,42 @@ +#' @title Stan Code for a Bayesian multilevel model +#' +#' @description \code{make_stancode} is a generic function that can be used to +#' generate the Stan code to fit Bayesian multilevel models from various packages +#' with Stan. The function invokes particular methods which depend on the +#' class of the formula object. +#' +#' You can view the available methods by typing \code{methods(make_stancode)}. +#' +#' See \code{\link[brms:make_stancode.default]{make_stancode}} for the default +#' method applied for \pkg{brms} +#' +#' @param formula A formula object whose class will determine which method will +#' be used. A symbolic description of the model to be fitted. +#' @param data An object of class data.frame, or one that can be coerced to that +#' class) containing data of all variables used in the model. +#' @param ... Further arguments passed to the specific method +#' +#' @return A named list of objects containing the required data to fit a +#' \pkg{brms} model with \pkg{Stan}. +#' +#' @examples +#' make_stancode(rating ~ treat + period + carry + (1|subject), +#' data = inhaler, family = "cumulative") +#' +#' ## for more examples, see ?make_stancode.default for \pkg{brms} and for the other +#' ## methods by first calling: +#' methods(make_stancode) +#' +#' ## and then ?make_stancode.* where * is the method name +#' +#' @seealso \code{\link{make_stancode.default}} +#' @export +make_stancode <- function(formula, data, ...) { + UseMethod("make_stancode") +} + + + #' Stan Code for \pkg{brms} Models #' #' Generate Stan code for \pkg{brms} models @@ -16,15 +55,15 @@ #' data = epilepsy, family = "poisson") #' #' @export -make_stancode <- function(formula, data, family = gaussian(), - prior = NULL, autocor = NULL, data2 = NULL, - cov_ranef = NULL, sparse = NULL, - sample_prior = "no", stanvars = NULL, - stan_funs = NULL, knots = NULL, - drop_unused_levels = TRUE, - threads = getOption("brms.threads", NULL), - normalize = getOption("brms.normalize", TRUE), - save_model = NULL, ...) { +make_stancode.default <- function(formula, data, family = gaussian(), + prior = NULL, autocor = NULL, data2 = NULL, + cov_ranef = NULL, sparse = NULL, + sample_prior = "no", stanvars = NULL, + stan_funs = NULL, knots = NULL, + drop_unused_levels = TRUE, + threads = getOption("brms.threads", NULL), + normalize = getOption("brms.normalize", TRUE), + save_model = NULL, ...) { if (is.brmsfit(formula)) { stop2("Use 'stancode' to extract Stan code from 'brmsfit' objects.") @@ -336,18 +375,17 @@ print.brmsmodel <- function(x, ...) { #' @aliases stancode.brmsfit #' #' @param object An object of class \code{brmsfit}. -#' @param version Logical; indicates if the first line containing -#' the \pkg{brms} version number should be included. -#' Defaults to \code{TRUE}. -#' @param regenerate Logical; indicates if the Stan code should -#' be regenerated with the current \pkg{brms} version. -#' By default, \code{regenerate} will be \code{FALSE} unless required -#' to be \code{TRUE} by other arguments. -#' @param threads Controls whether the Stan code should be threaded. -#' See \code{\link{threading}} for details. +#' @param version Logical; indicates if the first line containing the \pkg{brms} +#' version number should be included. Defaults to \code{TRUE}. +#' @param regenerate Logical; indicates if the Stan code should be regenerated +#' with the current \pkg{brms} version. By default, \code{regenerate} will be +#' \code{FALSE} unless required to be \code{TRUE} by other arguments. +#' @param threads Controls whether the Stan code should be threaded. See +#' \code{\link{threading}} for details. #' @param backend Controls the Stan backend. See \code{\link{brm}} for details. -#' @param ... Further arguments passed to \code{\link{make_stancode}} if the -#' Stan code is regenerated. +#' @param ... Further arguments passed to +#' \code{\link[brms:make_stancode.default]{make_stancode}} if the Stan code is +#' regenerated. #' #' @return Stan model code for further processing. #' diff --git a/R/make_standata.R b/R/make_standata.R index e2a4a9712..d7bfe47f8 100644 --- a/R/make_standata.R +++ b/R/make_standata.R @@ -96,7 +96,7 @@ make_standata.default <- function(formula, data, family = gaussian(), prior = NU ) } -# internal work function of 'make_stancode' +# internal work function of 'make_standata' # @param check_response check validity of the response? # @param only_response extract data related to the response only? # @param internal prepare Stan data for use in post-processing methods? diff --git a/R/stanvars.R b/R/stanvars.R index f80fe5491..0687142d4 100644 --- a/R/stanvars.R +++ b/R/stanvars.R @@ -39,7 +39,7 @@ #' code into the \code{'likelihood'} block while having \code{\link{threading}} #' activated. In this case, your custom Stan code may need adjustments to ensure #' correct observation indexing. Please investigate the generated Stan code via -#' \code{make_stancode} to see which adjustments are necessary in your case. +#' \code{\link[brms:make_stancode.default]{make_stancode}} to see which adjustments are necessary in your case. #' #' @examples #' bprior <- prior(normal(mean_intercept, 10), class = "Intercept") diff --git a/man/brms-package.Rd b/man/brms-package.Rd index bde65f468..bd9e9dc29 100644 --- a/man/brms-package.Rd +++ b/man/brms-package.Rd @@ -23,7 +23,7 @@ The main function of \pkg{brms} is \code{\link{brm}}, which uses formula syntax to specify a wide range of complex Bayesian models (see \code{\link{brmsformula}} for details). Based on the supplied formulas, data, and additional information, it writes the Stan code -on the fly via \code{\link{make_stancode}}, prepares the data via +on the fly via \code{\link[brms:make_stancode.default]{make_stancode}}, prepares the data via \code{\link[brms:make_standata.default]{make_standata}} and fits the model using \pkg{\link[rstan:rstan]{Stan}}. diff --git a/man/brmsfit_needs_refit.Rd b/man/brmsfit_needs_refit.Rd index 35e6db2e8..5520b0084 100644 --- a/man/brmsfit_needs_refit.Rd +++ b/man/brmsfit_needs_refit.Rd @@ -20,7 +20,7 @@ brmsfit_needs_refit( \item{sdata}{New Stan data (result of a call to \code{\link[brms:make_standata.default]{make_standata}}). Pass \code{NULL} to avoid this data check.} -\item{scode}{New Stan code (result of a call to \code{\link{make_stancode}}). +\item{scode}{New Stan code (result of a call to \code{\link[brms:make_stancode.default]{make_stancode}}). Pass \code{NULL} to avoid this code check.} \item{data}{New data to check consistency of factor level names. diff --git a/man/make_stancode.Rd b/man/make_stancode.Rd index 4529b4a28..af7bd4625 100644 --- a/man/make_stancode.Rd +++ b/man/make_stancode.Rd @@ -2,148 +2,45 @@ % Please edit documentation in R/make_stancode.R \name{make_stancode} \alias{make_stancode} -\title{Stan Code for \pkg{brms} Models} +\title{Stan Code for a Bayesian multilevel model} \usage{ -make_stancode( - formula, - data, - family = gaussian(), - prior = NULL, - autocor = NULL, - data2 = NULL, - cov_ranef = NULL, - sparse = NULL, - sample_prior = "no", - stanvars = NULL, - stan_funs = NULL, - knots = NULL, - drop_unused_levels = TRUE, - threads = getOption("brms.threads", NULL), - normalize = getOption("brms.normalize", TRUE), - save_model = NULL, - ... -) +make_stancode(formula, data, ...) } \arguments{ -\item{formula}{An object of class \code{\link[stats:formula]{formula}}, -\code{\link{brmsformula}}, or \code{\link{mvbrmsformula}} (or one that can -be coerced to that classes): A symbolic description of the model to be -fitted. The details of model specification are explained in -\code{\link{brmsformula}}.} +\item{formula}{A formula object whose class will determine which method will +be used. A symbolic description of the model to be fitted.} -\item{data}{An object of class \code{data.frame} (or one that can be coerced -to that class) containing data of all variables used in the model.} +\item{data}{An object of class data.frame, or one that can be coerced to that +class) containing data of all variables used in the model.} -\item{family}{A description of the response distribution and link function to -be used in the model. This can be a family function, a call to a family -function or a character string naming the family. Every family function has -a \code{link} argument allowing to specify the link function to be applied -on the response variable. If not specified, default links are used. For -details of supported families see \code{\link{brmsfamily}}. By default, a -linear \code{gaussian} model is applied. In multivariate models, -\code{family} might also be a list of families.} - -\item{prior}{One or more \code{brmsprior} objects created by -\code{\link{set_prior}} or related functions and combined using the -\code{c} method or the \code{+} operator. See also \code{\link[brms:get_prior.default]{get_prior}} -for more help.} - -\item{autocor}{(Deprecated) An optional \code{\link{cor_brms}} object -describing the correlation structure within the response variable (i.e., -the 'autocorrelation'). See the documentation of \code{\link{cor_brms}} for -a description of the available correlation structures. Defaults to -\code{NULL}, corresponding to no correlations. In multivariate models, -\code{autocor} might also be a list of autocorrelation structures. -It is now recommend to specify autocorrelation terms directly -within \code{formula}. See \code{\link{brmsformula}} for more details.} - -\item{data2}{A named \code{list} of objects containing data, which -cannot be passed via argument \code{data}. Required for some objects -used in autocorrelation structures to specify dependency structures -as well as for within-group covariance matrices.} - -\item{cov_ranef}{(Deprecated) A list of matrices that are proportional to the -(within) covariance structure of the group-level effects. The names of the -matrices should correspond to columns in \code{data} that are used as -grouping factors. All levels of the grouping factor should appear as -rownames of the corresponding matrix. This argument can be used, among -others to model pedigrees and phylogenetic effects. -It is now recommended to specify those matrices in the formula -interface using the \code{\link{gr}} and related functions. See -\code{vignette("brms_phylogenetics")} for more details.} - -\item{sparse}{(Deprecated) Logical; indicates whether the population-level -design matrices should be treated as sparse (defaults to \code{FALSE}). For -design matrices with many zeros, this can considerably reduce required -memory. Sampling speed is currently not improved or even slightly -decreased. It is now recommended to use the \code{sparse} argument of -\code{\link{brmsformula}} and related functions.} - -\item{sample_prior}{Indicate if draws from priors should be drawn -additionally to the posterior draws. Options are \code{"no"} (the -default), \code{"yes"}, and \code{"only"}. Among others, these draws can -be used to calculate Bayes factors for point hypotheses via -\code{\link{hypothesis}}. Please note that improper priors are not sampled, -including the default improper priors used by \code{brm}. See -\code{\link{set_prior}} on how to set (proper) priors. Please also note -that prior draws for the overall intercept are not obtained by default -for technical reasons. See \code{\link{brmsformula}} how to obtain prior -draws for the intercept. If \code{sample_prior} is set to \code{"only"}, -draws are drawn solely from the priors ignoring the likelihood, which -allows among others to generate draws from the prior predictive -distribution. In this case, all parameters must have proper priors.} - -\item{stanvars}{An optional \code{stanvars} object generated by function -\code{\link{stanvar}} to define additional variables for use in -\pkg{Stan}'s program blocks.} - -\item{stan_funs}{(Deprecated) An optional character string containing -self-defined \pkg{Stan} functions, which will be included in the functions -block of the generated \pkg{Stan} code. It is now recommended to use the -\code{stanvars} argument for this purpose instead.} - -\item{knots}{Optional list containing user specified knot values to be used -for basis construction of smoothing terms. See -\code{\link[mgcv:gamm]{gamm}} for more details.} - -\item{drop_unused_levels}{Should unused factors levels in the data be -dropped? Defaults to \code{TRUE}.} - -\item{threads}{Number of threads to use in within-chain parallelization. For -more control over the threading process, \code{threads} may also be a -\code{brmsthreads} object created by \code{\link{threading}}. Within-chain -parallelization is experimental! We recommend its use only if you are -experienced with Stan's \code{reduce_sum} function and have a slow running -model that cannot be sped up by any other means. Can be set globally for -the current \R session via the \code{"brms.threads"} option (see -\code{\link{options}}).} - -\item{normalize}{Logical. Indicates whether normalization constants should -be included in the Stan code (defaults to \code{TRUE}). Setting it -to \code{FALSE} requires Stan version >= 2.25 to work. If \code{FALSE}, -sampling efficiency may be increased but some post processing functions -such as \code{\link{bridge_sampler}} will not be available. Can be -controlled globally for the current \R session via the `brms.normalize` -option.} - -\item{save_model}{Either \code{NULL} or a character string. In the latter -case, the model's Stan code is saved via \code{\link{cat}} in a text file -named after the string supplied in \code{save_model}.} - -\item{...}{Other arguments for internal usage only.} +\item{...}{Further arguments passed to the specific method} } \value{ -A character string containing the fully commented \pkg{Stan} code - to fit a \pkg{brms} model. +A named list of objects containing the required data to fit a + \pkg{brms} model with \pkg{Stan}. } \description{ -Generate Stan code for \pkg{brms} models +\code{make_stancode} is a generic function that can be used to + generate the Stan code to fit Bayesian multilevel models from various packages + with Stan. The function invokes particular methods which depend on the + class of the formula object. + + You can view the available methods by typing \code{methods(make_stancode)}. + + See \code{\link[brms:make_stancode.default]{make_stancode}} for the default + method applied for \pkg{brms} } \examples{ make_stancode(rating ~ treat + period + carry + (1|subject), data = inhaler, family = "cumulative") -make_stancode(count ~ zAge + zBase * Trt + (1|patient), - data = epilepsy, family = "poisson") +## for more examples, see ?make_stancode.default for \pkg{brms} and for the other +## methods by first calling: +methods(make_stancode) +## and then ?make_stancode.* where * is the method name + +} +\seealso{ +\code{\link{make_stancode.default}} } diff --git a/man/make_stancode.default.Rd b/man/make_stancode.default.Rd new file mode 100644 index 000000000..26c1643e3 --- /dev/null +++ b/man/make_stancode.default.Rd @@ -0,0 +1,149 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/make_stancode.R +\name{make_stancode.default} +\alias{make_stancode.default} +\title{Stan Code for \pkg{brms} Models} +\usage{ +\method{make_stancode}{default}( + formula, + data, + family = gaussian(), + prior = NULL, + autocor = NULL, + data2 = NULL, + cov_ranef = NULL, + sparse = NULL, + sample_prior = "no", + stanvars = NULL, + stan_funs = NULL, + knots = NULL, + drop_unused_levels = TRUE, + threads = getOption("brms.threads", NULL), + normalize = getOption("brms.normalize", TRUE), + save_model = NULL, + ... +) +} +\arguments{ +\item{formula}{An object of class \code{\link[stats:formula]{formula}}, +\code{\link{brmsformula}}, or \code{\link{mvbrmsformula}} (or one that can +be coerced to that classes): A symbolic description of the model to be +fitted. The details of model specification are explained in +\code{\link{brmsformula}}.} + +\item{data}{An object of class \code{data.frame} (or one that can be coerced +to that class) containing data of all variables used in the model.} + +\item{family}{A description of the response distribution and link function to +be used in the model. This can be a family function, a call to a family +function or a character string naming the family. Every family function has +a \code{link} argument allowing to specify the link function to be applied +on the response variable. If not specified, default links are used. For +details of supported families see \code{\link{brmsfamily}}. By default, a +linear \code{gaussian} model is applied. In multivariate models, +\code{family} might also be a list of families.} + +\item{prior}{One or more \code{brmsprior} objects created by +\code{\link{set_prior}} or related functions and combined using the +\code{c} method or the \code{+} operator. See also \code{\link[brms:get_prior.default]{get_prior}} +for more help.} + +\item{autocor}{(Deprecated) An optional \code{\link{cor_brms}} object +describing the correlation structure within the response variable (i.e., +the 'autocorrelation'). See the documentation of \code{\link{cor_brms}} for +a description of the available correlation structures. Defaults to +\code{NULL}, corresponding to no correlations. In multivariate models, +\code{autocor} might also be a list of autocorrelation structures. +It is now recommend to specify autocorrelation terms directly +within \code{formula}. See \code{\link{brmsformula}} for more details.} + +\item{data2}{A named \code{list} of objects containing data, which +cannot be passed via argument \code{data}. Required for some objects +used in autocorrelation structures to specify dependency structures +as well as for within-group covariance matrices.} + +\item{cov_ranef}{(Deprecated) A list of matrices that are proportional to the +(within) covariance structure of the group-level effects. The names of the +matrices should correspond to columns in \code{data} that are used as +grouping factors. All levels of the grouping factor should appear as +rownames of the corresponding matrix. This argument can be used, among +others to model pedigrees and phylogenetic effects. +It is now recommended to specify those matrices in the formula +interface using the \code{\link{gr}} and related functions. See +\code{vignette("brms_phylogenetics")} for more details.} + +\item{sparse}{(Deprecated) Logical; indicates whether the population-level +design matrices should be treated as sparse (defaults to \code{FALSE}). For +design matrices with many zeros, this can considerably reduce required +memory. Sampling speed is currently not improved or even slightly +decreased. It is now recommended to use the \code{sparse} argument of +\code{\link{brmsformula}} and related functions.} + +\item{sample_prior}{Indicate if draws from priors should be drawn +additionally to the posterior draws. Options are \code{"no"} (the +default), \code{"yes"}, and \code{"only"}. Among others, these draws can +be used to calculate Bayes factors for point hypotheses via +\code{\link{hypothesis}}. Please note that improper priors are not sampled, +including the default improper priors used by \code{brm}. See +\code{\link{set_prior}} on how to set (proper) priors. Please also note +that prior draws for the overall intercept are not obtained by default +for technical reasons. See \code{\link{brmsformula}} how to obtain prior +draws for the intercept. If \code{sample_prior} is set to \code{"only"}, +draws are drawn solely from the priors ignoring the likelihood, which +allows among others to generate draws from the prior predictive +distribution. In this case, all parameters must have proper priors.} + +\item{stanvars}{An optional \code{stanvars} object generated by function +\code{\link{stanvar}} to define additional variables for use in +\pkg{Stan}'s program blocks.} + +\item{stan_funs}{(Deprecated) An optional character string containing +self-defined \pkg{Stan} functions, which will be included in the functions +block of the generated \pkg{Stan} code. It is now recommended to use the +\code{stanvars} argument for this purpose instead.} + +\item{knots}{Optional list containing user specified knot values to be used +for basis construction of smoothing terms. See +\code{\link[mgcv:gamm]{gamm}} for more details.} + +\item{drop_unused_levels}{Should unused factors levels in the data be +dropped? Defaults to \code{TRUE}.} + +\item{threads}{Number of threads to use in within-chain parallelization. For +more control over the threading process, \code{threads} may also be a +\code{brmsthreads} object created by \code{\link{threading}}. Within-chain +parallelization is experimental! We recommend its use only if you are +experienced with Stan's \code{reduce_sum} function and have a slow running +model that cannot be sped up by any other means. Can be set globally for +the current \R session via the \code{"brms.threads"} option (see +\code{\link{options}}).} + +\item{normalize}{Logical. Indicates whether normalization constants should +be included in the Stan code (defaults to \code{TRUE}). Setting it +to \code{FALSE} requires Stan version >= 2.25 to work. If \code{FALSE}, +sampling efficiency may be increased but some post processing functions +such as \code{\link{bridge_sampler}} will not be available. Can be +controlled globally for the current \R session via the `brms.normalize` +option.} + +\item{save_model}{Either \code{NULL} or a character string. In the latter +case, the model's Stan code is saved via \code{\link{cat}} in a text file +named after the string supplied in \code{save_model}.} + +\item{...}{Other arguments for internal usage only.} +} +\value{ +A character string containing the fully commented \pkg{Stan} code + to fit a \pkg{brms} model. +} +\description{ +Generate Stan code for \pkg{brms} models +} +\examples{ +make_stancode(rating ~ treat + period + carry + (1|subject), + data = inhaler, family = "cumulative") + +make_stancode(count ~ zAge + zBase * Trt + (1|patient), + data = epilepsy, family = "poisson") + +} diff --git a/man/stancode.brmsfit.Rd b/man/stancode.brmsfit.Rd index 729d443f8..5bd9cc3a1 100644 --- a/man/stancode.brmsfit.Rd +++ b/man/stancode.brmsfit.Rd @@ -19,22 +19,21 @@ stancode(object, ...) \arguments{ \item{object}{An object of class \code{brmsfit}.} -\item{version}{Logical; indicates if the first line containing -the \pkg{brms} version number should be included. -Defaults to \code{TRUE}.} +\item{version}{Logical; indicates if the first line containing the \pkg{brms} +version number should be included. Defaults to \code{TRUE}.} -\item{regenerate}{Logical; indicates if the Stan code should -be regenerated with the current \pkg{brms} version. -By default, \code{regenerate} will be \code{FALSE} unless required -to be \code{TRUE} by other arguments.} +\item{regenerate}{Logical; indicates if the Stan code should be regenerated +with the current \pkg{brms} version. By default, \code{regenerate} will be +\code{FALSE} unless required to be \code{TRUE} by other arguments.} -\item{threads}{Controls whether the Stan code should be threaded. -See \code{\link{threading}} for details.} +\item{threads}{Controls whether the Stan code should be threaded. See +\code{\link{threading}} for details.} \item{backend}{Controls the Stan backend. See \code{\link{brm}} for details.} -\item{...}{Further arguments passed to \code{\link{make_stancode}} if the -Stan code is regenerated.} +\item{...}{Further arguments passed to +\code{\link[brms:make_stancode.default]{make_stancode}} if the Stan code is +regenerated.} } \value{ Stan model code for further processing. diff --git a/man/stanvar.Rd b/man/stanvar.Rd index aa5342840..598615b21 100644 --- a/man/stanvar.Rd +++ b/man/stanvar.Rd @@ -59,7 +59,7 @@ Special attention is necessary when using \code{stanvars} to inject code into the \code{'likelihood'} block while having \code{\link{threading}} activated. In this case, your custom Stan code may need adjustments to ensure correct observation indexing. Please investigate the generated Stan code via -\code{make_stancode} to see which adjustments are necessary in your case. +\code{\link[brms:make_stancode.default]{make_stancode}} to see which adjustments are necessary in your case. } \examples{ bprior <- prior(normal(mean_intercept, 10), class = "Intercept") From 99653feea0d469d11f86bafb7bce41c34b835b79 Mon Sep 17 00:00:00 2001 From: Ven Popov Date: Wed, 28 Feb 2024 21:35:57 +0100 Subject: [PATCH 5/8] cosmetic changes to docs --- R/make_stancode.R | 4 +++- R/make_standata.R | 4 +++- R/priors.R | 4 +++- man/get_prior.Rd | 4 +++- man/make_stancode.Rd | 4 +++- man/make_standata.Rd | 4 +++- 6 files changed, 18 insertions(+), 6 deletions(-) diff --git a/R/make_stancode.R b/R/make_stancode.R index f8574ac2f..c52bf6755 100644 --- a/R/make_stancode.R +++ b/R/make_stancode.R @@ -5,7 +5,9 @@ #' with Stan. The function invokes particular methods which depend on the #' class of the formula object. #' -#' You can view the available methods by typing \code{methods(make_stancode)}. +#' You can view the available methods by typing: +#' +#' \code{methods(make_stancode)} #' #' See \code{\link[brms:make_stancode.default]{make_stancode}} for the default #' method applied for \pkg{brms} diff --git a/R/make_standata.R b/R/make_standata.R index d7bfe47f8..eff30f339 100644 --- a/R/make_standata.R +++ b/R/make_standata.R @@ -5,7 +5,9 @@ #' with Stan. The function invokes particular methods which depend on the #' class of the formula object. #' -#' You can view the available methods by typing \code{methods(make_standata)}. +#' You can view the available methods by typing: +#' +#' \code{methods(make_standata)} #' #' See \code{\link[brms:make_standata.default]{make_standata}} for the default #' method applied for \pkg{brms} diff --git a/R/priors.R b/R/priors.R index 05d960246..71ea6ba12 100644 --- a/R/priors.R +++ b/R/priors.R @@ -445,7 +445,9 @@ prior_string <- function(prior, ...) { #' function invokes particular methods which depend on the class of the #' formula object. #' -#' You can view the available methods by typing \code{methods(get_prior)}. +#' You can view the available methods by typing +#' +#' \code{methods(get_prior)} #' #' See \code{\link[brms:get_prior.default]{get_prior}} for the default method #' applied for \pkg{brms} diff --git a/man/get_prior.Rd b/man/get_prior.Rd index c15c623dd..d5b444443 100644 --- a/man/get_prior.Rd +++ b/man/get_prior.Rd @@ -28,7 +28,9 @@ A data.frame with columns \code{prior}, \code{class}, \code{coef}, function invokes particular methods which depend on the class of the formula object. - You can view the available methods by typing \code{methods(get_prior)}. + You can view the available methods by typing + + \code{methods(get_prior)} See \code{\link[brms:get_prior.default]{get_prior}} for the default method applied for \pkg{brms} diff --git a/man/make_stancode.Rd b/man/make_stancode.Rd index af7bd4625..1611e1d12 100644 --- a/man/make_stancode.Rd +++ b/man/make_stancode.Rd @@ -25,7 +25,9 @@ A named list of objects containing the required data to fit a with Stan. The function invokes particular methods which depend on the class of the formula object. - You can view the available methods by typing \code{methods(make_stancode)}. + You can view the available methods by typing: + + \code{methods(make_stancode)} See \code{\link[brms:make_stancode.default]{make_stancode}} for the default method applied for \pkg{brms} diff --git a/man/make_standata.Rd b/man/make_standata.Rd index 0713f0668..12fad80bb 100644 --- a/man/make_standata.Rd +++ b/man/make_standata.Rd @@ -25,7 +25,9 @@ A named list of objects containing the required data to fit a with Stan. The function invokes particular methods which depend on the class of the formula object. - You can view the available methods by typing \code{methods(make_standata)}. + You can view the available methods by typing: + + \code{methods(make_standata)} See \code{\link[brms:make_standata.default]{make_standata}} for the default method applied for \pkg{brms} From 40694b1f599c33317858895c32fa1e6428fb8585 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paul-Christian=20B=C3=BCrkner?= Date: Fri, 1 Mar 2024 23:54:44 +0100 Subject: [PATCH 6/8] Change 'make_stancode' and 'make_standata' to be aliases of 'stancode' and 'standata' --- NAMESPACE | 8 +- NEWS.md | 4 + R/brm.R | 20 +- R/brms-package.R | 4 +- R/brmsfit-helpers.R | 4 +- R/families.R | 2 +- R/formula-gp.R | 2 +- R/make_stancode.R | 130 +++++++------ R/make_standata.R | 121 ++++++------- R/priors.R | 171 +++++++++++------- R/stanvars.R | 2 +- R/summary.R | 37 ---- man/brm.Rd | 16 +- man/brm_multiple.Rd | 2 +- man/brms-package.Rd | 4 +- man/brmsfit_needs_refit.Rd | 4 +- man/default_prior.Rd | 43 +++++ ...or.default.Rd => default_prior.default.Rd} | 41 +++-- man/get_prior.Rd | 52 ------ man/gp.Rd | 2 +- man/make_stancode.Rd | 48 ----- man/make_standata.Rd | 49 ----- man/mixture.Rd | 2 +- man/prior_summary.brmsfit.Rd | 19 +- man/set_prior.Rd | 4 +- man/stancode.Rd | 45 +++++ man/stancode.brmsfit.Rd | 11 +- ...tancode.default.Rd => stancode.default.Rd} | 23 +-- man/standata.Rd | 44 +++++ man/standata.brmsfit.Rd | 12 +- ...tandata.default.Rd => standata.default.Rd} | 26 ++- man/stanvar.Rd | 2 +- man/validate_prior.Rd | 10 +- tests/testthat/tests.priors.R | 2 +- 34 files changed, 478 insertions(+), 488 deletions(-) create mode 100644 man/default_prior.Rd rename man/{get_prior.default.Rd => default_prior.default.Rd} (72%) delete mode 100644 man/get_prior.Rd delete mode 100644 man/make_stancode.Rd delete mode 100644 man/make_standata.Rd create mode 100644 man/stancode.Rd rename man/{make_stancode.default.Rd => stancode.default.Rd} (92%) create mode 100644 man/standata.Rd rename man/{make_standata.default.Rd => standata.default.Rd} (89%) diff --git a/NAMESPACE b/NAMESPACE index c63e8ac63..a7f549cf2 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -59,6 +59,8 @@ S3method(data_response,brmsterms) S3method(data_response,mvbrmsterms) S3method(def_scale_prior,brmsterms) S3method(def_scale_prior,mvbrmsterms) +S3method(default_prior,brmsfit) +S3method(default_prior,default) S3method(dpar_family,default) S3method(dpar_family,mixfamily) S3method(duplicated,brmsprior) @@ -116,7 +118,6 @@ S3method(get_group_vars,default) S3method(get_group_vars,mvbrmsterms) S3method(get_int_vars,brmsterms) S3method(get_int_vars,mvbrmsterms) -S3method(get_prior,default) S3method(get_re,brmsterms) S3method(get_re,btl) S3method(get_re,default) @@ -143,8 +144,6 @@ S3method(loo_moment_match,brmsfit) S3method(loo_predict,brmsfit) S3method(loo_predictive_interval,brmsfit) S3method(loo_subsample,brmsfit) -S3method(make_stancode,default) -S3method(make_standata,default) S3method(marginal_effects,brmsfit) S3method(marginal_smooths,brmsfit) S3method(mcmc_plot,brmsfit) @@ -252,7 +251,9 @@ S3method(stan_predictor,btl) S3method(stan_predictor,btnl) S3method(stan_predictor,mvbrmsterms) S3method(stancode,brmsfit) +S3method(stancode,default) S3method(standata,brmsfit) +S3method(standata,default) S3method(standata_basis,brmsterms) S3method(standata_basis,btl) S3method(standata_basis,btnl) @@ -379,6 +380,7 @@ export(data_predictor) export(data_response) export(dbeta_binomial) export(ddirichlet) +export(default_prior) export(density_ratio) export(dexgaussian) export(dfrechet) diff --git a/NEWS.md b/NEWS.md index b264f85df..0f8020c3a 100644 --- a/NEWS.md +++ b/NEWS.md @@ -9,6 +9,10 @@ if potentially results-changing arguments are provided to the criterion method. ### Other Changes +* Change `make_stancode` and `make_standata` to be aliases of `stancode` and +`standata`, respectively. This enable other packages to define new `stancode` +and `standata` methods to generate Stan code and data for their own objects +building on brms. Thanks to Ven Popov for helping with this. (#1604) * No longer automatically canonicalize the Stan code if cmdstanr is used as backend. (#1544) * Improve parameter class names in the `summary` output. diff --git a/R/brm.R b/R/brm.R index c0892aa2f..cca636a29 100644 --- a/R/brm.R +++ b/R/brm.R @@ -31,7 +31,7 @@ #' \code{family} might also be a list of families. #' @param prior One or more \code{brmsprior} objects created by #' \code{\link{set_prior}} or related functions and combined using the -#' \code{c} method or the \code{+} operator. See also \code{\link[brms:get_prior.default]{get_prior}} +#' \code{c} method or the \code{+} operator. See also \code{\link[brms:default_prior.default]{default_prior}} #' for more help. #' @param data2 A named \code{list} of objects containing data, which #' cannot be passed via argument \code{data}. Required for some objects @@ -271,7 +271,7 @@ #' \code{\link[brms:set_prior]{set_prior}} function. Its documentation #' contains detailed information on how to correctly specify priors. To find #' out on which parameters or parameter classes priors can be defined, use -#' \code{\link[brms:get_prior.default]{get_prior}}. Default priors are chosen to be +#' \code{\link[brms:default_prior.default]{default_prior}}. Default priors are chosen to be #' non or very weakly informative so that their influence on the results will #' be negligible and you usually don't have to worry about them. However, #' after getting more familiar with Bayesian statistics, I recommend you to @@ -318,12 +318,12 @@ #' @examples #' \dontrun{ #' # Poisson regression for the number of seizures in epileptic patients -#' # using normal priors for population-level effects -#' # and half-cauchy priors for standard deviations of group-level effects -#' prior1 <- prior(normal(0, 10), class = b) + -#' prior(cauchy(0, 2), class = sd) -#' fit1 <- brm(count ~ zBase * Trt + (1|patient), data = epilepsy, -#' family = poisson(), prior = prior1) +#' fit1 <- brm( +#' count ~ zBase * Trt + (1|patient), +#' data = epilepsy, family = poisson(), +#' prior = prior(normal(0, 10), class = b) + +#' prior(cauchy(0, 2), class = sd) +#' ) #' #' # generate a summary of the results #' summary(fit1) @@ -537,7 +537,7 @@ brm <- function(formula, data, family = gaussian(), prior = NULL, ) ranef <- tidy_ranef(bterms, data = data) # generate Stan code - model <- .make_stancode( + model <- .stancode( bterms, data = data, prior = prior, stanvars = stanvars, save_model = save_model, backend = backend, threads = threads, opencl = opencl, @@ -556,7 +556,7 @@ brm <- function(formula, data, family = gaussian(), prior = NULL, exclude <- exclude_pars(x) # generate Stan data before compiling the model to avoid # unnecessary compilations in case of invalid data - sdata <- .make_standata( + sdata <- .standata( bterms, data = data, prior = prior, data2 = data2, stanvars = stanvars, threads = threads ) diff --git a/R/brms-package.R b/R/brms-package.R index 7c553dcb2..d8c0ff308 100644 --- a/R/brms-package.R +++ b/R/brms-package.R @@ -22,8 +22,8 @@ #' formula syntax to specify a wide range of complex Bayesian models #' (see \code{\link{brmsformula}} for details). Based on the supplied #' formulas, data, and additional information, it writes the Stan code -#' on the fly via \code{\link[brms:make_stancode.default]{make_stancode}}, prepares the data via -#' \code{\link[brms:make_standata.default]{make_standata}} and fits the model using +#' on the fly via \code{\link[brms:stancode.default]{stancode}}, prepares the data via +#' \code{\link[brms:standata.default]{standata}} and fits the model using #' \pkg{\link[rstan:rstan]{Stan}}. #' #' Subsequently, a large number of post-processing methods can be applied: diff --git a/R/brmsfit-helpers.R b/R/brmsfit-helpers.R index af35a64e6..8777cddcf 100644 --- a/R/brmsfit-helpers.R +++ b/R/brmsfit-helpers.R @@ -871,9 +871,9 @@ validate_cores_post_processing <- function(cores) { #' and scripts should not use it. #' #' @param fit Old \code{brmsfit} object (e.g., loaded from file). -#' @param sdata New Stan data (result of a call to \code{\link[brms:make_standata.default]{make_standata}}). +#' @param sdata New Stan data (result of a call to \code{\link[brms:standata.default]{standata}}). #' Pass \code{NULL} to avoid this data check. -#' @param scode New Stan code (result of a call to \code{\link[brms:make_stancode.default]{make_stancode}}). +#' @param scode New Stan code (result of a call to \code{\link[brms:stancode.default]{stancode}}). #' Pass \code{NULL} to avoid this code check. #' @param data New data to check consistency of factor level names. #' Pass \code{NULL} to avoid this data check. diff --git a/R/families.R b/R/families.R index 79c2c77e9..1460e14f9 100644 --- a/R/families.R +++ b/R/families.R @@ -927,7 +927,7 @@ acat <- function(link = "logit", link_disc = "log", #' pp_check(fit4) #' #' ## compare model fit -#' LOO(fit1, fit2, fit3, fit4) +#' loo(fit1, fit2, fit3, fit4) #' } #' #' @export diff --git a/R/formula-gp.R b/R/formula-gp.R index 588e503aa..f4b750804 100644 --- a/R/formula-gp.R +++ b/R/formula-gp.R @@ -100,7 +100,7 @@ #' plot(me3, ask = FALSE, points = TRUE) #' #' # compare model fit -#' LOO(fit1, fit2, fit3) +#' loo(fit1, fit2, fit3) #' #' # simulate data with a factor covariate #' dat2 <- mgcv::gamSim(4, n = 90, scale = 2) diff --git a/R/make_stancode.R b/R/make_stancode.R index c52bf6755..a01386708 100644 --- a/R/make_stancode.R +++ b/R/make_stancode.R @@ -1,85 +1,89 @@ -#' @title Stan Code for a Bayesian multilevel model +#' @title Stan Code for Bayesian models #' -#' @description \code{make_stancode} is a generic function that can be used to -#' generate the Stan code to fit Bayesian multilevel models from various packages -#' with Stan. The function invokes particular methods which depend on the -#' class of the formula object. +#' @description \code{stancode} is a generic function that can be used to +#' generate Stan code for Bayesian models. It's original use is +#' within the \pkg{brms} package, but new methods for use +#' with objects from other packages can be registered to the same generic. #' -#' You can view the available methods by typing: +#' @param object An object whose class will determine which method to apply. +#' Usually, it will be some kind of symbolic description of the model +#' form which Stan code should be generated. +#' @param formula Synonym of \code{object} for use in \code{make_stancode}. +#' @param ... Further arguments passed to the specific method. #' -#' \code{methods(make_stancode)} +#' @return Usually, a character string containing the generated Stan code. +#' For pretty printing, we recommend the returned object to be of class +#' \code{c("character", "brmsmodel")}. #' -#' See \code{\link[brms:make_stancode.default]{make_stancode}} for the default -#' method applied for \pkg{brms} +#' @details +#' See \code{\link[brms:stancode.default]{stancode.default}} for the default +#' method applied for \pkg{brms} models. +#' You can view the available methods by typing: \code{methods(stancode)} +#' The \code{make_stancode} function is an alias of \code{stancode}. #' -#' @param formula A formula object whose class will determine which method will -#' be used. A symbolic description of the model to be fitted. -#' @param data An object of class data.frame, or one that can be coerced to that -#' class) containing data of all variables used in the model. -#' @param ... Further arguments passed to the specific method -#' -#' @return A named list of objects containing the required data to fit a -#' \pkg{brms} model with \pkg{Stan}. +#' @seealso +#' \code{\link{stancode.default}}, \code{\link{stancode.brmsfit}} #' #' @examples -#' make_stancode(rating ~ treat + period + carry + (1|subject), -#' data = inhaler, family = "cumulative") -#' -#' ## for more examples, see ?make_stancode.default for \pkg{brms} and for the other -#' ## methods by first calling: -#' methods(make_stancode) -#' -#' ## and then ?make_stancode.* where * is the method name +#' stancode(rating ~ treat + period + carry + (1|subject), +#' data = inhaler, family = "cumulative") #' -#' @seealso \code{\link{make_stancode.default}} #' @export -make_stancode <- function(formula, data, ...) { - UseMethod("make_stancode") +stancode <- function(object, ...) { + UseMethod("stancode") } - +#' @rdname stancode +#' @export +make_stancode <- function(formula, ...) { + # became an alias of 'stancode' in 2.20.14 + stancode(formula, ...) +} #' Stan Code for \pkg{brms} Models #' #' Generate Stan code for \pkg{brms} models #' #' @inheritParams brm +#' @param object An object of class \code{\link[stats:formula]{formula}}, +#' \code{\link{brmsformula}}, or \code{\link{mvbrmsformula}} (or one that can +#' be coerced to that classes): A symbolic description of the model to be +#' fitted. The details of model specification are explained in +#' \code{\link{brmsformula}}. #' @param ... Other arguments for internal usage only. #' #' @return A character string containing the fully commented \pkg{Stan} code -#' to fit a \pkg{brms} model. +#' to fit a \pkg{brms} model. It is of class \code{c("character", "brmsmodel")} +#' to facilitate pretty printing. #' #' @examples -#' make_stancode(rating ~ treat + period + carry + (1|subject), -#' data = inhaler, family = "cumulative") +#' stancode(rating ~ treat + period + carry + (1|subject), +#' data = inhaler, family = "cumulative") #' -#' make_stancode(count ~ zAge + zBase * Trt + (1|patient), -#' data = epilepsy, family = "poisson") +#' stancode(count ~ zAge + zBase * Trt + (1|patient), +#' data = epilepsy, family = "poisson") #' #' @export -make_stancode.default <- function(formula, data, family = gaussian(), - prior = NULL, autocor = NULL, data2 = NULL, - cov_ranef = NULL, sparse = NULL, - sample_prior = "no", stanvars = NULL, - stan_funs = NULL, knots = NULL, - drop_unused_levels = TRUE, - threads = getOption("brms.threads", NULL), - normalize = getOption("brms.normalize", TRUE), - save_model = NULL, ...) { +stancode.default <- function(object, data, family = gaussian(), + prior = NULL, autocor = NULL, data2 = NULL, + cov_ranef = NULL, sparse = NULL, + sample_prior = "no", stanvars = NULL, + stan_funs = NULL, knots = NULL, + drop_unused_levels = TRUE, + threads = getOption("brms.threads", NULL), + normalize = getOption("brms.normalize", TRUE), + save_model = NULL, ...) { - if (is.brmsfit(formula)) { - stop2("Use 'stancode' to extract Stan code from 'brmsfit' objects.") - } - formula <- validate_formula( - formula, data = data, family = family, + object <- validate_formula( + object, data = data, family = family, autocor = autocor, sparse = sparse, cov_ranef = cov_ranef ) - bterms <- brmsterms(formula) + bterms <- brmsterms(object) data2 <- validate_data2( data2, bterms = bterms, - get_data2_autocor(formula), - get_data2_cov_ranef(formula) + get_data2_autocor(object), + get_data2_cov_ranef(object) ) data <- validate_data( data, bterms = bterms, @@ -93,7 +97,7 @@ make_stancode.default <- function(formula, data, family = gaussian(), stanvars <- validate_stanvars(stanvars, stan_funs = stan_funs) threads <- validate_threads(threads) - .make_stancode( + .stancode( bterms, data = data, prior = prior, stanvars = stanvars, threads = threads, normalize = normalize, save_model = save_model, @@ -101,16 +105,17 @@ make_stancode.default <- function(formula, data, family = gaussian(), ) } -# internal work function of 'make_stancode' +# internal work function of 'stancode.default' # @param parse parse the Stan model for automatic syntax checking # @param backend name of the backend used for parsing # @param silent silence parsing messages -.make_stancode <- function(bterms, data, prior, stanvars, +.stancode <- function(bterms, data, prior, stanvars, threads = threading(), normalize = getOption("brms.normalize", TRUE), parse = getOption("brms.parse_stancode", FALSE), backend = getOption("brms.backend", "rstan"), silent = TRUE, save_model = NULL, ...) { + normalize <- as_one_logical(normalize) parse <- as_one_logical(parse) backend <- match.arg(backend, backend_choices()) @@ -370,11 +375,9 @@ print.brmsmodel <- function(x, ...) { invisible(x) } -#' Extract Stan model code -#' -#' Extract Stan code that was used to specify the model. +#' Extract Stan code from \code{brmsfit} objects #' -#' @aliases stancode.brmsfit +#' Extract Stan code from a fitted \pkg{brms} model. #' #' @param object An object of class \code{brmsfit}. #' @param version Logical; indicates if the first line containing the \pkg{brms} @@ -386,14 +389,15 @@ print.brmsmodel <- function(x, ...) { #' \code{\link{threading}} for details. #' @param backend Controls the Stan backend. See \code{\link{brm}} for details. #' @param ... Further arguments passed to -#' \code{\link[brms:make_stancode.default]{make_stancode}} if the Stan code is +#' \code{\link[brms:stancode.default]{stancode}} if the Stan code is #' regenerated. #' -#' @return Stan model code for further processing. +#' @return Stan code for further processing. #' #' @export stancode.brmsfit <- function(object, version = TRUE, regenerate = NULL, threads = NULL, backend = NULL, ...) { + if (is.null(regenerate)) { # determine whether regenerating the Stan code is required regenerate <- FALSE @@ -440,12 +444,6 @@ stancode.brmsfit <- function(object, version = TRUE, regenerate = NULL, out } -#' @rdname stancode.brmsfit -#' @export -stancode <- function(object, ...) { - UseMethod("stancode") -} - # expand '#include' statements # This could also be done automatically by Stan at compilation time # but would result in Stan code that is not self-contained until compilation diff --git a/R/make_standata.R b/R/make_standata.R index eff30f339..6b89e1db9 100644 --- a/R/make_standata.R +++ b/R/make_standata.R @@ -1,84 +1,85 @@ -#' @title Data for a Bayesian multilevel model +#' @title Stan data for Bayesian models #' -#' @description \code{make_standata} is a generic function that can be used to -#' generate the data to fit Bayesian multilevel models from various packages -#' with Stan. The function invokes particular methods which depend on the -#' class of the formula object. +#' @description \code{standata} is a generic function that can be used to +#' generate data for Bayesian models to be passed to Stan. It's original use is +#' within the \pkg{brms} package, but new methods for use +#' with objects from other packages can be registered to the same generic. #' -#' You can view the available methods by typing: -#' -#' \code{methods(make_standata)} -#' -#' See \code{\link[brms:make_standata.default]{make_standata}} for the default -#' method applied for \pkg{brms} -#' -#' @param formula A formula object whose class will determine which method will +#' @param object A formula object whose class will determine which method will #' be used. A symbolic description of the model to be fitted. -#' @param data An object of class data.frame, or one that can be coerced to that -#' class) containing data of all variables used in the model. -#' @param ... Further arguments passed to the specific method +#' @param formula Synonym of \code{object} for use in \code{make_standata}. +#' @param ... Further arguments passed to the specific method. #' #' @return A named list of objects containing the required data to fit a -#' \pkg{brms} model with \pkg{Stan}. +#' Bayesian model with \pkg{Stan}. +#' +#' @details +#' See \code{\link{standata.default}} for the default method applied for +#' \pkg{brms} models. You can view the available methods by typing +#' \code{methods(standata)}. The \code{make_standata} function is an alias +#' of \code{standata}. #' #' @examples -#' sdata1 <- make_standata(rating ~ treat + period + carry + (1|subject), -#' data = inhaler, family = "cumulative") +#' sdata1 <- standata(rating ~ treat + period + carry + (1|subject), +#' data = inhaler, family = "cumulative") #' str(sdata1) #' -#' ## for more examples, see ?make_standata.default for \pkg{brms} and for the other -#' ## methods by first calling: -#' methods(make_standata) -#' -#' ## and then ?make_standata.* where * is the method name +#' @seealso +#' \code{\link{standata.default}}, \code{\link{standata.brmsfit}} #' -#' @seealso \code{\link{make_standata.default}} #' @export -make_standata <- function(formula, data, ...) { - UseMethod("make_standata") +standata <- function(object, ...) { + UseMethod("standata") } +#' @rdname standata +#' @export +make_standata <- function(formula, ...) { + # became an alias of standata in 2.20.14. + standata(formula, ...) +} #' Data for \pkg{brms} Models #' -#' Generate data for \pkg{brms} models to be passed to \pkg{Stan} +#' Generate data for \pkg{brms} models to be passed to \pkg{Stan}. #' #' @inheritParams brm +#' @param object An object of class \code{\link[stats:formula]{formula}}, +#' \code{\link{brmsformula}}, or \code{\link{mvbrmsformula}} (or one that can +#' be coerced to that classes): A symbolic description of the model to be +#' fitted. The details of model specification are explained in +#' \code{\link{brmsformula}}. #' @param ... Other arguments for internal use. #' #' @return A named list of objects containing the required data #' to fit a \pkg{brms} model with \pkg{Stan}. -#' -#' @author Paul-Christian Buerkner \email{paul.buerkner@@gmail.com} +#' The \code{get_prior} function is an alias of \code{default_prior}. #' #' @examples -#' sdata1 <- make_standata(rating ~ treat + period + carry + (1|subject), -#' data = inhaler, family = "cumulative") +#' sdata1 <- standata(rating ~ treat + period + carry + (1|subject), +#' data = inhaler, family = "cumulative") #' str(sdata1) #' -#' sdata2 <- make_standata(count ~ zAge + zBase * Trt + (1|patient), -#' data = epilepsy, family = "poisson") +#' sdata2 <- standata(count ~ zAge + zBase * Trt + (1|patient), +#' data = epilepsy, family = "poisson") #' str(sdata2) #' #' @export -make_standata.default <- function(formula, data, family = gaussian(), prior = NULL, - autocor = NULL, data2 = NULL, cov_ranef = NULL, - sample_prior = "no", stanvars = NULL, - threads = getOption("brms.threads", NULL), - knots = NULL, drop_unused_levels = TRUE, ...) { +standata.default <- function(object, data, family = gaussian(), prior = NULL, + autocor = NULL, data2 = NULL, cov_ranef = NULL, + sample_prior = "no", stanvars = NULL, + threads = getOption("brms.threads", NULL), + knots = NULL, drop_unused_levels = TRUE, ...) { - if (is.brmsfit(formula)) { - stop2("Use 'standata' to extract Stan data from 'brmsfit' objects.") - } - formula <- validate_formula( - formula, data = data, family = family, + object <- validate_formula( + object, data = data, family = family, autocor = autocor, cov_ranef = cov_ranef ) - bterms <- brmsterms(formula) + bterms <- brmsterms(object) data2 <- validate_data2( data2, bterms = bterms, - get_data2_autocor(formula), - get_data2_cov_ranef(formula) + get_data2_autocor(object), + get_data2_cov_ranef(object) ) data <- validate_data( data, bterms = bterms, @@ -91,21 +92,21 @@ make_standata.default <- function(formula, data, family = gaussian(), prior = NU ) stanvars <- validate_stanvars(stanvars) threads <- validate_threads(threads) - .make_standata( + .standata( bterms, data = data, prior = prior, data2 = data2, stanvars = stanvars, threads = threads, ... ) } -# internal work function of 'make_standata' +# internal work function of 'standata' # @param check_response check validity of the response? # @param only_response extract data related to the response only? # @param internal prepare Stan data for use in post-processing methods? # @param basis original Stan data as prepared by 'standata_basis' # @param ... currently ignored # @return names list of data passed to Stan -.make_standata <- function(bterms, data, prior, stanvars, data2, +.standata <- function(bterms, data, prior, stanvars, data2, threads = threading(), check_response = TRUE, only_response = FALSE, internal = FALSE, basis = NULL, ...) { @@ -160,25 +161,23 @@ make_standata.default <- function(formula, data, family = gaussian(), prior = NU structure(out, class = c("standata", "list")) } -#' Extract data passed to Stan +#' Extract data passed to Stan from \code{brmsfit} objects #' -#' Extract all data that was used by Stan to fit the model. -#' -#' @aliases standata.brmsfit +#' Extract all data that was used by Stan to fit a \pkg{brms} model. #' #' @param object An object of class \code{brmsfit}. -#' @param ... More arguments passed to \code{\link[brms:make_standata.default]{make_standata}} +#' @param ... More arguments passed to +#' \code{\link[brms:standata.default]{standata.default}}. #' and \code{\link{validate_newdata}}. #' @inheritParams prepare_predictions #' -#' @return A named list containing the data originally passed to Stan. +#' @return A named list containing the data passed to Stan. #' #' @export standata.brmsfit <- function(object, newdata = NULL, re_formula = NULL, newdata2 = NULL, new_objects = NULL, incl_autocor = TRUE, ...) { - object <- restructure(object) # allows functions to fall back to old default behavior # which was used when originally fitting the model options(.brmsfit_version = object$version$brms) @@ -204,19 +203,13 @@ standata.brmsfit <- function(object, newdata = NULL, re_formula = NULL, # of splines on new machines (#1465) basis <- standata_basis(bterms, data = object$data) } - .make_standata( + .standata( bterms, data = data, prior = object$prior, data2 = data2, stanvars = stanvars, threads = object$threads, basis = basis, ... ) } -#' @rdname standata.brmsfit -#' @export -standata <- function(object, ...) { - UseMethod("standata") -} - # prepare basis data required for correct predictions from new data # TODO: eventually export this function if we want to ensure full compatibility # with the 'empty' feature. see ?rename_pars for an example diff --git a/R/priors.R b/R/priors.R index 71ea6ba12..b85c5e1e3 100644 --- a/R/priors.R +++ b/R/priors.R @@ -62,7 +62,7 @@ #' set priors on. Often, it may not be immediately clear, which parameters are #' present in the model. To get a full list of parameters and parameter #' classes for which priors can be specified (depending on the model) use -#' function \code{\link[brms:get_prior.default]{get_prior}}. +#' function \code{\link[brms:default_prior.default]{default_prior}}. #' #' 1. Population-level ('fixed') effects #' @@ -308,7 +308,7 @@ #' function, for example, \code{constant(1)} to fix a parameter to 1. #' Broadcasting to vectors and matrices is done automatically. #' -#' @seealso \code{\link[brms:get_prior.default]{get_prior}} +#' @seealso \code{\link[brms:default_prior.default]{default_prior}} #' #' @examples #' ## use alias functions @@ -438,108 +438,108 @@ prior_string <- function(prior, ...) { set_prior(prior, ...) } -#' @title Get default priors for a Bayesian multilevel model -#' @description \code{get_prior} is a generic function that can be used to -#' obtain the default priors for a Bayesian multilevel model from various -#' packages that use the \pkg{brms} package for fitting the model. The -#' function invokes particular methods which depend on the class of the -#' formula object. +#' Default priors for Bayesian models #' -#' You can view the available methods by typing +#' @description \code{default_prior} is a generic function that can be used to +#' get default priors for Bayesian models. It's original use is +#' within the \pkg{brms} package, but new methods for use +#' with objects from other packages can be registered to the same generic. #' -#' \code{methods(get_prior)} -#' -#' See \code{\link[brms:get_prior.default]{get_prior}} for the default method -#' applied for \pkg{brms} +#' @param object An object whose class will determine which method will +#' be used. A symbolic description of the model to be fitted. +#' @param formula Synonym of \code{object} for use in \code{get_prior}. +#' @param ... Further arguments passed to the specific method. #' +#' @return Usually, a \code{brmsprior} object. See +#' \code{\link{default_prior.default}} for more details. #' -#' @param formula A formula object whose class will determine which method will -#' be used. A symbolic description of the model to be fitted. -#' @param data An object of class data.frame, or one that can be coerced to that -#' class) containing data of all variables used in the model. -#' @param ... Further arguments passed to the specific method +#' @details +#' See \code{\link{default_prior.default}} for the default method applied for +#' \pkg{brms} models. You can view the available methods by typing +#' \code{methods(default_prior)}. #' -#' @return A data.frame with columns \code{prior}, \code{class}, \code{coef}, -#' and \code{group} and several rows, each providing information on a -#' parameter (or parameter class) on which priors can be specified. The prior -#' column is empty except for internal default priors. +#' @seealso +#' \code{\link{set_prior}}, \code{\link{default_prior.default}} #' #' @examples #' ## get all parameters and parameters classes to define priors on -#' (prior <- get_prior(count ~ zAge + zBase * Trt + (1|patient) + (1|obs), -#' data = epilepsy, family = poisson())) +#' (prior <- default_prior(count ~ zAge + zBase * Trt + (1|patient) + (1|obs), +#' data = epilepsy, family = poisson())) #' -#' ## for more examples, see ?get_prior.default for \pkg{brms} and for the other -#' ## methods by first calling: -#' methods(get_prior) -#' -#' ## and then ?get_prior.* where * is the method name -#' -#' @seealso \code{\link{set_prior}} \code{\link{get_prior.default}} #' @export -get_prior <- function(formula, data, ...) { - UseMethod('get_prior') +default_prior <- function(object, ...) { + UseMethod("default_prior") } -#' Overview on Priors for \pkg{brms} Models +#' @rdname default_prior +#' @export +get_prior <- function(formula, ...) { + default_prior(formula, ...) +} + +#' Default Priors for \pkg{brms} Models #' #' Get information on all parameters (and parameter classes) for which priors #' may be specified including default priors. #' #' @inheritParams brm +#' @param object An object of class \code{\link[stats:formula]{formula}}, +#' \code{\link{brmsformula}}, or \code{\link{mvbrmsformula}} (or one that can +#' be coerced to that classes): A symbolic description of the model to be +#' fitted. The details of model specification are explained in +#' \code{\link{brmsformula}}. #' @param ... Other arguments for internal usage only. #' -#' @return A data.frame with columns \code{prior}, \code{class}, \code{coef}, -#' and \code{group} and several rows, each providing information on a -#' parameter (or parameter class) on which priors can be specified. The prior -#' column is empty except for internal default priors. +#' @return A \code{brmsprior} object. That is, a data.frame with specific +#' columns including \code{prior}, \code{class}, \code{coef}, and \code{group} +#' and several rows, each providing information on a parameter (or parameter +#' class) on which priors can be specified. The prior column is empty except +#' for internal default priors. #' -#' @seealso \code{\link{set_prior}} +#' @seealso \code{\link{default_prior}}, \code{\link{set_prior}} #' #' @examples -#' ## get all parameters and parameters classes to define priors on -#' (prior <- get_prior(count ~ zAge + zBase * Trt + (1|patient) + (1|obs), -#' data = epilepsy, family = poisson())) +#' # get all parameters and parameters classes to define priors on +#' (prior <- default_prior(count ~ zAge + zBase * Trt + (1|patient) + (1|obs), +#' data = epilepsy, family = poisson())) #' -#' ## define a prior on all population-level effects a once +#' # define a prior on all population-level effects a once #' prior$prior[1] <- "normal(0,10)" #' -#' ## define a specific prior on the population-level effect of Trt +#' # define a specific prior on the population-level effect of Trt #' prior$prior[5] <- "student_t(10, 0, 5)" #' -#' ## verify that the priors indeed found their way into Stan's model code -#' make_stancode(count ~ zAge + zBase * Trt + (1|patient) + (1|obs), -#' data = epilepsy, family = poisson(), -#' prior = prior) +#' # verify that the priors indeed found their way into Stan's model code +#' stancode(count ~ zAge + zBase * Trt + (1|patient) + (1|obs), +#' data = epilepsy, family = poisson(), +#' prior = prior) #' #' @export -get_prior.default <- function(formula, data, family = gaussian(), autocor = NULL, - data2 = NULL, knots = NULL, drop_unused_levels = TRUE, - sparse = NULL, ...) { - if (is.brmsfit(formula)) { - stop2("Use 'prior_summary' to extract priors from 'brmsfit' objects.") - } - formula <- validate_formula( - formula, data = data, family = family, +default_prior.default <- function(object, data, family = gaussian(), autocor = NULL, + data2 = NULL, knots = NULL, drop_unused_levels = TRUE, + sparse = NULL, ...) { + + object <- validate_formula( + object, data = data, family = family, autocor = autocor, sparse = sparse ) - bterms <- brmsterms(formula) + bterms <- brmsterms(object) data2 <- validate_data2( data2, bterms = bterms, - get_data2_autocor(formula) + get_data2_autocor(object) ) data <- validate_data( data, bterms = bterms, data2 = data2, knots = knots, drop_unused_levels = drop_unused_levels ) - .get_prior(bterms, data, ...) + .default_prior(bterms, data, ...) } # internal work function of 'get_prior' # @param internal return priors for internal use? # @return a brmsprior object -.get_prior <- function(bterms, data, internal = FALSE, ...) { +.default_prior <- function(bterms, data, internal = FALSE, ...) { ranef <- tidy_ranef(bterms, data) meef <- tidy_meef(bterms, data) # initialize output @@ -1194,7 +1194,7 @@ def_scale_prior.brmsterms <- function(x, data, center = TRUE, df = 3, #' #' @return An object of class \code{brmsprior}. #' -#' @seealso \code{\link[brms:get_prior.default]{get_prior}}, \code{\link{set_prior}}. +#' @seealso \code{\link[brms:default_prior.default]{default_prior}}, \code{\link{set_prior}}. #' #' @examples #' prior1 <- prior(normal(0,10), class = b) + @@ -1223,7 +1223,7 @@ validate_prior <- function(prior, formula, data, family = gaussian(), # internal work function of 'validate_prior' .validate_prior <- function(prior, bterms, data, sample_prior, ...) { sample_prior <- validate_sample_prior(sample_prior) - all_priors <- .get_prior(bterms, data, internal = TRUE) + all_priors <- .default_prior(bterms, data, internal = TRUE) if (is.null(prior)) { prior <- all_priors } else if (!is.brmsprior(prior)) { @@ -1735,6 +1735,53 @@ convert_stan2bounds <- function(bound, default = c(-Inf, Inf)) { out } +#' Priors of \code{brms} models +#' +#' Extract priors of models fitted with \pkg{brms}. +#' +#' @aliases prior_summary +#' +#' @param object An object of class \code{brmsfit}. +#' @param all Logical; Show all parameters in the model which may have +#' priors (\code{TRUE}) or only those with proper priors (\code{FALSE})? +#' @param ... Further arguments passed to or from other methods. +#' +#' @return An \code{brmsprior} object. +#' +#' @examples +#' \dontrun{ +#' fit <- brm( +#' count ~ zAge + zBase * Trt + (1|patient) + (1|obs), +#' data = epilepsy, family = poisson(), +#' prior = prior(student_t(5,0,10), class = b) + +#' prior(cauchy(0,2), class = sd) +#' ) +#' +#' prior_summary(fit) +#' prior_summary(fit, all = FALSE) +#' print(prior_summary(fit, all = FALSE), show_df = FALSE) +#' } +#' +#' @method prior_summary brmsfit +#' @export +#' @export prior_summary +#' @importFrom rstantools prior_summary +#' @export +prior_summary.brmsfit <- function(object, all = TRUE, ...) { + object <- restructure(object) + prior <- object$prior + if (!all) { + prior <- prior[nzchar(prior$prior), ] + } + prior +} + +#' @export +default_prior.brmsfit <- function(object, ...) { + # just in case people try to apply default_prior to brmsfit objects + prior_summary.brmsfit(object, ...) +} + #' Checks if argument is a \code{brmsprior} object #' #' @param x An \R object diff --git a/R/stanvars.R b/R/stanvars.R index 0687142d4..6fbb04119 100644 --- a/R/stanvars.R +++ b/R/stanvars.R @@ -39,7 +39,7 @@ #' code into the \code{'likelihood'} block while having \code{\link{threading}} #' activated. In this case, your custom Stan code may need adjustments to ensure #' correct observation indexing. Please investigate the generated Stan code via -#' \code{\link[brms:make_stancode.default]{make_stancode}} to see which adjustments are necessary in your case. +#' \code{\link[brms:stancode.default]{stancode}} to see which adjustments are necessary in your case. #' #' @examples #' bprior <- prior(normal(mean_intercept, 10), class = "Intercept") diff --git a/R/summary.R b/R/summary.R index fae5ead8a..741c118ef 100644 --- a/R/summary.R +++ b/R/summary.R @@ -569,40 +569,3 @@ posterior_interval.brmsfit <- function( ps <- as.matrix(object, pars = pars, variable = variable, ...) rstantools::posterior_interval(ps, prob = prob) } - -#' Extract Priors of a Bayesian Model Fitted with \pkg{brms} -#' -#' @aliases prior_summary -#' -#' @param object An object of class \code{brmsfit}. -#' @param all Logical; Show all parameters in the model which may have -#' priors (\code{TRUE}) or only those with proper priors (\code{FALSE})? -#' @param ... Further arguments passed to or from other methods. -#' -#' @return For \code{brmsfit} objects, an object of class \code{brmsprior}. -#' -#' @examples -#' \dontrun{ -#' fit <- brm(count ~ zAge + zBase * Trt -#' + (1|patient) + (1|obs), -#' data = epilepsy, family = poisson(), -#' prior = c(prior(student_t(5,0,10), class = b), -#' prior(cauchy(0,2), class = sd))) -#' -#' prior_summary(fit) -#' prior_summary(fit, all = FALSE) -#' print(prior_summary(fit, all = FALSE), show_df = FALSE) -#' } -#' -#' @method prior_summary brmsfit -#' @export -#' @export prior_summary -#' @importFrom rstantools prior_summary -prior_summary.brmsfit <- function(object, all = TRUE, ...) { - object <- restructure(object) - prior <- object$prior - if (!all) { - prior <- prior[nzchar(prior$prior), ] - } - prior -} diff --git a/man/brm.Rd b/man/brm.Rd index 3f0083db0..6f5a0e4c7 100644 --- a/man/brm.Rd +++ b/man/brm.Rd @@ -70,7 +70,7 @@ linear \code{gaussian} model is applied. In multivariate models, \item{prior}{One or more \code{brmsprior} objects created by \code{\link{set_prior}} or related functions and combined using the -\code{c} method or the \code{+} operator. See also \code{\link[brms:get_prior.default]{get_prior}} +\code{c} method or the \code{+} operator. See also \code{\link[brms:default_prior.default]{default_prior}} for more help.} \item{autocor}{(Deprecated) An optional \code{\link{cor_brms}} object @@ -363,7 +363,7 @@ Fit a generalized (non-)linear multivariate multilevel model via \code{\link[brms:set_prior]{set_prior}} function. Its documentation contains detailed information on how to correctly specify priors. To find out on which parameters or parameter classes priors can be defined, use - \code{\link[brms:get_prior.default]{get_prior}}. Default priors are chosen to be + \code{\link[brms:default_prior.default]{default_prior}}. Default priors are chosen to be non or very weakly informative so that their influence on the results will be negligible and you usually don't have to worry about them. However, after getting more familiar with Bayesian statistics, I recommend you to @@ -398,12 +398,12 @@ Fit a generalized (non-)linear multivariate multilevel model via \examples{ \dontrun{ # Poisson regression for the number of seizures in epileptic patients -# using normal priors for population-level effects -# and half-cauchy priors for standard deviations of group-level effects -prior1 <- prior(normal(0, 10), class = b) + - prior(cauchy(0, 2), class = sd) -fit1 <- brm(count ~ zBase * Trt + (1|patient), data = epilepsy, - family = poisson(), prior = prior1) +fit1 <- brm( + count ~ zBase * Trt + (1|patient), + data = epilepsy, family = poisson(), + prior = prior(normal(0, 10), class = b) + + prior(cauchy(0, 2), class = sd) +) # generate a summary of the results summary(fit1) diff --git a/man/brm_multiple.Rd b/man/brm_multiple.Rd index efc49719b..bd1d07fab 100644 --- a/man/brm_multiple.Rd +++ b/man/brm_multiple.Rd @@ -51,7 +51,7 @@ linear \code{gaussian} model is applied. In multivariate models, \item{prior}{One or more \code{brmsprior} objects created by \code{\link{set_prior}} or related functions and combined using the -\code{c} method or the \code{+} operator. See also \code{\link[brms:get_prior.default]{get_prior}} +\code{c} method or the \code{+} operator. See also \code{\link[brms:default_prior.default]{default_prior}} for more help.} \item{data2}{A \emph{list} of named lists each of which will be used to fit a diff --git a/man/brms-package.Rd b/man/brms-package.Rd index bd9e9dc29..2edc50c18 100644 --- a/man/brms-package.Rd +++ b/man/brms-package.Rd @@ -23,8 +23,8 @@ The main function of \pkg{brms} is \code{\link{brm}}, which uses formula syntax to specify a wide range of complex Bayesian models (see \code{\link{brmsformula}} for details). Based on the supplied formulas, data, and additional information, it writes the Stan code -on the fly via \code{\link[brms:make_stancode.default]{make_stancode}}, prepares the data via -\code{\link[brms:make_standata.default]{make_standata}} and fits the model using +on the fly via \code{\link[brms:stancode.default]{stancode}}, prepares the data via +\code{\link[brms:standata.default]{standata}} and fits the model using \pkg{\link[rstan:rstan]{Stan}}. Subsequently, a large number of post-processing methods can be applied: diff --git a/man/brmsfit_needs_refit.Rd b/man/brmsfit_needs_refit.Rd index 5520b0084..51151eba6 100644 --- a/man/brmsfit_needs_refit.Rd +++ b/man/brmsfit_needs_refit.Rd @@ -17,10 +17,10 @@ brmsfit_needs_refit( \arguments{ \item{fit}{Old \code{brmsfit} object (e.g., loaded from file).} -\item{sdata}{New Stan data (result of a call to \code{\link[brms:make_standata.default]{make_standata}}). +\item{sdata}{New Stan data (result of a call to \code{\link[brms:standata.default]{standata}}). Pass \code{NULL} to avoid this data check.} -\item{scode}{New Stan code (result of a call to \code{\link[brms:make_stancode.default]{make_stancode}}). +\item{scode}{New Stan code (result of a call to \code{\link[brms:stancode.default]{stancode}}). Pass \code{NULL} to avoid this code check.} \item{data}{New data to check consistency of factor level names. diff --git a/man/default_prior.Rd b/man/default_prior.Rd new file mode 100644 index 000000000..75f8f8d2c --- /dev/null +++ b/man/default_prior.Rd @@ -0,0 +1,43 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/priors.R +\name{default_prior} +\alias{default_prior} +\alias{get_prior} +\title{Default priors for Bayesian models} +\usage{ +default_prior(object, ...) + +get_prior(formula, ...) +} +\arguments{ +\item{object}{An object whose class will determine which method will +be used. A symbolic description of the model to be fitted.} + +\item{...}{Further arguments passed to the specific method.} + +\item{formula}{Synonym of \code{object} for use in \code{get_prior}.} +} +\value{ +Usually, a \code{brmsprior} object. See + \code{\link{default_prior.default}} for more details. +} +\description{ +\code{default_prior} is a generic function that can be used to + get default priors for Bayesian models. It's original use is + within the \pkg{brms} package, but new methods for use + with objects from other packages can be registered to the same generic. +} +\details{ +See \code{\link{default_prior.default}} for the default method applied for +\pkg{brms} models. You can view the available methods by typing +\code{methods(default_prior)}. +} +\examples{ +## get all parameters and parameters classes to define priors on +(prior <- default_prior(count ~ zAge + zBase * Trt + (1|patient) + (1|obs), + data = epilepsy, family = poisson())) + +} +\seealso{ +\code{\link{set_prior}}, \code{\link{default_prior.default}} +} diff --git a/man/get_prior.default.Rd b/man/default_prior.default.Rd similarity index 72% rename from man/get_prior.default.Rd rename to man/default_prior.default.Rd index 178b2f725..17756d3d2 100644 --- a/man/get_prior.default.Rd +++ b/man/default_prior.default.Rd @@ -1,11 +1,11 @@ % Generated by roxygen2: do not edit by hand % Please edit documentation in R/priors.R -\name{get_prior.default} -\alias{get_prior.default} -\title{Overview on Priors for \pkg{brms} Models} +\name{default_prior.default} +\alias{default_prior.default} +\title{Default Priors for \pkg{brms} Models} \usage{ -\method{get_prior}{default}( - formula, +\method{default_prior}{default}( + object, data, family = gaussian(), autocor = NULL, @@ -17,7 +17,7 @@ ) } \arguments{ -\item{formula}{An object of class \code{\link[stats:formula]{formula}}, +\item{object}{An object of class \code{\link[stats:formula]{formula}}, \code{\link{brmsformula}}, or \code{\link{mvbrmsformula}} (or one that can be coerced to that classes): A symbolic description of the model to be fitted. The details of model specification are explained in @@ -66,32 +66,33 @@ decreased. It is now recommended to use the \code{sparse} argument of \item{...}{Other arguments for internal usage only.} } \value{ -A data.frame with columns \code{prior}, \code{class}, \code{coef}, - and \code{group} and several rows, each providing information on a - parameter (or parameter class) on which priors can be specified. The prior - column is empty except for internal default priors. +A \code{brmsprior} object. That is, a data.frame with specific + columns including \code{prior}, \code{class}, \code{coef}, and \code{group} + and several rows, each providing information on a parameter (or parameter + class) on which priors can be specified. The prior column is empty except + for internal default priors. } \description{ Get information on all parameters (and parameter classes) for which priors may be specified including default priors. } \examples{ -## get all parameters and parameters classes to define priors on -(prior <- get_prior(count ~ zAge + zBase * Trt + (1|patient) + (1|obs), - data = epilepsy, family = poisson())) +# get all parameters and parameters classes to define priors on +(prior <- default_prior(count ~ zAge + zBase * Trt + (1|patient) + (1|obs), + data = epilepsy, family = poisson())) -## define a prior on all population-level effects a once +# define a prior on all population-level effects a once prior$prior[1] <- "normal(0,10)" -## define a specific prior on the population-level effect of Trt +# define a specific prior on the population-level effect of Trt prior$prior[5] <- "student_t(10, 0, 5)" -## verify that the priors indeed found their way into Stan's model code -make_stancode(count ~ zAge + zBase * Trt + (1|patient) + (1|obs), - data = epilepsy, family = poisson(), - prior = prior) +# verify that the priors indeed found their way into Stan's model code +stancode(count ~ zAge + zBase * Trt + (1|patient) + (1|obs), + data = epilepsy, family = poisson(), + prior = prior) } \seealso{ -\code{\link{set_prior}} +\code{\link{default_prior}}, \code{\link{set_prior}} } diff --git a/man/get_prior.Rd b/man/get_prior.Rd deleted file mode 100644 index d5b444443..000000000 --- a/man/get_prior.Rd +++ /dev/null @@ -1,52 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/priors.R -\name{get_prior} -\alias{get_prior} -\title{Get default priors for a Bayesian multilevel model} -\usage{ -get_prior(formula, data, ...) -} -\arguments{ -\item{formula}{A formula object whose class will determine which method will -be used. A symbolic description of the model to be fitted.} - -\item{data}{An object of class data.frame, or one that can be coerced to that -class) containing data of all variables used in the model.} - -\item{...}{Further arguments passed to the specific method} -} -\value{ -A data.frame with columns \code{prior}, \code{class}, \code{coef}, - and \code{group} and several rows, each providing information on a - parameter (or parameter class) on which priors can be specified. The prior - column is empty except for internal default priors. -} -\description{ -\code{get_prior} is a generic function that can be used to - obtain the default priors for a Bayesian multilevel model from various - packages that use the \pkg{brms} package for fitting the model. The - function invokes particular methods which depend on the class of the - formula object. - - You can view the available methods by typing - - \code{methods(get_prior)} - - See \code{\link[brms:get_prior.default]{get_prior}} for the default method - applied for \pkg{brms} -} -\examples{ -## get all parameters and parameters classes to define priors on - (prior <- get_prior(count ~ zAge + zBase * Trt + (1|patient) + (1|obs), - data = epilepsy, family = poisson())) - -## for more examples, see ?get_prior.default for \pkg{brms} and for the other -## methods by first calling: -methods(get_prior) - -## and then ?get_prior.* where * is the method name - -} -\seealso{ -\code{\link{set_prior}} \code{\link{get_prior.default}} -} diff --git a/man/gp.Rd b/man/gp.Rd index ef095eac4..9382d0e9d 100644 --- a/man/gp.Rd +++ b/man/gp.Rd @@ -126,7 +126,7 @@ me3 <- conditional_effects(fit3, ndraws = 200, spaghetti = TRUE) plot(me3, ask = FALSE, points = TRUE) # compare model fit -LOO(fit1, fit2, fit3) +loo(fit1, fit2, fit3) # simulate data with a factor covariate dat2 <- mgcv::gamSim(4, n = 90, scale = 2) diff --git a/man/make_stancode.Rd b/man/make_stancode.Rd deleted file mode 100644 index 1611e1d12..000000000 --- a/man/make_stancode.Rd +++ /dev/null @@ -1,48 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/make_stancode.R -\name{make_stancode} -\alias{make_stancode} -\title{Stan Code for a Bayesian multilevel model} -\usage{ -make_stancode(formula, data, ...) -} -\arguments{ -\item{formula}{A formula object whose class will determine which method will -be used. A symbolic description of the model to be fitted.} - -\item{data}{An object of class data.frame, or one that can be coerced to that -class) containing data of all variables used in the model.} - -\item{...}{Further arguments passed to the specific method} -} -\value{ -A named list of objects containing the required data to fit a - \pkg{brms} model with \pkg{Stan}. -} -\description{ -\code{make_stancode} is a generic function that can be used to - generate the Stan code to fit Bayesian multilevel models from various packages - with Stan. The function invokes particular methods which depend on the - class of the formula object. - - You can view the available methods by typing: - - \code{methods(make_stancode)} - - See \code{\link[brms:make_stancode.default]{make_stancode}} for the default - method applied for \pkg{brms} -} -\examples{ -make_stancode(rating ~ treat + period + carry + (1|subject), - data = inhaler, family = "cumulative") - -## for more examples, see ?make_stancode.default for \pkg{brms} and for the other -## methods by first calling: -methods(make_stancode) - -## and then ?make_stancode.* where * is the method name - -} -\seealso{ -\code{\link{make_stancode.default}} -} diff --git a/man/make_standata.Rd b/man/make_standata.Rd deleted file mode 100644 index 12fad80bb..000000000 --- a/man/make_standata.Rd +++ /dev/null @@ -1,49 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/make_standata.R -\name{make_standata} -\alias{make_standata} -\title{Data for a Bayesian multilevel model} -\usage{ -make_standata(formula, data, ...) -} -\arguments{ -\item{formula}{A formula object whose class will determine which method will -be used. A symbolic description of the model to be fitted.} - -\item{data}{An object of class data.frame, or one that can be coerced to that -class) containing data of all variables used in the model.} - -\item{...}{Further arguments passed to the specific method} -} -\value{ -A named list of objects containing the required data to fit a - \pkg{brms} model with \pkg{Stan}. -} -\description{ -\code{make_standata} is a generic function that can be used to - generate the data to fit Bayesian multilevel models from various packages - with Stan. The function invokes particular methods which depend on the - class of the formula object. - - You can view the available methods by typing: - - \code{methods(make_standata)} - - See \code{\link[brms:make_standata.default]{make_standata}} for the default - method applied for \pkg{brms} -} -\examples{ -sdata1 <- make_standata(rating ~ treat + period + carry + (1|subject), - data = inhaler, family = "cumulative") -str(sdata1) - -## for more examples, see ?make_standata.default for \pkg{brms} and for the other -## methods by first calling: -methods(make_standata) - -## and then ?make_standata.* where * is the method name - -} -\seealso{ -\code{\link{make_standata.default}} -} diff --git a/man/mixture.Rd b/man/mixture.Rd index 7ca789817..45ef005b7 100644 --- a/man/mixture.Rd +++ b/man/mixture.Rd @@ -97,7 +97,7 @@ summary(fit4) pp_check(fit4) ## compare model fit -LOO(fit1, fit2, fit3, fit4) +loo(fit1, fit2, fit3, fit4) } } diff --git a/man/prior_summary.brmsfit.Rd b/man/prior_summary.brmsfit.Rd index 98193f0eb..0c43904ca 100644 --- a/man/prior_summary.brmsfit.Rd +++ b/man/prior_summary.brmsfit.Rd @@ -1,9 +1,9 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/summary.R +% Please edit documentation in R/priors.R \name{prior_summary.brmsfit} \alias{prior_summary.brmsfit} \alias{prior_summary} -\title{Extract Priors of a Bayesian Model Fitted with \pkg{brms}} +\title{Priors of \code{brms} models} \usage{ \method{prior_summary}{brmsfit}(object, all = TRUE, ...) } @@ -16,18 +16,19 @@ priors (\code{TRUE}) or only those with proper priors (\code{FALSE})?} \item{...}{Further arguments passed to or from other methods.} } \value{ -For \code{brmsfit} objects, an object of class \code{brmsprior}. +An \code{brmsprior} object. } \description{ -Extract Priors of a Bayesian Model Fitted with \pkg{brms} +Extract priors of models fitted with \pkg{brms}. } \examples{ \dontrun{ -fit <- brm(count ~ zAge + zBase * Trt - + (1|patient) + (1|obs), - data = epilepsy, family = poisson(), - prior = c(prior(student_t(5,0,10), class = b), - prior(cauchy(0,2), class = sd))) +fit <- brm( + count ~ zAge + zBase * Trt + (1|patient) + (1|obs), + data = epilepsy, family = poisson(), + prior = prior(student_t(5,0,10), class = b) + + prior(cauchy(0,2), class = sd) +) prior_summary(fit) prior_summary(fit, all = FALSE) diff --git a/man/set_prior.Rd b/man/set_prior.Rd index 785ddeb29..f623c2c0f 100644 --- a/man/set_prior.Rd +++ b/man/set_prior.Rd @@ -104,7 +104,7 @@ Define priors for specific parameters or classes of parameters. set priors on. Often, it may not be immediately clear, which parameters are present in the model. To get a full list of parameters and parameter classes for which priors can be specified (depending on the model) use - function \code{\link[brms:get_prior.default]{get_prior}}. + function \code{\link[brms:default_prior.default]{default_prior}}. 1. Population-level ('fixed') effects @@ -408,5 +408,5 @@ set_prior("normal(0, 2)", dpar = c("muX", "muY", "muZ")) } \seealso{ -\code{\link[brms:get_prior.default]{get_prior}} +\code{\link[brms:default_prior.default]{default_prior}} } diff --git a/man/stancode.Rd b/man/stancode.Rd new file mode 100644 index 000000000..6051897c6 --- /dev/null +++ b/man/stancode.Rd @@ -0,0 +1,45 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/make_stancode.R +\name{stancode} +\alias{stancode} +\alias{make_stancode} +\title{Stan Code for Bayesian models} +\usage{ +stancode(object, ...) + +make_stancode(formula, ...) +} +\arguments{ +\item{object}{An object whose class will determine which method to apply. +Usually, it will be some kind of symbolic description of the model +form which Stan code should be generated.} + +\item{...}{Further arguments passed to the specific method.} + +\item{formula}{Synonym of \code{object} for use in \code{make_stancode}.} +} +\value{ +Usually, a character string containing the generated Stan code. + For pretty printing, we recommend the returned object to be of class + \code{c("character", "brmsmodel")}. +} +\description{ +\code{stancode} is a generic function that can be used to + generate Stan code for Bayesian models. It's original use is + within the \pkg{brms} package, but new methods for use + with objects from other packages can be registered to the same generic. +} +\details{ +See \code{\link[brms:stancode.default]{stancode.default}} for the default + method applied for \pkg{brms} models. + You can view the available methods by typing: \code{methods(stancode)} + The \code{make_stancode} function is an alias of \code{stancode}. +} +\examples{ +stancode(rating ~ treat + period + carry + (1|subject), + data = inhaler, family = "cumulative") + +} +\seealso{ +\code{\link{stancode.default}}, \code{\link{stancode.brmsfit}} +} diff --git a/man/stancode.brmsfit.Rd b/man/stancode.brmsfit.Rd index 5bd9cc3a1..655c34704 100644 --- a/man/stancode.brmsfit.Rd +++ b/man/stancode.brmsfit.Rd @@ -2,8 +2,7 @@ % Please edit documentation in R/make_stancode.R \name{stancode.brmsfit} \alias{stancode.brmsfit} -\alias{stancode} -\title{Extract Stan model code} +\title{Extract Stan code from \code{brmsfit} objects} \usage{ \method{stancode}{brmsfit}( object, @@ -13,8 +12,6 @@ backend = NULL, ... ) - -stancode(object, ...) } \arguments{ \item{object}{An object of class \code{brmsfit}.} @@ -32,12 +29,12 @@ with the current \pkg{brms} version. By default, \code{regenerate} will be \item{backend}{Controls the Stan backend. See \code{\link{brm}} for details.} \item{...}{Further arguments passed to -\code{\link[brms:make_stancode.default]{make_stancode}} if the Stan code is +\code{\link[brms:stancode.default]{stancode}} if the Stan code is regenerated.} } \value{ -Stan model code for further processing. +Stan code for further processing. } \description{ -Extract Stan code that was used to specify the model. +Extract Stan code from a fitted \pkg{brms} model. } diff --git a/man/make_stancode.default.Rd b/man/stancode.default.Rd similarity index 92% rename from man/make_stancode.default.Rd rename to man/stancode.default.Rd index 26c1643e3..bca0464b0 100644 --- a/man/make_stancode.default.Rd +++ b/man/stancode.default.Rd @@ -1,11 +1,11 @@ % Generated by roxygen2: do not edit by hand % Please edit documentation in R/make_stancode.R -\name{make_stancode.default} -\alias{make_stancode.default} +\name{stancode.default} +\alias{stancode.default} \title{Stan Code for \pkg{brms} Models} \usage{ -\method{make_stancode}{default}( - formula, +\method{stancode}{default}( + object, data, family = gaussian(), prior = NULL, @@ -25,7 +25,7 @@ ) } \arguments{ -\item{formula}{An object of class \code{\link[stats:formula]{formula}}, +\item{object}{An object of class \code{\link[stats:formula]{formula}}, \code{\link{brmsformula}}, or \code{\link{mvbrmsformula}} (or one that can be coerced to that classes): A symbolic description of the model to be fitted. The details of model specification are explained in @@ -45,7 +45,7 @@ linear \code{gaussian} model is applied. In multivariate models, \item{prior}{One or more \code{brmsprior} objects created by \code{\link{set_prior}} or related functions and combined using the -\code{c} method or the \code{+} operator. See also \code{\link[brms:get_prior.default]{get_prior}} +\code{c} method or the \code{+} operator. See also \code{\link[brms:default_prior.default]{default_prior}} for more help.} \item{autocor}{(Deprecated) An optional \code{\link{cor_brms}} object @@ -134,16 +134,17 @@ named after the string supplied in \code{save_model}.} } \value{ A character string containing the fully commented \pkg{Stan} code - to fit a \pkg{brms} model. + to fit a \pkg{brms} model. It is of class \code{c("character", "brmsmodel")} + to facilitate pretty printing. } \description{ Generate Stan code for \pkg{brms} models } \examples{ -make_stancode(rating ~ treat + period + carry + (1|subject), - data = inhaler, family = "cumulative") +stancode(rating ~ treat + period + carry + (1|subject), + data = inhaler, family = "cumulative") -make_stancode(count ~ zAge + zBase * Trt + (1|patient), - data = epilepsy, family = "poisson") +stancode(count ~ zAge + zBase * Trt + (1|patient), + data = epilepsy, family = "poisson") } diff --git a/man/standata.Rd b/man/standata.Rd new file mode 100644 index 000000000..db7756e61 --- /dev/null +++ b/man/standata.Rd @@ -0,0 +1,44 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/make_standata.R +\name{standata} +\alias{standata} +\alias{make_standata} +\title{Stan data for Bayesian models} +\usage{ +standata(object, ...) + +make_standata(formula, ...) +} +\arguments{ +\item{object}{A formula object whose class will determine which method will +be used. A symbolic description of the model to be fitted.} + +\item{...}{Further arguments passed to the specific method.} + +\item{formula}{Synonym of \code{object} for use in \code{make_standata}.} +} +\value{ +A named list of objects containing the required data to fit a + Bayesian model with \pkg{Stan}. +} +\description{ +\code{standata} is a generic function that can be used to + generate data for Bayesian models to be passed to Stan. It's original use is + within the \pkg{brms} package, but new methods for use + with objects from other packages can be registered to the same generic. +} +\details{ +See \code{\link{standata.default}} for the default method applied for +\pkg{brms} models. You can view the available methods by typing +\code{methods(standata)}. The \code{make_standata} function is an alias +of \code{standata}. +} +\examples{ +sdata1 <- standata(rating ~ treat + period + carry + (1|subject), + data = inhaler, family = "cumulative") +str(sdata1) + +} +\seealso{ +\code{\link{standata.default}}, \code{\link{standata.brmsfit}} +} diff --git a/man/standata.brmsfit.Rd b/man/standata.brmsfit.Rd index 24d821c42..806d72d45 100644 --- a/man/standata.brmsfit.Rd +++ b/man/standata.brmsfit.Rd @@ -2,8 +2,7 @@ % Please edit documentation in R/make_standata.R \name{standata.brmsfit} \alias{standata.brmsfit} -\alias{standata} -\title{Extract data passed to Stan} +\title{Extract data passed to Stan from \code{brmsfit} objects} \usage{ \method{standata}{brmsfit}( object, @@ -14,8 +13,6 @@ incl_autocor = TRUE, ... ) - -standata(object, ...) } \arguments{ \item{object}{An object of class \code{brmsfit}.} @@ -40,12 +37,13 @@ used in autocorrelation structures, or \code{\link{stanvars}}.} specified via \code{autocor} should be included in the predictions. Defaults to \code{TRUE}.} -\item{...}{More arguments passed to \code{\link[brms:make_standata.default]{make_standata}} +\item{...}{More arguments passed to +\code{\link[brms:standata.default]{standata.default}}. and \code{\link{validate_newdata}}.} } \value{ -A named list containing the data originally passed to Stan. +A named list containing the data passed to Stan. } \description{ -Extract all data that was used by Stan to fit the model. +Extract all data that was used by Stan to fit a \pkg{brms} model. } diff --git a/man/make_standata.default.Rd b/man/standata.default.Rd similarity index 89% rename from man/make_standata.default.Rd rename to man/standata.default.Rd index 368cc0641..99f399b57 100644 --- a/man/make_standata.default.Rd +++ b/man/standata.default.Rd @@ -1,11 +1,11 @@ % Generated by roxygen2: do not edit by hand % Please edit documentation in R/make_standata.R -\name{make_standata.default} -\alias{make_standata.default} +\name{standata.default} +\alias{standata.default} \title{Data for \pkg{brms} Models} \usage{ -\method{make_standata}{default}( - formula, +\method{standata}{default}( + object, data, family = gaussian(), prior = NULL, @@ -21,7 +21,7 @@ ) } \arguments{ -\item{formula}{An object of class \code{\link[stats:formula]{formula}}, +\item{object}{An object of class \code{\link[stats:formula]{formula}}, \code{\link{brmsformula}}, or \code{\link{mvbrmsformula}} (or one that can be coerced to that classes): A symbolic description of the model to be fitted. The details of model specification are explained in @@ -41,7 +41,7 @@ linear \code{gaussian} model is applied. In multivariate models, \item{prior}{One or more \code{brmsprior} objects created by \code{\link{set_prior}} or related functions and combined using the -\code{c} method or the \code{+} operator. See also \code{\link[brms:get_prior.default]{get_prior}} +\code{c} method or the \code{+} operator. See also \code{\link[brms:default_prior.default]{default_prior}} for more help.} \item{autocor}{(Deprecated) An optional \code{\link{cor_brms}} object @@ -107,20 +107,18 @@ dropped? Defaults to \code{TRUE}.} \value{ A named list of objects containing the required data to fit a \pkg{brms} model with \pkg{Stan}. + The \code{get_prior} function is an alias of \code{default_prior}. } \description{ -Generate data for \pkg{brms} models to be passed to \pkg{Stan} +Generate data for \pkg{brms} models to be passed to \pkg{Stan}. } \examples{ -sdata1 <- make_standata(rating ~ treat + period + carry + (1|subject), - data = inhaler, family = "cumulative") +sdata1 <- standata(rating ~ treat + period + carry + (1|subject), + data = inhaler, family = "cumulative") str(sdata1) -sdata2 <- make_standata(count ~ zAge + zBase * Trt + (1|patient), - data = epilepsy, family = "poisson") +sdata2 <- standata(count ~ zAge + zBase * Trt + (1|patient), + data = epilepsy, family = "poisson") str(sdata2) } -\author{ -Paul-Christian Buerkner \email{paul.buerkner@gmail.com} -} diff --git a/man/stanvar.Rd b/man/stanvar.Rd index 598615b21..5fde234b3 100644 --- a/man/stanvar.Rd +++ b/man/stanvar.Rd @@ -59,7 +59,7 @@ Special attention is necessary when using \code{stanvars} to inject code into the \code{'likelihood'} block while having \code{\link{threading}} activated. In this case, your custom Stan code may need adjustments to ensure correct observation indexing. Please investigate the generated Stan code via -\code{\link[brms:make_stancode.default]{make_stancode}} to see which adjustments are necessary in your case. +\code{\link[brms:stancode.default]{stancode}} to see which adjustments are necessary in your case. } \examples{ bprior <- prior(normal(mean_intercept, 10), class = "Intercept") diff --git a/man/validate_prior.Rd b/man/validate_prior.Rd index f1c54e919..eccb88fe9 100644 --- a/man/validate_prior.Rd +++ b/man/validate_prior.Rd @@ -19,7 +19,7 @@ validate_prior( \arguments{ \item{prior}{One or more \code{brmsprior} objects created by \code{\link{set_prior}} or related functions and combined using the -\code{c} method or the \code{+} operator. See also \code{\link[brms:get_prior.default]{get_prior}} +\code{c} method or the \code{+} operator. See also \code{\link[brms:default_prior.default]{default_prior}} for more help.} \item{formula}{An object of class \code{\link[stats:formula]{formula}}, @@ -66,7 +66,11 @@ for basis construction of smoothing terms. See \item{drop_unused_levels}{Should unused factors levels in the data be dropped? Defaults to \code{TRUE}.} -\item{...}{Other arguments for internal usage only.} +\item{...}{Further arguments passed to Stan. +For \code{backend = "rstan"} the arguments are passed to +\code{\link[rstan]{sampling}} or \code{\link[rstan]{vb}}. +For \code{backend = "cmdstanr"} the arguments are passed to the +\code{cmdstanr::sample} or \code{cmdstanr::variational} method.} } \value{ An object of class \code{brmsprior}. @@ -83,5 +87,5 @@ validate_prior(prior1, count ~ zAge + zBase * Trt + (1|patient), } \seealso{ -\code{\link[brms:get_prior.default]{get_prior}}, \code{\link{set_prior}}. +\code{\link[brms:default_prior.default]{default_prior}}, \code{\link{set_prior}}. } diff --git a/tests/testthat/tests.priors.R b/tests/testthat/tests.priors.R index c363d8af2..6e4232bac 100644 --- a/tests/testthat/tests.priors.R +++ b/tests/testthat/tests.priors.R @@ -1,4 +1,4 @@ -# most tests of prior related stuff can be found in tests.make_stancode.R +# most tests of prior related stuff can be found in tests.stancode.R context("Tests for prior generating functions") test_that("get_prior finds all classes for which priors can be specified", { From baeaa20833dbea845190308a7f6356aa5f50cc9a Mon Sep 17 00:00:00 2001 From: Ven Popov Date: Sun, 3 Mar 2024 10:44:58 +0100 Subject: [PATCH 7/8] change examples, update docs --- NEWS.md | 8 ++++--- R/brm.R | 4 ++-- R/make_standata.R | 1 - R/priors.R | 47 +++++++++++++++++++------------------ R/projpred.R | 2 +- R/rename_pars.R | 4 ++-- R/stanvars.R | 16 ++++++------- doc/brms_overview.ltx | 2 +- man/brm.Rd | 4 ++-- man/constant.Rd | 16 ++++++------- man/rename_pars.Rd | 4 ++-- man/set_prior.Rd | 20 ++++++++-------- man/standata.default.Rd | 1 - man/stanvar.Rd | 16 ++++++------- man/validate_prior.Rd | 6 +---- vignettes/brms_overview.ltx | 2 +- 16 files changed, 75 insertions(+), 78 deletions(-) diff --git a/NEWS.md b/NEWS.md index 0f8020c3a..7099d5fa0 100644 --- a/NEWS.md +++ b/NEWS.md @@ -10,9 +10,11 @@ if potentially results-changing arguments are provided to the criterion method. ### Other Changes * Change `make_stancode` and `make_standata` to be aliases of `stancode` and -`standata`, respectively. This enable other packages to define new `stancode` -and `standata` methods to generate Stan code and data for their own objects -building on brms. Thanks to Ven Popov for helping with this. (#1604) +`standata`, respectively. Change `get_prior` to be an alias of a new generic +method `default_prior`. This enable other packages to define new `stancode`, +`standata` and `default_prior` methods to generate Stan code and data, and extract +the default priors, for their own objects building on brms. Thanks to Ven Popov +for helping with this. (#1604) * No longer automatically canonicalize the Stan code if cmdstanr is used as backend. (#1544) * Improve parameter class names in the `summary` output. diff --git a/R/brm.R b/R/brm.R index cca636a29..43c86dc1a 100644 --- a/R/brm.R +++ b/R/brm.R @@ -418,8 +418,8 @@ #' #' #' # fit a model manually via rstan -#' scode <- make_stancode(count ~ Trt, data = epilepsy) -#' sdata <- make_standata(count ~ Trt, data = epilepsy) +#' scode <- stancode(count ~ Trt, data = epilepsy) +#' sdata <- standata(count ~ Trt, data = epilepsy) #' stanfit <- rstan::stan(model_code = scode, data = sdata) #' # feed the Stan model back into brms #' fit8 <- brm(count ~ Trt, data = epilepsy, empty = TRUE) diff --git a/R/make_standata.R b/R/make_standata.R index 6b89e1db9..eb3d0dd1e 100644 --- a/R/make_standata.R +++ b/R/make_standata.R @@ -53,7 +53,6 @@ make_standata <- function(formula, ...) { #' #' @return A named list of objects containing the required data #' to fit a \pkg{brms} model with \pkg{Stan}. -#' The \code{get_prior} function is an alias of \code{default_prior}. #' #' @examples #' sdata1 <- standata(rating ~ treat + period + carry + (1|subject), diff --git a/R/priors.R b/R/priors.R index b85c5e1e3..cc14efb77 100644 --- a/R/priors.R +++ b/R/priors.R @@ -319,8 +319,8 @@ #' identical(prior1, prior3) #' #' # check which parameters can have priors -#' get_prior(rating ~ treat + period + carry + (1|subject), -#' data = inhaler, family = cumulative()) +#' default_prior(rating ~ treat + period + carry + (1|subject), +#' data = inhaler, family = cumulative()) #' #' # define some priors #' bprior <- c(prior_string("normal(0,10)", class = "b"), @@ -329,25 +329,25 @@ #' group = ~subject, coef = ~Intercept)) #' #' # verify that the priors indeed found their way into Stan's model code -#' make_stancode(rating ~ treat + period + carry + (1|subject), -#' data = inhaler, family = cumulative(), -#' prior = bprior) +#' stancode(rating ~ treat + period + carry + (1|subject), +#' data = inhaler, family = cumulative(), +#' prior = bprior) #' #' # use the horseshoe prior to model sparsity in regression coefficients -#' make_stancode(count ~ zAge + zBase * Trt, -#' data = epilepsy, family = poisson(), -#' prior = set_prior("horseshoe(3)")) +#' stancode(count ~ zAge + zBase * Trt, +#' data = epilepsy, family = poisson(), +#' prior = set_prior("horseshoe(3)")) #' #' # fix certain priors to constants #' bprior <- prior(constant(1), class = "b") + #' prior(constant(2), class = "b", coef = "zBase") + #' prior(constant(0.5), class = "sd") -#' make_stancode(count ~ zAge + zBase + (1 | patient), +#' stancode(count ~ zAge + zBase + (1 | patient), #' data = epilepsy, prior = bprior) #' #' # pass priors to Stan without checking #' prior <- prior_string("target += normal_lpdf(b[1] | 0, 1)", check = FALSE) -#' make_stancode(count ~ Trt, data = epilepsy, prior = prior) +#' stancode(count ~ Trt, data = epilepsy, prior = prior) #' #' # define priors in a vectorized manner #' # useful in particular for categorical or multivariate models @@ -474,6 +474,7 @@ default_prior <- function(object, ...) { #' @rdname default_prior #' @export get_prior <- function(formula, ...) { + # became an alias of default_prior in 2.20.14. default_prior(formula, ...) } @@ -536,7 +537,7 @@ default_prior.default <- function(object, data, family = gaussian(), autocor = N .default_prior(bterms, data, ...) } -# internal work function of 'get_prior' +# internal work function of 'default_prior' # @param internal return priors for internal use? # @return a brmsprior object .default_prior <- function(bterms, data, internal = FALSE, ...) { @@ -916,7 +917,7 @@ def_lscale_prior <- function(bterms, data, plb = 0.01, pub = 0.01) { # @param ranef: a list returned by tidy_ranef # @param def_scale_prior a character string defining # the default prior for SD parameters -# @param internal: see 'get_prior' +# @param internal: see 'default_prior' prior_re <- function(ranef, def_scale_prior, internal = FALSE, ...) { prior <- empty_prior() if (!nrow(ranef)) { @@ -1189,7 +1190,7 @@ def_scale_prior.brmsterms <- function(x, data, center = TRUE, df = 3, #' Validate priors supplied by the user. Return a complete #' set of priors for the given model, including default priors. #' -#' @inheritParams get_prior.default +#' @inheritParams default_prior.default #' @inheritParams brm #' #' @return An object of class \code{brmsprior}. @@ -1256,7 +1257,7 @@ validate_prior <- function(prior, formula, data, family = gaussian(), "The following priors do not correspond ", "to any model parameter: \n", collapse(.print_prior(prior[invalid, ]), "\n"), - "Function 'get_prior' might be helpful to you." + "Function 'default_prior' might be helpful to you." ) } prior <- prior[!invalid, ] @@ -1319,7 +1320,7 @@ validate_prior <- function(prior, formula, data, family = gaussian(), "' will not be used in the model as all related coefficients have ", "individual priors already. If you did not set those ", "priors yourself, then maybe brms has assigned default priors. ", - "See ?set_prior and ?get_prior for more details." + "See ?set_prior and ?default_prior for more details." ) } } @@ -2311,17 +2312,17 @@ has_special_prior <- function(prior, px = NULL, class = NULL) { #' @returns A named list with elements \code{const} and \code{broadcast}. #' #' @examples -#' make_stancode(count ~ Base + Age, data = epilepsy, -#' prior = prior(constant(1), class = "b")) +#' stancode(count ~ Base + Age, data = epilepsy, +#' prior = prior(constant(1), class = "b")) #' #' # will fail parsing because brms will try to broadcast a vector into a vector -#' make_stancode(count ~ Base + Age, data = epilepsy, -#' prior = prior(constant(alpha), class = "b"), -#' stanvars = stanvar(c(1, 0), name = "alpha")) +#' stancode(count ~ Base + Age, data = epilepsy, +#' prior = prior(constant(alpha), class = "b"), +#' stanvars = stanvar(c(1, 0), name = "alpha")) #' -#' make_stancode(count ~ Base + Age, data = epilepsy, -#' prior = prior(constant(alpha, broadcast = FALSE), class = "b"), -#' stanvars = stanvar(c(1, 0), name = "alpha")) +#' stancode(count ~ Base + Age, data = epilepsy, +#' prior = prior(constant(alpha, broadcast = FALSE), class = "b"), +#' stanvars = stanvar(c(1, 0), name = "alpha")) #' #' @seealso \code{\link{set_prior}} #' diff --git a/R/projpred.R b/R/projpred.R index b36583f3f..86e7c9738 100644 --- a/R/projpred.R +++ b/R/projpred.R @@ -251,7 +251,7 @@ get_refmodel.brmsfit <- function(object, newdata = NULL, resp = NULL, if (!is.null(orhs)) warn_wrhs_orhs("orhs") } - # extract the response variable manually instead of from make_standata + # extract the response variable manually instead of from standata # so that it passes input checks of validate_newdata later on (#1314) formula <- formula(object) if (!is.null(resp)) { diff --git a/R/rename_pars.R b/R/rename_pars.R index a17d147fc..206f342e9 100644 --- a/R/rename_pars.R +++ b/R/rename_pars.R @@ -14,8 +14,8 @@ #' @examples #' \dontrun{ #' # fit a model manually via rstan -#' scode <- make_stancode(count ~ Trt, data = epilepsy) -#' sdata <- make_standata(count ~ Trt, data = epilepsy) +#' scode <- stancode(count ~ Trt, data = epilepsy) +#' sdata <- standata(count ~ Trt, data = epilepsy) #' stanfit <- rstan::stan(model_code = scode, data = sdata) #' #' # feed the Stan model back into brms diff --git a/R/stanvars.R b/R/stanvars.R index 6fbb04119..711786583 100644 --- a/R/stanvars.R +++ b/R/stanvars.R @@ -44,30 +44,30 @@ #' @examples #' bprior <- prior(normal(mean_intercept, 10), class = "Intercept") #' stanvars <- stanvar(5, name = "mean_intercept") -#' make_stancode(count ~ Trt, epilepsy, prior = bprior, -#' stanvars = stanvars) +#' 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;") -#' make_stancode(count ~ Trt + zBase, epilepsy, -#' prior = bprior, stanvars = stanvars) +#' 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") -#' make_stancode(count ~ Trt + zBase, epilepsy, -#' prior = bprior, stanvars = stanvars) +#' 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") -#' make_stancode(count ~ Trt + zBase, epilepsy, -#' stanvars = stanvars, threads = threading(2)) +#' stancode(count ~ Trt + zBase, epilepsy, +#' stanvars = stanvars, threads = threading(2)) #' #' @export stanvar <- function(x = NULL, name = NULL, scode = NULL, diff --git a/doc/brms_overview.ltx b/doc/brms_overview.ltx index 1c600bc59..702cc9e4f 100644 --- a/doc/brms_overview.ltx +++ b/doc/brms_overview.ltx @@ -119,7 +119,7 @@ devtools::install_github("paul-buerkner/brms") Additionally, a \proglang{C++} compiler is required. This is because \pkg{brms} internally creates \pkg{Stan} code, which is translated to \proglang{C++} and compiled afterwards. The program \pkg{Rtools} \citep{Rtools2015} comes with a \proglang{C++} compiler for Windows\footnote{During the installation process, there is an option to change the system \code{PATH}. Please make sure to check this options, because otherwise \pkg{Rtools} will not be available within \proglang{R}.}. On OS X, one should use \pkg{Xcode} \citep{Xcode2015} from the App Store. To check whether the compiler can be called within \proglang{R}, run \code{system("g++ -v")} when using \pkg{Rtools} or \code{system("clang++ -v")} when using \pkg{Xcode}. If no warning occurs and a few lines of difficult to read system code are printed out, the compiler should work correctly. For more detailed instructions on how to get the compilers running, see the prerequisites section on \url{https://github.com/stan-dev/rstan/wiki/RStan-Getting-Started}. -Models are fitted in \pkg{brms} using the following procedure, which is also summarized in Figure~\ref{flowchart}. First, the user specifies the model using the \code{brm} function in a way typical for most model fitting \proglang{R} functions, that is by defining \code{formula}, \code{data}, and \code{family}, as well as some other optional arguments. Second, this information is processed and the \code{make_stancode} and \code{make_standata} functions are called. The former generates the model code in \pkg{Stan} language and the latter prepares the data for use in \pkg{Stan}. These two are the mandatory parts of every \pkg{Stan} model and without \pkg{brms}, users would have to specify them themselves. Third, \pkg{Stan} code and data as well as additional arguments (such as the number of iterations and chains) are passed to functions of the \pkg{rstan} package (the \proglang{R} interface of \pkg{Stan}; \citeauthor{stan2017}, \citeyear{stan2017}). Fourth, the model is fitted by \pkg{Stan} after translating and compiling it in \proglang{C++}. Fifth, after the model has been fitted and returned by \pkg{rstan}, the fitted model object is post-processed in \pkg{brms} among others by renaming the model parameters to be understood by the user. Sixth, the results can be investigated in \proglang{R} using various methods such as \code{summary}, \code{plot}, or \code{predict} (for a complete list of methods type \code{methods(class = "brmsfit")}). +Models are fitted in \pkg{brms} using the following procedure, which is also summarized in Figure~\ref{flowchart}. First, the user specifies the model using the \code{brm} function in a way typical for most model fitting \proglang{R} functions, that is by defining \code{formula}, \code{data}, and \code{family}, as well as some other optional arguments. Second, this information is processed and the \code{stancode} and \code{standata} functions are called. The former generates the model code in \pkg{Stan} language and the latter prepares the data for use in \pkg{Stan}. These two are the mandatory parts of every \pkg{Stan} model and without \pkg{brms}, users would have to specify them themselves. Third, \pkg{Stan} code and data as well as additional arguments (such as the number of iterations and chains) are passed to functions of the \pkg{rstan} package (the \proglang{R} interface of \pkg{Stan}; \citeauthor{stan2017}, \citeyear{stan2017}). Fourth, the model is fitted by \pkg{Stan} after translating and compiling it in \proglang{C++}. Fifth, after the model has been fitted and returned by \pkg{rstan}, the fitted model object is post-processed in \pkg{brms} among others by renaming the model parameters to be understood by the user. Sixth, the results can be investigated in \proglang{R} using various methods such as \code{summary}, \code{plot}, or \code{predict} (for a complete list of methods type \code{methods(class = "brmsfit")}). \begin{figure}[ht] \centering diff --git a/man/brm.Rd b/man/brm.Rd index 6f5a0e4c7..c26c31a55 100644 --- a/man/brm.Rd +++ b/man/brm.Rd @@ -498,8 +498,8 @@ fit7 <- update(fit7, future = TRUE) # fit a model manually via rstan -scode <- make_stancode(count ~ Trt, data = epilepsy) -sdata <- make_standata(count ~ Trt, data = epilepsy) +scode <- stancode(count ~ Trt, data = epilepsy) +sdata <- standata(count ~ Trt, data = epilepsy) stanfit <- rstan::stan(model_code = scode, data = sdata) # feed the Stan model back into brms fit8 <- brm(count ~ Trt, data = epilepsy, empty = TRUE) diff --git a/man/constant.Rd b/man/constant.Rd index 19da1f64b..dee75147c 100644 --- a/man/constant.Rd +++ b/man/constant.Rd @@ -24,17 +24,17 @@ The function does not evaluate its arguments -- it exists purely to help set up the model. } \examples{ -make_stancode(count ~ Base + Age, data = epilepsy, - prior = prior(constant(1), class = "b")) +stancode(count ~ Base + Age, data = epilepsy, + prior = prior(constant(1), class = "b")) # will fail parsing because brms will try to broadcast a vector into a vector -make_stancode(count ~ Base + Age, data = epilepsy, - prior = prior(constant(alpha), class = "b"), - stanvars = stanvar(c(1, 0), name = "alpha")) +stancode(count ~ Base + Age, data = epilepsy, + prior = prior(constant(alpha), class = "b"), + stanvars = stanvar(c(1, 0), name = "alpha")) -make_stancode(count ~ Base + Age, data = epilepsy, - prior = prior(constant(alpha, broadcast = FALSE), class = "b"), - stanvars = stanvar(c(1, 0), name = "alpha")) +stancode(count ~ Base + Age, data = epilepsy, + prior = prior(constant(alpha, broadcast = FALSE), class = "b"), + stanvars = stanvar(c(1, 0), name = "alpha")) } \seealso{ diff --git a/man/rename_pars.Rd b/man/rename_pars.Rd index 2565042fc..587f8d3d6 100644 --- a/man/rename_pars.Rd +++ b/man/rename_pars.Rd @@ -24,8 +24,8 @@ Function \code{rename_pars} is a deprecated alias of \code{rename_pars}. \examples{ \dontrun{ # fit a model manually via rstan -scode <- make_stancode(count ~ Trt, data = epilepsy) -sdata <- make_standata(count ~ Trt, data = epilepsy) +scode <- stancode(count ~ Trt, data = epilepsy) +sdata <- standata(count ~ Trt, data = epilepsy) stanfit <- rstan::stan(model_code = scode, data = sdata) # feed the Stan model back into brms diff --git a/man/set_prior.Rd b/man/set_prior.Rd index f623c2c0f..d4434d275 100644 --- a/man/set_prior.Rd +++ b/man/set_prior.Rd @@ -372,8 +372,8 @@ identical(prior1, prior2) identical(prior1, prior3) # check which parameters can have priors -get_prior(rating ~ treat + period + carry + (1|subject), - data = inhaler, family = cumulative()) +default_prior(rating ~ treat + period + carry + (1|subject), + data = inhaler, family = cumulative()) # define some priors bprior <- c(prior_string("normal(0,10)", class = "b"), @@ -382,25 +382,25 @@ bprior <- c(prior_string("normal(0,10)", class = "b"), group = ~subject, coef = ~Intercept)) # verify that the priors indeed found their way into Stan's model code -make_stancode(rating ~ treat + period + carry + (1|subject), - data = inhaler, family = cumulative(), - prior = bprior) +stancode(rating ~ treat + period + carry + (1|subject), + data = inhaler, family = cumulative(), + prior = bprior) # use the horseshoe prior to model sparsity in regression coefficients -make_stancode(count ~ zAge + zBase * Trt, - data = epilepsy, family = poisson(), - prior = set_prior("horseshoe(3)")) +stancode(count ~ zAge + zBase * Trt, + data = epilepsy, family = poisson(), + prior = set_prior("horseshoe(3)")) # fix certain priors to constants bprior <- prior(constant(1), class = "b") + prior(constant(2), class = "b", coef = "zBase") + prior(constant(0.5), class = "sd") -make_stancode(count ~ zAge + zBase + (1 | patient), +stancode(count ~ zAge + zBase + (1 | patient), data = epilepsy, prior = bprior) # pass priors to Stan without checking prior <- prior_string("target += normal_lpdf(b[1] | 0, 1)", check = FALSE) -make_stancode(count ~ Trt, data = epilepsy, prior = prior) +stancode(count ~ Trt, data = epilepsy, prior = prior) # define priors in a vectorized manner # useful in particular for categorical or multivariate models diff --git a/man/standata.default.Rd b/man/standata.default.Rd index 99f399b57..8e16846a3 100644 --- a/man/standata.default.Rd +++ b/man/standata.default.Rd @@ -107,7 +107,6 @@ dropped? Defaults to \code{TRUE}.} \value{ A named list of objects containing the required data to fit a \pkg{brms} model with \pkg{Stan}. - The \code{get_prior} function is an alias of \code{default_prior}. } \description{ Generate data for \pkg{brms} models to be passed to \pkg{Stan}. diff --git a/man/stanvar.Rd b/man/stanvar.Rd index 5fde234b3..c3c9ac97b 100644 --- a/man/stanvar.Rd +++ b/man/stanvar.Rd @@ -64,29 +64,29 @@ correct observation indexing. Please investigate the generated Stan code via \examples{ bprior <- prior(normal(mean_intercept, 10), class = "Intercept") stanvars <- stanvar(5, name = "mean_intercept") -make_stancode(count ~ Trt, epilepsy, prior = bprior, - stanvars = stanvars) +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;") -make_stancode(count ~ Trt + zBase, epilepsy, - prior = bprior, stanvars = stanvars) +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") -make_stancode(count ~ Trt + zBase, epilepsy, - prior = bprior, stanvars = stanvars) +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") -make_stancode(count ~ Trt + zBase, epilepsy, - stanvars = stanvars, threads = threading(2)) +stancode(count ~ Trt + zBase, epilepsy, + stanvars = stanvars, threads = threading(2)) } diff --git a/man/validate_prior.Rd b/man/validate_prior.Rd index eccb88fe9..ab64bc9d4 100644 --- a/man/validate_prior.Rd +++ b/man/validate_prior.Rd @@ -66,11 +66,7 @@ for basis construction of smoothing terms. See \item{drop_unused_levels}{Should unused factors levels in the data be dropped? Defaults to \code{TRUE}.} -\item{...}{Further arguments passed to Stan. -For \code{backend = "rstan"} the arguments are passed to -\code{\link[rstan]{sampling}} or \code{\link[rstan]{vb}}. -For \code{backend = "cmdstanr"} the arguments are passed to the -\code{cmdstanr::sample} or \code{cmdstanr::variational} method.} +\item{...}{Other arguments for internal usage only.} } \value{ An object of class \code{brmsprior}. diff --git a/vignettes/brms_overview.ltx b/vignettes/brms_overview.ltx index 1c600bc59..702cc9e4f 100644 --- a/vignettes/brms_overview.ltx +++ b/vignettes/brms_overview.ltx @@ -119,7 +119,7 @@ devtools::install_github("paul-buerkner/brms") Additionally, a \proglang{C++} compiler is required. This is because \pkg{brms} internally creates \pkg{Stan} code, which is translated to \proglang{C++} and compiled afterwards. The program \pkg{Rtools} \citep{Rtools2015} comes with a \proglang{C++} compiler for Windows\footnote{During the installation process, there is an option to change the system \code{PATH}. Please make sure to check this options, because otherwise \pkg{Rtools} will not be available within \proglang{R}.}. On OS X, one should use \pkg{Xcode} \citep{Xcode2015} from the App Store. To check whether the compiler can be called within \proglang{R}, run \code{system("g++ -v")} when using \pkg{Rtools} or \code{system("clang++ -v")} when using \pkg{Xcode}. If no warning occurs and a few lines of difficult to read system code are printed out, the compiler should work correctly. For more detailed instructions on how to get the compilers running, see the prerequisites section on \url{https://github.com/stan-dev/rstan/wiki/RStan-Getting-Started}. -Models are fitted in \pkg{brms} using the following procedure, which is also summarized in Figure~\ref{flowchart}. First, the user specifies the model using the \code{brm} function in a way typical for most model fitting \proglang{R} functions, that is by defining \code{formula}, \code{data}, and \code{family}, as well as some other optional arguments. Second, this information is processed and the \code{make_stancode} and \code{make_standata} functions are called. The former generates the model code in \pkg{Stan} language and the latter prepares the data for use in \pkg{Stan}. These two are the mandatory parts of every \pkg{Stan} model and without \pkg{brms}, users would have to specify them themselves. Third, \pkg{Stan} code and data as well as additional arguments (such as the number of iterations and chains) are passed to functions of the \pkg{rstan} package (the \proglang{R} interface of \pkg{Stan}; \citeauthor{stan2017}, \citeyear{stan2017}). Fourth, the model is fitted by \pkg{Stan} after translating and compiling it in \proglang{C++}. Fifth, after the model has been fitted and returned by \pkg{rstan}, the fitted model object is post-processed in \pkg{brms} among others by renaming the model parameters to be understood by the user. Sixth, the results can be investigated in \proglang{R} using various methods such as \code{summary}, \code{plot}, or \code{predict} (for a complete list of methods type \code{methods(class = "brmsfit")}). +Models are fitted in \pkg{brms} using the following procedure, which is also summarized in Figure~\ref{flowchart}. First, the user specifies the model using the \code{brm} function in a way typical for most model fitting \proglang{R} functions, that is by defining \code{formula}, \code{data}, and \code{family}, as well as some other optional arguments. Second, this information is processed and the \code{stancode} and \code{standata} functions are called. The former generates the model code in \pkg{Stan} language and the latter prepares the data for use in \pkg{Stan}. These two are the mandatory parts of every \pkg{Stan} model and without \pkg{brms}, users would have to specify them themselves. Third, \pkg{Stan} code and data as well as additional arguments (such as the number of iterations and chains) are passed to functions of the \pkg{rstan} package (the \proglang{R} interface of \pkg{Stan}; \citeauthor{stan2017}, \citeyear{stan2017}). Fourth, the model is fitted by \pkg{Stan} after translating and compiling it in \proglang{C++}. Fifth, after the model has been fitted and returned by \pkg{rstan}, the fitted model object is post-processed in \pkg{brms} among others by renaming the model parameters to be understood by the user. Sixth, the results can be investigated in \proglang{R} using various methods such as \code{summary}, \code{plot}, or \code{predict} (for a complete list of methods type \code{methods(class = "brmsfit")}). \begin{figure}[ht] \centering From 354be0d5183bd2887e9cd853c2bd82a35a815b48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paul-Christian=20B=C3=BCrkner?= Date: Sun, 3 Mar 2024 11:28:51 +0100 Subject: [PATCH 8/8] minor cleaning --- README.Rmd | 4 +- README.md | 75 +-- man/figures/README-conditional_effects-1.png | Bin 38648 -> 39385 bytes man/figures/README-plot-1.png | Bin 112449 -> 100279 bytes tests/testthat/tests.make_stancode.R | 646 +++++++++---------- tests/testthat/tests.make_standata.R | 456 ++++++------- 6 files changed, 591 insertions(+), 590 deletions(-) diff --git a/README.Rmd b/README.Rmd index e2ed34994..22fb62006 100644 --- a/README.Rmd +++ b/README.Rmd @@ -261,9 +261,9 @@ Discourse. To propose a new feature or report a bug, please open an issue on ### How can I extract the generated Stan code? -If you have already fitted a model, just apply the `stancode` method on the +If you have already fitted a model, apply the `stancode` method on the fitted model object. If you just want to generate the Stan code without any -model fitting, use the `make_stancode` function. +model fitting, use the `stancode` method on your model formula. ### Can I avoid compiling models? diff --git a/README.md b/README.md index d87cfd83c..09f7ddcec 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,8 @@ with posterior predictive checks, cross-validation, and Bayes factors. (The R Journal) - [Website](https://paul-buerkner.github.io/brms/) (Website of brms with documentation and vignettes) -- [Blog posts](https://paul-buerkner.github.io/software/brms-blogposts.html) +- [Blog + posts](https://paul-buerkner.github.io/software/brms-blogposts.html) (List of blog posts about brms) - [Ask a question](https://discourse.mc-stan.org/) (Stan Forums on Discourse) @@ -79,18 +80,18 @@ summary(fit1) #> Draws: 4 chains, each with iter = 2000; warmup = 1000; thin = 1; #> total post-warmup draws = 4000 #> -#> Group-Level Effects: +#> Multilevel Hyperparameters: #> ~patient (Number of levels: 59) #> Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS -#> sd(Intercept) 0.58 0.07 0.46 0.73 1.01 768 1579 +#> sd(Intercept) 0.59 0.07 0.46 0.74 1.01 566 1356 #> -#> Population-Level Effects: +#> Regression Coefficients: #> Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS -#> Intercept 1.77 0.11 1.54 1.99 1.00 753 1511 -#> zAge 0.09 0.08 -0.07 0.26 1.00 830 1429 -#> zBase 0.70 0.12 0.47 0.95 1.00 678 1389 -#> Trt1 -0.26 0.16 -0.59 0.05 1.01 709 1356 -#> zBase:Trt1 0.05 0.17 -0.29 0.37 1.01 721 1404 +#> Intercept 1.78 0.12 1.55 2.01 1.00 771 1595 +#> zAge 0.09 0.09 -0.08 0.27 1.00 590 1302 +#> zBase 0.71 0.12 0.47 0.96 1.00 848 1258 +#> Trt1 -0.27 0.16 -0.60 0.05 1.01 749 1172 +#> zBase:Trt1 0.05 0.17 -0.30 0.38 1.00 833 1335 #> #> Draws were sampled using sampling(NUTS). For each parameter, Bulk_ESS #> and Tail_ESS are effective sample size measures, and Rhat is the potential @@ -155,8 +156,8 @@ previous seizures. Than we can use newdata <- data.frame(Trt = c(0, 1), zAge = 0, zBase = 0) predict(fit1, newdata = newdata, re_formula = NA) #> Estimate Est.Error Q2.5 Q97.5 -#> [1,] 5.90325 2.486249 2 11 -#> [2,] 4.59025 2.180262 1 9 +#> [1,] 5.91200 2.494857 2 11 +#> [2,] 4.57325 2.166058 1 9 ``` We need to set `re_formula = NA` in order not to condition of the @@ -167,8 +168,8 @@ line. ``` r fitted(fit1, newdata = newdata, re_formula = NA) #> Estimate Est.Error Q2.5 Q97.5 -#> [1,] 5.918847 0.6762827 4.666180 7.308699 -#> [2,] 4.554778 0.5144053 3.630642 5.659664 +#> [1,] 5.945276 0.7075160 4.696257 7.450011 +#> [2,] 4.540081 0.5343471 3.579757 5.665132 ``` Both methods return the same estimate (up to random error), while the @@ -194,46 +195,46 @@ leave-one-out (LOO) cross-validation. loo(fit1, fit2) #> Output of model 'fit1': #> -#> Computed from 4000 by 236 log-likelihood matrix +#> Computed from 4000 by 236 log-likelihood matrix. #> #> Estimate SE -#> elpd_loo -671.6 35.8 -#> p_loo 94.6 13.6 -#> looic 1343.3 71.6 +#> elpd_loo -671.7 36.6 +#> p_loo 94.3 14.2 +#> looic 1343.4 73.2 #> ------ -#> Monte Carlo SE of elpd_loo is NA. +#> MCSE of elpd_loo is NA. +#> MCSE and ESS estimates assume MCMC draws (r_eff in [0.4, 2.0]). #> #> Pareto k diagnostic values: -#> Count Pct. Min. n_eff -#> (-Inf, 0.5] (good) 209 88.6% 546 -#> (0.5, 0.7] (ok) 18 7.6% 125 -#> (0.7, 1] (bad) 7 3.0% 23 -#> (1, Inf) (very bad) 2 0.8% 12 +#> Count Pct. Min. ESS +#> (-Inf, 0.7] (good) 228 96.6% 157 +#> (0.7, 1] (bad) 7 3.0% +#> (1, Inf) (very bad) 1 0.4% #> See help('pareto-k-diagnostic') for details. #> #> Output of model 'fit2': #> -#> Computed from 4000 by 236 log-likelihood matrix +#> Computed from 4000 by 236 log-likelihood matrix. #> #> Estimate SE -#> elpd_loo -596.2 14.1 -#> p_loo 108.5 7.3 -#> looic 1192.3 28.3 +#> elpd_loo -596.8 14.0 +#> p_loo 109.7 7.2 +#> looic 1193.6 28.1 #> ------ -#> Monte Carlo SE of elpd_loo is NA. +#> MCSE of elpd_loo is NA. +#> MCSE and ESS estimates assume MCMC draws (r_eff in [0.4, 1.7]). #> #> Pareto k diagnostic values: -#> Count Pct. Min. n_eff -#> (-Inf, 0.5] (good) 84 35.6% 755 -#> (0.5, 0.7] (ok) 96 40.7% 171 -#> (0.7, 1] (bad) 50 21.2% 25 -#> (1, Inf) (very bad) 6 2.5% 10 +#> Count Pct. Min. ESS +#> (-Inf, 0.7] (good) 172 72.9% 83 +#> (0.7, 1] (bad) 56 23.7% +#> (1, Inf) (very bad) 8 3.4% #> See help('pareto-k-diagnostic') for details. #> #> Model comparisons: #> elpd_diff se_diff #> fit2 0.0 0.0 -#> fit1 -75.5 26.3 +#> fit1 -74.9 27.2 ``` The `loo` output when comparing models is a little verbose. We first see @@ -335,9 +336,9 @@ feature or report a bug, please open an issue on ### How can I extract the generated Stan code? -If you have already fitted a model, just apply the `stancode` method on -the fitted model object. If you just want to generate the Stan code -without any model fitting, use the `make_stancode` function. +If you have already fitted a model, apply the `stancode` method on the +fitted model object. If you just want to generate the Stan code without +any model fitting, use the `stancode` method on your model formula. ### Can I avoid compiling models? diff --git a/man/figures/README-conditional_effects-1.png b/man/figures/README-conditional_effects-1.png index 0396e6d05dab412f8eb352260425a4770e0ff2b1..94f9babfcbeccc0b79772f965870c7c40318de5e 100644 GIT binary patch literal 39385 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 mPye{=y_V5jR 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 z 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

TYw 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 literal 112449 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Ⓢ~tYQ6d*7^|^ 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

ZtFyTtMBw3<=Fm?cnXWXb9F#|6M|AAaiyoYU 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[M_1] sd_1;") expect_match2(scode, "vector[M_2] sd_2;") @@ -43,7 +43,7 @@ test_that("specified priors appear in the Stan code", { prior(normal(0, 1), class = b), prior(normal(0, 5), class = Intercept), prior(cauchy(0, 5), class = sd)) - scode <- make_stancode(y ~ x1 + cs(x2) + (0 + x1 + x2 | g), + scode <- stancode(y ~ x1 + cs(x2) + (0 + x1 + x2 | g), data = dat, family = acat(), prior = prior, sample_prior = TRUE) expect_match2(scode, "lprior += normal_lpdf(b | 0, 1)") @@ -57,7 +57,7 @@ test_that("specified priors appear in the Stan code", { prior(normal(0,10), nlpar = b), prior(cauchy(0,1), class = sd, nlpar = a), prior(lkj(2), class = cor, group = g)) - scode <- make_stancode( + scode <- stancode( bf(y ~ a * exp(-b * x1), a + b ~ (1|ID|g), nl = TRUE), data = dat, prior = prior, sample_prior = TRUE ) @@ -73,7 +73,7 @@ test_that("specified priors appear in the Stan code", { prior(cauchy(0, 5), sigma, resp = y), prior(cauchy(0, 1), sigma, resp = x1)) form <- bf(mvbind(y, x1) ~ x2) + set_rescor(TRUE) - scode <- make_stancode(form, dat, prior = prior, + scode <- stancode(form, dat, prior = prior, sample_prior = TRUE) expect_match2(scode, "lprior += lkj_corr_cholesky_lpdf(Lrescor | 2)") expect_match2(scode, "prior_sigma_y = cauchy_rng(0,5)") @@ -82,7 +82,7 @@ test_that("specified priors appear in the Stan code", { prior <- c(prior(uniform(-1, 1), ar), prior(normal(0, 0.5), ma), prior(normal(0, 5))) - scode <- make_stancode(y ~ mo(g) + arma(cov = TRUE), dat, + scode <- stancode(y ~ mo(g) + arma(cov = TRUE), dat, prior = prior, sample_prior = TRUE) expect_match2(scode, "vector[Kar] ar;") expect_match2(scode, "vector[Kma] ma;") @@ -100,27 +100,27 @@ test_that("specified priors appear in the Stan code", { # test for problem described in #213 prior <- c(prior(normal(0, 1), coef = x1), prior(normal(0, 2), coef = x1, dpar = sigma)) - scode <- make_stancode(bf(y ~ x1, sigma ~ x1), dat, prior = prior) + scode <- stancode(bf(y ~ x1, sigma ~ x1), dat, prior = prior) expect_match2(scode, "lprior += normal_lpdf(b[1] | 0, 1);") expect_match2(scode, "lprior += normal_lpdf(b_sigma[1] | 0, 2);") prior <- c(set_prior("target += normal_lpdf(b[1] | 0, 1)", check = FALSE), set_prior("", class = "sigma")) - scode <- make_stancode(y ~ x1, dat, prior = prior, sample_prior = TRUE) + scode <- stancode(y ~ x1, dat, prior = prior, sample_prior = TRUE) expect_match2(scode, "target += normal_lpdf(b[1] | 0, 1)") expect_true(!grepl("sigma \\|", scode)) # commented out until fixes implemented in 'check_prior_content' prior <- prior(gamma(0, 1), coef = x1) - expect_warning(make_stancode(y ~ x1, dat, prior = prior), + expect_warning(stancode(y ~ x1, dat, prior = prior), "no natural lower bound") prior <- prior(uniform(0,5), class = sd) - expect_warning(make_stancode(y ~ x1 + (1|g), dat, prior = prior), + expect_warning(stancode(y ~ x1 + (1|g), dat, prior = prior), "no natural upper bound") prior <- prior(uniform(-1, 1), class = cor) expect_error( - make_stancode(y ~ x1 + (x1|g), dat, prior = prior), + stancode(y ~ x1 + (x1|g), dat, prior = prior), "prior for correlation matrices is the 'lkj' prior" ) }) @@ -132,7 +132,7 @@ test_that("special shrinkage priors appear in the Stan code", { # horseshoe prior hs <- horseshoe(7, scale_global = 2, df_global = 3, df_slab = 6, scale_slab = 3) - scode <- make_stancode(y ~ x1*x2, data = dat, + scode <- stancode(y ~ x1*x2, data = dat, prior = set_prior(hs), sample_prior = TRUE) expect_match2(scode, "vector[Kscales] hs_local;") @@ -150,13 +150,13 @@ test_that("special shrinkage priors appear in the Stan code", { "scales = scales_horseshoe(hs_local, hs_global, hs_scale_slab^2 * hs_slab);" ) - scode <- make_stancode(y ~ x1*x2, data = dat, poisson(), + scode <- stancode(y ~ x1*x2, data = dat, poisson(), prior = prior(horseshoe(scale_global = 3))) expect_match2(scode, "scales = scales_horseshoe(hs_local, hs_global, hs_scale_slab^2 * hs_slab);" ) - scode <- make_stancode(x1 ~ mo(y), dat, prior = prior(horseshoe())) + scode <- stancode(x1 ~ mo(y), dat, prior = prior(horseshoe())) expect_match2(scode, "target += std_normal_lpdf(zbsp);") expect_match2(scode, "target += student_t_lpdf(hs_local | hs_df, 0, 1)" @@ -166,7 +166,7 @@ test_that("special shrinkage priors appear in the Stan code", { ) # R2D2 prior - scode <- make_stancode(y ~ x1*x2, data = dat, + scode <- stancode(y ~ x1*x2, data = dat, prior = prior(R2D2(0.5, 10)), sample_prior = TRUE) expect_match2(scode, "scales = scales_R2D2(R2D2_phi, R2D2_tau2);") @@ -177,7 +177,7 @@ test_that("special shrinkage priors appear in the Stan code", { # shrinkage priors applied in a non-linear model hs_a1 <- horseshoe(7, scale_global = 2, df_global = 3) R2D2_a2 <- R2D2(0.5, 10) - scode <- SW(make_stancode( + scode <- SW(stancode( bf(y ~ a1 + a2, a1 ~ x1, a2 ~ 0 + x2, nl = TRUE), data = dat, sample_prior = TRUE, prior = c(set_prior(hs_a1, nlpar = "a1"), @@ -208,7 +208,7 @@ test_that("special shrinkage priors appear in the Stan code", { prior(R2D2(), class = sdgp) + prior(R2D2(), class = ar) + prior(R2D2(), class = ma) - scode <- make_stancode(bform, data = dat, prior = bprior) + scode <- stancode(bform, data = dat, prior = bprior) expect_match2(scode, "sdb = scales[(1):(Kc)];") expect_match2(scode, "sdbsp = scales[(1+Kc):(Kc+Ksp)];") expect_match2(scode, "sdbs = scales[(1+Kc+Ksp):(Kc+Ksp+Ks)];") @@ -222,21 +222,21 @@ test_that("special shrinkage priors appear in the Stan code", { expect_match2(scode, "ar = zar .* sdar; // scale coefficients") # check error messages - expect_error(make_stancode(y ~ x1*x2, data = dat, + expect_error(stancode(y ~ x1*x2, data = dat, prior = prior(horseshoe(-1))), "Degrees of freedom of the local priors") - expect_error(make_stancode(y ~ x1*x2, data = dat, + expect_error(stancode(y ~ x1*x2, data = dat, prior = prior(horseshoe(1, -1))), "Scale of the global prior") - expect_error(make_stancode(y ~ cs(x1), dat, acat(), prior = prior(R2D2())), + expect_error(stancode(y ~ cs(x1), dat, acat(), prior = prior(R2D2())), "Special priors are not yet allowed") bprior <- prior(horseshoe()) + prior(normal(0, 1), coef = "y") - expect_error(make_stancode(x1 ~ y, dat, prior = bprior), + expect_error(stancode(x1 ~ y, dat, prior = bprior), "Defining separate priors for single coefficients") - expect_error(make_stancode(x1 ~ y, dat, prior = prior(horseshoe(), lb = 0)), + expect_error(stancode(x1 ~ y, dat, prior = prior(horseshoe(), lb = 0)), "Setting boundaries on coefficients is not allowed") expect_error( - make_stancode(y ~ x1*x2, data = dat, prior = prior(lasso(2, scale = 10))), + stancode(y ~ x1*x2, data = dat, prior = prior(lasso(2, scale = 10))), "The lasso prior is no longer supported" ) }) @@ -253,7 +253,7 @@ test_that("priors can be fixed to constants", { prior(constant(1), sd, group = g, coef = x2) + prior(constant(2), sd, group = g, coef = x1) + prior(constant(0.3), sigma) - scode <- make_stancode(y ~ x1*x2 + (x1*x2 | g), dat, prior = prior) + scode <- stancode(y ~ x1*x2 + (x1*x2 | g), dat, prior = prior) expect_match2(scode, "b[1] = 3;") expect_match2(scode, "b[2] = -1;") expect_match2(scode, "b[3] = par_b_3;") @@ -266,7 +266,7 @@ test_that("priors can be fixed to constants", { expect_match2(scode, "sigma = 0.3;") prior <- prior(constant(3)) - scode <- make_stancode(y ~ x2 + x1 + cs(g), dat, family = sratio(), + scode <- stancode(y ~ x2 + x1 + cs(g), dat, family = sratio(), prior = prior) expect_match2(scode, "b = rep_vector(3, rows(b));") expect_match2(scode, "bcs = rep_matrix(3, rows(bcs), cols(bcs));") @@ -274,7 +274,7 @@ test_that("priors can be fixed to constants", { prior <- prior(normal(0, 3)) + prior(constant(3), coef = x1) + prior(constant(-1), coef = g) - scode <- make_stancode(y ~ x1 + cs(x2) + cs(g), dat, family = sratio(), + scode <- stancode(y ~ x1 + cs(x2) + cs(g), dat, family = sratio(), prior = prior) expect_match2(scode, "b[1] = 3;") expect_match2(scode, "bcs[1] = par_bcs_1;") @@ -283,20 +283,20 @@ test_that("priors can be fixed to constants", { prior <- prior(constant(3), class = "sd", group = "g") + prior(constant("[[1, 0], [0, 1]]"), class = "cor") - scode <- make_stancode(y ~ x1 + (x1 | gr(g, by = h)), dat, prior = prior) + scode <- stancode(y ~ x1 + (x1 | gr(g, by = h)), dat, prior = prior) expect_match2(scode, "sd_1 = rep_matrix(3, rows(sd_1), cols(sd_1));") expect_match2(scode, "L_1[2] = [[1, 0], [0, 1]];") prior <- prior(constant(0.5), class = lscale, coef = gpx1h1) + prior(normal(0, 10), class = lscale, coef = gpx1h2) - scode <- make_stancode(y ~ gp(x1, by = h), dat, prior = prior) + scode <- stancode(y ~ gp(x1, by = h), dat, prior = prior) expect_match2(scode, "lscale_1[1][1] = 0.5;") expect_match2(scode, "lscale_1[2][1] = par_lscale_1_2_1;") expect_match2(scode, "lprior += normal_lpdf(lscale_1[2][1] | 0, 10)") # test that improper base priors are correctly recognized (#919) prior <- prior(constant(-1), b, coef = x2) - scode <- make_stancode(y ~ x1*x2, dat, prior = prior) + scode <- stancode(y ~ x1*x2, dat, prior = prior) expect_match2(scode, "real par_b_1;") expect_match2(scode, "b[3] = par_b_3;") @@ -304,70 +304,70 @@ test_that("priors can be fixed to constants", { prior <- prior(normal(0, 1), Intercept) + prior(constant(3), Intercept, coef = 2) expect_error( - make_stancode(y ~ x1, data = dat, family = cumulative(), prior = prior), + stancode(y ~ x1, data = dat, family = cumulative(), prior = prior), "Can either estimate or fix all values" ) }) test_that("link functions appear in the Stan code", { dat <- data.frame(y = 1:10, x = rnorm(10)) - expect_match2(make_stancode(y ~ s(x), dat, family = poisson()), + expect_match2(stancode(y ~ s(x), dat, family = poisson()), "target += poisson_log_lpmf(Y | mu);") - expect_match2(make_stancode(mvbind(y, y + 1) ~ x, dat, + expect_match2(stancode(mvbind(y, y + 1) ~ x, dat, family = skew_normal("log")), "mu_y = exp(mu_y);") - expect_match2(make_stancode(y ~ x, dat, family = von_mises(tan_half)), + expect_match2(stancode(y ~ x, dat, family = von_mises(tan_half)), "mu = inv_tan_half_vector(mu);") - expect_match2(make_stancode(y ~ x, dat, family = weibull()), + expect_match2(stancode(y ~ x, dat, family = weibull()), "mu = exp(mu);") - expect_match2(make_stancode(y ~ x, dat, family = poisson("sqrt")), + expect_match2(stancode(y ~ x, dat, family = poisson("sqrt")), "mu = square(mu);") - expect_match2(make_stancode(y ~ s(x), dat, family = bernoulli()), + expect_match2(stancode(y ~ s(x), dat, family = bernoulli()), "target += bernoulli_logit_lpmf(Y | mu);") - scode <- make_stancode(y ~ x, dat, family = beta_binomial('logit')) + scode <- stancode(y ~ x, dat, family = beta_binomial('logit')) expect_match2(scode, "mu = inv_logit(mu);") - scode <- make_stancode(y ~ x, dat, family = beta_binomial('cloglog')) + scode <- stancode(y ~ x, dat, family = beta_binomial('cloglog')) expect_match2(scode, "mu = inv_cloglog(mu);") - scode <- make_stancode(y ~ x, dat, family = beta_binomial('cauchit')) + scode <- stancode(y ~ x, dat, family = beta_binomial('cauchit')) expect_match2(scode, "mu = inv_cauchit_vector(mu);") - scode <- make_stancode(y ~ x, dat, family = cumulative('cauchit')) + scode <- stancode(y ~ x, dat, family = cumulative('cauchit')) expect_match2(scode, "p = inv_cauchit(disc * (thres[1] - mu));") }) test_that("Stan GLM primitives are applied correctly", { dat <- data.frame(x = rnorm(10), y = 1:10) - scode <- make_stancode(y ~ x, dat, family = gaussian) + scode <- stancode(y ~ x, dat, family = gaussian) expect_match2(scode, "normal_id_glm_lpdf(Y | Xc, Intercept, b, sigma)") - scode <- make_stancode(y ~ x, dat, family = bernoulli) + scode <- stancode(y ~ x, dat, family = bernoulli) expect_match2(scode, "bernoulli_logit_glm_lpmf(Y | Xc, Intercept, b)") - scode <- make_stancode(y ~ x, dat, family = poisson) + scode <- stancode(y ~ x, dat, family = poisson) expect_match2(scode, "poisson_log_glm_lpmf(Y | Xc, Intercept, b)") - scode <- make_stancode(y ~ x, dat, family = negbinomial) + scode <- stancode(y ~ x, dat, family = negbinomial) expect_match2(scode, "neg_binomial_2_log_glm_lpmf(Y | Xc, Intercept, b, shape)" ) - scode <- make_stancode(y ~ x, dat, family = brmsfamily("negbinomial2")) + scode <- stancode(y ~ x, dat, family = brmsfamily("negbinomial2")) expect_match2(scode, "neg_binomial_2_log_glm_lpmf(Y | Xc, Intercept, b, inv(sigma))" ) - scode <- make_stancode(y ~ 0 + x, dat, family = gaussian) + scode <- stancode(y ~ 0 + x, dat, family = gaussian) expect_match2(scode, "normal_id_glm_lpdf(Y | X, 0, b, sigma)") bform <- bf(y ~ x) + bf(x ~ 1, family = negbinomial()) + set_rescor(FALSE) - scode <- make_stancode(bform, dat, family = gaussian) + scode <- stancode(bform, dat, family = gaussian) expect_match2(scode, "normal_id_glm_lpdf(Y_y | Xc_y, Intercept_y, b_y, sigma_y)" ) - scode <- make_stancode(bf(y ~ x, decomp = "QR"), dat, family = gaussian) + scode <- stancode(bf(y ~ x, decomp = "QR"), dat, family = gaussian) expect_match2(scode, "normal_id_glm_lpdf(Y | XQ, Intercept, bQ, sigma);") }) @@ -376,27 +376,27 @@ test_that("customized covariances appear in the Stan code", { rownames(M) <- unique(inhaler$subject) dat2 <- list(M = M) - scode <- make_stancode(rating ~ treat + (1 | gr(subject, cov = M)), + scode <- stancode(rating ~ treat + (1 | gr(subject, cov = M)), data = inhaler, data2 = dat2) expect_match2(scode, "r_1_1 = (sd_1[1] * (Lcov_1 * z_1[1]))") - scode <- make_stancode(rating ~ treat + (1 + treat | gr(subject, cov = M)), + scode <- stancode(rating ~ treat + (1 + treat | gr(subject, cov = M)), data = inhaler, data2 = dat2) expect_match2(scode, "r_1 = scale_r_cor_cov(z_1, sd_1, L_1, Lcov_1);") expect_match2(scode, "cor_1[choose(k - 1, 2) + j] = Cor_1[j, k];") - scode <- make_stancode(rating ~ (1 + treat | gr(subject, cor = FALSE, cov = M)), + scode <- stancode(rating ~ (1 + treat | gr(subject, cor = FALSE, cov = M)), data = inhaler, data2 = dat2) expect_match2(scode, "r_1_1 = (sd_1[1] * (Lcov_1 * z_1[1]));") expect_match2(scode, "r_1_2 = (sd_1[2] * (Lcov_1 * z_1[2]));") inhaler$by <- inhaler$subject %% 2 - scode <- make_stancode(rating ~ (1 + treat | gr(subject, by = by, cov = M)), + scode <- stancode(rating ~ (1 + treat | gr(subject, by = by, cov = M)), data = inhaler, data2 = dat2) expect_match2(scode, "r_1 = scale_r_cor_by_cov(z_1, sd_1, L_1, Jby_1, Lcov_1);") expect_warning( - scode <- make_stancode(rating ~ treat + period + carry + (1|subject), + scode <- stancode(rating ~ treat + period + carry + (1|subject), data = inhaler, cov_ranef = list(subject = 1)), "Argument 'cov_ranef' is deprecated" ) @@ -404,18 +404,18 @@ test_that("customized covariances appear in the Stan code", { }) test_that("truncation appears in the Stan code", { - scode <- make_stancode(time | trunc(0) ~ age + sex + disease, + scode <- stancode(time | trunc(0) ~ age + sex + disease, data = kidney, family = "gamma") expect_match2(scode, "target += gamma_lpdf(Y[n] | shape, shape / mu[n]) -") expect_match2(scode, "gamma_lccdf(lb[n] | shape, shape / mu[n]);") - scode <- make_stancode(time | trunc(ub = 100) ~ age + sex + disease, + scode <- stancode(time | trunc(ub = 100) ~ age + sex + disease, data = kidney, family = student("log")) expect_match2(scode, "target += student_t_lpdf(Y[n] | nu, mu[n], sigma) -") expect_match2(scode, "student_t_lcdf(ub[n] | nu, mu[n], sigma);") - scode <- make_stancode(count | trunc(0, 150) ~ Trt, + scode <- stancode(count | trunc(0, 150) ~ Trt, data = epilepsy, family = "poisson") expect_match2(scode, "target += poisson_lpmf(Y[n] | mu[n]) -") expect_match2(scode, @@ -423,57 +423,57 @@ test_that("truncation appears in the Stan code", { ) }) -test_that("make_stancode handles models without fixed effects", { - expect_match2(make_stancode(count ~ 0 + (1|patient) + (1+Trt|visit), +test_that("stancode handles models without fixed effects", { + expect_match2(stancode(count ~ 0 + (1|patient) + (1+Trt|visit), data = epilepsy, family = "poisson"), "mu = rep_vector(0.0, N);") }) -test_that("make_stancode correctly restricts FE parameters", { +test_that("stancode correctly restricts FE parameters", { data <- data.frame(y = rep(0:1, each = 5), x = rnorm(10)) - scode <- make_stancode(y ~ x, data, prior = set_prior("", lb = 2)) + scode <- stancode(y ~ x, data, prior = set_prior("", lb = 2)) expect_match2(scode, "vector[Kc] b") - scode <- make_stancode( + scode <- stancode( y ~ x, data, prior = set_prior("normal (0, 2)", ub = "4") ) expect_match2(scode, "vector[Kc] b") expect_match2(scode, "- 1 * normal_lcdf(4 | 0, 2)") prior <- set_prior("normal(0,5)", lb = "-3", ub = 5) - scode <- make_stancode(y ~ 0 + x, data, prior = prior) + scode <- stancode(y ~ 0 + x, data, prior = prior) expect_match2(scode, "vector[K] b") }) test_that("self-defined functions appear in the Stan code", { # cauchit link - scode <- make_stancode(rating ~ treat, data = inhaler, + scode <- stancode(rating ~ treat, data = inhaler, family = bernoulli("cauchit")) expect_match2(scode, "real inv_cauchit(real y)") # softplus link - scode <- make_stancode(rating ~ treat, data = inhaler, + scode <- stancode(rating ~ treat, data = inhaler, family = brmsfamily("poisson", "softplus")) expect_match2(scode, "vector log_expm1_vector(vector x)") # squareplus link - scode <- make_stancode(rating ~ treat, data = inhaler, + scode <- stancode(rating ~ treat, data = inhaler, family = brmsfamily("poisson", "squareplus")) expect_match2(scode, "real squareplus(real x)") # tan_half link - expect_match2(make_stancode(rating ~ treat, data = inhaler, + expect_match2(stancode(rating ~ treat, data = inhaler, family = von_mises("tan_half")), "vector inv_tan_half_vector(vector y)") # logm1 link - expect_match2(make_stancode(rating ~ treat, data = inhaler, + expect_match2(stancode(rating ~ treat, data = inhaler, family = frechet()), "real expp1(real y)") # inverse gaussian models - scode <- make_stancode(time | cens(censored) ~ age, data = kidney, + scode <- stancode(time | cens(censored) ~ age, data = kidney, family = inverse.gaussian) expect_match2(scode, "real inv_gaussian_lpdf(real y") expect_match2(scode, "real inv_gaussian_lcdf(real y") @@ -481,64 +481,64 @@ test_that("self-defined functions appear in the Stan code", { expect_match2(scode, "real inv_gaussian_vector_lpdf(vector y") # von Mises models - scode <- make_stancode(time ~ age, data = kidney, family = von_mises) + scode <- stancode(time ~ age, data = kidney, family = von_mises) expect_match2(scode, "real von_mises_real_lpdf(real y") expect_match2(scode, "real von_mises_vector_lpdf(vector y") # zero-inflated and hurdle models - expect_match2(make_stancode(count ~ Trt, data = epilepsy, + expect_match2(stancode(count ~ Trt, data = epilepsy, family = "zero_inflated_poisson"), "real zero_inflated_poisson_lpmf(int y") - expect_match2(make_stancode(count ~ Trt, data = epilepsy, + expect_match2(stancode(count ~ Trt, data = epilepsy, family = "zero_inflated_negbinomial"), "real zero_inflated_neg_binomial_lpmf(int y") - expect_match2(make_stancode(count ~ Trt, data = epilepsy, + expect_match2(stancode(count ~ Trt, data = epilepsy, family = "zero_inflated_binomial"), "real zero_inflated_binomial_lpmf(int y") - expect_match2(make_stancode(count ~ Trt, data = epilepsy, + expect_match2(stancode(count ~ Trt, data = epilepsy, family = "zero_inflated_beta_binomial"), "real zero_inflated_beta_binomial_lpmf(int y") - expect_match2(make_stancode(count ~ Trt, data = epilepsy, + expect_match2(stancode(count ~ Trt, data = epilepsy, family = "zero_inflated_beta"), "real zero_inflated_beta_lpdf(real y") - expect_match2(make_stancode(count ~ Trt, data = epilepsy, + expect_match2(stancode(count ~ Trt, data = epilepsy, family = "zero_one_inflated_beta"), "real zero_one_inflated_beta_lpdf(real y") - expect_match2(make_stancode(count ~ Trt, data = epilepsy, + expect_match2(stancode(count ~ Trt, data = epilepsy, family = hurdle_poisson()), "real hurdle_poisson_lpmf(int y") - expect_match2(make_stancode(count ~ Trt, data = epilepsy, + expect_match2(stancode(count ~ Trt, data = epilepsy, family = hurdle_negbinomial), "real hurdle_neg_binomial_lpmf(int y") - expect_match2(make_stancode(count ~ Trt, data = epilepsy, + expect_match2(stancode(count ~ Trt, data = epilepsy, family = hurdle_gamma("log")), "real hurdle_gamma_lpdf(real y") - expect_match2(make_stancode(count ~ Trt, data = epilepsy, + expect_match2(stancode(count ~ Trt, data = epilepsy, family = hurdle_lognormal("identity")), "real hurdle_lognormal_lpdf(real y") # linear models with special covariance structures expect_match2( - make_stancode(rating ~ treat + ar(cov = TRUE), data = inhaler), + stancode(rating ~ treat + ar(cov = TRUE), data = inhaler), "real normal_time_hom_lpdf(vector y" ) expect_match2( - make_stancode(time ~ age + ar(cov = TRUE), data = kidney, + stancode(time ~ age + ar(cov = TRUE), data = kidney, family = "student"), "real student_t_time_hom_lpdf(vector y" ) # ARMA covariance matrices expect_match2( - make_stancode(rating ~ treat + ar(cov = TRUE), data = inhaler), + stancode(rating ~ treat + ar(cov = TRUE), data = inhaler), "matrix cholesky_cor_ar1(real ar" ) expect_match2( - make_stancode(time ~ age + ma(cov = TRUE), data = kidney), + stancode(time ~ age + ma(cov = TRUE), data = kidney), "matrix cholesky_cor_ma1(real ma" ) expect_match2( - make_stancode(time ~ age + arma(cov = TRUE), data = kidney), + stancode(time ~ age + arma(cov = TRUE), data = kidney), "matrix cholesky_cor_arma1(real ar, real ma" ) }) @@ -547,16 +547,16 @@ test_that("invalid combinations of modeling options are detected", { data <- data.frame(y1 = rnorm(10), y2 = rnorm(10), wi = 1:10, ci = sample(-1:1, 10, TRUE)) expect_error( - make_stancode(y1 | cens(ci) ~ y2 + ar(cov = TRUE), data = data), + stancode(y1 | cens(ci) ~ y2 + ar(cov = TRUE), data = data), "Invalid addition arguments for this model" ) form <- bf(mvbind(y1, y2) ~ 1 + ar(cov = TRUE)) + set_rescor(TRUE) expect_error( - make_stancode(form, data = data), + stancode(form, data = data), "Explicit covariance terms cannot be modeled when 'rescor'" ) expect_error( - make_stancode(y1 | resp_se(wi) ~ y2 + ma(), data = data), + stancode(y1 | resp_se(wi) ~ y2 + ma(), data = data), "Please set cov = TRUE in ARMA structures" ) }) @@ -571,7 +571,7 @@ test_that("Stan code for multivariate models is correct", { form <- bf(mvbind(y1, y2) ~ x) + set_rescor(TRUE) prior <- prior(horseshoe(2), resp = "y1") + prior(horseshoe(2), resp = "y2") - scode <- make_stancode(form, dat, prior = prior) + scode <- stancode(form, dat, prior = prior) expect_match2(scode, "target += multi_normal_cholesky_lpdf(Y | Mu, LSigma);") expect_match2(scode, "LSigma = diag_pre_multiply(sigma, Lrescor);") expect_match2(scode, "target += student_t_lpdf(hs_local_y1 | hs_df_y1, 0, 1)") @@ -581,14 +581,14 @@ test_that("Stan code for multivariate models is correct", { form <- bf(mvbind(y1, y2) ~ x) + set_rescor(TRUE) prior <- prior(R2D2(0.2, 10), resp = "y1") + prior(R2D2(0.5, 10), resp = "y2") - scode <- SW(make_stancode(form, dat, student(), prior = prior)) + scode <- SW(stancode(form, dat, student(), prior = prior)) expect_match2(scode, "target += multi_student_t_lpdf(Y | nu, Mu, Sigma);") expect_match2(scode, "matrix[nresp, nresp] Sigma = multiply_lower") expect_match2(scode, "lprior += gamma_lpdf(nu | 2, 0.1)") expect_match2(scode, "target += dirichlet_lpdf(R2D2_phi_y2 | R2D2_cons_D2_y2);") form <- bf(mvbind(y1, y2) | weights(x) ~ 1) + set_rescor(TRUE) - scode <- make_stancode(form, dat) + scode <- stancode(form, dat) expect_match2(scode, "target += weights[n] * (multi_normal_cholesky_lpdf(Y[n] | Mu[n], LSigma));" ) @@ -603,7 +603,7 @@ test_that("Stan code for multivariate models is correct", { ) bprior <- prior(normal(0, 5), resp = y1) + prior(normal(0, 10), resp = y2) - scode <- make_stancode(bform, dat, prior = bprior) + scode <- stancode(bform, dat, prior = bprior) expect_match2(scode, "r_1_y2_3 = r_1[, 3]") expect_match2(scode, "err_y1[n] = Y_y1[n] - mu_y1[n]") expect_match2(scode, "target += normal_lccdf(Y_y1[n] | mu_y1[n], sigma_y1)") @@ -614,13 +614,13 @@ test_that("Stan code for multivariate models is correct", { # multivariate binomial models bform <- bf(x ~ 1) + bf(g ~ 1) + binomial() - scode <- make_stancode(bform, dat) + scode <- stancode(bform, dat) expect_match2(scode, "binomial_logit_lpmf(Y_x | trials_x, mu_x)") expect_match2(scode, "binomial_logit_lpmf(Y_g | trials_g, mu_g)") # multivariate weibull models bform <- bform + weibull() - scode <- make_stancode(bform, dat) + scode <- stancode(bform, dat) expect_match2(scode, "weibull_lpdf(Y_g | shape_g, mu_g / tgamma(1 + 1 / shape_g));") }) @@ -631,7 +631,7 @@ test_that("Stan code for categorical models is correct", { prior(cauchy(0, 1), "Intercept", dpar = mu2) + prior(normal(0, 2), "Intercept", dpar = mu3) - scode <- make_stancode(y ~ x + (1 | gr(.g, id = "ID")), data = dat, + scode <- stancode(y ~ x + (1 | gr(.g, id = "ID")), data = dat, family = categorical(), prior = prior) expect_match2(scode, "target += categorical_logit_lpmf(Y[n] | mu[n]);") expect_match2(scode, "mu[n] = transpose([0, mu2[n], mu3[n], muab[n]]);") @@ -643,7 +643,7 @@ test_that("Stan code for categorical models is correct", { expect_match2(scode, "lprior += normal_lpdf(Intercept_mu3 | 0, 2);") expect_match2(scode, "r_1 = scale_r_cor(z_1, sd_1, L_1);") - scode <- make_stancode(y ~ x + (1 |ID| .g), data = dat, + scode <- stancode(y ~ x + (1 |ID| .g), data = dat, family = categorical(refcat = NA)) expect_match2(scode, "mu[n] = transpose([mu1[n], mu2[n], mu3[n], muab[n]]);") }) @@ -659,7 +659,7 @@ test_that("Stan code for multinomial models is correct", { prior <- prior(normal(0, 10), "b", dpar = muy2) + prior(cauchy(0, 1), "Intercept", dpar = muy2) + prior(normal(0, 2), "Intercept", dpar = muy3) - scode <- make_stancode(bf(y | trials(size) ~ 1, muy2 ~ x), data = dat, + scode <- stancode(bf(y | trials(size) ~ 1, muy2 ~ x), data = dat, family = multinomial(), prior = prior) expect_match2(scode, "array[N, ncat] int Y;") expect_match2(scode, "target += multinomial_logit2_lpmf(Y[n] | mu[n]);") @@ -679,7 +679,7 @@ test_that("Stan code for dirichlet models is correct", { # dirichlet in probability-sum(alpha) concentration prior <- prior(normal(0, 5), class = "b", dpar = "muy3") + prior(exponential(10), "phi") - scode <- make_stancode(bf(y ~ 1, muy3 ~ x), data = dat, + scode <- stancode(bf(y ~ 1, muy3 ~ x), data = dat, family = dirichlet(), prior = prior) expect_match2(scode, "array[N] vector[ncat] Y;") expect_match2(scode, "target += dirichlet_logit_lpdf(Y[n] | mu[n], phi);") @@ -687,7 +687,7 @@ test_that("Stan code for dirichlet models is correct", { expect_match2(scode, "lprior += normal_lpdf(b_muy3 | 0, 5);") expect_match2(scode, "lprior += exponential_lpdf(phi | 10);") - scode <- make_stancode(bf(y ~ x, phi ~ x), data = dat, + scode <- stancode(bf(y ~ x, phi ~ x), data = dat, family = dirichlet()) expect_match2(scode, "target += dirichlet_logit_lpdf(Y[n] | mu[n], phi[n]);") expect_match2(scode, "phi += Intercept_phi + Xc_phi * b_phi;") @@ -695,7 +695,7 @@ test_that("Stan code for dirichlet models is correct", { # dirichlet2 in alpha parameterization prior <- prior(normal(0, 5), class = "b", dpar = "muy3") - scode <- make_stancode(bf(y ~ 1, muy3 ~ x), data = dat, + scode <- stancode(bf(y ~ 1, muy3 ~ x), data = dat, family = brmsfamily("dirichlet2"), prior = prior) expect_match2(scode, "array[N] vector[ncat] Y;") expect_match2(scode, "muy3 = exp(muy3);") @@ -716,7 +716,7 @@ test_that("Stan code for logistic_normal models is correct", { prior <- prior(normal(0, 5), class = "b", dpar = "muy3") + prior(exponential(10), "sigmay1") + prior(lkj(3), "lncor") - scode <- make_stancode(bf(y ~ x), data = dat, + scode <- stancode(bf(y ~ x), data = dat, family = logistic_normal(refcat = "y2"), prior = prior) expect_match2(scode, "array[N] vector[ncat] Y;") @@ -730,7 +730,7 @@ test_that("Stan code for logistic_normal models is correct", { prior <- prior(normal(0, 5), class = "b", dpar = "muy3") + prior(normal(0, 3), class = "b", dpar = "sigmay2") - scode <- make_stancode(bf(y ~ 1, muy3 ~ x, sigmay2 ~ x), data = dat, + scode <- stancode(bf(y ~ 1, muy3 ~ x, sigmay2 ~ x), data = dat, family = logistic_normal(), prior = prior) expect_match2(scode, "array[N] vector[ncat] Y;") @@ -745,32 +745,32 @@ test_that("Stan code for logistic_normal models is correct", { test_that("Stan code for ARMA models is correct", { dat <- data.frame(y = rep(1:4, 2), x = 1:8, time = 1:8) - scode <- make_stancode(y ~ x + ar(time), dat, student()) + scode <- stancode(y ~ x + ar(time), dat, student()) expect_match2(scode, "vector[Kar] ar") expect_match2(scode, "err[n] = Y[n] - mu[n];") expect_match2(scode, "mu[n] += Err[n, 1:Kar] * ar;") - scode <- make_stancode(y ~ x + ma(time, q = 2), dat, student()) + scode <- stancode(y ~ x + ma(time, q = 2), dat, student()) expect_match2(scode, "mu[n] += Err[n, 1:Kma] * ma;") expect_warning( - scode <- make_stancode(mvbind(y, x) ~ 1, dat, gaussian(), + scode <- stancode(mvbind(y, x) ~ 1, dat, gaussian(), autocor = cor_ar()), "Argument 'autocor' should be specified within the 'formula' argument" ) expect_match2(scode, "err_y[n] = Y_y[n] - mu_y[n];") bform <- bf(y ~ x, sigma ~ x) + acformula(~arma(time, cov = TRUE)) - scode <- make_stancode(bform, dat, family = student) + scode <- stancode(bform, dat, family = student) expect_match2(scode, "student_t_time_het_lpdf(Y | nu, mu, sigma, Lcortime") bform <- bf(y ~ exp(eta) - 1, eta ~ x, autocor = ~ar(time), nl = TRUE) - scode <- make_stancode(bform, dat, family = student, + scode <- stancode(bform, dat, family = student, prior = prior(normal(0, 1), nlpar = eta)) expect_match2(scode, "mu[n] += Err[n, 1:Kar] * ar;") # correlations of latent residuals - scode <- make_stancode( + scode <- stancode( y ~ x + ar(time, cov = TRUE), dat, family = poisson, prior = prior(cauchy(0, 10), class = sderr) ) @@ -781,7 +781,7 @@ test_that("Stan code for ARMA models is correct", { expect_match2(scode, "mu += Intercept + Xc * b + err;") expect_match2(scode, "lprior += cauchy_lpdf(sderr | 0, 10)") - scode <- make_stancode( + scode <- stancode( y ~ x + ar(time), dat, family = poisson, prior = prior(cauchy(0, 10), class = sderr) ) @@ -792,7 +792,7 @@ test_that("Stan code for ARMA models is correct", { expect_match2(scode, "lprior += cauchy_lpdf(sderr | 0, 10)") # apply shrinkage priors on sderr - scode <- make_stancode( + scode <- stancode( y ~ x + ar(time), dat, family = poisson, prior = prior(horseshoe(main = TRUE), class = b) + prior(horseshoe(), class = sderr) @@ -802,7 +802,7 @@ test_that("Stan code for ARMA models is correct", { test_that("Stan code for compound symmetry models is correct", { dat <- data.frame(y = rep(1:4, 2), x = 1:8, time = 1:8) - scode <- make_stancode( + scode <- stancode( y ~ x + cosy(time), dat, prior = prior(normal(0, 2), cosy) ) @@ -810,10 +810,10 @@ test_that("Stan code for compound symmetry models is correct", { expect_match2(scode, "Lcortime = cholesky_cor_cosy(cosy, max_nobs_tg);") expect_match2(scode, "lprior += normal_lpdf(cosy | 0, 2)") - scode <- make_stancode(bf(y ~ x + cosy(time), sigma ~ x), dat) + scode <- stancode(bf(y ~ x + cosy(time), sigma ~ x), dat) expect_match2(scode, "normal_time_het_lpdf(Y | mu, sigma, Lcortime") - scode <- make_stancode(y ~ x + cosy(time), dat, family = poisson) + scode <- stancode(y ~ x + cosy(time), dat, family = poisson) expect_match2(scode, "Lcortime = cholesky_cor_cosy(cosy, max_nobs_tg);") }) @@ -821,12 +821,12 @@ test_that("Stan code for UNSTR covariance terms is correct", { dat <- data.frame(y = 1:12, x = rnorm(12), tim = c(5:1, 1:5, c(0, 4)), g = c(rep(3:4, 5), rep(2, 2))) - scode <- make_stancode(y ~ x + unstr(tim, g), data = dat) + scode <- stancode(y ~ x + unstr(tim, g), data = dat) expect_match2(scode, "normal_time_hom_flex_lpdf(Y | mu, sigma, Lcortime, nobs_tg, begin_tg, end_tg, Jtime_tg);") expect_match2(scode, "cortime[choose(k - 1, 2) + j] = Cortime[j, k];") expect_match2(scode, "lprior += lkj_corr_cholesky_lpdf(Lcortime | 1);") - scode <- make_stancode( + scode <- stancode( y ~ x + unstr(tim, g), data = dat, family = student(), prior = prior(lkj(4), cortime) ) @@ -834,14 +834,14 @@ test_that("Stan code for UNSTR covariance terms is correct", { expect_match2(scode, "lprior += lkj_corr_cholesky_lpdf(Lcortime | 4);") # test standard error - scode <- make_stancode( + scode <- stancode( y | se(1, sigma = TRUE) ~ x + unstr(tim, g), data = dat, family = gaussian(), ) expect_match2(scode, "normal_time_hom_se_flex_lpdf(Y | mu, sigma, se2, Lcortime, nobs_tg, begin_tg, end_tg, Jtime_tg);") # test latent representation - scode <- make_stancode( + scode <- stancode( y ~ x + unstr(tim, g), data = dat, family = poisson() ) @@ -849,7 +849,7 @@ test_that("Stan code for UNSTR covariance terms is correct", { expect_match2(scode, "mu += Intercept + Xc * b + err;") # non-linear model - scode <- make_stancode( + scode <- stancode( bf(y ~ a, a ~ x, autocor = ~ unstr(tim, g), nl = TRUE), data = dat, family = student(), prior = prior(normal(0,1), nlpar = a) ) @@ -857,11 +857,11 @@ test_that("Stan code for UNSTR covariance terms is correct", { }) test_that("Stan code for intercept only models is correct", { - expect_match2(make_stancode(rating ~ 1, data = inhaler), + expect_match2(stancode(rating ~ 1, data = inhaler), "b_Intercept = Intercept;") - expect_match2(make_stancode(rating ~ 1, data = inhaler, family = cratio()), + expect_match2(stancode(rating ~ 1, data = inhaler, family = cratio()), "b_Intercept = Intercept;") - expect_match2(make_stancode(rating ~ 1, data = inhaler, family = categorical()), + expect_match2(stancode(rating ~ 1, data = inhaler, family = categorical()), "b_mu3_Intercept = Intercept_mu3;") }) @@ -869,7 +869,7 @@ test_that("Stan code of ordinal models is correct", { dat <- data.frame(y = c(rep(1:4, 2), 1, 1), x1 = rnorm(10), x2 = rnorm(10), g = factor(rep(1:2, 5))) - scode <- make_stancode( + scode <- stancode( y ~ x1, dat, family = cumulative(), prior = prior(normal(0, 2), Intercept, coef = 2) ) @@ -879,7 +879,7 @@ test_that("Stan code of ordinal models is correct", { expect_match2(scode, "lprior += student_t_lpdf(Intercept[1] | 3, 0, 2.5);") expect_match2(scode, "lprior += normal_lpdf(Intercept[2] | 0, 2);") - scode <- make_stancode( + scode <- stancode( y ~ x1, dat, cumulative("probit", threshold = "equidistant"), prior = prior(normal(0, 2), Intercept) ) @@ -890,11 +890,11 @@ test_that("Stan code of ordinal models is correct", { expect_match2(scode, "b_Intercept = Intercept + dot_product(means_X, b);") expect_match2(scode, "lprior += normal_lpdf(first_Intercept | 0, 2);") - scode <- make_stancode(y ~ x1, dat, family = cratio("probit")) + scode <- stancode(y ~ x1, dat, family = cratio("probit")) expect_match2(scode, "real cratio_probit_lpmf(int y") expect_match2(scode, "q[k] = normal_lcdf(disc * (mu - thres[k])|0,1);") - scode <- make_stancode(y ~ x1 + cs(x2) + cs(g), dat, family = sratio()) + scode <- stancode(y ~ x1 + cs(x2) + cs(g), dat, family = sratio()) expect_match2(scode, "real sratio_logit_lpmf(int y") expect_match2(scode, "matrix[N, Kcs] Xcs;") expect_match2(scode, "matrix[Kcs, nthres] bcs;") @@ -903,12 +903,12 @@ test_that("Stan code of ordinal models is correct", { "target += sratio_logit_lpmf(Y[n] | mu[n], disc, Intercept - transpose(mucs[n]));" ) - scode <- make_stancode(y ~ x1 + cse(x2) + (cse(1)|g), dat, family = acat()) + scode <- stancode(y ~ x1 + cse(x2) + (cse(1)|g), dat, family = acat()) expect_match2(scode, "real acat_logit_lpmf(int y") expect_match2(scode, "mucs[n, 1] = mucs[n, 1] + r_1_1[J_1[n]] * Z_1_1[n];") expect_match2(scode, "b_Intercept = Intercept + dot_product(means_X, b);") - scode <- make_stancode(y ~ x1 + (cse(x2)||g), dat, family = acat("probit_approx")) + scode <- stancode(y ~ x1 + (cse(x2)||g), dat, family = acat("probit_approx")) expect_match2(scode, paste("mucs[n, 3] = mucs[n, 3] + r_1_3[J_1[n]] * Z_1_3[n]", "+ r_1_6[J_1[n]] * Z_1_6[n];")) @@ -917,7 +917,7 @@ test_that("Stan code of ordinal models is correct", { ) # sum-to-zero thresholds - scode <- make_stancode( + scode <- stancode( y ~ x1, dat, cumulative("probit", threshold = "sum_to_zero"), prior = prior(normal(0, 2), Intercept) ) @@ -926,7 +926,7 @@ test_that("Stan code of ordinal models is correct", { expect_match2(scode, "vector[nthres] b_Intercept = Intercept_stz;") # non-linear ordinal models - scode <- make_stancode( + scode <- stancode( bf(y ~ eta, eta ~ x1, nl = TRUE), dat, family = cumulative(), prior = prior(normal(0, 2), nlpar = eta) ) @@ -936,7 +936,7 @@ test_that("Stan code of ordinal models is correct", { ) # ordinal mixture models with fixed intercepts - scode <- make_stancode( + scode <- stancode( bf(y ~ 1, mu1 ~ x1, mu2 ~ 1), data = dat, family = mixture(cumulative(), nmix = 2, order = "mu") ) @@ -945,7 +945,7 @@ test_that("Stan code of ordinal models is correct", { }) test_that("ordinal disc parameters appear in the Stan code", { - scode <- make_stancode( + scode <- stancode( bf(rating ~ period + carry + treat, disc ~ period), data = inhaler, family = cumulative(), prior = prior(normal(0,5), dpar = disc) @@ -967,7 +967,7 @@ test_that("grouped ordinal thresholds appear in the Stan code", { ) prior <- prior(normal(0,1), class = "Intercept", group = "b") - scode <- make_stancode( + scode <- stancode( y | thres(th, gr) ~ x, data = dat, family = sratio(), prior = prior ) @@ -979,7 +979,7 @@ test_that("grouped ordinal thresholds appear in the Stan code", { expect_match2(scode, "vector[nthres[1]] b_Intercept_1 = Intercept_1;") # model with equidistant thresholds - scode <- make_stancode( + scode <- stancode( y | thres(th, gr) ~ x, data = dat, family = cumulative(threshold = "equidistant"), prior = prior @@ -990,7 +990,7 @@ test_that("grouped ordinal thresholds appear in the Stan code", { expect_match2(scode, "Intercept_2[k] = first_Intercept_2 + (k - 1.0) * delta_2;") # sum-to-zero constraints - scode <- make_stancode( + scode <- stancode( y | thres(gr = gr) ~ x, data = dat, cumulative(threshold = "sum_to_zero"), prior = prior(normal(0, 2), Intercept) @@ -999,7 +999,7 @@ test_that("grouped ordinal thresholds appear in the Stan code", { expect_match2(scode, "ordered_logistic_merged_lpmf(Y[n] | mu[n], merged_Intercept_stz, Jthres[n]);") # ordinal mixture model - scode <- make_stancode( + scode <- stancode( y | thres(th, gr) ~ x, data = dat, family = mixture(cratio, acat, order = "mu"), prior = prior @@ -1013,7 +1013,7 @@ test_that("grouped ordinal thresholds appear in the Stan code", { # multivariate ordinal model bform <- bf(y | thres(th, gr) ~ x, family = sratio) + bf(y2 | thres(th, gr) ~ x, family = cumulative) - scode <- make_stancode(bform, data = dat) + scode <- stancode(bform, data = dat) expect_match2(scode, "lprior += student_t_lpdf(Intercept_y2_1 | 3, 0, 2.5);") expect_match2(scode, "merged_Intercept_y[Kthres_start_y[2]:Kthres_end_y[2]] = Intercept_y_2;") }) @@ -1025,7 +1025,7 @@ test_that("Stan code of hurdle cumulative model is correct", { x2 = rnorm(10), g = factor(rep(1:2, 5))) - scode <- make_stancode( + scode <- stancode( y ~ x1, dat, family = hurdle_cumulative(), prior = prior(normal(0, 2), Intercept, coef = 2) ) @@ -1033,7 +1033,7 @@ test_that("Stan code of hurdle cumulative model is correct", { "target += hurdle_cumulative_ordered_logistic_lpmf(Y[n] | mu[n], hu, disc, Intercept);" ) - scode <- make_stancode( + scode <- stancode( bf(y ~ x1, hu ~ x2), dat, hurdle_cumulative("probit", threshold = "equidistant"), prior = prior(normal(0, 2), Intercept) @@ -1045,7 +1045,7 @@ test_that("Stan code of hurdle cumulative model is correct", { # sum-to-zero thresholds - scode <- make_stancode( + scode <- stancode( bf(y ~ x1, hu ~ x2, disc ~ g), dat, hurdle_cumulative("cloglog", threshold = "sum_to_zero"), prior = prior(normal(0, 2), Intercept) @@ -1056,7 +1056,7 @@ test_that("Stan code of hurdle cumulative model is correct", { # non-linear ordinal models - scode <- make_stancode( + scode <- stancode( bf(y ~ eta, eta ~ x1, nl = TRUE), dat, family = hurdle_cumulative(), @@ -1075,7 +1075,7 @@ test_that("monotonic effects appear in the Stan code", { prior <- c(prior(normal(0,1), class = b, coef = mox1), prior(dirichlet(c(1,0.5,2)), simo, coef = mox11), prior(dirichlet(c(1,0.5,2)), simo, coef = mox21)) - scode <- make_stancode(y ~ y*mo(x1)*mo(x2), dat, prior = prior) + scode <- stancode(y ~ y*mo(x1)*mo(x2), dat, prior = prior) expect_match2(scode, "array[N] int Xmo_3;") expect_match2(scode, "simplex[Jmo[1]] simo_1;") expect_match2(scode, "(bsp[2]) * mo(simo_2, Xmo_2[n])") @@ -1086,22 +1086,22 @@ test_that("monotonic effects appear in the Stan code", { expect_match2(scode, "lprior += dirichlet_lpdf(simo_1 | con_simo_1);") expect_match2(scode, "lprior += dirichlet_lpdf(simo_8 | con_simo_8);") - scode <- make_stancode(y ~ mo(x1) + (mo(x1) | x2), dat) + scode <- stancode(y ~ mo(x1) + (mo(x1) | x2), dat) expect_match2(scode, "(bsp[1] + r_1_2[J_1[n]]) * mo(simo_1, Xmo_1[n])") expect_true(!grepl("Z_1_w", scode)) # test issue reported in discourse post #12978 - scode <- make_stancode(y ~ mo(x1) + (mo(x1) | x2) + (mo(x1) | g), dat) + scode <- stancode(y ~ mo(x1) + (mo(x1) | x2) + (mo(x1) | g), dat) expect_match2(scode, "(bsp[1] + r_1_2[J_1[n]] + r_2_2[J_2[n]]) * mo(simo_1, Xmo_1[n])") # test issue #813 - scode <- make_stancode(y ~ mo(x1):y, dat) + scode <- stancode(y ~ mo(x1):y, dat) expect_match2(scode, "mu[n] += (bsp[1]) * mo(simo_1, Xmo_1[n]) * Csp_1[n];") # test issue #924 (conditional monotonicity) prior <- c(prior(dirichlet(c(1,0.5,2)), simo, coef = "v"), prior(dirichlet(c(1,0.5,2)), simo, coef = "w")) - scode <- make_stancode(y ~ y*mo(x1, id = "v")*mo(x2, id = "w"), + scode <- stancode(y ~ y*mo(x1, id = "v")*mo(x2, id = "w"), dat, prior = prior) expect_match2(scode, "lprior += dirichlet_lpdf(simo_1 | con_simo_1);") expect_match2(scode, "lprior += dirichlet_lpdf(simo_2 | con_simo_2);") @@ -1109,13 +1109,13 @@ test_that("monotonic effects appear in the Stan code", { expect_match2(scode, "simplex[Jmo[7]] simo_7 = simo_1;") expect_error( - make_stancode(y ~ mo(x1) + (mo(x2) | x2), dat), + stancode(y ~ mo(x1) + (mo(x2) | x2), dat), "Special group-level terms require" ) prior <- prior(beta(1, 1), simo, coef = mox11) expect_error( - make_stancode(y ~ mo(x1), dat, prior = prior), + stancode(y ~ mo(x1), dat, prior = prior), "'dirichlet' is the only valid prior for simplex parameters" ) }) @@ -1128,8 +1128,8 @@ test_that("Stan code for non-linear models is correct", { ) prior <- c(set_prior("normal(0,5)", nlpar = "a"), set_prior("normal(0,1)", nlpar = "b")) - # syntactic validity is already checked within make_stancode - scode <- make_stancode( + # syntactic validity is already checked within stancode + scode <- stancode( bf(y ~ a - exp(b^z) * (z <= a) * v, flist = flist, nl = TRUE), data = data, prior = prior ) @@ -1140,13 +1140,13 @@ test_that("Stan code for non-linear models is correct", { expect_match2(scode, "array[N] int C_2;") # non-linear predictor can be computed outside a loop - scode <- make_stancode(bf(y ~ a - exp(b + z), flist = flist, + scode <- stancode(bf(y ~ a - exp(b + z), flist = flist, nl = TRUE, loop = FALSE), data = data, prior = prior) expect_match2(scode, "mu = (nlp_a - exp(nlp_b + C_1));") # check if that also works with threading - scode <- make_stancode(bf(y ~ a - exp(b + z), flist = flist, + scode <- stancode(bf(y ~ a - exp(b + z), flist = flist, nl = TRUE, loop = FALSE), data = data, prior = prior, threads = threading(2), parse = FALSE) @@ -1156,7 +1156,7 @@ test_that("Stan code for non-linear models is correct", { flist <- list(a1 ~ 1, a2 ~ z + (x|g)) prior <- c(set_prior("beta(1,1)", nlpar = "a1", lb = 0, ub = 1), set_prior("normal(0,1)", nlpar = "a2")) - scode <- make_stancode( + scode <- stancode( bf(y ~ a1 * exp(-x/(a2 + z)), flist = flist, nl = TRUE), data = data, family = Gamma("log"), @@ -1168,7 +1168,7 @@ test_that("Stan code for non-linear models is correct", { nlf(sigma ~ a1 * exp(-x/(a2 + z))) + lf(a1 ~ 1, a2 ~ z + (x|g)) + lf(alpha ~ x) - scode <- make_stancode( + scode <- stancode( bform, data, family = skew_normal(), prior = c( prior(normal(0, 1), nlpar = a1), @@ -1191,14 +1191,14 @@ test_that("Stan code for nested non-linear parameters is correct", { ) bprior <- prior(normal(0, 1), nlpar = "a") + prior(normal(0, 1), nlpar = "b") - scode <- make_stancode(bform, dat, prior = bprior) + scode <- stancode(bform, dat, prior = bprior) expect_match2(scode, "nlp_lb[n] = (inv_logit(nlp_a[n] / C_lb_1[n]));") expect_match2(scode, "mu[n] = (nlp_lb[n] + (1 - nlp_lb[n]) * inv_logit(nlp_b[n] * C_1[n]));" ) }) -test_that("make_stancode is correct for non-linear matrix covariates", { +test_that("stancode is correct for non-linear matrix covariates", { N <- 10 dat <- data.frame(y=rnorm(N)) dat$X <- matrix(rnorm(N*2), N, 2) @@ -1212,7 +1212,7 @@ test_that("make_stancode is correct for non-linear matrix covariates", { " nlstanvar <- stanvar(scode = nlfun_stan, block = "functions") bform <- bf(y~nlfun(a, b, c, X), a~1, b~1, c~1, nl = TRUE) - scode <- make_stancode(bform, dat, stanvars = nlstanvar) + scode <- stancode(bform, dat, stanvars = nlstanvar) expect_match2(scode, "matrix[N, 2] C_1;") # integer matrix @@ -1223,13 +1223,13 @@ test_that("make_stancode is correct for non-linear matrix covariates", { " nlstanvar <- stanvar(scode = nlfun_stan_int, block = "functions") bform <- bf(y~nlfun(a, b, c, X2), a~1, b~1, c~1, nl = TRUE) - scode <- make_stancode(bform, dat, stanvars = nlstanvar) + scode <- stancode(bform, dat, stanvars = nlstanvar) expect_match2(scode, "array[N, 2] int C_1;") }) -test_that("make_stancode accepts very long non-linear formulas", { +test_that("stancode accepts very long non-linear formulas", { data <- data.frame(y = rnorm(10), this_is_a_very_long_predictor = rnorm(10)) - expect_silent(make_stancode(bf(y ~ b0 + this_is_a_very_long_predictor + + expect_silent(stancode(bf(y ~ b0 + this_is_a_very_long_predictor + this_is_a_very_long_predictor + this_is_a_very_long_predictor, b0 ~ 1, nl = TRUE), @@ -1237,21 +1237,21 @@ test_that("make_stancode accepts very long non-linear formulas", { }) test_that("no loop in trans-par is defined for simple 'identity' models", { - expect_true(!grepl(make_stancode(time ~ age, data = kidney), + expect_true(!grepl(stancode(time ~ age, data = kidney), "mu[n] = (mu[n]);", fixed = TRUE)) - expect_true(!grepl(make_stancode(time ~ age, data = kidney, + expect_true(!grepl(stancode(time ~ age, data = kidney, family = poisson("identity")), "mu[n] = (mu[n]);", fixed = TRUE)) }) test_that("known standard errors appear in the Stan code", { - scode <- make_stancode(time | se(age) ~ sex, data = kidney) + scode <- stancode(time | se(age) ~ sex, data = kidney) expect_match2(scode, "target += normal_lpdf(Y | mu, se)") - scode <- make_stancode(time | se(age) + weights(age) ~ sex, data = kidney) + scode <- stancode(time | se(age) + weights(age) ~ sex, data = kidney) expect_match2(scode, "target += weights[n] * (normal_lpdf(Y[n] | mu[n], se[n]))") - scode <- make_stancode(time | se(age, sigma = TRUE) ~ sex, data = kidney) + scode <- stancode(time | se(age, sigma = TRUE) ~ sex, data = kidney) expect_match2(scode, "target += normal_lpdf(Y | mu, sqrt(square(sigma) + se2))") - scode <- make_stancode(bf(time | se(age, sigma = TRUE) ~ sex, sigma ~ sex), + scode <- stancode(bf(time | se(age, sigma = TRUE) ~ sex, sigma ~ sex), data = kidney) expect_match2(scode, "target += normal_lpdf(Y | mu, sqrt(square(sigma) + se2))") }) @@ -1260,24 +1260,24 @@ test_that("functions defined in 'stan_funs' appear in the functions block", { test_fun <- paste0(" real test_fun(real a, real b) {\n", " return a + b;\n", " }\n") - scode <- SW(make_stancode(time ~ age, data = kidney, stan_funs = test_fun)) + scode <- SW(stancode(time ~ age, data = kidney, stan_funs = test_fun)) expect_match2(scode, test_fun) }) test_that("FCOR matrices appear in the Stan code", { data <- data.frame(y = 1:5) V <- diag(5) - expect_match2(make_stancode(y ~ fcor(V), data = data, family = gaussian(), + expect_match2(stancode(y ~ fcor(V), data = data, family = gaussian(), data2 = list(V = V)), "target += normal_fcor_hom_lpdf(Y | mu, sigma, Lfcor);") - expect_match2(make_stancode(y ~ fcor(V), data = data, family = student(), + expect_match2(stancode(y ~ fcor(V), data = data, family = student(), data2 = list(V = V)), "target += student_t_fcor_hom_lpdf(Y | nu, mu, sigma, Lfcor);") }) test_that("Stan code for GAMMs is correct", { dat <- data.frame(y = rnorm(10), x = rnorm(10), g = factor(rep(1:2, 5))) - scode <- make_stancode(y ~ s(x) + (1|g), data = dat, + scode <- stancode(y ~ s(x) + (1|g), data = dat, prior = set_prior("normal(0,2)", "sds")) expect_match2(scode, "Zs_1_1 * s_1_1") expect_match2(scode, "matrix[N, knots_1[1]] Zs_1_1") @@ -1286,14 +1286,14 @@ test_that("Stan code for GAMMs is correct", { prior <- c(set_prior("normal(0,5)", nlpar = "lp"), set_prior("normal(0,2)", "sds", nlpar = "lp")) - scode <- make_stancode(bf(y ~ lp, lp ~ s(x) + (1|g), nl = TRUE), + scode <- stancode(bf(y ~ lp, lp ~ s(x) + (1|g), nl = TRUE), data = dat, prior = prior) expect_match2(scode, "Zs_lp_1_1 * s_lp_1_1") expect_match2(scode, "matrix[N, knots_lp_1[1]] Zs_lp_1_1") expect_match2(scode, "target += std_normal_lpdf(zs_lp_1_1)") expect_match2(scode, "lprior += normal_lpdf(sds_lp_1 | 0,2)") - scode <- make_stancode( + scode <- stancode( y ~ s(x) + t2(x,y), data = dat, prior = set_prior("normal(0,1)", "sds") + set_prior("normal(0,2)", "sds", coef = "t2(x, y)") @@ -1304,7 +1304,7 @@ test_that("Stan code for GAMMs is correct", { expect_match2(scode, "lprior += normal_lpdf(sds_1 | 0,1)") expect_match2(scode, "lprior += normal_lpdf(sds_2 | 0,2)") - scode <- make_stancode(y ~ g + s(x, by = g), data = dat) + scode <- stancode(y ~ g + s(x, by = g), data = dat) expect_match2(scode, "vector[knots_2[1]] zs_2_1") expect_match2(scode, "s_2_1 = sds_2[1] * zs_2_1") }) @@ -1312,7 +1312,7 @@ test_that("Stan code for GAMMs is correct", { test_that("Stan code of response times models is correct", { dat <- epilepsy dat$cens <- sample(-1:1, nrow(dat), TRUE) - scode <- make_stancode(count ~ Trt + (1|patient), + scode <- stancode(count ~ Trt + (1|patient), data = dat, family = exgaussian("log"), prior = prior(gamma(1,1), class = beta)) expect_match2(scode, @@ -1321,7 +1321,7 @@ test_that("Stan code of response times models is correct", { expect_match2(scode, "mu = exp(mu)") expect_match2(scode, "lprior += gamma_lpdf(beta | 1, 1)") - scode <- make_stancode(bf(count ~ Trt + (1|patient), + scode <- stancode(bf(count ~ Trt + (1|patient), sigma ~ Trt, beta ~ Trt), data = dat, family = exgaussian()) expect_match2(scode, @@ -1329,18 +1329,18 @@ test_that("Stan code of response times models is correct", { ) expect_match2(scode, "beta = exp(beta)") - scode <- make_stancode(count | cens(cens) ~ Trt + (1|patient), + scode <- stancode(count | cens(cens) ~ Trt + (1|patient), data = dat, family = exgaussian("inverse")) expect_match2(scode, "exp_mod_normal_lccdf(Y[n] | mu[n] - beta, sigma, inv(beta))") - scode <- make_stancode(count ~ Trt, dat, family = shifted_lognormal()) + scode <- stancode(count ~ Trt, dat, family = shifted_lognormal()) expect_match2(scode, "target += lognormal_lpdf(Y - ndt | mu, sigma)") - scode <- make_stancode(count | cens(cens) ~ Trt, dat, family = shifted_lognormal()) + scode <- stancode(count | cens(cens) ~ Trt, dat, family = shifted_lognormal()) expect_match2(scode, "target += lognormal_lcdf(Y[n] - ndt | mu[n], sigma)") # test issue #837 - scode <- make_stancode(mvbind(count, zBase) ~ Trt, data = dat, + scode <- stancode(mvbind(count, zBase) ~ Trt, data = dat, family = shifted_lognormal()) expect_match2(scode, "lprior += uniform_lpdf(ndt_count | 0, min_Y_count)") expect_match2(scode, "lprior += uniform_lpdf(ndt_zBase | 0, min_Y_zBase)") @@ -1348,36 +1348,36 @@ test_that("Stan code of response times models is correct", { test_that("Stan code of wiener diffusion models is correct", { dat <- data.frame(q = 1:10, resp = sample(0:1, 10, TRUE), x = rnorm(10)) - scode <- make_stancode(q | dec(resp) ~ x, data = dat, family = wiener()) + scode <- stancode(q | dec(resp) ~ x, data = dat, family = wiener()) expect_match2(scode, "target += wiener_diffusion_lpdf(Y[n] | dec[n], bs, ndt, bias, mu[n])" ) - scode <- make_stancode(bf(q | dec(resp) ~ x, bs ~ x, ndt ~ x, bias ~ x), + scode <- stancode(bf(q | dec(resp) ~ x, bs ~ x, ndt ~ x, bias ~ x), data = dat, family = wiener()) expect_match2(scode, "target += wiener_diffusion_lpdf(Y[n] | dec[n], bs[n], ndt[n], bias[n], mu[n])" ) expect_match2(scode, "bias = inv_logit(bias);") - scode <- make_stancode(bf(q | dec(resp) ~ x, ndt = 0.5), + scode <- stancode(bf(q | dec(resp) ~ x, ndt = 0.5), data = dat, family = wiener()) expect_match2(scode, "real ndt = 0.5;") - expect_error(make_stancode(q ~ x, data = dat, family = wiener()), + expect_error(stancode(q ~ x, data = dat, family = wiener()), "Addition argument 'dec' is required for family 'wiener'") }) test_that("Group IDs appear in the Stan code", { form <- bf(count ~ Trt + (1+Trt|3|visit) + (1|patient), shape ~ (1|3|visit) + (Trt||patient)) - scode <- make_stancode(form, data = epilepsy, family = negbinomial()) + scode <- stancode(form, data = epilepsy, family = negbinomial()) expect_match2(scode, "r_2_1 = r_2[, 1]") expect_match2(scode, "r_2_shape_3 = r_2[, 3]") form <- bf(count ~ a, sigma ~ (1|3|visit) + (Trt||patient), a ~ Trt + (1+Trt|3|visit) + (1|patient), nl = TRUE) - scode <- make_stancode(form, data = epilepsy, family = student(), + scode <- stancode(form, data = epilepsy, family = student(), prior = set_prior("normal(0,5)", nlpar = "a")) expect_match2(scode, "r_2_a_2 = r_2[, 2];") expect_match2(scode, "r_1_sigma_2 = (sd_1[2] * (z_1[2]));") @@ -1386,52 +1386,52 @@ test_that("Group IDs appear in the Stan code", { test_that("weighted, censored, and truncated likelihoods are correct", { dat <- data.frame(y = 1:9, x = rep(-1:1, 3), y2 = 10:18) - scode <- make_stancode(y | weights(y2) ~ 1, dat, poisson()) + scode <- stancode(y | weights(y2) ~ 1, dat, poisson()) expect_match2(scode, "target += weights[n] * (poisson_log_lpmf(Y[n] | mu[n]));") - scode <- make_stancode(y | trials(y2) + weights(y2) ~ 1, dat, binomial()) + scode <- stancode(y | trials(y2) + weights(y2) ~ 1, dat, binomial()) expect_match2(scode, "target += weights[n] * (binomial_logit_lpmf(Y[n] | trials[n], mu[n]));" ) - scode <- make_stancode(y | cens(x, y2) ~ 1, dat, poisson()) + scode <- stancode(y | cens(x, y2) ~ 1, dat, poisson()) expect_match2(scode, "target += poisson_lpmf(Y[n] | mu[n]);") - scode <- make_stancode(y | cens(x) ~ 1, dat, exponential()) + scode <- stancode(y | cens(x) ~ 1, dat, exponential()) expect_match2(scode, "target += exponential_lccdf(Y[n] | inv(mu[n]));") dat$x[1] <- 2 - scode <- make_stancode(y | cens(x, y2) ~ 1, dat, gaussian()) + scode <- stancode(y | cens(x, y2) ~ 1, dat, gaussian()) expect_match2(scode, paste0( "target += log_diff_exp(\n", " normal_lcdf(rcens[n] | mu[n], sigma)," )) dat$x <- 1 - expect_match2(make_stancode(y | cens(x) + weights(x) ~ 1, dat, exponential()), + expect_match2(stancode(y | cens(x) + weights(x) ~ 1, dat, exponential()), "target += weights[n] * exponential_lccdf(Y[n] | inv(mu[n]));") - scode <- make_stancode(y | cens(x) + trunc(0.1) ~ 1, dat, exponential()) + scode <- stancode(y | cens(x) + trunc(0.1) ~ 1, dat, exponential()) expect_match2(scode, "target += exponential_lccdf(Y[n] | inv(mu[n])) -") expect_match2(scode, " exponential_lccdf(lb[n] | inv(mu[n]));") - scode <- make_stancode(y | cens(x) + trunc(ub = 30) ~ 1, dat) + scode <- stancode(y | cens(x) + trunc(ub = 30) ~ 1, dat) expect_match2(scode, "target += normal_lccdf(Y[n] | mu[n], sigma) -") expect_match2(scode, " normal_lcdf(ub[n] | mu[n], sigma);") - scode <- make_stancode(y | weights(x) + trunc(0, 30) ~ 1, dat) + scode <- stancode(y | weights(x) + trunc(0, 30) ~ 1, dat) expect_match2(scode, "target += weights[n] * (normal_lpdf(Y[n] | mu[n], sigma) -") expect_match2(scode, " log_diff_exp(normal_lcdf(ub[n] | mu[n], sigma),") expect_match2( - make_stancode(y | trials(y2) + weights(y2) ~ 1, dat, beta_binomial()), + stancode(y | trials(y2) + weights(y2) ~ 1, dat, beta_binomial()), "target += weights[n] * (beta_binomial_lpmf(Y[n] | trials[n], mu[n] * phi," ) expect_match2( - make_stancode(y | trials(y2) + trunc(0, 30) ~ 1, dat, beta_binomial()), + stancode(y | trials(y2) + trunc(0, 30) ~ 1, dat, beta_binomial()), "log_diff_exp(beta_binomial_lcdf(ub[n] | trials[n], mu[n] * phi," ) expect_match2( - make_stancode(y | trials(y2) + cens(x, y2) ~ 1, dat, beta_binomial()), + stancode(y | trials(y2) + cens(x, y2) ~ 1, dat, beta_binomial()), "beta_binomial_lcdf(rcens[n] | trials[n], mu[n] * phi," ) }) @@ -1448,7 +1448,7 @@ test_that("noise-free terms appear in the Stan code", { prior(normal(0, 10), "meanme") + prior(cauchy(0, 5), "sdme", coef = "mez") + prior(lkj(2), "corme") - scode <- make_stancode( + scode <- stancode( y ~ me(x, xsd)*me(z, zsd)*x, data = dat, prior = me_prior, sample_prior = "yes" ) @@ -1465,24 +1465,24 @@ test_that("noise-free terms appear in the Stan code", { expect_match2(scode, "+ transpose(diag_pre_multiply(sdme_1, Lme_1) * zme_1)") expect_match2(scode, "corme_1[choose(k - 1, 2) + j] = Corme_1[j, k];") - scode <- make_stancode( + scode <- stancode( y ~ me(x, xsd)*z + (me(x, xsd)*z | ID), data = dat ) expect_match2(scode, "(bsp[1] + r_1_3[J_1[n]]) * Xme_1[n]") expect_match2(scode, "(bsp[2] + r_1_4[J_1[n]]) * Xme_1[n] * Csp_1[n]") - expect_match2(make_stancode(y ~ I(me(x, xsd)^2), data = dat), + expect_match2(stancode(y ~ I(me(x, xsd)^2), data = dat), "(bsp[1]) * (Xme_1[n]^2)") # test that noise-free variables are unique across model parts - scode <- make_stancode( + scode <- stancode( bf(y ~ me(x, xsd)*me(z, zsd)*x, sigma ~ me(x, xsd)), data = dat, prior = prior(normal(0,5)) ) expect_match2(scode, "mu[n] += (bsp[1]) * Xme_1[n]") expect_match2(scode, "sigma[n] += (bsp_sigma[1]) * Xme_1[n]") - scode <- make_stancode( + scode <- stancode( bf(y ~ a * b, a + b ~ me(x, xsd), nl = TRUE), data = dat, prior = prior(normal(0,5), nlpar = a) + @@ -1493,21 +1493,21 @@ test_that("noise-free terms appear in the Stan code", { bform <- bf(mvbind(y, z) ~ me(x, xsd)) + set_rescor(TRUE) + set_mecor(FALSE) - scode <- make_stancode(bform, dat) + scode <- stancode(bform, dat) expect_match2(scode, "mu_y[n] += (bsp_y[1]) * Xme_1[n]") expect_match2(scode, "mu_z[n] += (bsp_z[1]) * Xme_1[n]") expect_match2(scode, "Xme_1 = meanme_1[1] + sdme_1[1] * zme_1;") # noise-free terms with grouping factors bform <- bf(y ~ me(x, xsd, ID) + me(z, xsd) + (me(x, xsd, ID) | ID)) - scode <- make_stancode(bform, dat) + scode <- stancode(bform, dat) expect_match2(scode, "vector[Nme_1] Xn_1;") expect_match2(scode, "Xme_1 = meanme_1[1] + sdme_1[1] * zme_1;") expect_match2(scode, "Xme_2 = meanme_2[1] + sdme_2[1] * zme_2;") expect_match2(scode, "(bsp[1] + r_1_2[J_1[n]]) * Xme_1[Jme_1[n]]") bform <- bform + set_mecor(FALSE) - scode <- make_stancode(bform, dat) + scode <- stancode(bform, dat) expect_match2(scode, "Xme_1 = meanme_1[1] + sdme_1[1] * zme_1;") }) @@ -1515,15 +1515,15 @@ test_that("Stan code of multi-membership models is correct", { dat <- data.frame(y = rnorm(10), g1 = sample(1:10, 10, TRUE), g2 = sample(1:10, 10, TRUE), w1 = rep(1, 10), w2 = rep(abs(rnorm(10)))) - expect_match2(make_stancode(y ~ (1|mm(g1, g2)), data = dat), + expect_match2(stancode(y ~ (1|mm(g1, g2)), data = dat), paste0(" W_1_1[n] * r_1_1[J_1_1[n]] * Z_1_1_1[n]", " + W_1_2[n] * r_1_1[J_1_2[n]] * Z_1_1_2[n]") ) - expect_match2(make_stancode(y ~ (1+w1|mm(g1,g2)), data = dat), + expect_match2(stancode(y ~ (1+w1|mm(g1,g2)), data = dat), paste0(" W_1_1[n] * r_1_2[J_1_1[n]] * Z_1_2_1[n]", " + W_1_2[n] * r_1_2[J_1_2[n]] * Z_1_2_2[n]") ) - expect_match2(make_stancode(y ~ (1+mmc(w1, w2)|mm(g1,g2)), data = dat), + expect_match2(stancode(y ~ (1+mmc(w1, w2)|mm(g1,g2)), data = dat), " W_1_2[n] * r_1_2[J_1_2[n]] * Z_1_2_2[n];" ) }) @@ -1534,9 +1534,9 @@ test_that("by variables in grouping terms are handled correctly", { g = rep(1:10, each = 10), z = factor(rep(c(0, 4.5, 3, 2, 5), each = 20)) ) - scode <- make_stancode(y ~ x + (1 | gr(g, by = z)), dat) + scode <- stancode(y ~ x + (1 | gr(g, by = z)), dat) expect_match2(scode, "r_1_1 = (transpose(sd_1[1, Jby_1]) .* (z_1[1]));") - scode <- make_stancode(y ~ x + (x | gr(g, by = z)), dat) + scode <- stancode(y ~ x + (x | gr(g, by = z)), dat) expect_match2(scode, "r_1 = scale_r_cor_by(z_1, sd_1, L_1, Jby_1);") expect_match2(scode, "lprior += student_t_lpdf(to_vector(sd_1) | 3, 0, 2.5)") expect_match2(scode, "lprior += lkj_corr_cholesky_lpdf(L_1[5] | 1);") @@ -1545,14 +1545,14 @@ test_that("by variables in grouping terms are handled correctly", { test_that("Group syntax | and || is handled correctly,", { data <- data.frame(y = rnorm(10), x = rnorm(10), g1 = rep(1:5, each = 2), g2 = rep(1:2, 5)) - scode <- make_stancode(y ~ x + (1+x||g1) + (I(x/4)|g2), data) + scode <- stancode(y ~ x + (1+x||g1) + (I(x/4)|g2), data) expect_match2(scode, "r_1_2 = (sd_1[2] * (z_1[2]));") expect_match2(scode, "r_2_1 = r_2[, 1];") expect_match2(scode, "r_2 = scale_r_cor(z_2, sd_2, L_2);") }) test_that("predicting zi and hu works correctly", { - scode <- make_stancode(bf(count ~ Trt, zi ~ Trt), epilepsy, + scode <- stancode(bf(count ~ Trt, zi ~ Trt), epilepsy, family = "zero_inflated_poisson") expect_match2(scode, "target += zero_inflated_poisson_log_logit_lpmf(Y[n] | mu[n], zi[n])" @@ -1560,13 +1560,13 @@ test_that("predicting zi and hu works correctly", { expect_true(!grepl("inv_logit\\(", scode)) expect_true(!grepl("exp(mu[n])", scode, fixed = TRUE)) - scode <- make_stancode(bf(count ~ Trt, zi ~ Trt), epilepsy, + scode <- stancode(bf(count ~ Trt, zi ~ Trt), epilepsy, family = zero_inflated_poisson(identity)) expect_match2(scode, "target += zero_inflated_poisson_logit_lpmf(Y[n] | mu[n], zi[n])" ) - scode <- make_stancode(bf(count ~ Trt, zi ~ Trt), epilepsy, + scode <- stancode(bf(count ~ Trt, zi ~ Trt), epilepsy, family = "zero_inflated_binomial") expect_match2(scode, "target += zero_inflated_binomial_blogit_logit_lpmf(Y[n] | trials[n], mu[n], zi[n])" @@ -1574,7 +1574,7 @@ test_that("predicting zi and hu works correctly", { expect_true(!grepl("inv_logit\\(", scode)) fam <- zero_inflated_binomial("probit", link_zi = "identity") - scode <- make_stancode( + scode <- stancode( bf(count ~ Trt, zi ~ Trt), epilepsy, family = fam, prior = prior("", class = Intercept, dpar = zi, lb = 0, ub = 1) ) @@ -1583,13 +1583,13 @@ test_that("predicting zi and hu works correctly", { ) expect_match2(scode, "mu = Phi(mu);") - scode <- make_stancode(bf(count ~ Trt, zi ~ Trt), epilepsy, + scode <- stancode(bf(count ~ Trt, zi ~ Trt), epilepsy, family = "zero_inflated_beta_binomial") expect_match2(scode, paste("target += zero_inflated_beta_binomial_logit_lpmf(Y[n]", "| trials[n], mu[n], phi, zi[n])")) expect_match2(scode, "mu = inv_logit(mu);") - scode <- make_stancode( + scode <- stancode( bf(count ~ Trt, zi ~ Trt), epilepsy, zero_inflated_beta_binomial("probit", link_zi = "identity"), prior = prior("", class = Intercept, dpar = zi, lb = 0, ub = 1) @@ -1599,7 +1599,7 @@ test_that("predicting zi and hu works correctly", { "| trials[n], mu[n], phi, zi[n])")) expect_match2(scode, "mu = Phi(mu);") - scode <- make_stancode( + scode <- stancode( bf(count ~ Trt, zi ~ Trt), epilepsy, family = zero_inflated_beta() ) @@ -1607,7 +1607,7 @@ test_that("predicting zi and hu works correctly", { "target += zero_inflated_beta_logit_lpdf(Y[n] | mu[n], phi, zi[n])" ) - scode <- make_stancode(bf(count ~ Trt, hu ~ Trt), epilepsy, + scode <- stancode(bf(count ~ Trt, hu ~ Trt), epilepsy, family = "hurdle_negbinomial") expect_match2(scode, "target += hurdle_neg_binomial_log_logit_lpmf(Y[n] | mu[n], shape, hu[n])" @@ -1615,14 +1615,14 @@ test_that("predicting zi and hu works correctly", { expect_true(!grepl("inv_logit\\(", scode)) expect_true(!grepl("exp(mu)", scode, fixed = TRUE)) - scode <- make_stancode(bf(count ~ Trt, hu ~ Trt), epilepsy, + scode <- stancode(bf(count ~ Trt, hu ~ Trt), epilepsy, family = "hurdle_gamma") expect_match2(scode, "hurdle_gamma_logit_lpdf(Y[n] | shape, shape / mu[n], hu[n])" ) expect_true(!grepl("inv_logit\\(", scode)) - scode <- make_stancode( + scode <- stancode( bf(count ~ Trt, hu ~ Trt), epilepsy, family = hurdle_gamma(link_hu = "identity"), prior = prior("", class = Intercept, dpar = hu, lb = 0, ub = 1) @@ -1632,25 +1632,25 @@ test_that("predicting zi and hu works correctly", { }) test_that("fixing auxiliary parameters is possible", { - scode <- make_stancode(bf(y ~ 1, sigma = 0.5), data = list(y = rnorm(10))) + scode <- stancode(bf(y ~ 1, sigma = 0.5), data = list(y = rnorm(10))) expect_match2(scode, "real sigma = 0.5;") }) test_that("Stan code of quantile regression models is correct", { data <- data.frame(y = rnorm(10), x = rnorm(10), c = 1) - scode <- make_stancode(y ~ x, data, family = asym_laplace()) + scode <- stancode(y ~ x, data, family = asym_laplace()) expect_match2(scode, "target += asym_laplace_lpdf(Y[n] | mu[n], sigma, quantile)") - scode <- make_stancode(bf(y ~ x, quantile = 0.75), data, family = asym_laplace()) + scode <- stancode(bf(y ~ x, quantile = 0.75), data, family = asym_laplace()) expect_match2(scode, "real quantile = 0.75;") - scode <- make_stancode(y | cens(c) ~ x, data, family = asym_laplace()) + scode <- stancode(y | cens(c) ~ x, data, family = asym_laplace()) expect_match2(scode, "target += asym_laplace_lccdf(Y[n] | mu[n], sigma, quantile)") - scode <- make_stancode(bf(y ~ x, sigma ~ x), data, family = asym_laplace()) + scode <- stancode(bf(y ~ x, sigma ~ x), data, family = asym_laplace()) expect_match2(scode, "target += asym_laplace_lpdf(Y[n] | mu[n], sigma[n], quantile)") - scode <- make_stancode(bf(y ~ x, quantile = 0.75), data, + scode <- stancode(bf(y ~ x, quantile = 0.75), data, family = brmsfamily("zero_inflated_asym_laplace")) expect_match2(scode, "target += zero_inflated_asym_laplace_lpdf(Y[n] | mu[n], sigma, quantile, zi)" @@ -1659,64 +1659,64 @@ test_that("Stan code of quantile regression models is correct", { test_that("Stan code of addition term 'rate' is correct", { data <- data.frame(y = rpois(10, 1), x = rnorm(10), time = 1:10) - scode <- make_stancode(y | rate(time) ~ x, data, poisson()) + scode <- stancode(y | rate(time) ~ x, data, poisson()) expect_match2(scode, "target += poisson_log_lpmf(Y | mu + log_denom);") - scode <- make_stancode(y | rate(time) ~ x, data, poisson("identity")) + scode <- stancode(y | rate(time) ~ x, data, poisson("identity")) expect_match2(scode, "target += poisson_lpmf(Y | mu .* denom);") - scode <- make_stancode(y | rate(time) ~ x, data, negbinomial()) + scode <- stancode(y | rate(time) ~ x, data, negbinomial()) expect_match2(scode, "target += neg_binomial_2_log_lpmf(Y | mu + log_denom, shape * denom);") bform <- bf(y | rate(time) ~ mi(x), shape ~ mi(x), family = negbinomial()) + bf(x | mi() ~ 1, family = gaussian()) - scode <- make_stancode(bform, data) + scode <- stancode(bform, data) expect_match2(scode, "target += neg_binomial_2_log_lpmf(Y_y | mu_y + log_denom_y, shape_y .* denom_y);") - scode <- make_stancode(y | rate(time) ~ x, data, brmsfamily("negbinomial2")) + scode <- stancode(y | rate(time) ~ x, data, brmsfamily("negbinomial2")) expect_match2(scode, "target += neg_binomial_2_log_lpmf(Y | mu + log_denom, inv(sigma) * denom);") - scode <- make_stancode(y | rate(time) + cens(1) ~ x, data, geometric()) + scode <- stancode(y | rate(time) + cens(1) ~ x, data, geometric()) expect_match2(scode, "target += neg_binomial_2_lpmf(Y[n] | mu[n] * denom[n], 1 * denom[n]);") }) test_that("Stan code of GEV models is correct", { data <- data.frame(y = rnorm(10), x = rnorm(10), c = 1) - SW(scode <- make_stancode(y ~ x, data, gen_extreme_value())) + SW(scode <- stancode(y ~ x, data, gen_extreme_value())) expect_match2(scode, "target += gen_extreme_value_lpdf(Y[n] | mu[n], sigma, xi)") expect_match2(scode, "xi = scale_xi(tmp_xi, Y, mu, sigma)") - SW(scode <- make_stancode(bf(y ~ x, sigma ~ x), data, gen_extreme_value())) + SW(scode <- stancode(bf(y ~ x, sigma ~ x), data, gen_extreme_value())) expect_match2(scode, "xi = scale_xi_vector(tmp_xi, Y, mu, sigma)") - SW(scode <- make_stancode(bf(y ~ x, xi ~ x), data, gen_extreme_value())) + SW(scode <- stancode(bf(y ~ x, xi ~ x), data, gen_extreme_value())) expect_match2(scode, "xi = expm1(xi)") - SW(scode <- make_stancode(bf(y ~ x, xi = 0), data, gen_extreme_value())) + SW(scode <- stancode(bf(y ~ x, xi = 0), data, gen_extreme_value())) expect_match2(scode, "real xi = 0; // shape parameter") - SW(scode <- make_stancode(y | cens(c) ~ x, data, gen_extreme_value())) + SW(scode <- stancode(y | cens(c) ~ x, data, gen_extreme_value())) expect_match2(scode, "target += gen_extreme_value_lccdf(Y[n] | mu[n], sigma, xi)") }) test_that("Stan code of Cox models is correct", { data <- data.frame(y = rexp(100), ce = sample(0:1, 100, TRUE), x = rnorm(100)) bform <- bf(y | cens(ce) ~ x) - scode <- make_stancode(bform, data, brmsfamily("cox")) + scode <- stancode(bform, data, brmsfamily("cox")) expect_match2(scode, "target += cox_log_lpdf(Y[n] | mu[n], bhaz[n], cbhaz[n]);") expect_match2(scode, "vector[N] cbhaz = Zcbhaz * sbhaz;") expect_match2(scode, "lprior += dirichlet_lpdf(sbhaz | con_sbhaz);") expect_match2(scode, "simplex[Kbhaz] sbhaz;") - scode <- make_stancode(bform, data, brmsfamily("cox", "identity")) + scode <- stancode(bform, data, brmsfamily("cox", "identity")) expect_match2(scode, "target += cox_lccdf(Y[n] | mu[n], bhaz[n], cbhaz[n]);") }) test_that("offsets appear in the Stan code", { data <- data.frame(y = rnorm(10), x = rnorm(10), c = 1) - scode <- make_stancode(y ~ x + offset(c), data) + scode <- stancode(y ~ x + offset(c), data) expect_match2(scode, "+ offsets;") - scode <- make_stancode(bf(y ~ a, a ~ offset(log(c + 1)), nl = TRUE), + scode <- stancode(bf(y ~ a, a ~ offset(log(c + 1)), nl = TRUE), data, prior = prior(normal(0,1), nlpar = a)) expect_match2(scode, "+ offsets_a;") }) @@ -1724,11 +1724,11 @@ test_that("offsets appear in the Stan code", { test_that("prior only models are correctly checked", { data <- data.frame(y = rnorm(10), x = rnorm(10), c = 1) prior <- prior(normal(0, 5), b) + prior("", Intercept) - expect_error(make_stancode(y ~ x, data, prior = prior, + expect_error(stancode(y ~ x, data, prior = prior, sample_prior = "only"), "Sampling from priors is not possible") prior <- prior(normal(0, 5), b) + prior(normal(0, 10), Intercept) - scode <- make_stancode(y ~ x, data, prior = prior, + scode <- stancode(y ~ x, data, prior = prior, sample_prior = "only") expect_match2(scode, "lprior += normal_lpdf(Intercept | 0, 10)") }) @@ -1737,7 +1737,7 @@ test_that("Stan code of mixture model is correct", { data <- data.frame(y = 1:10, x = rnorm(10), c = 1) data$z <- abs(data$y) - scode <- make_stancode( + scode <- stancode( bf(y ~ x, sigma2 ~ x), data, family = mixture(gaussian, gaussian), sample_prior = TRUE @@ -1750,20 +1750,20 @@ test_that("Stan code of mixture model is correct", { expect_match2(scode, "target += log_sum_exp(ps);") expect_match2(scode, "simplex[2] prior_theta = dirichlet_rng(con_theta);") - scode <- make_stancode(bf(z | weights(c) ~ x, shape1 ~ x, theta1 = 1, theta2 = 2), + scode <- stancode(bf(z | weights(c) ~ x, shape1 ~ x, theta1 = 1, theta2 = 2), data = data, mixture(Gamma("log"), weibull)) expect_match(scode, "data \\{[^\\}]*real theta1;") expect_match(scode, "data \\{[^\\}]*real theta2;") expect_match2(scode, "ps[1] = log(theta1) + gamma_lpdf(Y[n] | shape1[n], shape1[n] / mu1[n]);") expect_match2(scode, "target += weights[n] * log_sum_exp(ps);") - scode <- make_stancode(bf(abs(y) | se(c) ~ x), data = data, + scode <- stancode(bf(abs(y) | se(c) ~ x), data = data, mixture(gaussian, student)) expect_match2(scode, "ps[1] = log(theta1) + normal_lpdf(Y[n] | mu1[n], se[n]);") expect_match2(scode, "ps[2] = log(theta2) + student_t_lpdf(Y[n] | nu2, mu2[n], se[n]);") fam <- mixture(gaussian, student, exgaussian) - scode <- make_stancode(bf(y ~ x), data = data, family = fam) + scode <- stancode(bf(y ~ x), data = data, family = fam) expect_match(scode, "parameters \\{[^\\}]*real Intercept_mu3;") expect_match2(scode, "ps[2] = log(theta2) + student_t_lpdf(Y[n] | nu2, mu2[n], sigma2);" @@ -1772,7 +1772,7 @@ test_that("Stan code of mixture model is correct", { "ps[3] = log(theta3) + exp_mod_normal_lpdf(Y[n] | mu3[n] - beta3, sigma3, inv(beta3));" ) - scode <- make_stancode(bf(y ~ x, theta1 ~ x, theta3 ~ x), + scode <- stancode(bf(y ~ x, theta1 ~ x, theta3 ~ x), data = data, family = fam) expect_match2(scode, "log_sum_exp_theta = log(exp(theta1[n]) + exp(theta2[n]) + exp(theta3[n]));") expect_match2(scode, "theta2 = rep_vector(0.0, N);") @@ -1780,13 +1780,13 @@ test_that("Stan code of mixture model is correct", { expect_match2(scode, "ps[1] = theta1[n] + normal_lpdf(Y[n] | mu1[n], sigma1);") fam <- mixture(cumulative, sratio) - scode <- make_stancode(y ~ x, data, family = fam) + scode <- stancode(y ~ x, data, family = fam) expect_match2(scode, "ordered_logistic_lpmf(Y[n] | mu1[n], Intercept_mu1);") expect_match2(scode, "sratio_logit_lpmf(Y[n] | mu2[n], disc2, Intercept_mu2);") # censored mixture model fam <- mixture(gaussian, gaussian) - scode <- make_stancode(y | cens(2, y2 = 2) ~ x, data, fam) + scode <- stancode(y | cens(2, y2 = 2) ~ x, data, fam) expect_match2(scode, "ps[2] = log(theta2) + normal_lccdf(Y[n] | mu2[n], sigma2);" ) @@ -1796,7 +1796,7 @@ test_that("Stan code of mixture model is correct", { )) # truncated mixture model - scode <- make_stancode(y | trunc(3) ~ x, data, fam) + scode <- stancode(y | trunc(3) ~ x, data, fam) expect_match2(scode, paste0( "ps[1] = log(theta1) + normal_lpdf(Y[n] | mu1[n], sigma1) -\n", " normal_lccdf(lb[n] | mu1[n], sigma1);" @@ -1810,7 +1810,7 @@ test_that("Stan code of mixture model is correct", { mixture(gaussian, nmix = 2) bprior <- prior(normal(0, 1), nlpar = "eta") + prior(normal(0, 1), nlpar = "a") - scode <- make_stancode(bform, data = data, prior = bprior) + scode <- stancode(bform, data = data, prior = bprior) expect_match2(scode, "mu1[n] = (nlp_eta[n] ^ 2);") expect_match2(scode, "mu2[n] = (log(nlp_eta[n]) + nlp_a[n]);") }) @@ -1819,7 +1819,7 @@ test_that("sparse matrix multiplication is applied correctly", { data <- data.frame(y = rnorm(10), x = rnorm(10)) # linear model - scode <- make_stancode( + scode <- stancode( bf(y ~ x, sparse = TRUE) + lf(sigma ~ x, sparse = TRUE), data, prior = prior(normal(0, 5), coef = "Intercept") ) @@ -1840,7 +1840,7 @@ test_that("sparse matrix multiplication is applied correctly", { expect_match2(scode, "target += normal_lpdf(Y | mu, sigma);") # non-linear model - scode <- make_stancode( + scode <- stancode( bf(y ~ a, lf(a ~ x, sparse = TRUE), nl = TRUE), data, prior = prior(normal(0, 1), nlpar = a) ) @@ -1858,7 +1858,7 @@ test_that("QR decomposition is included in the Stan code", { lf(sigma ~ 0 + x1 + x2, decomp = "QR") # simple priors - scode <- make_stancode(bform, data, prior = prior(normal(0, 2))) + scode <- stancode(bform, data, prior = prior(normal(0, 2))) expect_match2(scode, "XQ = qr_thin_Q(Xc) * sqrt(N - 1);") expect_match2(scode, "b = XR_inv * bQ;") expect_match2(scode, "lprior += normal_lpdf(bQ | 0, 2);") @@ -1866,7 +1866,7 @@ test_that("QR decomposition is included in the Stan code", { expect_match2(scode, "XR_sigma = qr_thin_R(X_sigma) / sqrt(N - 1);") # horseshoe prior - scode <- make_stancode(bform, data, prior = prior(horseshoe(1))) + scode <- stancode(bform, data, prior = prior(horseshoe(1))) expect_match2(scode, "target += std_normal_lpdf(zb);") expect_match2(scode, "scales = scales_horseshoe(") expect_match2(scode, "sdb = scales[(1):(Kc)];") @@ -1880,7 +1880,7 @@ test_that("Stan code for Gaussian processes is correct", { prior <- prior(gamma(0.1, 0.1), sdgp) + prior(gamma(4, 2), sdgp, coef = gpx2x1) - scode <- make_stancode(y ~ gp(x1) + gp(x2, by = x1, gr = FALSE), + scode <- stancode(y ~ gp(x1) + gp(x2, by = x1, gr = FALSE), dat, prior = prior) expect_match2(scode, "lprior += inv_gamma_lpdf(lscale_1[1]") expect_match2(scode, "lprior += gamma_lpdf(sdgp_1 | 0.1, 0.1)") @@ -1889,25 +1889,25 @@ test_that("Stan code for Gaussian processes is correct", { expect_match2(scode, "Cgp_2 .* gp_pred_2;") prior <- prior + prior(normal(0, 1), lscale, coef = gpx1) - scode <- make_stancode(y ~ gp(x1) + gp(x2, by = x1, gr = TRUE), + scode <- stancode(y ~ gp(x1) + gp(x2, by = x1, gr = TRUE), data = dat, prior = prior) expect_match2(scode, "lprior += normal_lpdf(lscale_1[1][1] | 0, 1)") expect_match2(scode, "gp_pred_2 = gp(Xgp_2, sdgp_2[1], lscale_2[1], zgp_2);") expect_match2(scode, "+ Cgp_2 .* gp_pred_2[Jgp_2]") # non-isotropic GP - scode <- make_stancode(y ~ gp(x1, x2, by = z, iso = FALSE), data = dat) + scode <- stancode(y ~ gp(x1, x2, by = z, iso = FALSE), data = dat) expect_match2(scode, "lprior += inv_gamma_lpdf(lscale_1[1][2]") expect_match2(scode, "lprior += inv_gamma_lpdf(lscale_1[4][2]") # Suppress Stan parser warnings that can currently not be avoided - scode <- make_stancode(y ~ gp(x1, x2) + gp(x1, by = z, gr = FALSE), + scode <- stancode(y ~ gp(x1, x2) + gp(x1, by = z, gr = FALSE), dat, silent = TRUE) expect_match2(scode, "gp(Xgp_1, sdgp_1[1], lscale_1[1], zgp_1)") expect_match2(scode, "mu[Igp_2_2] += Cgp_2_2 .* gp_pred_2_2;") # approximate GPS - scode <- make_stancode( + scode <- stancode( y ~ gp(x1, k = 10, c = 5/4) + gp(x2, by = x1, k = 10, c = 5/4), data = dat ) @@ -1920,14 +1920,14 @@ test_that("Stan code for Gaussian processes is correct", { prior <- c(prior(normal(0, 10), lscale, coef = gpx1, nlpar = a), prior(gamma(0.1, 0.1), sdgp, nlpar = a), prior(normal(0, 1), b, nlpar = a)) - scode <- make_stancode(bf(y ~ a, a ~ gp(x1), nl = TRUE), + scode <- stancode(bf(y ~ a, a ~ gp(x1), nl = TRUE), data = dat, prior = prior) expect_match2(scode, "lprior += normal_lpdf(lscale_a_1[1][1] | 0, 10)") expect_match2(scode, "lprior += gamma_lpdf(sdgp_a_1 | 0.1, 0.1)") expect_match2(scode, "gp(Xgp_a_1, sdgp_a_1[1], lscale_a_1[1], zgp_a_1)") prior <- prior(gamma(2, 2), lscale, coef = gpx1z5, nlpar = "a") - scode <- make_stancode(bf(y ~ a, a ~ gp(x1, by = z, gr = TRUE), nl = TRUE), + scode <- stancode(bf(y ~ a, a ~ gp(x1, by = z, gr = TRUE), nl = TRUE), data = dat, prior = prior, silent = TRUE) expect_match2(scode, "nlp_a[Igp_a_1_1] += Cgp_a_1_1 .* gp_pred_a_1_1[Jgp_a_1_1];" @@ -1939,7 +1939,7 @@ test_that("Stan code for Gaussian processes is correct", { # test warnings prior <- prior(normal(0, 1), lscale) expect_warning( - make_stancode(y ~ gp(x1), data = dat, prior = prior), + stancode(y ~ gp(x1), data = dat, prior = prior), "The global prior 'normal(0, 1)' of class 'lscale' will not be used", fixed = TRUE ) @@ -1950,7 +1950,7 @@ test_that("Stan code for SAR models is correct", { W <- matrix(0, nrow = 10, ncol = 10) dat2 <- list(W = W) - scode <- make_stancode( + scode <- stancode( y ~ x + sar(W), data = dat, prior = prior(normal(0.5, 1), lagsar), data2 = dat2 @@ -1960,7 +1960,7 @@ test_that("Stan code for SAR models is correct", { ) expect_match2(scode, "lprior += normal_lpdf(lagsar | 0.5, 1)") - scode <- make_stancode( + scode <- stancode( y ~ x + sar(W, type = "lag"), data = dat, family = student(), data2 = dat2 @@ -1969,13 +1969,13 @@ test_that("Stan code for SAR models is correct", { "target += student_t_lagsar_lpdf(Y | nu, mu, sigma, lagsar, Msar, eigenMsar)" ) - scode <- make_stancode(y ~ x + sar(W, type = "error"), data = dat, + scode <- stancode(y ~ x + sar(W, type = "error"), data = dat, data2 = dat2) expect_match2(scode, "target += normal_errorsar_lpdf(Y | mu, sigma, errorsar, Msar, eigenMsar)" ) - scode <- make_stancode( + scode <- stancode( y ~ x + sar(W, "error"), data = dat, family = student(), prior = prior(beta(2, 3), errorsar), data2 = dat2 @@ -1986,7 +1986,7 @@ test_that("Stan code for SAR models is correct", { expect_match2(scode, "lprior += beta_lpdf(errorsar | 2, 3)") expect_error( - make_stancode(bf(y ~ sar(W), sigma ~ x), data = dat), + stancode(bf(y ~ sar(W), sigma ~ x), data = dat), "SAR models are not implemented when predicting 'sigma'" ) }) @@ -2001,25 +2001,25 @@ test_that("Stan code for CAR models is correct", { rownames(W) <- seq_len(nrow(W)) dat2 <- list(W = W) - scode <- make_stancode(y ~ x + car(W), dat, data2 = dat2) + scode <- stancode(y ~ x + car(W), dat, data2 = dat2) expect_match2(scode, "real car;") expect_match2(scode, "real sparse_car_lpdf(vector phi") expect_match2(scode, "target += sparse_car_lpdf(") expect_match2(scode, "mu[n] += rcar[Jloc[n]]") - scode <- make_stancode(y ~ x + car(W, type = "esicar"), dat, data2 = dat2) + scode <- stancode(y ~ x + car(W, type = "esicar"), dat, data2 = dat2) expect_match2(scode, "real sparse_icar_lpdf(vector phi") expect_match2(scode, "target += sparse_icar_lpdf(") expect_match2(scode, "mu[n] += rcar[Jloc[n]]") expect_match2(scode, "rcar[Nloc] = - sum(zcar)") - scode <- make_stancode(y ~ x + car(W, type = "icar"), dat, data2 = dat2) + scode <- stancode(y ~ x + car(W, type = "icar"), dat, data2 = dat2) expect_match2(scode, "target += -0.5 * dot_self(zcar[edges1] - zcar[edges2])") expect_match2(scode, "target += normal_lpdf(sum(zcar) | 0, 0.001 * Nloc)") expect_match2(scode, "mu[n] += rcar[Jloc[n]]") expect_match2(scode, "rcar = zcar * sdcar") - scode <- make_stancode(y ~ x + car(W, type = "bym2"), dat, data2 = dat2) + scode <- stancode(y ~ x + car(W, type = "bym2"), dat, data2 = dat2) expect_match2(scode, "target += -0.5 * dot_self(zcar[edges1] - zcar[edges2])") expect_match2(scode, "target += normal_lpdf(sum(zcar) | 0, 0.001 * Nloc)") expect_match2(scode, "mu[n] += rcar[Jloc[n]]") @@ -2030,13 +2030,13 @@ test_that("Stan code for CAR models is correct", { )) # apply a CAR term on a distributional parameter other than 'mu' - scode <- make_stancode(bf(y ~ x, sigma ~ car(W)), dat, data2 = dat2) + scode <- stancode(bf(y ~ x, sigma ~ car(W)), dat, data2 = dat2) expect_match2(scode, "real sparse_car_lpdf(vector phi") expect_match2(scode, "target += sparse_car_lpdf(") expect_match2(scode, "sigma[n] += rcar_sigma[Jloc_sigma[n]]") # apply shrinkage priors on a CAR term - scode <- make_stancode(bf(y ~ x + car(W)), dat, data2 = dat2, + scode <- stancode(bf(y ~ x + car(W)), dat, data2 = dat2, prior = prior(horseshoe(main = TRUE), class = b) + prior(horseshoe(), class = sdcar)) expect_match2(scode, "sdcar = scales[(1+Kc):(Kc+1)][1];") @@ -2044,21 +2044,21 @@ test_that("Stan code for CAR models is correct", { test_that("Stan code for skew_normal models is correct", { dat = data.frame(y = rnorm(10), x = rnorm(10)) - scode <- make_stancode(y ~ x, dat, skew_normal()) + scode <- stancode(y ~ x, dat, skew_normal()) expect_match2(scode, "delta = alpha / sqrt(1 + alpha^2);") expect_match2(scode, "omega = sigma / sqrt(1 - sqrt(2 / pi())^2 * delta^2);") expect_match2(scode, "mu[n] = mu[n] - omega * delta * sqrt(2 / pi());") - scode <- make_stancode(bf(y ~ x, sigma ~ x), dat, skew_normal()) + scode <- stancode(bf(y ~ x, sigma ~ x), dat, skew_normal()) expect_match2(scode, "omega[n] = sigma[n] / sqrt(1 - sqrt(2 / pi())^2 * delta^2);") expect_match2(scode, "mu[n] = mu[n] - omega[n] * delta * sqrt(2 / pi());") - scode <- make_stancode(bf(y | se(x) ~ x, alpha ~ x), dat, skew_normal()) + scode <- stancode(bf(y | se(x) ~ x, alpha ~ x), dat, skew_normal()) expect_match2(scode, "delta[n] = alpha[n] / sqrt(1 + alpha[n]^2);") expect_match2(scode, "omega[n] = se[n] / sqrt(1 - sqrt(2 / pi())^2 * delta[n]^2);") expect_match2(scode, "mu[n] = mu[n] - omega[n] * delta[n] * sqrt(2 / pi());") - scode <- make_stancode(y ~ x, dat, mixture(skew_normal, nmix = 2)) + scode <- stancode(y ~ x, dat, mixture(skew_normal, nmix = 2)) expect_match2(scode, "omega1 = sigma1 / sqrt(1 - sqrt(2 / pi())^2 * delta1^2);") expect_match2(scode, "mu2[n] = mu2[n] - omega2 * delta2 * sqrt(2 / pi());") }) @@ -2068,40 +2068,40 @@ test_that("Stan code for missing value terms works correctly", { dat$x[c(1, 3, 9)] <- NA bform <- bf(y ~ mi(x)*g) + bf(x | mi() ~ g) + set_rescor(FALSE) - scode <- make_stancode(bform, dat) + scode <- stancode(bform, dat) expect_match2(scode, "Yl_x[Jmi_x] = Ymi_x;") expect_match2(scode, "(bsp_y[1]) * Yl_x[n] + (bsp_y[2]) * Yl_x[n] * Csp_y_1[n];") expect_match2(scode, "target += normal_id_glm_lpdf(Yl_x | Xc_x, Intercept_x, b_x, sigma_x);") bform <- bf(y ~ mi(x) + (mi(x) | g)) + bf(x | mi() ~ 1) + set_rescor(FALSE) - scode <- make_stancode(bform, dat) + scode <- stancode(bform, dat) expect_match2(scode, "(bsp_y[1] + r_1_y_2[J_1_y[n]]) * Yl_x[n] + r_1_y_1[J_1_y[n]] * Z_1_y_1[n];" ) bform <- bf(y ~ a, a ~ mi(x), nl = TRUE) + bf(x | mi() ~ 1) + set_rescor(FALSE) bprior <- prior(normal(0, 1), nlpar = "a", resp = "y") - scode <- make_stancode(bform, dat, prior = bprior) + scode <- stancode(bform, dat, prior = bprior) expect_match2(scode, "nlp_y_a[n] += (bsp_y_a[1]) * Yl_x[n];") expect_match2(scode, "lprior += normal_lpdf(bsp_y_a | 0, 1);") bform <- bf(y ~ mi(x)*mo(g)) + bf(x | mi() ~ 1) + set_rescor(FALSE) - scode <- make_stancode(bform, dat) + scode <- stancode(bform, dat) expect_match2(scode, "(bsp_y[3]) * Yl_x[n] * mo(simo_y_2, Xmo_y_2[n]);") bform <- bf(y ~ 1, sigma ~ 1) + bf(x | mi() ~ 1) + set_rescor(TRUE) - scode <- make_stancode(bform, dat) + scode <- stancode(bform, dat) expect_match2(scode, "Yl[n][2] = Yl_x[n];") expect_match2(scode, "sigma[n] = transpose([sigma_y[n], sigma_x]);") expect_match2(scode, "LSigma[n] = diag_pre_multiply(sigma[n], Lrescor);") bform <- bf(x | mi() ~ y, family = "lognormal") - scode <- make_stancode(bform, dat) + scode <- stancode(bform, dat) expect_match2(scode, "vector[Nmi] Ymi;") bform <- bf(y ~ I(log(mi(x))) * g) + bf(x | mi() + trunc(lb = 1) ~ y, family = "lognormal") - scode <- make_stancode(bform, dat) + scode <- stancode(bform, dat) expect_match2(scode, "vector[Nmi_x] Ymi_x;") expect_match2(scode, "(bsp_y[1]) * (log(Yl_x[n])) + (bsp_y[2]) * (log(Yl_x[n])) * Csp_y_1[n]" @@ -2109,7 +2109,7 @@ test_that("Stan code for missing value terms works correctly", { bform <- bf(y ~ mi(x)*g) + bf(x | mi() + cens(z) ~ y, family = "beta") - scode <- make_stancode(bform, dat) + scode <- stancode(bform, dat) expect_match2(scode, "vector[Nmi_x] Ymi_x;") expect_match2(scode, "target += beta_lpdf(Yl_x[n] | mu_x[n] * phi_x, (1 - mu_x[n]) * phi_x);" @@ -2117,7 +2117,7 @@ test_that("Stan code for missing value terms works correctly", { bform <- bf(y | mi() ~ mi(x), shape ~ mi(x), family=weibull()) + bf(x| mi() ~ z, family=gaussian()) + set_rescor(FALSE) - scode <- make_stancode(bform, data = dat) + scode <- stancode(bform, data = dat) expect_match2(scode, "weibull_lpdf(Yl_y | shape_y, mu_y ./ tgamma(1 + 1 ./ shape_y));") expect_match2(scode, "shape_y[n] += (bsp_shape_y[1]) * Yl_x[n];") }) @@ -2126,7 +2126,7 @@ test_that("Stan code for overimputation works correctly", { dat = data.frame(y = rnorm(10), x_x = rnorm(10), g = 1:10, z = 1) dat$x[c(1, 3, 9)] <- NA bform <- bf(y ~ mi(x_x)*g) + bf(x_x | mi(g) ~ 1) + set_rescor(FALSE) - scode <- make_stancode(bform, dat, sample_prior = "yes") + scode <- stancode(bform, dat, sample_prior = "yes") expect_match2(scode, "target += normal_lpdf(Yl_xx | mu_xx, sigma_xx)") expect_match2(scode, "target += normal_lpdf(Y_xx[Jme_xx] | Yl_xx[Jme_xx], noise_xx[Jme_xx])" @@ -2146,7 +2146,7 @@ test_that("Missing value terms can be combined with 'subset'", { bf(x | mi() + index(g2) + subset(s) ~ 1) + bf(z | mi() ~ s) + set_rescor(FALSE) - scode <- make_stancode(bform, dat) + scode <- stancode(bform, dat) expect_match2(scode, "(bsp_y[1]) * Yl_x[idxl_y_x_1[n]]") expect_match2(scode, "(bsp_y[2]) * Yl_z[n]") expect_match2(scode, "(bsp_y[3]) * Yl_x[idxl_y_x_1[n]] * Yl_z[n]") @@ -2154,14 +2154,14 @@ test_that("Missing value terms can be combined with 'subset'", { }) test_that("Stan code for advanced count data distribution is correct", { - scode <- make_stancode( + scode <- stancode( count ~ zAge + zBase * Trt + (1|patient), data = epilepsy, family = brmsfamily("discrete_weibull") ) expect_match2(scode, "mu = inv_logit(mu);") expect_match2(scode, "target += discrete_weibull_lpmf(Y[n] | mu[n], shape);") - scode <- make_stancode( + scode <- stancode( count ~ zAge + zBase * Trt + (1|patient), data = epilepsy, family = brmsfamily("com_poisson") ) @@ -2172,7 +2172,7 @@ test_that("argument 'stanvars' is handled correctly", { bprior <- prior(normal(mean_intercept, 10), class = "Intercept") mean_intercept <- 5 stanvars <- stanvar(mean_intercept) - scode <- make_stancode(count ~ Trt, data = epilepsy, + scode <- stancode(count ~ Trt, data = epilepsy, prior = bprior, stanvars = stanvars) expect_match2(scode, "real mean_intercept;") @@ -2180,7 +2180,7 @@ test_that("argument 'stanvars' is handled correctly", { 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;") - scode <- make_stancode(count ~ Trt + zBase, epilepsy, + scode <- stancode(count ~ Trt + zBase, epilepsy, prior = bprior, stanvars = stanvars) expect_match2(scode, "vector[K] M;") expect_match2(scode, "matrix[K, K] V;") @@ -2190,7 +2190,7 @@ test_that("argument 'stanvars' is handled correctly", { set_prior("target += normal_lpdf(tau | 0, 10)", check = FALSE) stanvars <- stanvar(scode = "real tau;", block = "parameters") - scode <- make_stancode(count ~ Trt + zBase, epilepsy, + scode <- stancode(count ~ Trt + zBase, epilepsy, prior = bprior, stanvars = stanvars) expect_match2(scode, "real tau;") expect_match2(scode, "lprior += normal_lpdf(b | 0, tau);") @@ -2200,7 +2200,7 @@ test_that("argument 'stanvars' is handled correctly", { stanvars <- stanvar(foo) + stanvar(scode = "real tau;", block = "parameters", pll_args = "real tau") - scode <- make_stancode(count ~ 1, data = epilepsy, family = poisson(), + scode <- stancode(count ~ 1, data = epilepsy, family = poisson(), stanvars = stanvars, threads = threading(2), parse = FALSE) expect_match2(scode, @@ -2212,12 +2212,12 @@ test_that("argument 'stanvars' is handled correctly", { # specify Stan code in the likelihood part of the model block stanvars <- stanvar(scode = "mu += 1.0;", block = "likelihood", position = "start") - scode <- make_stancode(count ~ Trt + (1|patient), data = epilepsy, + scode <- stancode(count ~ Trt + (1|patient), data = epilepsy, stanvars = stanvars) expect_match2(scode, "mu += 1.0;") stanvars <- stanvar(scode = "mu += 1.0;", block = "likelihood", position = "start") - scode <- make_stancode(count ~ Trt + (1|patient), data = epilepsy, + scode <- stancode(count ~ Trt + (1|patient), data = epilepsy, stanvars = stanvars, threads = 2, parse = FALSE) expect_match2(scode, "mu += 1.0;") @@ -2225,7 +2225,7 @@ test_that("argument 'stanvars' is handled correctly", { # add transformation at the end of a block stanvars <- stanvar(scode = "r_1_1 = r_1_1 * 2;", block = "tparameters", position = "end") - scode <- make_stancode(count ~ Trt + (1 | patient), epilepsy, + scode <- stancode(count ~ Trt + (1 | patient), epilepsy, stanvars = stanvars) expect_match2(scode, "r_1_1 = r_1_1 * 2;\n}") @@ -2237,7 +2237,7 @@ test_that("argument 'stanvars' is handled correctly", { # stanvar(scode = "real tau;", block = "parameters") + # stanvar(scode = "vector[Kc] b = zb * tau;", # block="tparameters", name = "b") - # scode <- make_stancode(count ~ Trt, epilepsy, + # scode <- stancode(count ~ Trt, epilepsy, # prior = bprior, stanvars = stanvars) # expect_match2(scode, "vector[Kc] b = zb * tau;") @@ -2245,7 +2245,7 @@ test_that("argument 'stanvars' is handled correctly", { # stanvar(scode = "real tau;", block = "parameters") + # stanvar(scode = "vector[Ksp] bsp = zbsp * tau;", # block = "tparameters", name = "bsp") - # scode <- make_stancode(count ~ mo(Base), epilepsy, stanvars = stanvars) + # scode <- stancode(count ~ mo(Base), epilepsy, stanvars = stanvars) # expect_match2(scode, "vector[Ksp] bsp = zbsp * tau;") }) @@ -2294,7 +2294,7 @@ test_that("custom families are handled correctly", { } " stanvars <- stanvar(scode = stan_funs, block = "functions") - scode <- make_stancode( + scode <- stancode( y | vint(size) + vreal(size) ~ x, data = dat, family = beta_binomial2, prior = prior(gamma(0.1, 0.1), class = "tau"), stanvars = stanvars @@ -2307,7 +2307,7 @@ test_that("custom families are handled correctly", { "target += beta_binomial2_lpmf(Y[n] | mu[n], tau, vint1[n], vreal1[n]);" ) - scode <- make_stancode( + scode <- stancode( bf(y | vint(size) + vreal(size) ~ x, tau ~ x), data = dat, family = beta_binomial2, stanvars = stanvars ) @@ -2317,7 +2317,7 @@ test_that("custom families are handled correctly", { ) # check custom families in mixture models - scode <- make_stancode( + scode <- stancode( y | vint(size) + vreal(size) + trials(size) ~ x, data = dat, family = mixture(binomial, beta_binomial2), stanvars = stanvars @@ -2331,7 +2331,7 @@ test_that("custom families are handled correctly", { y | vint(size) + vreal(size) + trials(size) ~ x, family = beta_binomial2 ) + bf(x ~ 1, family = gaussian()) - scode <- make_stancode(bform, data = dat, stanvars = stanvars) + scode <- stancode(bform, data = dat, stanvars = stanvars) expect_match2(scode, "target += beta_binomial2_lpmf(Y_y[n] | mu_y[n], tau_y, vint1_y[n], vreal1_y[n]);" ) @@ -2355,7 +2355,7 @@ test_that("custom families are handled correctly", { } " stanvars <- stanvar(scode = stan_funs_vec, block = "functions") - scode <- make_stancode( + scode <- stancode( y | vint(size) + vreal(size) ~ x, data = dat, family = beta_binomial2_vec, prior = prior(gamma(0.1, 0.1), class = "tau"), @@ -2369,21 +2369,21 @@ test_that("custom families are handled correctly", { test_that("likelihood of distributional beta models is correct", { # test issue #404 dat <- data.frame(prop = rbeta(100, shape1 = 2, shape2 = 2)) - scode <- make_stancode( + scode <- stancode( bf(prop ~ 1, phi ~ 1), data = dat, family = Beta() ) expect_match2(scode, "beta_lpdf(Y[n] | mu[n] * phi[n], (1 - mu[n]) * phi[n])") }) test_that("student-t group-level effects work without errors", { - scode <- make_stancode(count ~ Trt + (1|gr(patient, dist = "st")), epilepsy) + scode <- stancode(count ~ Trt + (1|gr(patient, dist = "st")), epilepsy) expect_match2(scode, "dfm_1 = sqrt(df_1 * udf_1);") expect_match2(scode, "dfm_1 .* (sd_1[1] * (z_1[1]));") expect_match2(scode, "lprior += gamma_lpdf(df_1 | 2, 0.1)") expect_match2(scode, "target += inv_chi_square_lpdf(udf_1 | df_1);") bprior <- prior(normal(20, 5), class = df, group = patient) - scode <- make_stancode( + scode <- stancode( count ~ Trt + (Trt|gr(patient, dist = "st")), epilepsy, prior = bprior ) @@ -2395,7 +2395,7 @@ test_that("student-t group-level effects work without errors", { test_that("centering design matrices can be changed correctly", { dat <- data.frame(y = 1:10, x = 1:10) - scode <- make_stancode( + scode <- stancode( bf(y ~ x, center = FALSE), data = dat, family = weibull(), prior = prior(normal(0,1), coef = Intercept) ) @@ -2403,7 +2403,7 @@ test_that("centering design matrices can be changed correctly", { expect_match2(scode, "lprior += normal_lpdf(b[1] | 0, 1);") bform <- bf(y ~ eta, nl = TRUE) + lf(eta ~ x, center = TRUE) - scode <- make_stancode(bform, data = dat) + scode <- stancode(bform, data = dat) expect_match2(scode, "nlp_eta += Intercept_eta + Xc_eta * b_eta;") }) @@ -2422,7 +2422,7 @@ test_that("to_vector() is correctly removed from prior of SD parameters", { prior(normal(0, 0.1), class = sd) , prior(normal(0, 0.01), class = sd, dpar = sigma) ) - scode <- make_stancode( + scode <- stancode( bform, data = dat, prior = bprior, @@ -2436,7 +2436,7 @@ test_that("Dirichlet priors can be flexibly included", { # tests issue #1165 dat <- data.frame(y = rnorm(10), x1 = rnorm(10), x2 = rnorm(10)) bprior <- prior("dirichlet([1,2]')", class = "b") - scode <- make_stancode(y ~ x1 + x2, dat, prior = bprior) + scode <- stancode(y ~ x1 + x2, dat, prior = bprior) expect_match2(scode, "simplex[Kc] b;") }) @@ -2468,7 +2468,7 @@ test_that("threaded Stan code is correct", { count ~ Trt*Age + mo(Exp) + s(Age) + offset(Age) + (1+Trt|visit), sigma ~ Trt + gp(Age) + gp(volume, by = Trt) ) - scode <- make_stancode(bform, dat, family = student(), threads = threads) + scode <- stancode(bform, dat, family = student(), threads = threads) expect_match2(scode, "real partial_log_lik_lpmf(array[] int seq, int start,") expect_match2(scode, "mu[n] += (bsp[1]) * mo(simo_1, Xmo_1[nn])") expect_match2(scode, "ptarget += student_t_lpdf(Y[start:end] | nu, mu, sigma);") @@ -2477,7 +2477,7 @@ test_that("threaded Stan code is correct", { expect_match2(scode, "sigma[start_at_one(Igp_sigma_2_2[which_gp_sigma_2_2], start)] +=") expect_match2(scode, "target += reduce_sum(partial_log_lik_lpmf, seq, grainsize, Y,") - scode <- make_stancode( + scode <- stancode( visit ~ cs(Trt) + Age, dat, family = sratio(), threads = threads, ) @@ -2486,7 +2486,7 @@ test_that("threaded Stan code is correct", { "ptarget += sratio_logit_lpmf(Y[nn] | mu[n], disc, Intercept") expect_match2(scode, " - transpose(mucs[n]));") - scode <- make_stancode( + scode <- stancode( bf(visit ~ a * Trt ^ b, a ~ mo(Exp), b ~ s(Age), nl = TRUE), data = dat, family = Gamma("log"), prior = set_prior("normal(0, 1)", nlpar = c("a", "b")), @@ -2496,18 +2496,18 @@ test_that("threaded Stan code is correct", { expect_match2(scode, "ptarget += gamma_lpdf(Y[start:end] | shape, shape ./ mu);") bform <- bf(mvbind(count, Exp) ~ Trt) + set_rescor(TRUE) - scode <- make_stancode(bform, dat, gaussian(), threads = threads) + scode <- stancode(bform, dat, gaussian(), threads = threads) expect_match2(scode, "ptarget += multi_normal_cholesky_lpdf(Y[start:end] | Mu, LSigma);") bform <- bf(brms::mvbind(count, Exp) ~ Trt) + set_rescor(FALSE) - scode <- make_stancode(bform, dat, gaussian(), threads = threads) + scode <- stancode(bform, dat, gaussian(), threads = threads) expect_match2(scode, "target += reduce_sum(partial_log_lik_count_lpmf, seq_count,") expect_match2(scode, "target += reduce_sum(partial_log_lik_Exp_lpmf, seq_Exp,") expect_match2(scode, "ptarget += normal_id_glm_lpdf(Y_Exp[start:end] | Xc_Exp[start:end], Intercept_Exp, b_Exp, sigma_Exp);" ) - scode <- make_stancode( + scode <- stancode( visit ~ Trt, dat, family = mixture(poisson(), nmix = 2), threads = threading(4, grainsize = 10, static = TRUE) ) @@ -2527,7 +2527,7 @@ test_that("Un-normalized Stan code is correct", { skip_if_not(found_cmdstan && cmdstan_version >= "2.29.0") options(brms.backend = "cmdstanr") - scode <- make_stancode( + scode <- stancode( count ~ zAge + zBase * Trt + (1|patient) + (1|obs), data = epilepsy, family = poisson(), prior = prior(student_t(5,0,10), class = b) + @@ -2540,7 +2540,7 @@ test_that("Un-normalized Stan code is correct", { expect_match2(scode, "lprior += cauchy_lupdf(sd_1 | 0, 2);") expect_match2(scode, "target += std_normal_lupdf(z_1[1]);") - scode <- make_stancode( + scode <- stancode( count ~ zAge + zBase * Trt + (1|patient) + (1|obs), data = epilepsy, family = poisson(), prior = prior(student_t(5,0,10), class = b) + @@ -2556,7 +2556,7 @@ test_that("Un-normalized Stan code is correct", { expect_match2(scode, "target += std_normal_lupdf(z_1[1]);") # Check that brms custom distributions stay normalized - scode <- make_stancode( + scode <- stancode( rating ~ period + carry + cs(treat), data = inhaler, family = sratio("cloglog"), normalize = FALSE @@ -2584,7 +2584,7 @@ test_that("Un-normalized Stan code is correct", { stanvars <- stanvar(scode = stan_funs, block = "functions") - scode <- make_stancode( + scode <- stancode( y | vint(size) + vreal(size) ~ x, data = dat, family = beta_binomial2, prior = prior(gamma(0.1, 0.1), class = "tau"), stanvars = stanvars, normalize = FALSE, backend = "cmdstanr" @@ -2605,7 +2605,7 @@ test_that("Un-normalized Stan code is correct", { # skip_if_not(found_cmdstan && cmdstan_version >= "2.29.0") # options(brms.backend = "cmdstanr") # -# scode <- make_stancode( +# scode <- stancode( # count ~ zAge + zBase * Trt + (1|patient) + (1|obs), # data = epilepsy, family = poisson(), # prior = prior(student_t(5,0,10), class = b) + diff --git a/tests/testthat/tests.make_standata.R b/tests/testthat/tests.make_standata.R index 81009dd0e..7ee8be056 100644 --- a/tests/testthat/tests.make_standata.R +++ b/tests/testthat/tests.make_standata.R @@ -1,192 +1,192 @@ -context("Tests for make_standata") +context("Tests for standata") -test_that(paste("make_standata returns correct data names ", +test_that(paste("standata returns correct data names ", "for fixed and random effects"), { - expect_equal(sort(names(make_standata(rating ~ treat + period + carry + expect_equal(sort(names(standata(rating ~ treat + period + carry + (1|subject), data = inhaler))), sort(c("N", "Y", "K", "Kc", "X", "Z_1_1", "J_1", "N_1", "M_1", "NC_1", "prior_only"))) - expect_equal(sort(names(make_standata(rating ~ treat + period + carry + expect_equal(sort(names(standata(rating ~ treat + period + carry + (1+treat|id|subject), data = inhaler, family = "categorical"))), sort(c("N", "Y", "ncat", "K_mu2", "Kc_mu2", "X_mu2", "Z_1_mu2_1", "Z_1_mu2_2", "K_mu3", "Kc_mu3", "X_mu3", "Z_1_mu3_3", "Z_1_mu3_4", "K_mu4", "Kc_mu4", "X_mu4", "Z_1_mu4_5", "Z_1_mu4_6", "J_1", "N_1", "M_1", "NC_1", "prior_only"))) - expect_equal(sort(names(make_standata(rating ~ treat + period + carry + expect_equal(sort(names(standata(rating ~ treat + period + carry + (1+treat|subject), data = inhaler))), sort(c("N", "Y", "K", "Kc", "X", "Z_1_1", "Z_1_2", "J_1", "N_1", "M_1", "NC_1", "prior_only"))) dat <- data.frame(y = 1:10, g = 1:10, h = 11:10, x = rep(0,10)) - expect_equal(sort(names(make_standata(y ~ 0 + Intercept + x + (1|g) + (1|h), + expect_equal(sort(names(standata(y ~ 0 + Intercept + x + (1|g) + (1|h), dat, "poisson"))), sort(c("N", "Y", "K", "X", "Z_1_1", "Z_2_1", "J_1", "J_2", "N_1", "M_1", "NC_1", "N_2", "M_2", "NC_2", "prior_only"))) expect_true(all(c("Z_1_1", "Z_1_2", "Z_2_1", "Z_2_2") %in% - names(make_standata(y ~ x + (1+x|g/h), dat)))) - expect_equal(make_standata(y ~ x + (1+x|g+h), dat), - make_standata(y ~ x + (1+x|g) + (1+x|h), dat)) + names(standata(y ~ x + (1+x|g/h), dat)))) + expect_equal(standata(y ~ x + (1+x|g+h), dat), + standata(y ~ x + (1+x|g) + (1+x|h), dat)) }) -test_that(paste("make_standata handles variables used as fixed effects", +test_that(paste("standata handles variables used as fixed effects", "and grouping factors at the same time"), { data <- data.frame(y = 1:9, x = factor(rep(c("a","b","c"), 3))) - standata <- make_standata(y ~ x + (1|x), data = data) + standata <- standata(y ~ x + (1|x), data = data) expect_equal(colnames(standata$X), c("Intercept", "xb", "xc")) expect_equal(standata$J_1, as.array(rep(1:3, 3))) - standata2 <- make_standata(y ~ x + (1|x), data = data, + standata2 <- standata(y ~ x + (1|x), data = data, control = list(not4stan = TRUE)) expect_equal(colnames(standata2$X), c("Intercept", "xb", "xc")) }) -test_that("make_standata returns correct data names for addition terms", { +test_that("standata returns correct data names for addition terms", { dat <- data.frame(y = 1:10, w = 1:10, t = 1:10, x = rep(0,10), c = sample(-1:1,10,TRUE)) - expect_equal(names(make_standata(y | se(w) ~ x, dat, gaussian())), + expect_equal(names(standata(y | se(w) ~ x, dat, gaussian())), c("N", "Y", "se", "K", "Kc", "X", "sigma", "prior_only")) - expect_equal(names(make_standata(y | weights(w) ~ x, dat, "gaussian")), + expect_equal(names(standata(y | weights(w) ~ x, dat, "gaussian")), c("N", "Y", "weights", "K", "Kc", "X", "prior_only")) - expect_equal(names(make_standata(y | cens(c) ~ x, dat, "student")), + expect_equal(names(standata(y | cens(c) ~ x, dat, "student")), c("N", "Y", "cens", "K", "Kc", "X", "prior_only")) - expect_equal(names(make_standata(y | trials(t) ~ x, dat, "binomial")), + expect_equal(names(standata(y | trials(t) ~ x, dat, "binomial")), c("N", "Y", "trials", "K", "Kc", "X", "prior_only")) - expect_equal(names(make_standata(y | trials(10) ~ x, dat, "binomial")), + expect_equal(names(standata(y | trials(10) ~ x, dat, "binomial")), c("N", "Y", "trials", "K", "Kc", "X", "prior_only")) - expect_equal(names(make_standata(y | thres(11) ~ x, dat, "acat")), + expect_equal(names(standata(y | thres(11) ~ x, dat, "acat")), c("N", "Y", "nthres", "K", "Kc", "X", "disc", "prior_only")) - expect_equal(names(make_standata(y | thres(10) ~ x, dat, cumulative())), + expect_equal(names(standata(y | thres(10) ~ x, dat, cumulative())), c("N", "Y", "nthres", "K", "Kc", "X", "disc", "prior_only")) - sdata <- make_standata(y | trunc(0,20) ~ x, dat, "gaussian") + sdata <- standata(y | trunc(0,20) ~ x, dat, "gaussian") expect_true(all(sdata$lb == 0) && all(sdata$ub == 20)) - sdata <- make_standata(y | trunc(ub = 21:30) ~ x, dat) + sdata <- standata(y | trunc(ub = 21:30) ~ x, dat) expect_true(all(all(sdata$ub == 21:30))) }) -test_that(paste("make_standata accepts correct response variables", +test_that(paste("standata accepts correct response variables", "depending on the family"), { - expect_equal(make_standata(y ~ 1, data = data.frame(y = seq(-9.9,0,0.1)), + expect_equal(standata(y ~ 1, data = data.frame(y = seq(-9.9,0,0.1)), family = "student")$Y, as.array(seq(-9.9,0,0.1))) - expect_equal(make_standata(y | trials(10) ~ 1, data = data.frame(y = 1:10), + expect_equal(standata(y | trials(10) ~ 1, data = data.frame(y = 1:10), family = "binomial")$Y, as.array(1:10)) - expect_equal(make_standata(y ~ 1, data = data.frame(y = 10:20), + expect_equal(standata(y ~ 1, data = data.frame(y = 10:20), family = "poisson")$Y, as.array(10:20)) - expect_equal(make_standata(y ~ 1, data = data.frame(y = rep(-c(1:2),5)), + expect_equal(standata(y ~ 1, data = data.frame(y = rep(-c(1:2),5)), family = "bernoulli")$Y, as.array(rep(1:0,5))) - expect_equal(make_standata(y ~ 1, data = data.frame(y = rep(c(TRUE, FALSE),5)), + expect_equal(standata(y ~ 1, data = data.frame(y = rep(c(TRUE, FALSE),5)), family = "bernoulli")$Y, as.array(rep(1:0,5))) - expect_equal(make_standata(y ~ 1, data = data.frame(y = rep(1,5)), + expect_equal(standata(y ~ 1, data = data.frame(y = rep(1,5)), family = "bernoulli")$Y, as.array(rep(1, 5))) - expect_equal(make_standata(y ~ 1, data = data.frame(y = rep(0,5)), + expect_equal(standata(y ~ 1, data = data.frame(y = rep(0,5)), family = "bernoulli")$Y, as.array(rep(0, 5))) - expect_equal(make_standata(y ~ 1, data = data.frame(y = rep(1:10,5)), + expect_equal(standata(y ~ 1, data = data.frame(y = rep(1:10,5)), family = "categorical")$Y, as.array(rep(1:10,5))) - expect_equal(make_standata(y ~ 1, data = data.frame(y = rep(11:20,5)), + expect_equal(standata(y ~ 1, data = data.frame(y = rep(11:20,5)), family = "categorical")$Y, as.array(rep(1:10,5))) - expect_equal(make_standata(y ~ 1, data = data.frame(y = factor(rep(11:20,5))), + expect_equal(standata(y ~ 1, data = data.frame(y = factor(rep(11:20,5))), family = "categorical")$Y, as.array(rep(1:10,5))) - expect_equal(make_standata(y ~ 1, data = data.frame(y = rep(1:10,5)), + expect_equal(standata(y ~ 1, data = data.frame(y = rep(1:10,5)), family = "cumulative")$Y, as.array(rep(1:10,5))) dat <- data.frame(y = factor(rep(-4:5,5), order = TRUE)) - expect_equal(make_standata(y ~ 1, data = dat, family = "acat")$Y, + expect_equal(standata(y ~ 1, data = dat, family = "acat")$Y, as.array(rep(1:10,5))) - expect_equal(make_standata(y ~ 1, data = data.frame(y = seq(1,10,0.1)), + expect_equal(standata(y ~ 1, data = data.frame(y = seq(1,10,0.1)), family = "exponential")$Y, as.array(seq(1,10,0.1))) dat <- data.frame(y1 = 1:10, y2 = 11:20, x = rep(0,10)) form <- bf(mvbind(y1, y2) ~ x) + set_rescor(TRUE) - sdata <- make_standata(form, data = dat) + sdata <- standata(form, data = dat) expect_equal(sdata$Y_y1, as.array(1:10)) expect_equal(sdata$Y_y2, as.array(11:20)) }) -test_that(paste("make_standata rejects incorrect response variables", +test_that(paste("standata rejects incorrect response variables", "depending on the family"), { - expect_error(make_standata(y ~ 1, data = data.frame(y = factor(1:10)), + expect_error(standata(y ~ 1, data = data.frame(y = factor(1:10)), family = "student"), "Family 'student' requires numeric responses") - expect_error(make_standata(y ~ 1, data = data.frame(y = -5:5), + expect_error(standata(y ~ 1, data = data.frame(y = -5:5), family = "geometric"), "Family 'geometric' requires response greater than or equal to 0") - expect_error(make_standata(y ~ 1, data = data.frame(y = -1:1), + expect_error(standata(y ~ 1, data = data.frame(y = -1:1), family = "bernoulli"), "contain only two different values") - expect_error(make_standata(y ~ 1, data = data.frame(y = factor(-1:1)), + expect_error(standata(y ~ 1, data = data.frame(y = factor(-1:1)), family = "cratio"), "Family 'cratio' requires either positive integers or ordered factors") - expect_error(make_standata(y ~ 1, data = data.frame(y = rep(0.5:7.5), 2), + expect_error(standata(y ~ 1, data = data.frame(y = rep(0.5:7.5), 2), family = "sratio"), "Family 'sratio' requires either positive integers or ordered factors") - expect_error(make_standata(y ~ 1, data = data.frame(y = rep(-7.5:7.5), 2), + expect_error(standata(y ~ 1, data = data.frame(y = rep(-7.5:7.5), 2), family = "gamma"), "Family 'gamma' requires response greater than 0") - expect_error(make_standata(y ~ 1, data = data.frame(y = c(0.1, 0.5, 1)), + expect_error(standata(y ~ 1, data = data.frame(y = c(0.1, 0.5, 1)), family = Beta()), "Family 'beta' requires response smaller than 1") - expect_error(make_standata(y ~ 1, data = data.frame(y = c(0, 0.5, 4)), + expect_error(standata(y ~ 1, data = data.frame(y = c(0, 0.5, 4)), family = von_mises()), "Family 'von_mises' requires response smaller than or equal to 3.14") - expect_error(make_standata(y ~ 1, data = data.frame(y = c(-1, 2, 5)), + expect_error(standata(y ~ 1, data = data.frame(y = c(-1, 2, 5)), family = hurdle_gamma()), "Family 'hurdle_gamma' requires response greater than or equal to 0") }) -test_that("make_standata suggests using family bernoulli if appropriate", { - expect_message(make_standata(y | trials(1) ~ 1, data = list(y = rep(0:1,5)), +test_that("standata suggests using family bernoulli if appropriate", { + expect_message(standata(y | trials(1) ~ 1, data = list(y = rep(0:1,5)), family = "binomial"), "family 'bernoulli' might be a more efficient choice.") - expect_message(make_standata(y ~ 1, data = data.frame(y = rep(1:2, 5)), + expect_message(standata(y ~ 1, data = data.frame(y = rep(1:2, 5)), family = "acat"), "family 'bernoulli' might be a more efficient choice.") - expect_message(make_standata(y ~ 1, data = data.frame(y = rep(0:1,5)), + expect_message(standata(y ~ 1, data = data.frame(y = rep(0:1,5)), family = "categorical"), "family 'bernoulli' might be a more efficient choice.") }) -test_that("make_standata returns correct values for addition terms", { +test_that("standata returns correct values for addition terms", { dat <- data.frame(y = rnorm(9), s = 1:9, w = 1:9, c1 = rep(-1:1, 3), c2 = rep(c("left","none","right"), 3), c3 = c(rep(c(TRUE, FALSE), 4), FALSE), c4 = c(sample(-1:1, 5, TRUE), rep(2, 4)), t = 11:19) - expect_equivalent(make_standata(y | se(s) ~ 1, data = dat)$se, + expect_equivalent(standata(y | se(s) ~ 1, data = dat)$se, as.array(1:9)) - expect_equal(make_standata(y | weights(w) ~ 1, data = dat)$weights, + expect_equal(standata(y | weights(w) ~ 1, data = dat)$weights, as.array(1:9)) - expect_equal(make_standata(y | cens(c1) ~ 1, data = dat)$cens, + expect_equal(standata(y | cens(c1) ~ 1, data = dat)$cens, as.array(rep(-1:1, 3))) - expect_equal(make_standata(y | cens(c2) ~ 1, data = dat)$cens, + expect_equal(standata(y | cens(c2) ~ 1, data = dat)$cens, as.array(rep(-1:1, 3))) - expect_equal(make_standata(y | cens(c3) ~ 1, data = dat)$cens, + expect_equal(standata(y | cens(c3) ~ 1, data = dat)$cens, as.array(c(rep(1:0, 4), 0))) - expect_equal(make_standata(y | cens(c4, y + 2) ~ 1, data = dat)$rcens, + expect_equal(standata(y | cens(c4, y + 2) ~ 1, data = dat)$rcens, as.array(c(rep(0, 5), dat$y[6:9] + 2))) - expect_equal(make_standata(s | trials(10) ~ 1, dat, + expect_equal(standata(s | trials(10) ~ 1, dat, family = "binomial")$trials, as.array(rep(10, 9))) - expect_equal(make_standata(s | trials(t) ~ 1, data = dat, + expect_equal(standata(s | trials(t) ~ 1, data = dat, family = "binomial")$trials, as.array(11:19)) - expect_equal(SW(make_standata(s | cat(19) ~ 1, data = dat, + expect_equal(SW(standata(s | cat(19) ~ 1, data = dat, family = "cumulative"))$nthres, 18) }) -test_that("make_standata rejects incorrect addition terms", { +test_that("standata rejects incorrect addition terms", { dat <- data.frame(y = rnorm(9), s = -(1:9), w = -(1:9), c = rep(-2:0, 3), t = 9:1, z = 1:9) - expect_error(make_standata(y | se(s) ~ 1, data = dat), + expect_error(standata(y | se(s) ~ 1, data = dat), "Standard errors must be non-negative") - expect_error(make_standata(y | weights(w) ~ 1, data = dat), + expect_error(standata(y | weights(w) ~ 1, data = dat), "Weights must be non-negative") - expect_error(make_standata(y | cens(c) ~ 1, data = dat)) - expect_error(make_standata(z | trials(t) ~ 1, data = dat, + expect_error(standata(y | cens(c) ~ 1, data = dat)) + expect_error(standata(z | trials(t) ~ 1, data = dat, family = "binomial"), "Number of trials is smaller than the number of events") }) -test_that("make_standata handles multivariate models", { +test_that("standata handles multivariate models", { dat <- data.frame( y1 = 1:10, y2 = 11:20, x = rep(0, 10), g = rep(1:2, 5), @@ -195,21 +195,21 @@ test_that("make_standata handles multivariate models", { ) form <- bf(mvbind(y1, y2) | weights(w) ~ x) + set_rescor(TRUE) - sdata <- make_standata(form, data = dat) + sdata <- standata(form, data = dat) expect_equal(sdata$Y_y1, as.array(dat$y1)) expect_equal(sdata$Y_y2, as.array(dat$y2)) expect_equal(sdata$weights_y1, as.array(1:10)) - expect_error(make_standata(bf(mvbind(y1, y2, y2) ~ x) + set_resor(FALSE), + expect_error(standata(bf(mvbind(y1, y2, y2) ~ x) + set_resor(FALSE), data = dat), "Cannot use the same response variable twice") form <- bf(mvbind(y1 / y2, y2, y1 * 3) ~ x) + set_rescor(FALSE) - sdata <- make_standata(form, data = dat) + sdata <- standata(form, data = dat) expect_equal(sdata$Y_y1y2, as.array(dat$y1 / dat$y2)) sdata <- suppressWarnings( - make_standata(mvbind(y1, y2) ~ x, dat, autocor = cor_ar(~ tim | g)) + standata(mvbind(y1, y2) ~ x, dat, autocor = cor_ar(~ tim | g)) ) target1 <- c(seq(9, 1, -2), seq(10, 2, -2)) expect_equal(sdata$Y_y1, as.array(target1)) @@ -227,7 +227,7 @@ test_that("make_standata handles multivariate models", { bprior <- prior(normal(0, 5), resp = y1) + prior(normal(0, 10), resp = y2) + prior(dirichlet(2, 1), theta, resp = x) - sdata <- make_standata(bform, dat, prior = bprior) + sdata <- standata(bform, dat, prior = bprior) sdata_names <- c( "N", "J_1_y1", "cens_y1", "Kma_y1", "Z_1_y2_3", "Zs_y2_1_1", "Y_y2", "con_theta_x", "X_mu2_x" @@ -236,13 +236,13 @@ test_that("make_standata handles multivariate models", { expect_equal(sdata$con_theta_x, as.array(c(2, 1))) }) -test_that("make_standata removes NAs correctly", { +test_that("standata removes NAs correctly", { dat <- data.frame(y = c(rnorm(9), NA)) - sdata <- suppressWarnings(make_standata(y ~ 1, dat)) + sdata <- suppressWarnings(standata(y ~ 1, dat)) expect_equal(as.numeric(sdata$Y), dat$y[1:9]) }) -test_that("make_standata handles the 'subset' addition argument correctly", { +test_that("standata handles the 'subset' addition argument correctly", { dat1 <- data.frame( y1 = rnorm(15), y2 = NA, x1 = rnorm(15), x2 = NA, x3 = rnorm(15), @@ -260,7 +260,7 @@ test_that("make_standata handles the 'subset' addition argument correctly", { bf(y2 | subset(sub2) ~ x2, family = gaussian()) + set_rescor(FALSE) - sdata <- make_standata(bform, dat) + sdata <- standata(bform, dat) nsub1 <- sum(dat$sub1) nsub2 <- sum(dat$sub2) expect_equal(sdata$N_y1, nsub1) @@ -269,95 +269,95 @@ test_that("make_standata handles the 'subset' addition argument correctly", { expect_equal(nrow(sdata$X_y2), nsub2) }) -test_that("make_standata returns correct data for ARMA terms", { +test_that("standata returns correct data for ARMA terms", { dat <- data.frame(y = 1:10, x = rep(0, 10), tim = 10:1, g = rep(3:4, 5)) - sdata <- make_standata(y ~ x + ma(tim, g), data = dat) + sdata <- standata(y ~ x + ma(tim, g), data = dat) expect_equal(sdata$J_lag, as.array(c(1, 1, 1, 1, 0, 1, 1, 1, 1, 0))) - sdata <- make_standata(y ~ x + ar(tim, g, p = 2), data = dat) + sdata <- standata(y ~ x + ar(tim, g, p = 2), data = dat) expect_equal(sdata$J_lag, as.array(c(1, 2, 2, 2, 0, 1, 2, 2, 2, 0))) - sdata <- make_standata(y ~ x + ar(tim, g, cov = TRUE), data = dat) + sdata <- standata(y ~ x + ar(tim, g, cov = TRUE), data = dat) expect_equal(sdata$begin_tg, as.array(c(1, 6))) expect_equal(sdata$nobs_tg, as.array(c(5, 5))) - sdata <- make_standata(y ~ x + ar(tim), data = dat, family = poisson(), + sdata <- standata(y ~ x + ar(tim), data = dat, family = poisson(), prior = prior(horseshoe(), class = sderr)) expect_equal(sdata$Kscales, 1) bform <- bf(y ~ exp(b * x), b ~ 1, nl = TRUE, autocor = ~arma()) - sdata <- make_standata(bform, dat) + sdata <- standata(bform, dat) }) -test_that("make_standata returns correct data for UNSTR covariance terms", { +test_that("standata returns correct data for UNSTR covariance terms", { dat <- data.frame(y = 1:12, x = rnorm(12), tim = c(5:1, 1:5, c(0, 4)), g = c(rep(3:4, 5), rep(2, 2))) - sdata <- make_standata(y ~ x + unstr(tim, g), data = dat) + sdata <- standata(y ~ x + unstr(tim, g), data = dat) expect_equal(sdata$n_unique_t, 6) expect_equal(sdata$n_unique_cortime, 15) Jtime <- rbind(c(1, 5, 0, 0, 0), 2:6, 2:6) expect_equal(sdata$Jtime_tg, Jtime) }) -test_that("make_standata allows to retrieve the initial data order", { +test_that("standata allows to retrieve the initial data order", { dat <- data.frame(y1 = rnorm(100), y2 = rnorm(100), id = sample(1:10, 100, TRUE), time = sample(1:100, 100)) # univariate model - sdata1 <- make_standata(y1 ~ ar(time, id), data = dat, internal = TRUE) + sdata1 <- standata(y1 ~ ar(time, id), data = dat, internal = TRUE) expect_equal(dat$y1, as.numeric(sdata1$Y[attr(sdata1, "old_order")])) # multivariate model form <- bf(mvbind(y1, y2) ~ ma(time, id)) + set_rescor(FALSE) - sdata2 <- make_standata(form, data = dat, internal = TRUE) + sdata2 <- standata(form, data = dat, internal = TRUE) expect_equal(sdata2$Y_y1[attr(sdata2, "old_order")], as.array(dat$y1)) expect_equal(sdata2$Y_y2[attr(sdata2, "old_order")], as.array(dat$y2)) }) -test_that("make_standata handles covariance matrices correctly", { +test_that("standata handles covariance matrices correctly", { A <- structure(diag(1, 4), dimnames = list(1:4, NULL)) - sdata <- make_standata(count ~ Trt + (1|gr(visit, cov = A)), + sdata <- standata(count ~ Trt + (1|gr(visit, cov = A)), data = epilepsy, data2 = list(A = A)) expect_equivalent(sdata$Lcov_1, t(chol(A))) B <- structure(diag(1:5), dimnames = list(c(1,5,2,4,3), NULL)) - sdata <- make_standata(count ~ Trt + (1|gr(visit, cov = B)), + sdata <- standata(count ~ Trt + (1|gr(visit, cov = B)), data = epilepsy, data2 = list(B = B)) expect_equivalent(sdata$Lcov_1, t(chol(B[c(1,3,5,4), c(1,3,5,4)]))) B <- diag(1, 4) - expect_error(make_standata(count ~ Trt + (1|gr(visit, cov = B)), + expect_error(standata(count ~ Trt + (1|gr(visit, cov = B)), data = epilepsy, data2 = list(B = B)), "Row or column names are required") B <- structure(diag(1, 4), dimnames = list(2:5, NULL)) - expect_error(make_standata(count ~ Trt + (1|gr(visit, cov = B)), + expect_error(standata(count ~ Trt + (1|gr(visit, cov = B)), data = epilepsy, data2 = list(B = B)), "Levels of .* do not match") B <- A B[1,2] <- 0.5 - expect_error(make_standata(count ~ Trt + (1|gr(visit, cov = B)), + expect_error(standata(count ~ Trt + (1|gr(visit, cov = B)), data = epilepsy, data2 = list(B = B)), "must be symmetric") expect_warning( - sdata <- make_standata(count ~ Trt + (1|visit), data = epilepsy, + sdata <- standata(count ~ Trt + (1|visit), data = epilepsy, cov_ranef = list(visit = A)), "Argument 'cov_ranef' is deprecated" ) expect_equivalent(sdata$Lcov_1, t(chol(A))) }) -test_that("make_standata correctly prepares data for non-linear models", { +test_that("standata correctly prepares data for non-linear models", { flist <- list(a ~ x + (1|1|g), b ~ mo(z) + (1|1|g)) dat <- data.frame( y = rnorm(9), x = rnorm(9), z = sample(1:9, 9), g = rep(1:3, 3) ) bform <- bf(y ~ a - b^z, flist = flist, nl = TRUE) - sdata <- make_standata(bform, data = dat) + sdata <- standata(bform, data = dat) expect_equal(names(sdata), c("N", "Y", "C_1", "K_a", "X_a", "Z_1_a_1", "K_b", "X_b", "Ksp_b", "Imo_b", "Xmo_b_1", "Jmo_b", @@ -371,17 +371,17 @@ test_that("make_standata correctly prepares data for non-linear models", { nlf(sigma ~ a1 * exp(-x/(a2 + z))) + lf(a1 ~ 1, a2 ~ z + (x|g)) + lf(alpha ~ x) - sdata <- make_standata(bform, dat, family = skew_normal()) + sdata <- standata(bform, dat, family = skew_normal()) sdata_names <- c("C_sigma_1", "X_a2", "Z_1_a2_1") expect_true(all(sdata_names %in% names(sdata))) }) -test_that("make_standata correctly prepares data for monotonic effects", { +test_that("standata correctly prepares data for monotonic effects", { data <- data.frame( y = rpois(120, 10), x1 = rep(1:4, 30), z = rnorm(10), x2 = factor(rep(c("a", "b", "c"), 40), ordered = TRUE) ) - sdata <- make_standata(y ~ mo(x1)*mo(x2)*y, data = data) + sdata <- standata(y ~ mo(x1)*mo(x2)*y, data = data) sdata_names <- c("Xmo_1", "Imo", "Jmo", "con_simo_8", "con_simo_5") expect_true(all(sdata_names %in% names(sdata))) expect_equivalent(sdata$Xmo_1, as.array(data$x1 - 1)) @@ -394,7 +394,7 @@ test_that("make_standata correctly prepares data for monotonic effects", { prior <- set_prior("dirichlet(1:3)", coef = "mox11", class = "simo", dpar = "sigma") - sdata <- make_standata(bf(y ~ 1, sigma ~ mo(x1)), + sdata <- standata(bf(y ~ 1, sigma ~ mo(x1)), data = data, prior = prior) expect_equal(sdata$con_simo_sigma_1, as.array(1:3)) @@ -403,147 +403,147 @@ test_that("make_standata correctly prepares data for monotonic effects", { set_prior("dirichlet(c(1, 0.5, 2))", class = "simo", coef = "mox11"), prior_(~dirichlet(c(1, 0.5, 2)), class = "simo", coef = "mox1:mox21") ) - sdata <- make_standata(y ~ mo(x1)*mo(x2), data = data, prior = prior) + sdata <- standata(y ~ mo(x1)*mo(x2), data = data, prior = prior) expect_equal(sdata$con_simo_1, as.array(c(1, 0.5, 2))) expect_equal(sdata$con_simo_3, as.array(c(1, 0.5, 2))) # test issue #924 (conditional monotonicity) prior <- c(prior(dirichlet(c(1, 0.5, 2)), simo, coef = "v"), prior(dirichlet(c(1,3)), simo, coef = "w")) - sdata <- make_standata(y ~ y*mo(x1, id = "v")*mo(x2, id = "w"), + sdata <- standata(y ~ y*mo(x1, id = "v")*mo(x2, id = "w"), data, prior = prior) expect_equal(sdata$con_simo_1, as.array(c(1, 0.5, 2))) expect_equal(sdata$con_simo_2, as.array(c(1, 3))) expect_true(!"sdata$con_simo_3" %in% names(sdata)) expect_error( - make_standata(y ~ mo(z), data = data), + standata(y ~ mo(z), data = data), "Monotonic predictors must be integers or ordered factors" ) prior <- c(set_prior("dirichlet(c(1,0.5,2))", class = "simo", coef = "mox21")) expect_error( - make_standata(y ~ mo(x2), data = data, prior = prior), + standata(y ~ mo(x2), data = data, prior = prior), "Invalid Dirichlet prior" ) }) -test_that("make_standata returns FCOR covariance matrices", { +test_that("standata returns FCOR covariance matrices", { data <- data.frame(y = 1:5) data2 <- list(V = diag(5)) - expect_equal(make_standata(y ~ fcor(V), data, data2 = data2)$Mfcor, + expect_equal(standata(y ~ fcor(V), data, data2 = data2)$Mfcor, data2$V, check.attributes = FALSE) expect_warning( expect_error( - make_standata(y~1, data, autocor = cor_fixed(diag(2))), + standata(y~1, data, autocor = cor_fixed(diag(2))), "Dimensions of 'M' for FCOR terms must be equal" ), "Using 'cor_brms' objects for 'autocor' is deprecated" ) }) -test_that("make_standata returns data for GAMMs", { +test_that("standata returns data for GAMMs", { dat <- data.frame(y = rnorm(10), x1 = rnorm(10), x2 = rnorm(10), x3 = rnorm(10), z = rnorm(10), g = factor(rep(1:2, 5))) - sdata <- make_standata(y ~ s(x1) + z + s(x2, by = x3), data = dat) + sdata <- standata(y ~ s(x1) + z + s(x2, by = x3), data = dat) expect_equal(sdata$nb_1, 1) expect_equal(as.vector(sdata$knots_2), 8) expect_equal(dim(sdata$Zs_1_1), c(10, 8)) expect_equal(dim(sdata$Zs_2_1), c(10, 8)) bform <- bf(y ~ lp, lp ~ s(x1) + z + s(x2, by = x3), nl = TRUE) - sdata <- make_standata(bform, dat) + sdata <- standata(bform, dat) expect_equal(sdata$nb_lp_1, 1) expect_equal(as.vector(sdata$knots_lp_2), 8) expect_equal(dim(sdata$Zs_lp_1_1), c(10, 8)) expect_equal(dim(sdata$Zs_lp_2_1), c(10, 8)) - sdata <- make_standata(y ~ g + s(x2, by = g), data = dat) + sdata <- standata(y ~ g + s(x2, by = g), data = dat) expect_true(all(c("knots_1", "knots_2") %in% names(sdata))) # test issue #562 dat$g <- as.character(dat$g) - sdata <- make_standata(y ~ g + s(x2, by = g), data = dat) + sdata <- standata(y ~ g + s(x2, by = g), data = dat) expect_true(all(c("knots_1", "knots_2") %in% names(sdata))) - sdata <- make_standata(y ~ t2(x1, x2), data = dat) + sdata <- standata(y ~ t2(x1, x2), data = dat) expect_equal(sdata$nb_1, 3) expect_equal(as.vector(sdata$knots_1), c(9, 6, 6)) expect_equal(dim(sdata$Zs_1_1), c(10, 9)) expect_equal(dim(sdata$Zs_1_3), c(10, 6)) - expect_error(make_standata(y ~ te(x1, x2), data = dat), + expect_error(standata(y ~ te(x1, x2), data = dat), "smooths 'te' and 'ti' are not yet implemented") }) -test_that("make_standata returns correct group ID data", { +test_that("standata returns correct group ID data", { form <- bf(count ~ Trt + (1+Trt|3|visit) + (1|patient), shape ~ (1|3|visit) + (Trt||patient)) - sdata <- make_standata(form, data = epilepsy, family = negbinomial()) + sdata <- standata(form, data = epilepsy, family = negbinomial()) expect_true(all(c("Z_1_1", "Z_2_2", "Z_3_shape_1", "Z_2_shape_3") %in% names(sdata))) form <- bf(count ~ a, sigma ~ (1|3|visit) + (Trt||patient), a ~ Trt + (1+Trt|3|visit) + (1|patient), nl = TRUE) - sdata <- make_standata(form, data = epilepsy, family = student()) + sdata <- standata(form, data = epilepsy, family = student()) expect_true(all(c("Z_1_sigma_1", "Z_2_a_3", "Z_2_sigma_1", "Z_3_a_1") %in% names(sdata))) }) -test_that("make_standata handles population-level intercepts", { +test_that("standata handles population-level intercepts", { dat <- data.frame(y = 10:1, x = 1:10) - sdata <- make_standata(y ~ 0 + x, data = dat) + sdata <- standata(y ~ 0 + x, data = dat) expect_equal(unname(sdata$X[, 1]), dat$x) - sdata <- make_standata(y ~ x, dat, cumulative(), + sdata <- standata(y ~ x, dat, cumulative(), control = list(not4stan = TRUE)) expect_equal(unname(sdata$X[, 1]), dat$x) - sdata <- make_standata(y ~ 0 + Intercept + x, data = dat) + sdata <- standata(y ~ 0 + Intercept + x, data = dat) expect_equal(unname(sdata$X), cbind(1, dat$x)) }) -test_that("make_standata handles category specific effects", { - sdata <- make_standata(rating ~ period + carry + cse(treat), +test_that("standata handles category specific effects", { + sdata <- standata(rating ~ period + carry + cse(treat), data = inhaler, family = sratio()) expect_equivalent(sdata$Xcs, matrix(inhaler$treat)) - sdata <- make_standata(rating ~ period + carry + cs(treat) + (cs(1)|subject), + sdata <- standata(rating ~ period + carry + cs(treat) + (cs(1)|subject), data = inhaler, family = acat()) expect_equivalent(sdata$Z_1_3, as.array(rep(1, nrow(inhaler)))) - sdata <- make_standata(rating ~ period + carry + (cs(treat)|subject), + sdata <- standata(rating ~ period + carry + (cs(treat)|subject), data = inhaler, family = cratio()) expect_equivalent(sdata$Z_1_4, as.array(inhaler$treat)) expect_warning( - make_standata(rating ~ 1 + cs(treat), data = inhaler, + standata(rating ~ 1 + cs(treat), data = inhaler, family = "cumulative"), "Category specific effects for this family should be considered experimental" ) - expect_error(make_standata(rating ~ 1 + (treat + cs(1)|subject), + expect_error(standata(rating ~ 1 + (treat + cs(1)|subject), data = inhaler, family = "cratio"), "category specific effects in separate group-level terms") }) -test_that("make_standata handles wiener diffusion models", { +test_that("standata handles wiener diffusion models", { dat <- data.frame(q = 1:10, resp = sample(0:1, 10, TRUE), x = rnorm(10)) dat$dec <- ifelse(dat$resp == 0, "lower", "upper") dat$test <- "a" - sdata <- make_standata(q | dec(resp) ~ x, data = dat, family = wiener()) + sdata <- standata(q | dec(resp) ~ x, data = dat, family = wiener()) expect_equal(sdata$dec, as.array(dat$resp)) - sdata <- make_standata(q | dec(dec) ~ x, data = dat, family = wiener()) + sdata <- standata(q | dec(dec) ~ x, data = dat, family = wiener()) expect_equal(sdata$dec, as.array(dat$resp)) - expect_error(make_standata(q | dec(test) ~ x, data = dat, family = wiener()), + expect_error(standata(q | dec(test) ~ x, data = dat, family = wiener()), "Decisions should be 'lower' or 'upper'") }) -test_that("make_standata handles noise-free terms", { +test_that("standata handles noise-free terms", { N <- 30 dat <- data.frame( y = rnorm(N), x = rnorm(N), z = rnorm(N), xsd = abs(rnorm(N, 1)), zsd = abs(rnorm(N, 1)), ID = rep(1:5, each = N / 5) ) - sdata <- make_standata( + sdata <- standata( bf(y ~ me(x, xsd)*me(z, zsd)*x, sigma ~ me(x, xsd)), data = dat ) @@ -554,59 +554,59 @@ test_that("make_standata handles noise-free terms", { expect_equal(sdata$NCme_1, 1) }) -test_that("make_standata handles noise-free terms with grouping factors", { +test_that("standata handles noise-free terms with grouping factors", { dat <- data.frame( y = rnorm(10), x1 = rep(1:5, each = 2), sdx = rep(1:5, each = 2), g = rep(c("b", "c", "a", "d", 1), each = 2) ) - sdata <- make_standata(y ~ me(x1, sdx, gr = g), dat) + sdata <- standata(y ~ me(x1, sdx, gr = g), dat) expect_equal(unname(sdata$Xn_1), as.array(c(5, 3, 1, 2, 4))) expect_equal(unname(sdata$noise_1), as.array(c(5, 3, 1, 2, 4))) dat$sdx[2] <- 10 expect_error( - make_standata(y ~ me(x1, sdx, gr = g), dat), + standata(y ~ me(x1, sdx, gr = g), dat), "Measured values and measurement error should be unique" ) }) -test_that("make_standata handles missing value terms", { +test_that("standata handles missing value terms", { dat = data.frame(y = rnorm(10), x = rnorm(10), g = 1:10) miss <- c(1, 3, 9) dat$x[miss] <- NA bform <- bf(y ~ mi(x)*g) + bf(x | mi() ~ g) + set_rescor(FALSE) - sdata <- make_standata(bform, dat) + sdata <- standata(bform, dat) expect_equal(sdata$Jmi_x, as.array(miss)) expect_true(all(is.infinite(sdata$Y_x[miss]))) # dots in variable names are correctly handled #452 dat$x.2 <- dat$x bform <- bf(y ~ mi(x.2)*g) + bf(x.2 | mi() ~ g) + set_rescor(FALSE) - sdata <- make_standata(bform, dat) + sdata <- standata(bform, dat) expect_equal(sdata$Jmi_x, as.array(miss)) dat$z <- rbeta(10, 1, 1) dat$z[miss] <- NA bform <- bf(exp(y) ~ mi(z)*g) + bf(z | mi() ~ g, family = Beta()) + set_rescor(FALSE) - sdata <- make_standata(bform, dat) + sdata <- standata(bform, dat) expect_equal(sdata$Jmi_z, as.array(miss)) }) -test_that("make_standata handles overimputation", { +test_that("standata handles overimputation", { dat = data.frame(y = rnorm(10), x = rnorm(10), g = 1:10, sdy = 1) miss <- c(1, 3, 9) dat$x[miss] <- dat$sdy[miss] <- NA bform <- bf(y ~ mi(x)*g) + bf(x | mi(sdy) ~ g) + set_rescor(FALSE) - sdata <- make_standata(bform, dat) + sdata <- standata(bform, dat) expect_equal(sdata$Jme_x, as.array(setdiff(1:10, miss))) expect_true(all(is.infinite(sdata$Y_x[miss]))) expect_true(all(is.infinite(sdata$noise_x[miss]))) }) -test_that("make_standata handles 'mi' terms with 'subset'", { +test_that("standata handles 'mi' terms with 'subset'", { dat <- data.frame( y = rnorm(10), x = c(rnorm(9), NA), z = rnorm(10), g1 = sample(1:5, 10, TRUE), g2 = 10:1, g3 = 1:10, @@ -616,7 +616,7 @@ test_that("make_standata handles 'mi' terms with 'subset'", { bform <- bf(y ~ mi(x, idx = g1)) + bf(x | mi() + index(g2) + subset(s) ~ 1) + set_rescor(FALSE) - sdata <- make_standata(bform, dat) + sdata <- standata(bform, dat) expect_true(all(sdata$idxl_y_x_1 %in% 9:5)) # test a bunch of errors @@ -624,21 +624,21 @@ test_that("make_standata handles 'mi' terms with 'subset'", { # bform <- bf(y ~ mi(x, idx = g1)) + # bf(x | mi() + index(g3) + subset(s) ~ 1) + # set_rescor(FALSE) - # expect_error(make_standata(bform, dat), + # expect_error(standata(bform, dat), # "Could not match all indices in response 'x'" # ) bform <- bf(y ~ mi(x, idx = g1)) + bf(x | mi() + subset(s) ~ 1) + set_rescor(FALSE) - expect_error(make_standata(bform, dat), + expect_error(standata(bform, dat), "Response 'x' needs to have an 'index' addition term" ) bform <- bf(y ~ mi(x)) + bf(x | mi() + subset(s) + index(g2) ~ 1) + set_rescor(FALSE) - expect_error(make_standata(bform, dat), + expect_error(standata(bform, dat), "mi() terms of subsetted variables require the 'idx' argument", fixed = TRUE ) @@ -646,17 +646,17 @@ test_that("make_standata handles 'mi' terms with 'subset'", { bform <- bf(y | mi() ~ mi(x, idx = g1)) + bf(x | mi() + subset(s) + index(g2) ~ mi(y)) + set_rescor(FALSE) - expect_error(make_standata(bform, dat), + expect_error(standata(bform, dat), "mi() terms in subsetted formulas require the 'idx' argument", fixed = TRUE ) }) -test_that("make_standata handles multi-membership models", { +test_that("standata handles multi-membership models", { dat <- data.frame(y = rnorm(10), g1 = c(7:2, rep(10, 4)), g2 = 1:10, w1 = rep(1, 10), w2 = rep(abs(rnorm(10)))) - sdata <- make_standata(y ~ (1|mm(g1,g2,g1,g2)), data = dat) + sdata <- standata(y ~ (1|mm(g1,g2,g1,g2)), data = dat) expect_true(all(paste0(c("W_1_", "J_1_"), 1:4) %in% names(sdata))) expect_equal(sdata$W_1_4, as.array(rep(0.25, 10))) expect_equal(unname(sdata$Z_1_1_1), as.array(rep(1, 10))) @@ -665,25 +665,25 @@ test_that("make_standata handles multi-membership models", { expect_equal(sdata$J_1_1, as.array(c(6, 5, 4, 3, 2, 1, 7, 7, 7, 7))) expect_equal(sdata$J_1_2, as.array(c(8, 1, 2, 3, 4, 5, 6, 9, 10, 7))) - sdata <- make_standata(y ~ (1|mm(g1,g2, weights = cbind(w1, w2))), dat) + sdata <- standata(y ~ (1|mm(g1,g2, weights = cbind(w1, w2))), dat) expect_equal(sdata$W_1_1, as.array(dat$w1 / (dat$w1 + dat$w2))) # tests mmc terms - sdata <- make_standata(y ~ (1+mmc(w1, w2)|mm(g1,g2)), data = dat) + sdata <- standata(y ~ (1+mmc(w1, w2)|mm(g1,g2)), data = dat) expect_equal(unname(sdata$Z_1_2_1), as.array(dat$w1)) expect_equal(unname(sdata$Z_1_2_2), as.array(dat$w2)) expect_error( - make_standata(y ~ (mmc(w1, w2, y)|mm(g1,g2)), data = dat), + standata(y ~ (mmc(w1, w2, y)|mm(g1,g2)), data = dat), "Invalid term 'mmc(w1, w2, y)':", fixed = TRUE ) expect_error( - make_standata(y ~ (mmc(w1, w2)*y|mm(g1,g2)), data = dat), + standata(y ~ (mmc(w1, w2)*y|mm(g1,g2)), data = dat), "The term 'mmc(w1, w2):y' is invalid", fixed = TRUE ) # tests if ":" works in multi-membership models - sdata <- make_standata(y ~ (1|mm(w1:g1,w1:g2)), dat) + sdata <- standata(y ~ (1|mm(w1:g1,w1:g2)), dat) expect_true(all(c("J_1_1", "J_1_2") %in% names(sdata))) }) @@ -701,29 +701,29 @@ test_that("by variables in grouping terms are handled correctly", { z2 = byvar[g_order], z3 = factor(1:2) ) - sdata <- make_standata(y ~ x + (x | gr(g, by = z)), dat) + sdata <- standata(y ~ x + (x | gr(g, by = z)), dat) expect_equal(sdata$Nby_1, 5) expect_equal(sdata$Jby_1, as.array(c(2, 2, 1, 1, 5, 4, 4, 5, 3, 3))) - sdata <- make_standata(y ~ x + (x | mm(g, g2, by = cbind(z, z2))), dat) + sdata <- standata(y ~ x + (x | mm(g, g2, by = cbind(z, z2))), dat) expect_equal(sdata$Nby_1, 5) expect_equal(sdata$Jby_1, as.array(c(2, 2, 1, 1, 5, 4, 4, 5, 3, 3))) - expect_error(make_standata(y ~ x + (1|gr(g, by = z3)), dat), + expect_error(standata(y ~ x + (1|gr(g, by = z3)), dat), "Some levels of 'g' correspond to multiple levels of 'z3'") }) -test_that("make_standata handles calls to the 'poly' function", { +test_that("standata handles calls to the 'poly' function", { dat <- data.frame(y = rnorm(10), x = rnorm(10)) - expect_equal(colnames(make_standata(y ~ 1 + poly(x, 3), dat)$X), + expect_equal(colnames(standata(y ~ 1 + poly(x, 3), dat)$X), c("Intercept", "polyx31", "polyx32", "polyx33")) }) -test_that("make_standata allows fixed distributional parameters", { +test_that("standata allows fixed distributional parameters", { dat <- list(y = 1:10) - expect_equal(make_standata(bf(y ~ 1, nu = 3), dat, student())$nu, 3) - expect_equal(make_standata(y ~ 1, dat, acat())$disc, 1) - expect_error(make_standata(bf(y ~ 1, bias = 0.5), dat), + expect_equal(standata(bf(y ~ 1, nu = 3), dat, student())$nu, 3) + expect_equal(standata(y ~ 1, dat, acat())$disc, 1) + expect_error(standata(bf(y ~ 1, bias = 0.5), dat), "Invalid fixed parameters: 'bias'") }) @@ -733,93 +733,93 @@ test_that("Cell-mean coding can be disabled", { lf(disc ~ 0 + g + (0 + g | y), cmc = FALSE) + cumulative() - sdata <- make_standata(bform, df) + sdata <- standata(bform, df) target <- matrix(rep(0:1, 5), dimnames = list(1:10, "gb")) expect_equal(sdata$X_disc, target) expect_equal(unname(sdata$Z_1_disc_1), as.array(rep(0:1, 5))) expect_true(!"Z_1_disc_2" %in% names(sdata)) bform <- bf(y ~ 0 + g + (1 | y), cmc = FALSE) - sdata <- make_standata(bform, df) + sdata <- standata(bform, df) expect_equal(sdata$X, target) expect_equal(unname(sdata$Z_1_1), as.array(rep(1, 10))) }) -test_that("make_standata correctly includes offsets", { +test_that("standata correctly includes offsets", { data <- data.frame(y = rnorm(10), x = rnorm(10), c = 1) - sdata <- make_standata(bf(y ~ x + offset(c), sigma ~ offset(c + 1)), data) + sdata <- standata(bf(y ~ x + offset(c), sigma ~ offset(c + 1)), data) expect_equal(sdata$offsets, as.array(data$c)) expect_equal(sdata$offsets_sigma, as.array(data$c + 1)) - sdata <- make_standata(y ~ x + offset(c) + offset(x), data) + sdata <- standata(y ~ x + offset(c) + offset(x), data) expect_equal(sdata$offsets, as.array(data$c + data$x)) }) -test_that("make_standata includes data for mixture models", { +test_that("standata includes data for mixture models", { data <- data.frame(y = rnorm(10), x = rnorm(10), c = 1) form <- bf(y ~ x, mu1 ~ 1, family = mixture(gaussian, gaussian)) - sdata <- make_standata(form, data) + sdata <- standata(form, data) expect_equal(sdata$con_theta, as.array(c(1, 1))) expect_equal(dim(sdata$X_mu1), c(10, 1)) expect_equal(dim(sdata$X_mu2), c(10, 2)) form <- bf(y ~ x, family = mixture(gaussian, gaussian)) - sdata <- make_standata(form, data, prior = prior(dirichlet(10, 2), theta)) + sdata <- standata(form, data, prior = prior(dirichlet(10, 2), theta)) expect_equal(sdata$con_theta, as.array(c(10, 2))) form <- bf(y ~ x, theta1 = 1, theta2 = 3, family = mixture(gaussian, gaussian)) - sdata <- make_standata(form, data) + sdata <- standata(form, data) expect_equal(sdata$theta1, 1/4) expect_equal(sdata$theta2, 3/4) }) -test_that("make_standata includes data for Gaussian processes", { +test_that("standata includes data for Gaussian processes", { dat <- data.frame(y = rnorm(10), x1 = rnorm(10), z = factor(c(2, 2, 2, 3, 4, rep(5, 5)))) - sdata <- make_standata(y ~ gp(x1), dat) + sdata <- standata(y ~ gp(x1), dat) expect_equal(max(sdata$Xgp_1) - min(sdata$Xgp_1), 1) - sdata <- make_standata(y ~ gp(x1, scale = FALSE), dat) + sdata <- standata(y ~ gp(x1, scale = FALSE), dat) expect_equal(max(sdata$Xgp_1) - min(sdata$Xgp_1), max(dat$x1) - min(dat$x1)) - sdata <- SW(make_standata(y ~ gp(x1, by = z, gr = TRUE, scale = FALSE), dat)) + sdata <- SW(standata(y ~ gp(x1, by = z, gr = TRUE, scale = FALSE), dat)) expect_equal(sdata$Igp_1_2, as.array(4)) expect_equal(sdata$Jgp_1_4, as.array(1:5)) expect_equal(sdata$Igp_1_4, as.array(6:10)) - sdata <- SW(make_standata(y ~ gp(x1, by = y, gr = TRUE), dat)) + sdata <- SW(standata(y ~ gp(x1, by = y, gr = TRUE), dat)) expect_equal(sdata$Cgp_1, as.array(dat$y)) }) -test_that("make_standata includes data for approximate Gaussian processes", { +test_that("standata includes data for approximate Gaussian processes", { dat <- data.frame(y = rnorm(10), x1 = sample(1:10, 10), z = factor(c(2, 2, 2, 3, 4, rep(5, 5)))) - sdata <- make_standata(y ~ gp(x1, k = 5, c = 5/4), dat) + sdata <- standata(y ~ gp(x1, k = 5, c = 5/4), dat) expect_equal(sdata$NBgp_1, 5) expect_equal(dim(sdata$Xgp_1), c(10, 5)) expect_equal(dim(sdata$slambda_1), c(5, 1)) - sdata <- SW(make_standata(y ~ gp(x1, by = z, k = 5, c = 5/4, scale = FALSE), dat)) + sdata <- SW(standata(y ~ gp(x1, by = z, k = 5, c = 5/4, scale = FALSE), dat)) expect_equal(sdata$Igp_1_2, as.array(4)) expect_equal(sdata$Cgp_1_2, as.array(1)) expect_equal(sdata$Igp_1_4, as.array(6:10)) }) -test_that("make_standata includes data for SAR models", { +test_that("standata includes data for SAR models", { dat <- data.frame(y = rnorm(10), x = rnorm(10)) W <- matrix(0, nrow = 10, ncol = 10) dat2 <- list(W = W) - sdata <- make_standata(y ~ x + sar(W), data = dat, data2 = dat2) + sdata <- standata(y ~ x + sar(W), data = dat, data2 = dat2) expect_equal(dim(sdata$M), rep(nrow(W), 2)) dat2 <- list(W = matrix(0, 2, 2)) expect_error( - make_standata(y ~ x + sar(W), data = dat, data2 = dat2), + standata(y ~ x + sar(W), data = dat, data2 = dat2), "Dimensions of 'M' for SAR terms must be equal" ) }) -test_that("make_standata includes data for CAR models", { +test_that("standata includes data for CAR models", { dat = data.frame(y = rnorm(10), x = rnorm(10), obs = 1:10) edges <- cbind(1:10, 10:1) W <- matrix(0, nrow = 10, ncol = 10) @@ -829,56 +829,56 @@ test_that("make_standata includes data for CAR models", { rownames(W) <- 1:nrow(W) dat2 <- list(W = W) - sdata <- make_standata(y ~ x + car(W, gr = obs), dat, data2 = dat2) + sdata <- standata(y ~ x + car(W, gr = obs), dat, data2 = dat2) expect_equal(sdata$Nloc, 10) expect_equal(unname(sdata$Nneigh), rep(1, 10)) expect_equal(unname(sdata$edges1), as.array(10:6)) expect_equal(unname(sdata$edges2), as.array(1:5)) - sdata_old <- SW(make_standata(y ~ x, dat, autocor = cor_car(W))) + sdata_old <- SW(standata(y ~ x, dat, autocor = cor_car(W))) expect_equal(sdata, sdata_old) rownames(dat2$W) <- c("a", 2:9, "b") dat$group <- rep(c("a", "b"), each = 5) - sdata <- make_standata(y ~ x + car(W, gr = group), dat, data2 = dat2, + sdata <- standata(y ~ x + car(W, gr = group), dat, data2 = dat2, prior = prior(horseshoe(), class = sdcar)) expect_equal(sdata$Nloc, 2) expect_equal(sdata$edges1, as.array(2)) expect_equal(sdata$edges2, as.array(1)) expect_equal(sdata$Kscales, 1) - sdata <- make_standata(y ~ x + car(W, group, type = "bym2"), + sdata <- standata(y ~ x + car(W, group, type = "bym2"), data = dat, data2 = dat2) expect_equal(length(sdata$car_scale), 1L) dat2$W[1, 10] <- 4 dat2$W[10, 1] <- 4 - expect_message(make_standata(y ~ car(W, gr = group), dat, data2 = dat2), + expect_message(standata(y ~ car(W, gr = group), dat, data2 = dat2), "Converting all non-zero values in 'M' to 1") # test error messages rownames(dat2$W) <- c(1:9, "a") - expect_error(make_standata(y ~ car(W, gr = group), dat, data2 = dat2), + expect_error(standata(y ~ car(W, gr = group), dat, data2 = dat2), "Row names of 'M' for CAR terms do not match") rownames(dat2$W) <- NULL - expect_error(make_standata(y ~ car(W, gr = group), dat, data2 = dat2), + expect_error(standata(y ~ car(W, gr = group), dat, data2 = dat2), "Row names are required for 'M'") dat2$W[1, 10] <- 0 - expect_error(make_standata(y ~ car(W), dat, data2 = dat2), + expect_error(standata(y ~ car(W), dat, data2 = dat2), "'M' for CAR terms must be symmetric") dat2$W[10, 1] <- 0 - expect_error(SW(make_standata(y ~ x + car(W), dat, data2 = dat2)), + expect_error(SW(standata(y ~ x + car(W), dat, data2 = dat2)), "all locations should have at least one neighbor") }) -test_that("make_standata includes data of special priors", { +test_that("standata includes data of special priors", { dat <- data.frame(y = 1:10, x1 = rnorm(10), x2 = rnorm(10), g = rep(1:2, each = 5), x3 = sample(1:5, 10, TRUE)) # horseshoe prior hs <- horseshoe(7, scale_global = 2, df_global = 3, df_slab = 6, scale_slab = 3) - sdata <- make_standata(y ~ x1*x2, data = dat, + sdata <- standata(y ~ x1*x2, data = dat, prior = set_prior(hs)) expect_equal(sdata$hs_df, 7) expect_equal(sdata$hs_df_global, 3) @@ -887,11 +887,11 @@ test_that("make_standata includes data of special priors", { expect_equal(sdata$hs_scale_slab, 3) hs <- horseshoe(par_ratio = 0.1) - sdata <- make_standata(y ~ x1*x2, data = dat, prior = set_prior(hs)) + sdata <- standata(y ~ x1*x2, data = dat, prior = set_prior(hs)) expect_equal(sdata$hs_scale_global, 0.1 / sqrt(nrow(dat))) # R2D2 prior - sdata <- make_standata(y ~ x1*x2, data = dat, + sdata <- standata(y ~ x1*x2, data = dat, prior = prior(R2D2(0.5, 10))) expect_equal(sdata$R2D2_mean_R2, 0.5) expect_equal(sdata$R2D2_prec_R2, 10) @@ -900,7 +900,7 @@ test_that("make_standata includes data of special priors", { # horseshoe and R2D2 prior applied in a non-linear model hs_a1 <- horseshoe(7, scale_global = 2, df_global = 3) R2D2_a2 <- R2D2(0.5, 10) - sdata <- make_standata( + sdata <- standata( bf(y ~ a1 + a2, a1 ~ x1, a2 ~ 0 + x2, nl = TRUE), data = dat, sample_prior = TRUE, prior = c(set_prior(hs_a1, nlpar = "a1"), @@ -917,14 +917,14 @@ test_that("make_standata includes data of special priors", { prior(R2D2(), class = sdgp) + prior(R2D2(), class = ar) + prior(R2D2(), class = ma) - sdata <- make_standata(bform, data = dat, prior = bprior) + sdata <- standata(bform, data = dat, prior = bprior) expect_equal(sdata$Kscales, 11) expect_equal(sdata$R2D2_cons_D2, as.array(11:1)) }) test_that("dots in formula are correctly expanded", { dat <- data.frame(y = 1:10, x1 = 1:10, x2 = 1:10) - sdata <- make_standata(y ~ ., dat) + sdata <- standata(y ~ ., dat) expect_equal(colnames(sdata$X), c("Intercept", "x1", "x2")) }) @@ -932,7 +932,7 @@ test_that("argument 'stanvars' is handled correctly", { bprior <- prior(normal(mean_intercept, 10), class = "Intercept") mean_intercept <- 5 stanvars <- stanvar(mean_intercept) - sdata <- make_standata(count ~ Trt, data = epilepsy, + sdata <- standata(count ~ Trt, data = epilepsy, prior = bprior, stanvars = stanvars) expect_equal(sdata$mean_intercept, 5) @@ -940,7 +940,7 @@ test_that("argument 'stanvars' is handled correctly", { 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;") - sdata <- make_standata(count ~ Trt + zBase, epilepsy, + sdata <- standata(count ~ Trt + zBase, epilepsy, prior = bprior, stanvars = stanvars) expect_equal(sdata$M, rep(0, 2)) expect_equal(sdata$V, diag(2)) @@ -956,7 +956,7 @@ test_that("addition arguments 'vint' and 'vreal' work correctly", { type = "int", vars = c("vint1[n]", "vreal1[n]") ) - sdata <- make_standata( + sdata <- standata( y | vint(size) + vreal(x, size) ~ 1, data = dat, family = beta_binomial2, ) @@ -968,11 +968,11 @@ test_that("addition arguments 'vint' and 'vreal' work correctly", { test_that("reserved variables 'Intercept' is handled correctly", { dat <- data.frame(y = 1:10) expect_warning( - sdata <- make_standata(y ~ 0 + intercept, dat), + sdata <- standata(y ~ 0 + intercept, dat), "Reserved variable name 'intercept' is deprecated." ) expect_true(all(sdata$X[, "intercept"] == 1)) - sdata <- make_standata(y ~ 0 + Intercept, dat) + sdata <- standata(y ~ 0 + Intercept, dat) expect_true(all(sdata$X[, "Intercept"] == 1)) }) @@ -988,44 +988,44 @@ test_that("data for multinomial and dirichlet models is correct", { dat$t <- with(dat, cbind(t1, t2, t3)) dat$size <- rowSums(dat$t) - sdata <- make_standata(t | trials(size) ~ x, dat, multinomial()) + sdata <- standata(t | trials(size) ~ x, dat, multinomial()) expect_equal(sdata$trials, as.array(dat$size)) expect_equal(sdata$ncat, 3) expect_equal(sdata$Y, unname(dat$t)) - sdata <- make_standata(y ~ x, data = dat, family = dirichlet()) + sdata <- standata(y ~ x, data = dat, family = dirichlet()) expect_equal(sdata$ncat, 3) expect_equal(sdata$Y, unname(dat$y)) expect_error( - make_standata(t | trials(10) ~ x, data = dat, family = multinomial()), + standata(t | trials(10) ~ x, data = dat, family = multinomial()), "Number of trials does not match the number of events" ) - expect_error(make_standata(t ~ x, data = dat, family = dirichlet()), + expect_error(standata(t ~ x, data = dat, family = dirichlet()), "Response values in simplex models must sum to 1") }) -test_that("make_standata handles cox models correctly", { +test_that("standata handles cox models correctly", { data <- data.frame(y = rexp(100), x = rnorm(100)) bform <- bf(y ~ x) bprior <- prior(dirichlet(3), sbhaz) - sdata <- make_standata(bform, data, brmsfamily("cox"), prior = bprior) + sdata <- standata(bform, data, brmsfamily("cox"), prior = bprior) expect_equal(dim(sdata$Zbhaz), c(100, 5)) expect_equal(dim(sdata$Zcbhaz), c(100, 5)) expect_equal(sdata$con_sbhaz, as.array(rep(3, 5))) - sdata <- make_standata(bform, data, brmsfamily("cox", bhaz = list(df = 6))) + sdata <- standata(bform, data, brmsfamily("cox", bhaz = list(df = 6))) expect_equal(dim(sdata$Zbhaz), c(100, 6)) expect_equal(dim(sdata$Zcbhaz), c(100, 6)) }) -test_that("make_standata handles addition term 'rate' is correctly", { +test_that("standata handles addition term 'rate' is correctly", { data <- data.frame(y = rpois(10, 1), x = rnorm(10), time = 1:10) - sdata <- make_standata(y | rate(time) ~ x, data, poisson()) + sdata <- standata(y | rate(time) ~ x, data, poisson()) expect_equal(sdata$denom, as.array(data$time)) }) -test_that("make_standata handles grouped ordinal thresholds correctly", { +test_that("standata handles grouped ordinal thresholds correctly", { dat <- data.frame( y = c(1:5, 1:4, 4), gr = rep(c("a", "b"), each = 5), @@ -1034,36 +1034,36 @@ test_that("make_standata handles grouped ordinal thresholds correctly", { ) # thresholds without a grouping factor - sdata <- make_standata(y ~ x, dat, cumulative()) + sdata <- standata(y ~ x, dat, cumulative()) expect_equal(sdata$nthres, 4) - sdata <- make_standata(y | thres(5) ~ x, dat, cumulative()) + sdata <- standata(y | thres(5) ~ x, dat, cumulative()) expect_equal(sdata$nthres, 5) expect_error( - make_standata(y | thres(th) ~ x, dat, cumulative()), + standata(y | thres(th) ~ x, dat, cumulative()), "Number of thresholds needs to be a single value" ) # thresholds with a grouping factor - sdata <- make_standata(y | thres(th, gr) ~ x, dat, cumulative()) + sdata <- standata(y | thres(th, gr) ~ x, dat, cumulative()) expect_equal(sdata$nthres, as.array(c(5, 6))) expect_equal(sdata$ngrthres, 2) expect_equal(unname(sdata$Jthres[1, ]), c(1, 5)) expect_equal(unname(sdata$Jthres[10, ]), c(6, 11)) - sdata <- make_standata(y | thres(gr = gr) ~ x, dat, cumulative()) + sdata <- standata(y | thres(gr = gr) ~ x, dat, cumulative()) expect_equal(sdata$nthres, as.array(c(4, 3))) expect_equal(sdata$ngrthres, 2) - sdata <- make_standata(y | thres(6, gr = gr) ~ x, dat, cumulative()) + sdata <- standata(y | thres(6, gr = gr) ~ x, dat, cumulative()) expect_equal(sdata$nthres, as.array(c(6, 6))) expect_equal(sdata$ngrthres, 2) }) test_that("information for threading is handled correctly", { dat <- data.frame(y = 1:10) - sdata <- make_standata(y ~ 1, dat, threads = threading(2, grainsize = 3)) + sdata <- standata(y ~ 1, dat, threads = threading(2, grainsize = 3)) expect_equal(sdata$grainsize, 3) }) @@ -1076,7 +1076,7 @@ test_that("variables in data2 can be used in population-level effects", { } out } - sdata <- make_standata(y ~ foo(x1, x2, x3, idx = id), data = dat, + sdata <- standata(y ~ foo(x1, x2, x3, idx = id), data = dat, data2 = list(id = c(3, 1))) target <- c("Intercept", "foox1x2x3idxEQidx3", "foox1x2x3idxEQidx1") expect_equal(colnames(sdata$X), target) @@ -1088,13 +1088,13 @@ test_that("NAs are allowed in unused interval censoring variables", { dat <- data.frame(y = rnorm(10), ce = c(1, rep(2, 9))) dat$y2 <- dat$y + 2 dat$y2[1] <- NA - sdata <- make_standata(y | cens(ce, y2 = y2) ~ 1, data = dat) + sdata <- standata(y | cens(ce, y2 = y2) ~ 1, data = dat) expect_equal(sdata$N, 10L) expect_equal(sdata$rcens[1], 0) dat$ce[1] <- 2 expect_error( - make_standata(y | cens(ce, y2 = y2) ~ 1, data = dat), + standata(y | cens(ce, y2 = y2) ~ 1, data = dat), "'y2' should not be NA for interval censored observations" ) }) @@ -1103,10 +1103,10 @@ test_that("drop_unused_factor levels works correctly", { dat <- data.frame(y = rnorm(10), x = factor(c("a", "b"), levels = c("a", "b", "c"))) # should drop level "c" - sdata <- make_standata(y ~ x, data = dat) + sdata <- standata(y ~ x, data = dat) expect_equal(colnames(sdata$X), c("Intercept", "xb")) # should not drop level "c" - sdata <- make_standata(y ~ x, data = dat, drop_unused_levels = FALSE) + sdata <- standata(y ~ x, data = dat, drop_unused_levels = FALSE) expect_equal(colnames(sdata$X), c("Intercept", "xb", "xc")) })