In my Stan programme’s data block, I have a matrix of parameters:
// the coefficients for control variables
row_vector[10] gamma[2];
I want each of these 20 parameters to be restricted in a different way (positive, negative, or unrestricted). In the data block, I have a matrix that describes these restrictions:
// the matrix of parameter restrictions
row_vector[10] params_restr[2];
It has 1s, -1s and 0s, standing for the restrictions mentioned above.
If gamma was just a single number, I would do something like:
Update: a solution I have found to work: just truncate the priors. However, I am not sure how generic this solution is. Also, it seems to be quite slow, so I’d still welcome better ideas.
for (k in 1:2) {
for (ctrl in 1:10) {
gamma[k, ctrl] ~ normal(0, 1) T[params_restr[k, ctrl] > 0 ? 0 : negative_infinity(),
params_restr[k, ctrl] < 0 ? 0 : positive_infinity()];
}
}
EDIT: Is it possible to vectorize it, to avoid the double loop? I tried, but with no success.
If you truncate your priors you’ll also want to constrain your variables (to prevent the sampler from going outside of the support of the truncated distribution – this’ll give HMC trouble), so that doesn’t get around the problem.
Also, since your priors aren’t a function of other parameters, you really don’t need that truncation either. The normalization for the truncation is constant so you can leave it out.