如何让 Stan 的数据块中的变量成为长度为 J >= 1 的数组?

How to have a variable in the data block of Stan be an array of length J >= 1?

我正在使用以下保存为 model.stan

的非常简单的 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

我如何编写这个 Stan 模型使其适用于所有 J >= 1?

这是一个常见问题(并且在 rstan 2.18.1 中隐藏了问题描述的错误使问题更加复杂)。如果在 Stan 程序的数据块中声明一个真正的数组,则对应的 R 对象必须具有维度属性。因此,

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

做 运行(虽然有很多不同的转换)因为 x 有一个 dim 属性是 J.