-
Notifications
You must be signed in to change notification settings - Fork 0
/
brm.Rmd
288 lines (274 loc) · 15.4 KB
/
brm.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
---
title: "``brms::brm``"
output: html_document
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
library(brms)
```
brm Fit Bayesian Generalized (Non-)Linear Multivariate Multilevel Models
#### Description
Fit Bayesian generalized (non-)linear multivariate multilevel models using Stan for full Bayesian
inference. A wide range of distributions and link functions are supported, allowing users to fit –
among others – linear, robust linear, count data, survival, response times, ordinal, zero-inflated,
hurdle, and even self-defined mixture models all in a multilevel context.
Further modeling options include non-linear and smooth terms, auto-correlation structures, censored data, meta-analytic standard
errors, and quite a few more. In addition, all parameters of the response distributions can
be predicted in order to perform distributional regression.
Prior specifications are flexible and explicitly
encourage users to apply prior distributions that actually reflect their beliefs. In addition,
model fit can easily be assessed and compared with posterior predictive checks and leave-one-out
cross-validation.
#### Usage
<pre><code>
brm(formula, data, family = gaussian(), prior = NULL, autocor = NULL,
cov_ranef = NULL, sample_prior = c("no", "yes", "only"),
sparse = FALSE, knots = NULL, stanvars = NULL, stan_funs = NULL,
fit = NA, save_ranef = TRUE, save_mevars = FALSE,
save_all_pars = FALSE, inits = "random", chains = 4, iter = 2000,
warmup = floor(iter/2), thin = 1, cores = getOption("mc.cores",
1L), control = NULL, algorithm = c("sampling", "meanfield",
"fullrank"), future = getOption("future", FALSE), silent = TRUE,
seed = NA, save_model = NULL, stan_model_args = list(),
save_dso = TRUE, file = NULL, ...)
</code></pre>
#### Arguments
* ``formula``: An object of class formula, brmsformula, or 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 brmsformula.
* ``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.
* `` 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 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 brmsfamily. By
default, a linear gaussian model is applied. In multivariate models, family
might also be a list of families.
* ``prior``: One or more brmsprior objects created by set_prior or related functions and combined using the c method or the + operator. See also ``get_prior`` for more
help.
* ``autocor`` An optional cor_brms object describing the correlation structure within the response variable (i.e., the ’autocorrelation’). See the documentation of ``cor_brms``
for a description of the available correlation structures. Defaults to NULL, corresponding to no correlations. In multivariate models, autocor might also be a
list of autocorrelation structures.
* ``cov_ranef`` 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
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. See vignette("brms_phylogenetics")
for more details.
* ``sample_prior``: Indicate if samples from all specified proper priors should be drawn additionally
to the posterior samples (defaults to "no"). Among others, these samples can be used to calculate Bayes factors for point hypotheses via hypothesis. If set to "only", samples are drawn solely from the priors ignoring the likelihood, which allows among others to generate samples from the prior predictive distribution.
In this case, all parameters must have proper priors.
* ``sparse`` Logical; indicates whether the population-level design matrices should be treated
as sparse (defaults to FALSE). For design matrices with many zeros, this can considerably
reduce required memory. Sampling speed is currently not improved or
even slightly decreased.
#### Examples
```{r}
## Not run:
# Poisson regression for the number of seizures in epileptic patients
# using student_t priors for population-level effects
# and half cauchy priors for standard deviations of group-level effects
bprior1 <- prior(student_t(5,0,10), class = b) +
prior(cauchy(0,2), class = sd)
fit1 <- brm(count ~ log_Age_c + log_Base4_c * Trt + (1|patient),
data = epilepsy, family = poisson(), prior = bprior1)
# generate a summary of the results
summary(fit1)
# plot the MCMC chains as well as the posterior distributions
plot(fit1, ask = FALSE)
```
```{r}
# predict responses based on the fitted model
head(predict(fit1))
# plot marginal effects for each predictor
plot(marginal_effects(fit1), ask = FALSE)
# investigate model fit
loo(fit1)
pp_check(fit1)
```
```{r}
# Ordinal regression modeling patient's rating of inhaler instructions
# category specific effects are estimated for variable 'treat'
fit2 <- brm(rating ~ period + carry + cs(treat),
data = inhaler, family = sratio("logit"),
prior = set_prior("normal(0,5)"), chains = 2)
summary(fit2)
plot(fit2, ask = FALSE)
WAIC(fit2)
```
```{r}
# Survival regression modeling the time between the first
# and second recurrence of an infection in kidney patients.
fit3 <- brm(time | cens(censored) ~ age * sex + disease + (1|patient),
data = kidney, family = lognormal())
summary(fit3)
plot(fit3, ask = FALSE)
plot(marginal_effects(fit3), ask = FALSE)
# Probit regression using the binomial family
ntrials <- sample(1:10, 100, TRUE)
success <- rbinom(100, size = ntrials, prob = 0.4)
x <- rnorm(100)
data4 <- data.frame(ntrials, success, x)
fit4 <- brm(success | trials(ntrials) ~ x, data = data4,
family = binomial("probit"))
summary(fit4)
```
```{r}
# Simple non-linear gaussian model
x <- rnorm(100)
y <- rnorm(100, mean = 2 - 1.5^x, sd = 1)
data5 <- data.frame(x, y)
bprior5 <- prior(normal(0, 2), nlpar = a1) +
prior(normal(0, 2), nlpar = a2)
fit5 <- brm(bf(y ~ a1 - a2^x, a1 + a2 ~ 1, nl = TRUE),
data = data5, prior = bprior5)
summary(fit5)
plot(marginal_effects(fit5), ask = FALSE)
```
```{r}
# Normal model with heterogeneous variances
data_het <- data.frame(
y = c(rnorm(50), rnorm(50, 1, 2)),
x = factor(rep(c("a", "b"), each = 50))
)
fit6 <- brm(bf(y ~ x, sigma ~ 0 + x), data = data_het)
summary(fit6)
plot(fit6)
marginal_effects(fit6)
# extract estimated residual SDs of both groups
sigmas <- exp(posterior_samples(fit6, "^b_sigma_"))
ggplot(stack(sigmas), aes(#### Values)) +
geom_density(aes(fill = ind))
```
```{r}
# Quantile regression predicting the 25%-quantile
fit7 <- brm(bf(y ~ x, quantile = 0.25), data = data_het,
family = asym_laplace())
summary(fit7)
marginal_effects(fit7)
```
```{r}
# use the future package for more flexible parallelization
library(future)
plan(multiprocess)
fit7 <- update(fit7, future = TRUE)
## End(Not run)
```
* `` knots ``:Optional list containing user specified knot #### Values to be used for basis construction
of smoothing terms. See gamm for more details.
stanvars An optional stanvars object generated by function stanvar to define additional
variables for use in Stan’s program blocks.
stan_funs (Deprecated) An optional character string containing self-defined Stan functions,
which will be included in the functions block of the generated Stan code.
It is now recommended to use the stanvars argument for this purpose, instead.
brm 17
* fit An instance of S3 class brmsfit derived from a previous fit; defaults to NA. If
fit is of class brmsfit, the compiled model associated with the fitted result is
re-used and all arguments modifying the model code or data are ignored. It is
not recommended to use this argument directly, but to call the update method,
instead.
* save_ranef A flag to indicate if group-level effects for each level of the grouping factor(s)
should be saved (default is TRUE). Set to FALSE to save memory. The argument
has no impact on the model fitting itself.
* save_mevars A flag to indicate if samples of latent noise-free variables obtained by using me
and mi terms should be saved (default is FALSE). Saving these samples allows to
better use methods such as predict with the latent variables but leads to very
large R objects even for models of moderate size and complexity.
* save_all_pars A flag to indicate if samples from all variables defined in Stan’s parameters
block should be saved (default is FALSE). Saving these samples is required in
order to apply the methods bridge_sampler, bayes_factor, and post_prob.
inits Either "random" or "0". If inits is "random" (the default), Stan will randomly
generate initial values for parameters. If it is "0", all parameters are initialized
to zero. This option is sometimes useful for certain families, as it happens that
default ("random") inits cause samples to be essentially constant. Generally,
setting inits = "0" is worth a try, if chains do not behave well. Alternatively,
inits can be a list of lists containing the initial #### Values, or a function (or function
name) generating initial #### Values. The latter options are mainly implemented for
internal testing.
* chains Number of Markov chains (defaults to 4).
* iter Number of total iterations per chain (including warmup; defaults to 2000).
* warmup A positive integer specifying number of warmup (aka burnin) iterations. This
also specifies the number of iterations used for stepsize adaptation, so warmup
samples should not be used for inference. The number of warmup should not be
larger than iter and the default is iter/2.
thin Thinning rate. Must be a positive integer. Set thin > 1 to save memory and
computation time if iter is large.
cores Number of cores to use when executing the chains in parallel, which defaults to
1 but we recommend setting the mc.cores option to be as many processors as
the hardware and RAM allow (up to the number of chains). For non-Windows
OS in non-interactive R sessions, forking is used instead of PSOCK clusters.
control A named list of parameters to control the sampler’s behavior. It defaults to
NULL so all the default #### Values are used. The most important control parameters
are discussed in the ’#### Details’ section below. For a comprehensive overview see
stan.
algorithm Character string indicating the estimation approach to use. Can be "sampling"
for MCMC (the default), "meanfield" for variational inference with independent
normal distributions, or "fullrank" for variational inference with a multivariate
normal distribution.
future Logical; If TRUE, the future package is used for parallel execution of the chains
and argument cores will be ignored. Can be set globally for the current R
18 brm
session via the future option. The execution type is controlled via plan (see
the examples section below).
silent logical; If TRUE (the default), most of the informational messages of compiler
and sampler are suppressed. The actual sampling progress is still printed. Set
refresh = 0 to turn this off as well. To stop Stan from opening additional
progress bars, set open_progress = FALSE.
seed The seed for random number generation to make results reproducible. If NA (the
default), Stan will set the seed randomly.
* save_model Either NULL or a character string. In the latter case, the model’s Stan code is
saved via cat in a text file named after the string supplied in save_model.
stan_model_args
A list of further #### Arguments passed to stan_model.
save_dso Logical, defaulting to TRUE, indicating whether the dynamic shared object (DSO)
compiled from the C++ code for the model will be saved or not. If TRUE, we can
draw samples from the same model in another R session using the saved DSO
(i.e., without compiling the C++ code again).
file Either NULL or a character string. In the latter case, the fitted model object is
saved via saveRDS in a file named after the string supplied in file. The .rds
extension is added automatically. If the file already exists, brm will load and
return the saved model object instead of refitting the model. As existing files
won’t be overwritten, you have to manually remove the file in order to refit
and save the model under an existing file name. The file name is stored in the
brmsfit object for later usage.
* `` ... ``: Further arguments passed to Stan that is to sampling or vb.
#### Details
Fit a generalized (non-)linear multivariate multilevel model via full Bayesian inference using Stan.
A general overview is provided in the vignettes vignette("brms_overview") and vignette("brms_multilevel").
For a full list of available vignettes see vignette(package = "brms").
Formula syntax of brms models
Details of the formula syntax applied in brms can be found in brmsformula.
Families and link functions
Details of families supported by brms can be found in brmsfamily.
Prior distributions
Priors should be specified using the 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 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 start
thinking about reasonable informative priors for your model parameters: Nearly always, there is at
least some prior information available that can be used to improve your inference.
Adjusting the sampling behavior of Stan
In addition to choosing the number of iterations, warmup samples, and chains, users can control
the behavior of the NUTS sampler, by using the control argument. The most important reason
brm 19
to use control is to decrease (or eliminate at best) the number of divergent transitions that cause
a bias in the obtained posterior samples. Whenever you see the warning "There were x divergent
transitions after warmup." you should really think about increasing adapt_delta. To do this, write
control = list(adapt_delta = <x>), where <x> should usually be #### Value between 0.8 (current
default) and 1. Increasing adapt_delta will slow down the sampler but will decrease the number
of divergent transitions threatening the validity of your posterior samples.
Another problem arises when the depth of the tree being evaluated in each iteration is exceeded.
This is less common than having divergent transitions, but may also bias the posterior samples.
When it happens, Stan will throw out a warning suggesting to increase max_treedepth, which can
be accomplished by writing control = list(max_treedepth = <x>) with a positive integer
<x> that should usually be larger than the current default of 10. for more details on the control
argument see stan.
#### Value
An object of class brmsfit, which contains the posterior samples along with many other useful
information about the model. Use methods(class = "brmsfit") for an overview on available
methods.
#### Author(s)
Paul-Christian Buerkner <[email protected]>
#### References
Paul-Christian Buerkner (2017). brms: An R Package for Bayesian Multilevel Models Using Stan.
Journal of Statistical Software, 80(1), 1-28. doi:10.18637/jss.v080.i01
Paul-Christian Buerkner (in review). Advanced Bayesian Multilevel Modeling with the R Package
brms. arXiv preprint.
See Also
brms, brmsformula, brmsfamily, brmsfit