How to use bimodal priors for bayesian data analysis in STAN

I tried adding a bi-modal prior in STAN for a homework exercise on Bayesian Data Analysis. At first, I thought this could work:

model{
  mu ~ normal(-0.5,0.3) + normal(0.5,0.3);
}

But it doesn’t. I had to dig deeper and I thought I could simply add multiple times to the log-posterior due to a sideremark of Bob Carpenter:

target += normal_lpdf(mu|.5,0.3);
target += normal_lpdf(mu|-.5,0.3);

Which also does not work. Finally, the solution is akin to the mixture model in the STAN manual:

  target += log_sum_exp(normal_lpdf(mu|.5,0.3),normal_lpdf(mu|-.5,0.3));

This results in beautiful bi-modal priors:

I did not find anything on google or the manual of how to do this. If there is a smarter way to do it, please leave a comment.


library(rstan)

model <- "
data { 
}
parameters {
real mu;
} 
transformed parameters {
}
model {
//mu ~ normal(10,1);
//mu ~ normal(-10,1);
target += log_sum_exp(normal_lpdf(mu|-.5,.3),normal_lpdf(mu|.5,.3));

}"



samples <- stan(model_code=model, 
  iter=2000, 
  chains=4, 
  thin=1,
  # seed=123 # Setting seed; Default is random seed
)

ggmcmc::ggs_density(ggmcmc::ggs(samples))+theme_minimal()

Categorized: Blog

Tagged:

Leave a Reply

25 − 16 =