Вот пример функции инициализации для 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
. Поэтому вы в конечном итоге генерируете три альфа, бета и лямбда параметра для каждой цепочки. Если посмотреть на списки, которые вы использовали ранее, то может показаться, что в каждой цепочке должен быть один параметр альфа, бета и лямбда (т. Е. В вашей модели есть только один параметр альфа, бета и лямбда). Кроме того, вы должны указать параметры для (например, mu и sd для нормального распределения, верхняя и нижняя границы для равномерного распределения). Я «оценил» их, основываясь на значениях, которые вы указали в трех списках. Вы также можете значительно упростить эту функцию и не указывать алгоритм RNG
для каждой цепочки, если хотите. Функция, которую вы написали, могла бы работать, если бы вместо этого она была написана как:
inits <- function(chain){
list(
alpha = rnorm(1),
beta = rlnorm(1),
lambda = runif(1))
}
Но, опять же, вы захотите указать другие параметры в rnorm
, rlnorm
и runif
.