如何用 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))
}
但同样,您需要在 rnorm
、rlnorm
和 runif
中指定其他参数。
我正在尝试随机初始化贝叶斯模型的链,今天我手动插入值,如下所示:
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))
}
但同样,您需要在 rnorm
、rlnorm
和 runif
中指定其他参数。