与 jags 中的 R "rep" 类似的功能来创建数组?

Similar function to R "rep" in jags to create array?

jags中是否有与R函数rep类似的函数?我想使用如下类似的代码创建一个数组:

n ~ dmulti(pi, N) # pi is a 3 dimensional probability vector, N is fixed
  # the dimension of n is hard coded in this line:
a <- c(rep(0, n[1]), rep(1, n[2]), rep(2, n[3])) 

我通读了手册,但找不到实现此目的的方法。我知道 Stan 可能会允许这样做,但我不能使用 Stan,因为我需要对离散参数进行推理。非常感谢您的帮助!

此问题也发布在 JAGS help forum

简短的回答是否定的,恐怕不是。 JAGS/BUGS 语言的规定之一是变量必须具有固定的维度(每个元素只定义一次)——在您的示例中,a 将根据向量 n 更改维度大小。可能有其他方法可以获得您正在寻找的结果,但不使用这种方法。

顺便说一下,您在那段代码(多项式分布的左轴和右轴)中使用了两次 n,这是不允许的 - 虽然这可能只是一个错字:)

马特

您可以用一些循环填充向量:

library(R2jags)

M <- function() {
  for (i in 1:n[1]) {
    a[i] <- 0
  }
  for (i in 1:n[2]) {
    a[i + n[1]] <- 1
  }
  for (i in 1:n[3]) {
    a[i + sum(n[1:2])] <- 2
  }
}

j <- jags(list(n=3:5), NULL, 'a', M, DIC=FALSE)
j$BUGSoutput$mean$a

## [1] 0 0 0 1 1 1 1 2 2 2 2 2

然而,正如@MattDenwood 所暗示的,如果 n 的元素总和是可变的,这将引发错误 - a 在整个模拟过程中必须具有恒定长度。

我已经在开发版本(未来的 JAGS 4.0.0)中添加了一个 rep 函数,正如 Matt 和 John 所提到的,这需要固定第二个参数,以便得到的向量的长度可以在编译时确定。