Based on an example by Ben Lambert in “A student’s guide to Bayesian statistics”.

1 Description of experiment

A biased coin is being tossed (probability of heads \(\theta > 0.5\)). The coin is tossed \(n\) times, recording the number of heads \(X_i\). The entire experiment is repeated 50 times. In every try the parameters \(\theta\) and \(n\) are the same.

2 Model definition:

\[ X_i \sim binomial(n, \theta) \] \[ n \sim \text{discrete-uniform}(11,20) \] \[ \theta \sim beta(7,2) \] Priors:

Binomial and Beta distributions:

par(mfrow=c(1,3))
plot(dbinom(c(0:13),13,0.6),type="h",xlab="x",ylab="density",main="binomial(13,0.6)")
plot(dunif(c(1:25),11,020),type="h",xlab="x",ylab="density",main="uniform(11,20)")
xticks<-seq(0,1,length=50)
plot(x=xticks, y=dbeta(xticks,7,2), type="l",xlab="x",ylab="density",main="beta(7,2)")

3 The code

Prepare sample data and load the model. The model will only see the list of numbers \(X\)

library(rstan)
set.seed(2020)
X<-rbinom(50, 13, 0.6)
K<-length(X)
shift<-10
aModel<-stan_model('~\\R\\bayes-talk\\coinFlip.stan')
X
 [1]  7  8  7  8 10 10 10  8 12  7  7  7  6  8  8  8  5  7  8  9  9 10  6  5  6 10  8  7  8  8  5 10  5  5 13  8 12  5  8  9  4  9  6  6
[45]  7  8  8  7  6 10

Run sampler

options(mc.cores=4)
fit<-sampling(aModel,data=list(X=X,K=K),iter=1000,chains=4)

Extract model parameters, estimate \(\theta\)

fit_states<-subset(dimnames(fit)$parameters, grepl("^pState",dimnames(fit)$parameters))
fit_ss<-extract(fit, pars=c('theta',fit_states))
lmean<-lapply(fit_ss, mean)
(mtheta<-lmean$theta)
[1] 0.5082172
quantile(fit_ss$theta,probs=c(0.05,0.95))
       5%       95% 
0.4030376 0.6067676 

Estimate the number of tosses \(n\)

maxpstate<-which.max(as.numeric(lmean[fit_states]))
(maxpstate<-maxpstate+shift)
[1] 15

Plot model parameters space

par(mfrow=c(2,5))
ylim<-c(0,1)
for (i in 1:length(fit_states)) {
  with(fit_ss, {
    plot(x=theta, ylim=ylim, ylab=paste0("p(Tosses=",i+shift,")"),
         main=paste0("p=",round(as.numeric(lmean[fit_states[i]]),digits=2)), 
         pch=".", y=fit_ss[[fit_states[i]]])
    abline(v=quantile(theta,probs=c(0.05,0.5,0.95)), col="gray")
  })
}

4 Analysis

Properties of binomial distribution:

Given these, let’s evaluate model fit by comparing model-predicted values of sample mean and standard deviation against what the sample has and what the theory provides


maxpstate*mtheta
[1] 7.623259
mean(X)
[1] 7.76
13*0.6
[1] 7.8
sqrt(maxpstate*mtheta*(1-mtheta))
[1] 1.93623
sd(X)
[1] 1.964584
sqrt(13*0.6*0.4)
[1] 1.766352

Differences are explained by small sample size. On larger samples all estimated parameters converge to true model parameters.

LS0tDQp0aXRsZTogIkJpYXNlZCBjb2luLCB1bmtub3duIG51bWJlciBvZiB0b3NzZXMiDQpvdXRwdXQ6IA0KICBodG1sX25vdGVib29rOiANCiAgICBmaWdfd2lkdGg6IDgNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRoZW1lOiBwYXBlcg0KICAgIHRvYzogeWVzDQotLS0NCkJhc2VkIG9uIGFuIGV4YW1wbGUgYnkgQmVuIExhbWJlcnQgaW4gIkEgc3R1ZGVudCdzIGd1aWRlIHRvIEJheWVzaWFuIHN0YXRpc3RpY3MiLg0KIVtdKEM6L1VzZXJzL2liYWdsYXkvRG9jdW1lbnRzL1IvYmF5ZXMtdGFsay9jb2luLmpwZykNCg0KIyBEZXNjcmlwdGlvbiBvZiBleHBlcmltZW50DQpBIGJpYXNlZCBjb2luIGlzIGJlaW5nIHRvc3NlZCAocHJvYmFiaWxpdHkgb2YgaGVhZHMgJFx0aGV0YSA+IDAuNSQpLiBUaGUgY29pbiBpcyB0b3NzZWQgJG4kIHRpbWVzLCByZWNvcmRpbmcgdGhlIG51bWJlciBvZiBoZWFkcyAkWF9pJC4gVGhlIGVudGlyZSBleHBlcmltZW50IGlzIHJlcGVhdGVkIDUwIHRpbWVzLiBJbiBldmVyeSB0cnkgdGhlIHBhcmFtZXRlcnMgJFx0aGV0YSQgYW5kICRuJCBhcmUgdGhlIHNhbWUuDQoNCiMgTW9kZWwgZGVmaW5pdGlvbjoNCiQkIFhfaSBcc2ltIGJpbm9taWFsKG4sIFx0aGV0YSkgJCQNCiQkIG4gXHNpbSBcdGV4dHtkaXNjcmV0ZS11bmlmb3JtfSgxMSwyMCkgJCQNCiQkIFx0aGV0YSBcc2ltIGJldGEoNywyKSAkJA0KICBQcmlvcnM6ICANCg0KKiAgQXNzdW1pbmcgdGhlIG51bWJlciBvZiB0b3NzZXMgY2FuIGJlIGFueSBpbnRlZ2VyIG51bWJlciBiZXR3ZWVuIDExIGFuZCAyMC4gIA0KKiAgQXNzdW1pbmcgdGhlIGNvaW4gaXMgYmlhc2VkIGZvciBoaWdoZXIgbnVtYmVyIG9mIGhlYWRzLCB0aGUgcHJvYmFiaWxpdHkgb2YgaGVhZHMgaXMgfjAuNzguICANCg0KQmlub21pYWwgYW5kIEJldGEgZGlzdHJpYnV0aW9uczoNCmBgYHtyIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTEwfQ0KcGFyKG1mcm93PWMoMSwzKSkNCnBsb3QoZGJpbm9tKGMoMDoxMyksMTMsMC42KSx0eXBlPSJoIix4bGFiPSJ4Iix5bGFiPSJkZW5zaXR5IixtYWluPSJiaW5vbWlhbCgxMywwLjYpIikNCnBsb3QoZHVuaWYoYygxOjI1KSwxMSwwMjApLHR5cGU9ImgiLHhsYWI9IngiLHlsYWI9ImRlbnNpdHkiLG1haW49InVuaWZvcm0oMTEsMjApIikNCnh0aWNrczwtc2VxKDAsMSxsZW5ndGg9NTApDQpwbG90KHg9eHRpY2tzLCB5PWRiZXRhKHh0aWNrcyw3LDIpLCB0eXBlPSJsIix4bGFiPSJ4Iix5bGFiPSJkZW5zaXR5IixtYWluPSJiZXRhKDcsMikiKQ0KYGBgDQoNCg0KIyBUaGUgY29kZQ0KUHJlcGFyZSBzYW1wbGUgZGF0YSBhbmQgbG9hZCB0aGUgbW9kZWwuIFRoZSBtb2RlbCB3aWxsIG9ubHkgc2VlIHRoZSBsaXN0IG9mIG51bWJlcnMgJFgkDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShyc3RhbikNCnNldC5zZWVkKDIwMjApDQpYPC1yYmlub20oNTAsIDEzLCAwLjYpDQpLPC1sZW5ndGgoWCkNCnNoaWZ0PC0xMA0KYU1vZGVsPC1zdGFuX21vZGVsKCd+XFxSXFxiYXllcy10YWxrXFxjb2luRmxpcC5zdGFuJykNClgNCmBgYA0KUnVuIHNhbXBsZXINCmBgYHtyfQ0Kb3B0aW9ucyhtYy5jb3Jlcz00KQ0KZml0PC1zYW1wbGluZyhhTW9kZWwsZGF0YT1saXN0KFg9WCxLPUspLGl0ZXI9MTAwMCxjaGFpbnM9NCkNCmBgYA0KRXh0cmFjdCBtb2RlbCBwYXJhbWV0ZXJzLCBlc3RpbWF0ZSAkXHRoZXRhJA0KYGBge3J9DQpmaXRfc3RhdGVzPC1zdWJzZXQoZGltbmFtZXMoZml0KSRwYXJhbWV0ZXJzLCBncmVwbCgiXnBTdGF0ZSIsZGltbmFtZXMoZml0KSRwYXJhbWV0ZXJzKSkNCmZpdF9zczwtZXh0cmFjdChmaXQsIHBhcnM9YygndGhldGEnLGZpdF9zdGF0ZXMpKQ0KbG1lYW48LWxhcHBseShmaXRfc3MsIG1lYW4pDQoobXRoZXRhPC1sbWVhbiR0aGV0YSkNCnF1YW50aWxlKGZpdF9zcyR0aGV0YSxwcm9icz1jKDAuMDUsMC45NSkpDQpgYGANCkVzdGltYXRlIHRoZSBudW1iZXIgb2YgdG9zc2VzICRuJA0KYGBge3J9DQptYXhwc3RhdGU8LXdoaWNoLm1heChhcy5udW1lcmljKGxtZWFuW2ZpdF9zdGF0ZXNdKSkNCihtYXhwc3RhdGU8LW1heHBzdGF0ZStzaGlmdCkNCmBgYA0KDQpQbG90IG1vZGVsIHBhcmFtZXRlcnMgc3BhY2UNCmBgYHtyIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTEwfQ0KcGFyKG1mcm93PWMoMiw1KSkNCnlsaW08LWMoMCwxKQ0KZm9yIChpIGluIDE6bGVuZ3RoKGZpdF9zdGF0ZXMpKSB7DQogIHdpdGgoZml0X3NzLCB7DQogICAgcGxvdCh4PXRoZXRhLCB5bGltPXlsaW0sIHlsYWI9cGFzdGUwKCJwKFRvc3Nlcz0iLGkrc2hpZnQsIikiKSwNCiAgICAgICAgIG1haW49cGFzdGUwKCJwPSIscm91bmQoYXMubnVtZXJpYyhsbWVhbltmaXRfc3RhdGVzW2ldXSksZGlnaXRzPTIpKSwgDQogICAgICAgICBwY2g9Ii4iLCB5PWZpdF9zc1tbZml0X3N0YXRlc1tpXV1dKQ0KICAgIGFibGluZSh2PXF1YW50aWxlKHRoZXRhLHByb2JzPWMoMC4wNSwwLjUsMC45NSkpLCBjb2w9ImdyYXkiKQ0KICB9KQ0KfQ0KYGBgDQojIEFuYWx5c2lzDQogIFByb3BlcnRpZXMgb2YgYmlub21pYWwgZGlzdHJpYnV0aW9uOiAgDQoNCiogIFByb2JhYmlsaXR5IHRoYXQgYSBjb3VudCBvZiBoZWFkcyBlcXVhbHMgeCwgZ2l2ZW4gYSBudW1iZXIgb2YgdG9zc2VzIG4gYW5kIGEgcHJvYmFiaWxpdHkgb2YgaGVhZHMgcDoNCiQkIHByb2IoeCkgPSBcYmlub217bn17eH1wXngoMS1wKV57bi14fSAkJA0KDQoqICBFeHBlY3RlZCB2YWx1ZToNCiQkIFxtYXRocm17RX0oWCk9bnAgJCQNCg0KKiAgU3RhbmRhcmQgZGV2aWF0aW9uOg0KJCQgc2QoWCk9XHNxcnR7bnAoMS1wKX0gJCQNCg0KICBHaXZlbiB0aGVzZSwgbGV0J3MgZXZhbHVhdGUgbW9kZWwgZml0IGJ5IGNvbXBhcmluZyBtb2RlbC1wcmVkaWN0ZWQgdmFsdWVzIG9mIHNhbXBsZSBtZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gYWdhaW5zdCB3aGF0IHRoZSBzYW1wbGUgaGFzIGFuZCB3aGF0IHRoZSB0aGVvcnkgcHJvdmlkZXMNCg0KYGBge3J9DQoNCm1heHBzdGF0ZSptdGhldGENCm1lYW4oWCkNCjEzKjAuNg0Kc3FydChtYXhwc3RhdGUqbXRoZXRhKigxLW10aGV0YSkpDQpzZChYKQ0Kc3FydCgxMyowLjYqMC40KQ0KYGBgDQpEaWZmZXJlbmNlcyBhcmUgZXhwbGFpbmVkIGJ5IHNtYWxsIHNhbXBsZSBzaXplLiBPbiBsYXJnZXIgc2FtcGxlcyBhbGwgZXN0aW1hdGVkIHBhcmFtZXRlcnMgY29udmVyZ2UgdG8gdHJ1ZSBtb2RlbCBwYXJhbWV0ZXJzLg==