Как случайным образом инициализировать цепочки с помощью Rjags? - PullRequest
0 голосов
/ 25 февраля 2020

Я пытаюсь инициализировать цепочки байесовской модели случайным образом, сегодня я делаю это, вставляя значения вручную, например:

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): ОШИБКА ВРЕМЕНИ: Несоответствие размеров в значениях, предоставленных для альфа

1 Ответ

0 голосов
/ 25 февраля 2020

Вот пример функции инициализации для 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.

...