| arms_gibbs {armspp} | R Documentation |
Gibbs sampling using ARMS
Description
This function uses ARMS (see also arms) to sample from
a multivariate target distribution specified by its (potentially
unnormalised) log density using Gibbs sampling. The function updates each
argument to the log pdf in turn using ARMS, returning a matrix of samples.
The arguments to this function have the same meaning as for
arms, except here they are recycled along the dimension of
previous, rather than from sample to sample.
Usage
arms_gibbs(n_samples, previous, log_pdf, lower, upper, initial = NULL,
n_initial = 10, convex = 0, max_points = 100, metropolis = TRUE,
include_n_evaluations = FALSE, show_progress = FALSE)
Arguments
n_samples |
Number of samples to return. |
previous |
Starting value for the Gibbs sampler. Vectors of this length
are passed to |
log_pdf |
Potentially unnormalised log density of target distribution. |
lower |
Lower bound of the support of the target distribution. |
upper |
Upper bound of the support of the target distribution. |
initial |
Initial points with which to build the rejection distribution. |
n_initial |
Number of points used to form |
convex |
Convexity adjustment. |
max_points |
Maximum number of points to allow in the rejection distribution. |
metropolis |
Whether to use a Metropolis-Hastings step after rejection sampling. Not necessary if the target distribution is log concave. |
include_n_evaluations |
Whether to return an object specifying the number of function evaluations used. |
show_progress |
If |
Value
Matrix of samples if include_n_evaluations is FALSE,
otherwise a list.
References
Gilks, W. R., Best, N. G. and Tan, K. K. C. (1995) Adaptive rejection Metropolis sampling. Applied Statistics, 44, 455-472.
See Also
http://www1.maths.leeds.ac.uk/~wally.gilks/adaptive.rejection/web_page/Welcome.html
Examples
# The classic 8schools example from RStan
# https://github.com/stan-dev/rstan/wiki/RStan-Getting-Started
schools_data <- list(
J = 8,
y = c(28, 8, -3, 7, -1, 1, 18, 12),
sigma = c(15, 10, 16, 11, 9, 11, 10, 18)
)
log_pdf <- function(params, p) {
mu <- params[1]
tau <- params[2]
eta <- params[3 : (3 + schools_data$J - 1)]
output <- (
sum(dnorm(eta, 0, 1, log = TRUE)) +
sum(dnorm(
schools_data$y,
mu + tau * eta,
schools_data$sigma,
log = TRUE
))
)
return(output)
}
x_start <- c(0, 0, rep(0, schools_data$J))
names(x_start) <- c(
'mu',
'tau',
paste0('eta', 1 : schools_data$J)
)
samples <- arms_gibbs(
250,
x_start,
log_pdf,
c(-1000, 0, rep(-1000, schools_data$J)),
1000,
metropolis = FALSE
)
print(colMeans(samples[51 : 250, ]))