Short blog on conditional parameters 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.