与j“rep”类似的功能在jags中创建数组?

时间:2015-02-13 19:40:23

标签: r jags

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])) 

我仔细阅读了手册,但却无法找到实现这一目标的方法。我知道斯坦可能允许这样做,但我不能使用斯坦,因为我需要对离散参数做推断。我真的很感谢你的帮助!

此问题也发布在JAGS help forum

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

顺便说一句,你在代码的那一位使用n两次(多项式分布的LHS和RHS)是不允许的 - 虽然这可能只是一个错字:)

马特

答案 2 :(得分:0)

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

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在整个模拟过程中必须保持恒定长度。