Как иметь переменную в блоке данных 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
,