############################################################################################################# # # Example 6.5 (pages 212-3) – Figure 6.8 (page 214) # # Poisson model with change point revisited. # Metropolis step for change point parameter. # # Model : y_i ~ Poisson(lambda) i=1,...,m # y_i ~ Poisson(phi) i=m+1,...,n # # Prior : lambda ~ Gamma(alpha,beta) # phi ~ Gamma(gamma,delta) # m ~ Uniform{1,...,n} # # Additional references: # # * Carlin, Gelfand and Smith (1992) # * Tanner (1996, page 147) # ############################################################################################################## # # Author : Hedibert Freitas Lopes # Graduate School of Business # University of Chicago # 5807 South Woodlawn Avenue # Chicago, Illinois, 60637 # Email : hlopes@ChicagoGSB.edu # ############################################################################################################### ################################################################## # # Real data application: Counts of coal mining disasters in # Great Britain by year from 1851 to 1962. # ################################################################## logpost = function(lambda,phi,m){ sm = sum(y[1:m]) return((alpha+sm-1)*log(lambda)+(gamma+sn-sm-1)*log(phi)-(beta+m)*lambda-(delta+n-m)*phi) } y = c(4,5,4,1,0,4,3,4,0,6,3,3,4,0,2,6,3,3,5,4,5,3,1,4,4,1,5,5,3,4, 2,5,2,2,3,4,2,1,3,2,2,1,1,1,1,3,0,0,1,0,1,1,0,0,3,1,0,3,2,2, 0,1,1,1,0,1,0,1,0,0,0,2,1,0,0,0,1,1,0,2,3,3,1,1,2,1,1,1,1,2, 4,2,0,0,0,1,4,0,0,0,1,0,0,0,0,0,1,0,0,1,0,1) n = length(y) # hyperparameters # --------------- alpha = 0.001 beta = 0.001 delta = 0.001 gamma = 0.001 sn = sum(y) # METROPOLIS-HASTINGS ALGORITHM # ----------------------------- set.seed(2079734) M = 5000 burnin = 0 taus = seq(0.05,0.5,by=0.05) neffs = NULL rates = NULL par(mfrow=c(5,2)) for (tau in taus){ jump = matrix(0,n,n) for (i in 1:n){ jump[i,] = exp(-tau*abs(i-1:n)) jump[i,] = jump[i,]/sum(jump[i,]) } ljump = log(jump) draws = NULL m = 41 acceptance = 0 system.time( for (i in 1:(burnin+M)){ lambda = rgamma(1,ifelse(m>1,sum(y[1:m]),0)+alpha,m+beta) phi = rgamma(1,ifelse(m1,sum(y[1:m]),0)+alpha,m+beta) phi = rgamma(1,ifelse(m