Hi folks,
I know that this is a much-discussed issue and I have been reading through a large number of posts, but after trying to reparameterize and test my model for over a week I would appreciate some help to see where I am going wrong.
In brief: I am looking to estimate a hierarchical model with four levels–repeated observations within individuals in a given year (on a unit scale), within individuals over the years, within geographical districts (called woredas). The n_eff on the variance parameters is low when I write the model. So far so familiar. However, when I try to reparameterize this, the problem actually becomes worse, with n_eff on the critical parameters cut roughly in half. Here are my questions:
-
may the issue stem from the fact that I currently do not include the means in the added declarations in the transformed parameter block? Or is there anything else wrong here?
-
If the means need to be added, how can I do that? I have tried something along the lines of
rt_w = a + sigma_wrt_w_tilde
rt_s = rt_s + sigma_wrt_t_tilde
rt_t = rt_s + sigma_t*rt_t_tilde
but then I am left with rt ~ normal(rt_t[id_year],sigma) in the model block, which does not match in dimensions. It seems like I am missing something obvious here, but I just cannot figure it out and it is driving me insane. -
if and when I can get this to work, might it be possible/helpful to use a de-centered parametrization also for the residual variance?
Any insights much appreciated!
Here is the original, centered model:
data{
int<lower=1> N;
int<lower=1> N_id_year;
int<lower=1> N_id;
int<lower=1> N_woreda;
vector[N] rt;
int woreda[N];
int id[N];
int id_year[N];
}
parameters{
real<lower=0> tau;
vector[N_woreda] rt_w;
vector[N_id] rt_s;
vector[N_id_year] rt_t;
real<lower=0,upper=1> a;
vector[N_id] tau_s;
vector[N_woreda] tau_w;
real<lower=0> sigma_w;
real<lower=0> sigma_s;
real<lower=0> sigma_t;
real<lower=0> sigma_tau_w;
real<lower=0> sigma_tau_s;
}
model{
vector[N] sigma;
vector[N] mu;
tau ~ cauchy( 0.25 , 0.25 );
sigma_tau_s ~ cauchy( 0.25 , 0.25 );
sigma_tau_w ~ cauchy( 0.25 , 0.25 );
sigma_w ~ cauchy( 0.25 , 0.25 );
sigma_s ~ cauchy( 0.25 , 0.25 );
sigma_t ~ cauchy( 0.25 , 0.25 );
tau_w ~ normal( 0 , sigma_tau_w );
tau_s ~ normal( 0 , sigma_tau_s );
rt_w ~ normal( 0 , sigma_w );
rt_s ~ normal( 0 , sigma_s );
rt_t ~ normal( 0 , sigma_t );
a ~ normal( 0.5 , 0.25 );
sigma = tau + tau_s[id] + tau_w[woreda];
mu = a + rt_w[woreda] + rt_s[id] + rt_t[id_year];
rt ~ normal( mu , sigma );
}
generated quantities{
vector[N] sigma;
vector[N] mu;
real dev;
dev = 0;
sigma = tau + tau_w[woreda] + tau_s[id];
mu = a + rt_w[woreda] + rt_s[id] + rt_t[id_year];
dev = dev + (-2)*normal_lpdf( rt | mu , sigma );
}
And here is the non-centered version I have been trying:
data{
int<lower=1> N;
int<lower=1> N_id_year;
int<lower=1> N_id;
int<lower=1> N_woreda;
vector[N] rt;
int woreda[N];
int id[N];
int id_year[N];
}
parameters{
real<lower=0> tau;
vector[N_woreda] rt_w_tilde;
vector[N_id] rt_s_tilde;
vector[N_id_year] rt_t_tilde;
real<lower=0,upper=1> a;
vector[N_id] tau_s;
vector[N_woreda] tau_w;
real<lower=0> sigma_w;
real<lower=0> sigma_s;
real<lower=0> sigma_t;
real<lower=0> sigma_tau_w;
real<lower=0> sigma_tau_s;
}
transformed parameters{
vector[N_woreda] rt_w;
vector[N_id] rt_s;
vector[N_id_year] rt_t;
rt_w = sigma_w*rt_w_tilde;
rt_s = sigma_s*rt_s_tilde;
rt_t = sigma_t*rt_t_tilde;
}
model{
vector[N] sigma;
vector[N] mu;
tau ~ cauchy( 0.25 , 0.25 );
sigma_tau_s ~ cauchy( 0.25 , 0.25 );
sigma_tau_w ~ cauchy( 0.25 , 0.25 );
sigma_w ~ cauchy( 0.25 , 0.25 );
sigma_s ~ cauchy( 0.25 , 0.25 );
sigma_t ~ cauchy( 0.25 , 0.25 );
tau_w ~ normal( 0 , sigma_tau_w );
tau_s ~ normal( 0 , sigma_tau_s );
rt_w_tilde ~ normal( 0 , 1 );
rt_s_tilde ~ normal( 0 , 1 );
rt_t_tilde ~ normal( 0 , 1 );
a ~ normal( 0.5 , 0.25 );
sigma = tau + tau_s[id] + tau_w[woreda];
mu = a + rt_w[woreda] + rt_s[id] + rt_t[id_year];
rt ~ normal( mu , sigma );
}
generated quantities{
vector[N] sigma;
vector[N] mu;
real dev;
dev = 0;
sigma = tau + tau_w[woreda] + tau_s[id];
mu = a + rt_w[woreda] + rt_s[id] + rt_t[id_year];
dev = dev + (-2)*normal_lpdf( rt | mu , sigma );
}