Как динамически создать файл модели openbugs (R, bash) с учетом набора параметров модели

Я подгоняю набор моделей, используя r2openbugs. Это требует от меня создания нового файла модели для каждой модели, которую я пробую. У меня есть набор комбинаций, которые я хочу протестировать (различные ковариатные наборы, включать ли случайные эффекты, вычислять ли прогнозы и т. Д.). Я хотел бы создать сценарий, который принимает набор параметров (список включаемых ковариат, T/F для случайных эффектов и предсказаний) и выводит действительный файл модели openbugs.

Текущая попытка решить эту проблему: в настоящее время я пишу каждую модель, которую хочу использовать, и выбираю между ними R-замыкания. Однако это, очевидно, дублирует много кода и занимает много времени. Я уверен, что возможно создать соответствующий файл модели, добавив / изменив текст для базовой модели в зависимости от некоторых параметров, но я не знаю, с чего начать.

Я хотел бы использовать R, чтобы сделать это, но был бы счастлив использовать bash, если это необходимо.

Пример модели:

ОСНОВНАЯ МОДЕЛЬ GLM

create_model(random_effects = F, 
             predictions = F, 
             cov_names = c(cov1, cov2, cov3))

вернется

for (k in 1:N_data) {
  BetaX_data[k] <- beta[1] + 
                   beta[2] * cov1[k] + 
                   beta[3] * cov2[k] + 
                   beta[4] * cov3[k]

  logit(pi_data[k]) <- BetaX_data[k]
  m[k] ~ dbin(pi_data[k], n[k])
}
## PRIORS ##
for (g in 1:N_cov) {
  beta[g] ~ dnorm(0, 0.00001) 
}

GLMM MODEL (аналогично предыдущей модели, но добавлены строки для случайного эффекта)

create_model(random_effects = T, 
             predictions = F, 
             cov_names = c(cov1, cov2, cov3))

вернется

for (i in 1:N_loc) { ## additional lines
  U[i] ~ dnorm(0, tau_iid)
}
for (k in 1:N_data) {
  BetaX_data[k] <- beta[1] + 
                   beta[2] * cov1[k] + 
                   beta[3] * cov2[k] + 
                   beta[4] * cov3[k]

  logit(pi_data[k]) <- BetaX_data[k] + U[location_id[k]]
  m[k] ~ dbin(pi_data[k], n[k])
}
## PRIORS ##
for (g in 1:N_cov) {
  beta[g] ~ dnorm(0, 0.00001) 
}
tau_iid ~ dgamma(0.001,0.001) ## additional lines

GLM MODEL (с удаленным cov2)

create_model(random_effects = F, 
             predictions = F, 
             cov_names = c(cov1, cov3))

вернется

for (k in 1:N_data) {
  BetaX_data[k] <- beta[1] + 
                   beta[2] * cov1[k] + 
                   beta[3] * cov3[k]  ## lines changed

  logit(pi_data[k]) <- BetaX_data[k]
  m[k] ~ dbin(pi_data[k], n[k])
}
## PRIORS ##
for (g in 1:N_cov) {
  beta[g] ~ dnorm(0, 0.00001) 
}

GLM МОДЕЛЬ (с предсказаниями)

create_model(random_effects = F, 
             predictions = T, 
             cov_names = c(cov1, cov2, cov3))

вернется

for (k in 1:N_data) {
  BetaX_data[k] <- beta[1] + 
                   beta[2] * cov1[k] + 
                   beta[3] * cov2[k] + 
                   beta[4] * cov3[k]

  logit(pi_data[k]) <- BetaX_data[k]
  m[k] ~ dbin(pi_data[k], n[k])
}
## PRIORS ##
for (g in 1:N_cov) {
  beta[g] ~ dnorm(0, 0.00001) 
}
## PREDICTIONS ##
for(l in 1:N_pred) { # additional lines which also 
                     # change depending on covariate set
  BetaX_pred[l] <- beta[1] + 
                   beta[2] * cov1[l] + 
                   beta[3] * cov2[l] + 
                   beta[4] * cov3[l]

  logit(pi_pred[l]) <- BetaX_pred[l]
}

1 ответ

Я не знаю способа сделать это специально для OpenBUGS, но вы можете проверить функцию template.jags в пакете runjags ( https://www.rdocumentation.org/packages/runjags/versions/2.0.4-2/topics/template.jags), которая в точности соответствует тому, что вы запрашиваете для моделей JAGS, но основана на синтаксисе модели в стиле lme4. Смотрите также раздел "Создание шаблона GLMM" здесь:

http://runjags.sourceforge.net/quickjags.html

Если вы использовали write.data=FALSE и write.inits=FALSE, то он просто создает модель, которая также должна быть действительным кодом OpenBUGS. Или вы можете просто установить JAGS и использовать его вместо этого:)

Надеюсь, это поможет.

Matt

Другие вопросы по тегам