@@ -646,9 +646,47 @@ parms.proposal <- gen.proposal.poisson(y, X, e, b0 = 0, B0 = 100)
646646parms.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}
653691poisson <- 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