betaHmcUpdate <- function(y, w, x, beta, alpha, delta_c, L_c, offset){
# sample random momentum
p0 <- matrix(rnorm(length(beta)))
# simulate Hamiltonian dynamics
bcurr <- matrix(beta)
pStar <- p0 - 0.5 * delta_c * dU_beta(y, w, x, bcurr, alpha, offset)
# first full step for position
bStar <- bcurr + delta_c*pStar
# full steps
for (jL in 1:c(L_c-1)){
# momentum
pStar <- pStar - delta_c * dU_beta(y, w, x, bStar, alpha, offset)
# position
bStar <- bStar + delta_c*pStar
}
# last half step
pStar <- pStar - 0.5 * delta_c * dU_beta(y, w, x, bStar, alpha, offset)
# evaluate energies
U0 <- Ubeta(y, w, x, bcurr, alpha, offset)
UStar <- Ubeta(y, w, x, bStar, alpha, offset)
K0 <- K(p0)
KStar <- K(pStar)
# accept/reject
alpha <- min(1, exp((U0 + K0) - (UStar + KStar)))
if (is.na(alpha)){
alpha <- 0
}
if (runif(1, 0, 1) < alpha){
bnext <- bStar
accept <- 1
} else {
bnext <- bcurr
accept <- 0
}
out <- list()
out$beta <- bnext
out$accept <- accept
out$a <- alpha
return(out)
}
Ubeta <- function(y, w, x, beta, alpha, offset){
# likelihood
logd <- 0
lin_preds <- offset + x %*% beta + alpha * w
for (i in 1:length(y)){
logd <- logd + dpois(y[i], lambda=exp(lin_preds[i]), log=T)
}
# prior
prior_beta_mean <- rep(0, length(beta))
if (length(beta) > 1){
prior_beta_var <- diag(rep(100, length(beta)))
} else {
prior_beta_var <- matrix(100)
}
logd <- logd + dmvnorm(as.numeric(beta), prior_beta_mean, prior_beta_var, log=T)
return(-logd)
}
dU_beta <- function(y, w, x, beta, alpha, offset){
grad <- array(0, c(length(beta), 1))
lin_preds <- offset + x %*% beta + alpha * w
for (j in 1:length(beta)){
for (i in 1:length(w)){
grad[j] <- grad[j] + x[i, j] * (y[i] - exp(lin_preds[i,]))
}
}
if (length(beta) > 1){
prior_var_inv <- diag(rep(1/100, length(beta)))
} else{
prior_var_inv <- 1/100
}
grad <- grad + t(-t(beta) %*% prior_var_inv)
return(-grad)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.