如何在给定一组模型参数的情况下动态创建openbugs模型文件(R,bash)

时间:2017-06-15 11:13:51

标签: r bash winbugs openbugs

我使用r2openbugs拟合一组模型。这需要我为我尝试的每个模型创建一个新的模型文件。我有一组我想测试的组合(不同的协变量集,是否包括随机效应,是否计算预测等)。我想创建一个脚本,它接受一组参数(包括协变量列表,随机效果和预测的T / F)并输出一个有效的openbugs模型文件。

目前对此问题的尝试: 我目前正在编写我想要使用的每个模型,并使用R闭包在它们之间进行选择。但是,这显然会复制很多代码,并且需要很长时间。我确信可以通过根据某些参数添加/修改基本模型的文本来生成适当的模型文件,但我真的不知道从哪里开始。

我想用R来做这件事,但如果有必要,我很乐意使用bash。

示范模型

BASIC GLM MODEL

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]
}

1 个答案:

答案 0 :(得分:0)

我不知道为OpenBUGS专门做这个的方法,但你可以在runjags包(https://www.rdocumentation.org/packages/runjags/versions/2.0.4-2/topics/template.jags)中查看template.jags函数,它完全符合你对JAGS模型的要求但是基于lme4风格的模型语法。另请参见此处的“生成GLMM模板”部分:

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

如果你使用write.data = FALSE和write.inits = FALSE,那么它只是创建模型,它也应该是有效的OpenBUGS代码。或者您可以只安装JAGS并使用它:)

希望有所帮助。

马特