Как иметь переменную в блоке данных Stan быть массивом длины J >= 1?

Я использую следующую очень простую модель Стэна, сохраненную как model.stan,

data {
  int<lower=1> J;
  real x[J];
}

parameters {
  real mu[J];
  real<lower=0> sigma[J];
}

model {
  sigma ~ inv_gamma(1, 1);
  mu ~ normal(0, 10);
  x ~ normal(mu, sigma);
} 

В этой модели у меня есть одна точка данных x[j] что я модель из J разные нормальные распределения.

Когда J > 1, следующий код R работает отлично:

library(rstan)
model <- stan_model('~/model.stan')
data <- list(J = J, x = runif(J))
stan.fit <- rstan::sampling(model, data=data)

Однако, когда J = 1, я получаю следующую ошибку:

failed to create the sampler; sampling not done

Как я могу написать эту модель Стэна, чтобы она работала для всех J >= 1?

1 ответ

Решение

Это общая проблема (и она усугубляется ошибкой, при которой описание проблемы в rstan 2.18.1 подавляется). Если вы объявляете реальный массив в блоке данных программы Stan, соответствующий объект R должен иметь атрибут измерения. Таким образом,

stan.fit <- sampling(model, data = list(J = J, x = as.array(runif(J))))

работает (хотя есть много расходящихся переходов), потому что x имеет dim атрибут, который J,

Другие вопросы по тегам