parallelTempering {EMC} | R Documentation |
Given a multi-modal and multi-dimensional target density function, a (possibly asymmetric) proposal distribution and a temperature ladder, this function produces samples from the target using the parallel tempering algorithm.
parallelTempering(nIters, temperLadder, startingVals, logTarDensFunc, MHPropNewFunc, logMHPropDensFunc = NULL, MHBlocks = NULL, MHBlockNTimes = NULL, moveProbsList = NULL, moveNTimesList = NULL, levelsSaveSampFor = NULL, saveFitness = FALSE, verboseLevel = 0, ...)
Below sampDim
refers to the dimension of the sample space,
temperLadderLen
refers to the length of the temperature ladder,
and levelsSaveSampForLen
refers to the length of the
levelsSaveSampFor
.
nIters |
integer > 0. |
temperLadder |
double vector with all positive
entries, in decreasing order. |
startingVals |
double matrix of dimension
temperLadderLen x sampDim or vector of
length sampDim , in which case the same starting values are
used for every temperature level. |
logTarDensFunc |
function of two arguments
(draw, ...)
that returns the target density evaluated in the log scale. |
MHPropNewFunc |
function of four arguments
(temperature, block, currentDraw, ...)
that returns new Metropolis-Hastings proposals. See details
below on the argument block. |
logMHPropDensFunc |
function of five arguments
(temperature, block, currentDraw, proposalDraw, ...)
that returns the proposal density evaluated in the log
scale. See details below on the argument block. |
MHBlocks |
list of integer vectors giving dimensions to be
blocked together for sampling. It defaults to
as.list(1:sampDim) , i.e., each dimension is treated as a
block on its own. See details below for an example. |
MHBlockNTimes |
integer vector of number of times each block
given by MHBlocks should be sampled in each iteration. It
defaults to rep(1, length(MHBlocks)) . See details below
for an example. |
moveProbsList |
named list of probabilities adding upto 1. |
moveNTimesList |
named list of integers >= 0. |
levelsSaveSampFor |
integer vector with positive
entries. |
saveFitness |
logical . |
verboseLevel |
integer , a value >= 2 produces a
lot of output. |
... |
optional arguments to be passed to logTarDensFunc ,
MHPropNewFunc and logMHPropDensFunc . |
MHPropNewFunc
and logMHPropDensFunc
MHPropNewFunc
and the logMHPropDensFunc
are called
multiple times by varying the block
argument over
1:length(MHBlocks)
, so these functions should know how to
generate a proposal from the currentDraw
or to evaluate the
proposal density depending on which block was passed as the
argument. See the example section for sample code.MHBlocks
and MHBlockNTimes
sampDim = 6
. Let we want to
sample dimensions 1, 2, 4 as one block, dimensions 3 and 5 as
another and treat dimension 6 as the third block. Suppose we want
to sample the three blocks mentioned above 1, 5 and 10 times in
each iteration, respectively. Then we could set MHBlocks =
list(c(1, 2, 4), c(3, 5), 6)
and MHBlockNTimes = c(1, 5,
10)
MH | Metropolis-Hastings or mutation |
RE | (random) exchange |
The current function could be used to run the PT algorithm by specifying what moves to employ using the following variables.
moveProbsList
and moveNTimesList
moveProbsList
and
moveNTimesList
come from the abbreviated names of the
moves above. For example, the following specifications are
valid:moveProbsList = list(MH = 0.4, RE = 0.6)
moveNTimesList = list(MH = 1, RE = temperLadderLen)
levelsSaveSampFor
temperLadderLen
. The
levelsSaveSampFor
could be used to save samples from other
temperature levels as well (e.g., levelsSaveSampFor =
1:temperLadderLen
saves samples from all levels).saveFitness
g(x) propto exp[ -H(x) / tau_{min} ]
H(x) is also known as the energy function. By default,
the fitness values are not saved, but one can do so by setting
saveFitness = TRUE
.
This function returns a list with the following components:
draws |
array of dimension nIters x
sampDim x levelsSaveSampForLen , if
saveFitness = FALSE . If saveFitness = TRUE , then the
returned array is of dimension nIters x
(sampDim + 1) x levelsSaveSampForLen ;
i.e., each of the levelsSaveSampForLen matrices contain the
fitness values in their last column. |
acceptRatios |
matrix of the acceptance rates for various
moves used. |
detailedAcceptRatios |
list of matrices with detailed
summary of the acceptance rates for various moves used. |
nIters |
the nIters argument. |
temperLadder |
the temperLadder argument. |
startingVals |
the startingVals argument. |
moveProbsList |
the moveProbsList argument. |
moveNTimesList |
the moveNTimesList argument. |
levelsSaveSampFor |
the levelsSaveSampFor argument. |
time |
the time taken by the run. |
The effect of leaving the default value NULL
for some of the
arguments above are as follows:
logMHPropDensFunc | the proposal density MHPropNewFunc is deemed symmetric. |
| as.list(1:sampDim) . |
| rep(1, length(MHBlocks)) . |
| list(MH = 0.4, RC = 0.3, SC = 0.3) . |
| list(MH = 1, RC = mm, SC = mm, RE = nn) , where |
| mm <- floor(nn / 2) and nn <- temperLadderLen . |
| temperLadderLen .
|
Gopi Goswami goswami@stat.harvard.edu
Faming Liang and Wing H.Wong (2001). Real-Parameter Evolutionary Monte Carlo with Applications to Bayesian Mixture Models. Journal of the American Statistical Association 96:653-666.
samplerObj <- with(VShapedFuncGenerator(-13579), parallelTempering(nIters = 2000, temperLadder = c(15, 6, 2, 1), startingVals = c(0, 0), logTarDensFunc = logTarDensFunc, MHPropNewFunc = MHPropNewFunc, levelsSaveSampFor = seq_len(4), verboseLevel = 1)) print(samplerObj) print(names(samplerObj)) with(samplerObj, { print(detailedAcceptRatios) print(dim(draws)) par(mfcol = c(2, 2)) for (ii in seq_along(levelsSaveSampFor)) { main <- paste('temper:', round(temperLadder[levelsSaveSampFor[ii]], 3)) plot(draws[ , , ii], xlim = c(-5, 20), ylim = c(-8, 8), pch = '.', ask = FALSE, main = as.expression(main), xlab = as.expression(substitute(x[xii], list(xii = 1))), ylab = as.expression(substitute(x[xii], list(xii = 2)))) } })