## The V-shaped distribution
VShapedFuncGenerator <-
function (seed = 13579)
{
set.seed(seed)
dd <- 2
ARDisp <-
function (rho)
{
tmp <- rep(1, dd)
diag((1 - rho) * tmp) + rho * tmp %*% t(tmp)
}
nMixComps <- 2
logWeights <- log(rep(1 / nMixComps, nMixComps))
meanMat <- matrix(c(1, 1, 15, 1), nMixComps, byrow = TRUE)
dispParam <- c(-0.95, 0.95)
dispArr <- array(dim = c(2, 2, nMixComps))
for (ii in seq_len(nMixComps)) {
dispArr[ , , ii] <- ARDisp(dispParam[ii])
}
logTarDensFunc <-
function (draw, ...)
{
ld <- sapply(seq_len(nMixComps), FUN =
function (ii)
{
dmvnorm(draw, meanMat[ii, ], dispArr[ , , ii], log = TRUE)
})
ww <- logWeights + ld
mm <- max(ww)
mm + log(sum(exp(ww - mm)))
}
MHProposalSD <- c(1.0, 1.0)
MHPropNewFunc <-
function (temperature, block, currentDraw, ...)
{
proposalDraw <- currentDraw
proposalDraw[block] <- rnorm(1, currentDraw[block],
sqrt(temperature) * MHProposalSD[block])
proposalDraw
}
list(logTarDensFunc = logTarDensFunc,
MHPropNewFunc = MHPropNewFunc)
}
samplerObj <-
with(VShapedFuncGenerator( ),
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))))
}
})Run the code above in your browser using DataLab