Как динамически создать файл модели 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