1 The data

This data is taken from Section 8.8 (Modeling Count Data) from Jim Albert and Jingchen Hu’s 2020 book Probability and Bayesian Modeling (CRC Press, Taylor & Francis Group). Suppose one is interested in monitoring the popularity of a particular blog about baseball analytics. The data in y (below) displays the number of visitors viewing this blog for 28 days during June of 2018.

y = c(95,81,85,100,111,130,113,92,65,78,96,118,120,104,91,91,79,106,91,114,110,98,61,84,96,126,119,90)

n = length(y)

days = c("fri","sat","sun","mon","tue","wed","thu")

t = rep(1:7,4)

# Exploratory data analysis

par(mfrow=c(2,2))
hist(y,xlab="",main="Number of visitors")
boxplot(y,ylab="Number of visitors")

ts.plot(y,type="b",xlab="Days",ylab="Number of visitors")
abline(v=7.5,lty=2)
abline(v=14.5,lty=2)
abline(v=21.5,lty=2)
 
plot(t,y,xlab="Day of the week",ylab="Number of visitors",axes=FALSE)
axis(2);axis(1,at=1:7,lab=days)

2 Linear regression vs Poisson regression

weekend=rep(0,n)
weekend[t<=3]=1

c(mean(y[weekend==0]),sqrt(var((y[weekend==0]))))
## [1] 109.00000  12.15456
c(mean(y[weekend==1]),sqrt(var((y[weekend==1]))))
## [1] 83.33333 11.42034
par(mfrow=c(1,2))
boxplot(y,ylab="Number of visitors")
boxplot(y~weekend,xlab="Type of day",names=c("Weekday","Weekend"),ylab="Number of visitors")

2.1 Gaussian regression

summary(lm(y~weekend))
## 
## Call:
## lm(formula = y ~ weekend)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -22.333  -6.250   1.333   8.750  21.000 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  109.000      2.962  36.795  < 2e-16 ***
## weekend      -25.667      4.525  -5.672 5.76e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 11.85 on 26 degrees of freedom
## Multiple R-squared:  0.5531, Adjusted R-squared:  0.5359 
## F-statistic: 32.17 on 1 and 26 DF,  p-value: 5.76e-06

2.2 Poisson regression

summary(glm(y~weekend,family="poisson"))
## 
## Call:
## glm(formula = y ~ weekend, family = "poisson")
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  4.69135    0.02395 195.916  < 2e-16 ***
## weekend     -0.26850    0.03967  -6.769  1.3e-11 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance: 85.141  on 27  degrees of freedom
## Residual deviance: 38.324  on 26  degrees of freedom
## AIC: 221.76
## 
## Number of Fisher Scoring iterations: 4
tab = rbind(c(109.000,109.000-25.667),
c(exp(4.69135),exp(4.69135-0.26850)))

rownames(tab) = c("Gaussian regression","Poisson regression")
colnames(tab) = c("Intercept","Slope")
tab
##                     Intercept    Slope
## Gaussian regression  109.0000 83.33300
## Poisson regression   109.0002 83.33345
ma = 4.7;sda=0.1
mb = -0.3;sdb=0.1
N = 100
alpha = seq(4.5,4.9,length=N)
beta = seq(-0.5,0,length=N)
loglike = matrix(0,N,N)
prior = matrix(0,N,N)
posterior = matrix(0,N,N)
for (i in 1:N)
  for (j in 1:N){
    lambda = exp(alpha[i]+beta[j]*weekend)
    loglike[i,j] = sum(dpois(y,lambda,log=TRUE))
    prior[i,j] = dnorm(alpha[i],ma,sda)*dnorm(beta[j],mb,sdb)
  }
like = exp(loglike)
post = prior*like

par(mfrow=c(1,1))
image(alpha,beta,prior,xlab=expression(alpha),ylab=expression(beta))
contour(alpha,beta,like,col=4,drawlabels=FALSE,add=TRUE,xlab=expression(alpha),ylab=expression(beta),lwd=2)
contour(alpha,beta,post,col=3,drawlabels=FALSE,add=TRUE,xlab=expression(alpha),ylab=expression(beta),lwd=2)

legend("topright",legend=c("Prior","Likelihood","Posterior"),col=c(2,4,3),lty=1,lwd=3)

3 SIR-based posterior inference

M = 10000
alphas = rnorm(M,ma,sda)
betas  = rnorm(M,mb,sdb)
plot(alphas,betas,xlab=expression(alpha),ylab=expression(beta))
contour(alpha,beta,prior,add=TRUE,drawlabels=FALSE,lwd=2,col=2)

w = rep(0,M)
for (i in 1:M)
  w[i] = sum(dpois(y,exp(alphas[i]+betas[i]*weekend),log=TRUE))
w = exp(w-max(w))
ind = sample(1:M,size=M,replace=TRUE,prob=w)

alphas1 = alphas[ind]
betas1 = betas[ind]
plot(alphas1,betas1)

image(alpha,beta,post,xlab=expression(alpha),ylab=expression(beta))
contour(alpha,beta,post,add=TRUE,drawlabels=FALSE,lwd=2,col=2)

par(mfrow=c(1,1))
plot(density(exp(alphas1)),xlim=c(70,120),ylim=c(0,0.2),xlab="Rate of visitors",ylab="Density",main="",lwd=2)
lines(density(exp(alphas1+betas1)),col=2,lwd=2)
legend("topright",legend=c("Weekdays","Weekends"),col=1:2,lty=1,lwd=2)

LS0tCnRpdGxlOiAiR2F1c3NpYW4gdnMgUG9pc3NvbiBSZWdyZXNzaW9uIgphdXRob3I6ICJIZWRpYmVydCBGcmVpdGFzIExvcGVzIgpkYXRlOiAiMjcvMTAvMjAyNSIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHRydWUKICAgIHRvY19kZXB0aDogMwogICAgdG9jX2NvbGxhcHNlZDogdHJ1ZQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgcGRmX2RvY3VtZW50OgogICAgdG9jOiB0cnVlCiAgICB0b2NfZGVwdGg6ICczJwpzdWJ0aXRsZTogTUMgc2ltdWxhdGlvbiBhbmQgdGhlIGJvb3N0cmFwCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKYGBgCgojIFRoZSBkYXRhClRoaXMgZGF0YSBpcyB0YWtlbiBmcm9tIFNlY3Rpb24gOC44IChNb2RlbGluZyBDb3VudCBEYXRhKSBmcm9tIEppbSBBbGJlcnQgYW5kIEppbmdjaGVuIEh1J3MgMjAyMCBib29rCipQcm9iYWJpbGl0eSBhbmQgQmF5ZXNpYW4gTW9kZWxpbmcqIChDUkMgUHJlc3MsIFRheWxvciAmIEZyYW5jaXMgR3JvdXApLiAgU3VwcG9zZSBvbmUgaXMgaW50ZXJlc3RlZCBpbiBtb25pdG9yaW5nIHRoZSBwb3B1bGFyaXR5IG9mIGEgcGFydGljdWxhciBibG9nIGFib3V0IGJhc2ViYWxsIGFuYWx5dGljcy4gIFRoZSBkYXRhIGluIHkgKGJlbG93KSBkaXNwbGF5cyB0aGUgbnVtYmVyIG9mIHZpc2l0b3JzIHZpZXdpbmcgdGhpcyBibG9nIGZvciAyOCBkYXlzIGR1cmluZyBKdW5lIG9mIDIwMTguCgoKYGBge3IgZmlnLmFsaWduPSdjZW50ZXInLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9MTB9CnkgPSBjKDk1LDgxLDg1LDEwMCwxMTEsMTMwLDExMyw5Miw2NSw3OCw5NiwxMTgsMTIwLDEwNCw5MSw5MSw3OSwxMDYsOTEsMTE0LDExMCw5OCw2MSw4NCw5NiwxMjYsMTE5LDkwKQoKbiA9IGxlbmd0aCh5KQoKZGF5cyA9IGMoImZyaSIsInNhdCIsInN1biIsIm1vbiIsInR1ZSIsIndlZCIsInRodSIpCgp0ID0gcmVwKDE6Nyw0KQoKIyBFeHBsb3JhdG9yeSBkYXRhIGFuYWx5c2lzCgpwYXIobWZyb3c9YygyLDIpKQpoaXN0KHkseGxhYj0iIixtYWluPSJOdW1iZXIgb2YgdmlzaXRvcnMiKQpib3hwbG90KHkseWxhYj0iTnVtYmVyIG9mIHZpc2l0b3JzIikKCnRzLnBsb3QoeSx0eXBlPSJiIix4bGFiPSJEYXlzIix5bGFiPSJOdW1iZXIgb2YgdmlzaXRvcnMiKQphYmxpbmUodj03LjUsbHR5PTIpCmFibGluZSh2PTE0LjUsbHR5PTIpCmFibGluZSh2PTIxLjUsbHR5PTIpCiAKcGxvdCh0LHkseGxhYj0iRGF5IG9mIHRoZSB3ZWVrIix5bGFiPSJOdW1iZXIgb2YgdmlzaXRvcnMiLGF4ZXM9RkFMU0UpCmF4aXMoMik7YXhpcygxLGF0PTE6NyxsYWI9ZGF5cykKYGBgCgojIExpbmVhciByZWdyZXNzaW9uIHZzIFBvaXNzb24gcmVncmVzc2lvbgpgYGB7ciBmaWcuYWxpZ249J2NlbnRlcicsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD01fQp3ZWVrZW5kPXJlcCgwLG4pCndlZWtlbmRbdDw9M109MQoKYyhtZWFuKHlbd2Vla2VuZD09MF0pLHNxcnQodmFyKCh5W3dlZWtlbmQ9PTBdKSkpKQpjKG1lYW4oeVt3ZWVrZW5kPT0xXSksc3FydCh2YXIoKHlbd2Vla2VuZD09MV0pKSkpCgpwYXIobWZyb3c9YygxLDIpKQpib3hwbG90KHkseWxhYj0iTnVtYmVyIG9mIHZpc2l0b3JzIikKYm94cGxvdCh5fndlZWtlbmQseGxhYj0iVHlwZSBvZiBkYXkiLG5hbWVzPWMoIldlZWtkYXkiLCJXZWVrZW5kIikseWxhYj0iTnVtYmVyIG9mIHZpc2l0b3JzIikKYGBgCgojIyBHYXVzc2lhbiByZWdyZXNzaW9uCgpgYGB7cn0Kc3VtbWFyeShsbSh5fndlZWtlbmQpKQpgYGAKCiMjIFBvaXNzb24gcmVncmVzc2lvbgoKYGBge3J9CnN1bW1hcnkoZ2xtKHl+d2Vla2VuZCxmYW1pbHk9InBvaXNzb24iKSkKCnRhYiA9IHJiaW5kKGMoMTA5LjAwMCwxMDkuMDAwLTI1LjY2NyksCmMoZXhwKDQuNjkxMzUpLGV4cCg0LjY5MTM1LTAuMjY4NTApKSkKCnJvd25hbWVzKHRhYikgPSBjKCJHYXVzc2lhbiByZWdyZXNzaW9uIiwiUG9pc3NvbiByZWdyZXNzaW9uIikKY29sbmFtZXModGFiKSA9IGMoIkludGVyY2VwdCIsIlNsb3BlIikKdGFiCmBgYAoKYGBge3J9Cm1hID0gNC43O3NkYT0wLjEKbWIgPSAtMC4zO3NkYj0wLjEKTiA9IDEwMAphbHBoYSA9IHNlcSg0LjUsNC45LGxlbmd0aD1OKQpiZXRhID0gc2VxKC0wLjUsMCxsZW5ndGg9TikKbG9nbGlrZSA9IG1hdHJpeCgwLE4sTikKcHJpb3IgPSBtYXRyaXgoMCxOLE4pCnBvc3RlcmlvciA9IG1hdHJpeCgwLE4sTikKZm9yIChpIGluIDE6TikKICBmb3IgKGogaW4gMTpOKXsKICAgIGxhbWJkYSA9IGV4cChhbHBoYVtpXStiZXRhW2pdKndlZWtlbmQpCiAgICBsb2dsaWtlW2ksal0gPSBzdW0oZHBvaXMoeSxsYW1iZGEsbG9nPVRSVUUpKQogICAgcHJpb3JbaSxqXSA9IGRub3JtKGFscGhhW2ldLG1hLHNkYSkqZG5vcm0oYmV0YVtqXSxtYixzZGIpCiAgfQpsaWtlID0gZXhwKGxvZ2xpa2UpCnBvc3QgPSBwcmlvcipsaWtlCgpwYXIobWZyb3c9YygxLDEpKQppbWFnZShhbHBoYSxiZXRhLHByaW9yLHhsYWI9ZXhwcmVzc2lvbihhbHBoYSkseWxhYj1leHByZXNzaW9uKGJldGEpKQpjb250b3VyKGFscGhhLGJldGEsbGlrZSxjb2w9NCxkcmF3bGFiZWxzPUZBTFNFLGFkZD1UUlVFLHhsYWI9ZXhwcmVzc2lvbihhbHBoYSkseWxhYj1leHByZXNzaW9uKGJldGEpLGx3ZD0yKQpjb250b3VyKGFscGhhLGJldGEscG9zdCxjb2w9MyxkcmF3bGFiZWxzPUZBTFNFLGFkZD1UUlVFLHhsYWI9ZXhwcmVzc2lvbihhbHBoYSkseWxhYj1leHByZXNzaW9uKGJldGEpLGx3ZD0yKQoKbGVnZW5kKCJ0b3ByaWdodCIsbGVnZW5kPWMoIlByaW9yIiwiTGlrZWxpaG9vZCIsIlBvc3RlcmlvciIpLGNvbD1jKDIsNCwzKSxsdHk9MSxsd2Q9MykKYGBgCgojIFNJUi1iYXNlZCBwb3N0ZXJpb3IgaW5mZXJlbmNlCgpgYGB7cn0KTSA9IDEwMDAwCmFscGhhcyA9IHJub3JtKE0sbWEsc2RhKQpiZXRhcyAgPSBybm9ybShNLG1iLHNkYikKcGxvdChhbHBoYXMsYmV0YXMseGxhYj1leHByZXNzaW9uKGFscGhhKSx5bGFiPWV4cHJlc3Npb24oYmV0YSkpCmNvbnRvdXIoYWxwaGEsYmV0YSxwcmlvcixhZGQ9VFJVRSxkcmF3bGFiZWxzPUZBTFNFLGx3ZD0yLGNvbD0yKQoKCncgPSByZXAoMCxNKQpmb3IgKGkgaW4gMTpNKQogIHdbaV0gPSBzdW0oZHBvaXMoeSxleHAoYWxwaGFzW2ldK2JldGFzW2ldKndlZWtlbmQpLGxvZz1UUlVFKSkKdyA9IGV4cCh3LW1heCh3KSkKaW5kID0gc2FtcGxlKDE6TSxzaXplPU0scmVwbGFjZT1UUlVFLHByb2I9dykKCmFscGhhczEgPSBhbHBoYXNbaW5kXQpiZXRhczEgPSBiZXRhc1tpbmRdCnBsb3QoYWxwaGFzMSxiZXRhczEpCmltYWdlKGFscGhhLGJldGEscG9zdCx4bGFiPWV4cHJlc3Npb24oYWxwaGEpLHlsYWI9ZXhwcmVzc2lvbihiZXRhKSkKY29udG91cihhbHBoYSxiZXRhLHBvc3QsYWRkPVRSVUUsZHJhd2xhYmVscz1GQUxTRSxsd2Q9Mixjb2w9MikKCgpwYXIobWZyb3c9YygxLDEpKQpwbG90KGRlbnNpdHkoZXhwKGFscGhhczEpKSx4bGltPWMoNzAsMTIwKSx5bGltPWMoMCwwLjIpLHhsYWI9IlJhdGUgb2YgdmlzaXRvcnMiLHlsYWI9IkRlbnNpdHkiLG1haW49IiIsbHdkPTIpCmxpbmVzKGRlbnNpdHkoZXhwKGFscGhhczErYmV0YXMxKSksY29sPTIsbHdkPTIpCmxlZ2VuZCgidG9wcmlnaHQiLGxlZ2VuZD1jKCJXZWVrZGF5cyIsIldlZWtlbmRzIiksY29sPTE6MixsdHk9MSxsd2Q9MikKYGBgCgo=