我正在尝试随机初始化贝叶斯模型的链,今天我将其手动插入值,如下所示:
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(模型的参数数量)
跟随错误:
错误:使用rjags编译和调整模型时发生以下错误:setParameters(init.values [[i]],i)中的错误:运行时错误:为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;对于均匀分布,请指定上限和下限)。我根据您在三个列表中指定的值“盯梢”了这些。您也可以极大地简化此功能,并且如果您愿意的话,也可以不为每个链指定RNG
算法。您编写的函数可以改为:
inits <- function(chain){
list(
alpha = rnorm(1),
beta = rlnorm(1),
lambda = runif(1))
}
但是同样,您想在rnorm
,rlnorm
和runif
中指定其他参数。