Selecting statistics for ABC model choice [R code]

As supplementary material to the ABC paper we just arXived, here is the R code I used to produce the Bayes factor comparisons between summary statistics in the normal versus Laplace example. (Warning: running the R code takes a while!)

# ABC model comparison between Laplace and normal
nobs=10^4
nsims=100
Niter=10^5
sqrtwo=sqrt(2)

probA=probB=matrix(0,nsims,3)
dista=distb=rep(0,Niter)
pro=c(.001,.01,.1)

#A) Simulation from the normal model
for (sims in 1:nsims){

  tru=rnorm(nobs)
  #stat=c(mean(tru),median(tru),var(tru))
  #stat=c(mean(tru^4),mean(tru^6))
  stat=mad(tru)
  mu=rnorm(Niter,sd=2)

  for (t in 1:Niter){

   #a) normal predictive
   prop=rnorm(nobs,mean=mu[t])
   #pstat=c(mean(prop),median(prop),var(prop))
   #pstat=c(mean(prop^4),mean(prop^6))
   pstat=mad(prop)
   dista[t]=sum((pstat-stat)^2)

   #b) Laplace predictive
   prop=mu[t]+sample(c(-1,1),nobs,rep=TRUE)*rexp(nobs,rate=sqrtwo)
   #pstat=c(mean(prop),median(prop),var(prop))
   #pstat=c(mean(prop^4),mean(prop^6))
   pstat=mad(prop)
   distb[t]=sum((pstat-stat)^2)
   }

   epsi=quantile(c(dista,distb),prob=pro)
   for (i in 1:3)
     probA[sims,i]=sum(dista<epsi[i])/(2*Niter*pro[i])
   }
#B) Simulation from the Laplace model
for (sims in 1:nsims){

  tru=sample(c(-1,1),nobs,rep=TRUE)*rexp(nobs,rate=sqrtwo)
  #stat=c(mean(tru),median(tru),var(tru))
  stat=mad(tru)
  mu=rnorm(Niter,sd=2)

  for (t in 1:Niter){

   #a) normal predictive
   prop=rnorm(nobs,mean=mu[t])
   #pstat=c(mean(prop),median(prop),var(prop))
   #pstat=c(mean(prop^4),mean(prop^6))
   pstat=mad(prop)
   dista[t]=sum((pstat-stat)^2)

   #b) Laplace predictive
   prop=mu[t]+sample(c(-1,1),nobs,rep=TRUE)*rexp(nobs,rate=sqrtwo)
   #pstat=c(mean(prop),median(prop),var(prop))
   #pstat=c(mean(prop^4),mean(prop^6))
   pstat=mad(prop)
   distb[t]=sum((pstat-stat)^2)
   }

   epsi=quantile(c(dista,distb),prob=pro)
   for (i in 1:3)
     probB[sims,i]=sum(dista<epsi[i])/(2*Niter*pro[i])
   }

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.