Skip to content

Commit db91be2

Browse files
committed
Poisson model:extra program for MH-step
1 parent 339ee0d commit db91be2

1 file changed

Lines changed: 45 additions & 37 deletions

File tree

vignettes/Chapter08.Rmd

Lines changed: 45 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -646,9 +646,47 @@ parms.proposal <- gen.proposal.poisson(y, X, e, b0 = 0, B0 = 100)
646646
parms.proposal
647647
```
648648

649-
Next we set up the independence Metropolis-Hastings algorithm to
650-
estimate the model parameters.
649+
To set up the independence Metropolis-Hastings algorithm for
650+
the Poisson model, we first write a short program for the MH step
651+
to sample the regression effects.
652+
```{r}
653+
sample_beta<- function(y,X,e, b0, B0, qmean, qvar, beta.old){
654+
655+
beta.proposed <- as.vector(mvtnorm::rmvnorm(1, mean = qmean, sigma = qvar))
656+
657+
# Compute log proposal density at proposed and old value
658+
lq_proposed <- mvtnorm::dmvnorm(beta.proposed, mean = qmean, sigma = qvar,
659+
log = TRUE)
660+
lq_old <- mvtnorm::dmvnorm(beta.old, mean = qmean, sigma = qvar,
661+
log = TRUE)
651662
663+
# Compute log prior of proposed and old value
664+
lpri_proposed <- mvtnorm::dmvnorm(beta.proposed, mean = b0, sigma = B0,
665+
log = TRUE)
666+
lpri_old <- mvtnorm::dmvnorm(beta.old, mean = b0, sigma = B0,
667+
log = TRUE)
668+
# Compute log likelihood of proposed and old value
669+
lh_proposed <- dpois(y, e * exp(X %*% beta.proposed), log = TRUE)
670+
lh_old <- dpois(y, e * exp(X %*% beta.old), log = TRUE)
671+
672+
maxlik <- max(lh_old, lh_proposed)
673+
ll <- sum(lh_proposed - maxlik) - sum(lh_old - maxlik)
674+
675+
# Compute acceptance probability and accept or not
676+
log_acc <- min(0, ll + lpri_proposed - lpri_old + lq_old - lq_proposed)
677+
678+
if (log(runif(1)) < log_acc) {
679+
beta <- beta.proposed
680+
acc <- 1
681+
} else {
682+
beta <- beta.old
683+
acc <- 0
684+
}
685+
return(res = list(beta=beta, acc=acc))
686+
}
687+
```
688+
689+
We use this program to sample from the posterior.
652690
```{r}
653691
poisson <- function(y, X, e, b0 = 0, B0 = 100, qmean, qvar,
654692
burnin = 1000L, M = 10000L) {
@@ -664,43 +702,13 @@ poisson <- function(y, X, e, b0 = 0, B0 = 100, qmean, qvar,
664702
beta <- as.vector(mvtnorm::rmvnorm(1, mean = qmean, sigma = qvar))
665703
666704
for (m in seq_len(burnin + M)) {
667-
beta.old <- beta
668-
beta.proposed <- as.vector(mvtnorm::rmvnorm(1, mean = qmean, sigma = qvar))
669-
670-
# Compute log proposal density at proposed and old value
671-
lq_proposed <- mvtnorm::dmvnorm(beta.proposed, mean = qmean, sigma = qvar,
672-
log = TRUE)
673-
lq_old <- mvtnorm::dmvnorm(beta.old, mean = qmean, sigma = qvar,
674-
log = TRUE)
675-
676-
# Compute log prior of proposed and old value
677-
lpri_proposed <- mvtnorm::dmvnorm(beta.proposed, mean = b0, sigma = B0,
678-
log = TRUE)
679-
lpri_old <- mvtnorm::dmvnorm(beta.old, mean = b0, sigma = B0,
680-
log = TRUE)
681-
682-
# Compute log-likelihood of proposed and old value
683-
lh_proposed <- dpois(y, e * exp(X %*% beta.proposed), log = TRUE)
684-
lh_old <- dpois(y, e * exp(X %*% beta.old), log = TRUE)
685-
686-
maxlik <- max(lh_old, lh_proposed)
687-
ll <- sum(lh_proposed - maxlik) - sum(lh_old - maxlik)
688-
689-
# Compute acceptance probability and accept or not
690-
log_acc <- min(0, ll + lpri_proposed - lpri_old + lq_old - lq_proposed)
691-
692-
if (log(runif(1)) < log_acc) {
693-
beta <- beta.proposed
694-
accept <- 1
695-
} else {
696-
beta <- beta.old
697-
accept <- 0
698-
}
699-
700-
# Store the beta draws
705+
beta.draw <- sample_beta(y,X,e, b0, B0, qmean, qvar,beta)
706+
beta<- beta.draw$beta
707+
708+
# Store the beta draws
701709
if (m > burnin) {
702710
beta.post[m - burnin, ] <- beta
703-
acc[m - burnin] <- accept
711+
acc[m - burnin] <- beta.draw $acc
704712
}
705713
}
706714
return(list(beta.post = beta.post, accept = mean(acc)))

0 commit comments

Comments
 (0)