I just wrote a short post on how to use ternary operator to get optional/conditional parameters and/or data in Stan if anyone’s interested.

http://www.martinmodrak.cz/2018/04/24/optional-parameters/data-in-stan/

I just wrote a short post on how to use ternary operator to get optional/conditional parameters and/or data in Stan if anyone’s interested.

http://www.martinmodrak.cz/2018/04/24/optional-parameters/data-in-stan/

9 Likes

Nice, I was just looking for this feature. Here’s a another variant:

```
data {
int N;
vector[N] X;
real sigma_mu;
real<lower=0> sigma_sigma;
}
parameters {
real mu;
real<lower=0> sigma[(sigma_sigma > 0) ? 1 : 0];
}
model {
real sigma_in = (sigma_sigma > 0) ? sigma[1] : sigma_mu;
// conditonal prior on sigma
if (sigma_sigma > 0) sigma[1] ~ normal(sigma_mu, sigma_sigma);
// likelihood where sigma_in is either a uncertain parameter or a deterministic data input
X ~ normal(mu, sigma_in);
}
```

Calling the above Stan model with `sigma_sigma`

set to a non zero value treats ´sigma_in´ as an uncertain parameter that is sampled during the HMC inference. While setting `sigma_sigma`

set to zero treats the ´sigma_in´ as an deterministic data input, which can result in a more efficient computation (the model above gets almost halved execution time).

Perhaps, this kind of optimization could be done within the Stan language? A sampling statement `normal_test_if_data_or_parameter(mu, sigma)`

could maybe test if ´sigma´ is a data input & equal to zero, in which case sampling is unnecessary.

Update: a less verbose variant.