Setup white noise model in brms

#1

Hi there, I would like to use brms to estimate mean and variance per group. I made it work in stan but would like to use brms to do the same thing. Here is the stan code:

data {
int<lower=1> Ntotal ;
int<lower=1> Ngroup ;
int<lower=1> Nsample ; // for priors
real y[Ntotal] ;
int group[Ntotal] ;
real meanY ;
real sdY ;
}
transformed data {
real normalSigma ;
normalSigma = sdY*10 ;
}
parameters {
real mu[Ngroup] ;
real<lower=0> sigma[Ngroup] ;
real mean_mu ;
real<lower=0> sigma_mu ;
}
model {
// hyper
mean_mu ~ normal(meanY, 100);
sigma_mu ~ uniform(1, 100) ;
// priors
sigma ~ cauchy( sdY , 100 ) ;
mu ~ normal( mean_mu, sigma_mu ) ;
for (i in 1:Ntotal){
y[i] ~ normal( mu[group[i]] , sigma[group[i]] ) ;
}
}
generated quantities{
vector[Ntotal] logLikelihood ; // for model comparison
vector[Ntotal] y_post ; // for posterior checking
vector[Nsample] mean_mu_prior ; // for checking priors
vector[Nsample] sigma_mu_prior ;
vector[Nsample] sigma_prior ;
vector[Nsample] mu_prior ;
for (i in 1:Ntotal){
logLikelihood[i] = normal_lpdf(y[i] | mu[group[i]], sigma[group[i]]) ;
y_post[i] = normal_rng(mu[group[i]], sigma[group[i]]) ;
}
for (i in 1:Nsample){
mean_mu_prior[i] = normal_rng(meanY, 100) ;
sigma_mu_prior[i] = uniform_rng(1, 100) ;
sigma_prior[i] = cauchy_rng(sdY, 100) ;
mu_prior[i] = normal_rng(mean_mu_prior[i], sigma_mu_prior[i]) ;
}
}

In brms: I have the code:
fit1 <- brm(bf(deltaZ ~ Overlap_ID -1, sigma ~ Overlap_ID-1 ) , data=residual_df, family = gaussian(), warmup=1000, iter=5000, chains =4, inits=“random”, cores=4)

Basically, I would like brms to estimate mu[i] and sigma[i] per group (Overlap_ID). But the estimates of the sigma’s are way too small than what I got from Stan.

Thanks.

0 Likes

#2

By default, brms models residual SDs through a log link. So, you can just exp(sigma) for each posterior sample, then summarize.

0 Likes

#3

Thanks Matti. I figured out also that the estimates of SDs are in log scale in brms.

0 Likes