“Left-hand side of sampling statement (~) may contain a non-linear transform of a parameter or local variable.
If it does, you need to include a target += statement with the log absolute determinant of the Jacobian of the transform. Left-hand-side of sampling statement:
obs ~ normal(…)”
This happens because you’re declaring eps
as a transformed parameter, then placing a prior on it in the model block. You probably want to move vector[N] eps;
up to the parameters block. Here’s a thread that goes into detail on placing priors on transformed parameters: Putting priors on transformed parameters .
I’m guessing this isn’t your intention though, so just rerun the model like this and it should initialize (it did for me).
data {
int<lower=1> N;
vector[N] x;
int<lower=0,upper=1> y[N];
}
parameters {
real<lower=0> sigma;
real<lower=0> beta;
real mu;
vector[N] eps;
}
transformed parameters{
//vector[N] eps;
vector[N] obs;
vector[N] q_obs;
obs = x + sigma*eps;
q_obs = beta*(2*Phi((mu-obs)/sigma)-1);
}
model {
mu ~ normal(12.5,3);
eps ~ normal(0,1);
y ~ bernoulli_logit(q_obs);
}
Unrelated to the initialization issue, you may want to place stronger prior/constraint on sigma
to keep it away from 0 so that the (mu-obs)/sigma
term doesn’t blow up. around slide 28 in this presentation by Andrew Gelman he gives a good example for a nonnegative parameter prior that avoids the boundary.