如何用 Rjags 随机初始化链?

How to randomly initialize the chains with Rjags?

我正在尝试随机初始化贝叶斯模型的链,今天我手动插入值,如下所示:

inits1 <- list("alpha" = 10, "beta" = 3.2, "lambda" = 2)
inits2 <- list("alpha" = 18, "beta" = 7, "lambda" = 4.6)
inits3 <- list("alpha" = 16, "beta" = 5, "lambda" = 3.1)

model.inits <- list(inits1, inits2, inits3)

我试过按以下方式执行,结果报错:

inits <- function(){ list("alpha"=rnorm(p), "beta" = rlnorm(p), "lambda" = runif(p))}

其中p->3(模型的参数个数)

错误如下:

Error: The following error occured when compiling and adapting the model using rjags: Error in setParameters(init.values[[i]], i) : RUNTIME ERROR: Dimension mismatch in values supplied for alpha

这里是 rjags 的初始化函数示例,最多可用于 8 个链:

inits_func <- function(chain){
  gen_list <- function(chain = chain){
    list( 
      alpha = rnorm(1, 14, 2),
      beta = rlnorm(1, log(5), log(1)),
      lambda = runif(1, 0.05, 5),
      .RNG.name = switch(chain,
                         "1" = "base::Wichmann-Hill",
                         "2" = "base::Marsaglia-Multicarry",
                         "3" = "base::Super-Duper",
                         "4" = "base::Mersenne-Twister",
                         "5" = "base::Wichmann-Hill",
                         "6" = "base::Marsaglia-Multicarry",
                         "7" = "base::Super-Duper",
                         "8" = "base::Mersenne-Twister"),
      .RNG.seed = sample(1:1e+06, 1)
    )
  }
  return(switch(chain,           
                "1" = gen_list(chain),
                "2" = gen_list(chain),
                "3" = gen_list(chain),
                "4" = gen_list(chain),
                "5" = gen_list(chain),
                "6" = gen_list(chain),
                "7" = gen_list(chain),
                "8" = gen_list(chain)
  )
  )
}

需要注意的重要一点是该函数应该 1) 有一个名为 chain 的参数,并且 2) 您需要手动指定要为每个链估算的参数数量。

您在函数中指定了 p=3。因此,您最终会为每个链生成三个 alpha、beta 和 lambda 参数。查看您之前使用的列表,似乎每个链都应该有一个单独的 alpha、beta 和 lambda 参数(即,您的模型中只有一个 alpha、beta 和 lambda 参数)。此外,您应该指定参数(例如,正态分布的 mu 和 sd,均匀分布的上限和下限)。我 'eyeballed' 这些基于您在三个列表中指定的值。如果你愿意,你也可以大大简化这个函数,而不是为每个链指定 RNG 算法。你写的函数可以工作,如果它被写成:

inits <- function(chain){
 list(
 alpha = rnorm(1),
 beta = rlnorm(1),
 lambda = runif(1))
}

但同样,您需要在 rnormrlnormrunif 中指定其他参数。