The Barker proposal is a gradient-based proposal inspired by the Barker accept-reject rule and proposed in Livingstone and Zanella (2022). It offers improved robustness compared to alternative gradient-based proposals such as Langevin proposals.
Arguments
- scale
Scale parameter of proposal distribution. A non-negative scalar value determining scale of steps proposed.
- shape
Shape parameter of proposal distribution. Either a vector corresponding to a diagonal shape matrix with per-dimension scaling factors, or a matrix allowing arbitrary linear transformations.
- sample_auxiliary
Function which generates a random vector from auxiliary variable distribution.
- sample_uniform
Function which generates a random vector from standard uniform distribution given an integer size.
Value
Proposal object. A list with entries
sample
: a function to generate sample from proposal distribution given current chain state,log_density_ratio
: a function to compute log density ratio for proposal for a given pair of current and proposed chain states,update
: a function to update parameters of proposal,parameters
: a function to return list of current parameter values.default_target_accept_prob
: a function returning the default target acceptance rate to use for any scale adaptation.default_initial_scale
: a function which given a dimension gives a default value to use for the initial proposal scale parameter.
Details
For more details see the vignette:
vignette("barker-proposal", package = "rmcmc")
References
Livingstone, S., & Zanella, G. (2022). The Barker proposal: combining robustness and efficiency in gradient-based MCMC. Journal of the Royal Statistical Society Series B: Statistical Methodology, 84(2), 496-523.
Examples
target_distribution <- list(
log_density = function(x) -sum(x^2) / 2,
gradient_log_density = function(x) -x
)
proposal <- barker_proposal(scale = 1.)
state <- chain_state(c(0., 0.))
withr::with_seed(
876287L, proposed_state <- proposal$sample(state, target_distribution)
)
log_density_ratio <- proposal$log_density_ratio(
state, proposed_state, target_distribution
)
proposal$update(scale = 0.5)