2

我正在使用 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 模型(移除 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]
}
4

1 回答 1

0

我不知道专门为 OpenBUGS 执行此操作的方法,但您可以查看 runjags 包中的 template.jags 函数(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 并使用它来代替:)

希望有帮助。

马特

于 2017-06-17T09:23:31.053 回答