BUGS models for Bayesian analyses implemented in MetaAnalyst
This appendix lists the model files generated by Meta-Analyst and passed to BUGS for Bayesian analyses. After any (Bayesian) analysis, you can elect to view these yourself by navigating to the “.brugs_tmp” subdirectory in the Meta-Analyst folder and opening the “model.txt” file.
Appendix A......................................................................................................................... 1
Appendix A Contents..................................................................................................... 1
Binary, two group, odds ratio, no control rate, no covariates..................................... 2
Binary, two group, risk ratio, no control rate, no covariates....................................... 3
Binary, two group, no control rate, one covariate....................................................... 4
Binary, two group, linear control rate, no covariates................................................... 5
Binary, two group, linear control rate, one covariate.................................................. 6
Binary, two group, quadratic control rate, no covariates............................................ 7
Binary, two group, quadratic control rate, one covariate............................................ 8
Binary, one group........................................................................................................ 9
Continuous, two group, no control rate, no covariates.............................................. 10
Continuous, two group, no control rate, one covariate............................................. 11
Continuous, two group, linear control rate, no covariates......................................... 12
Continuous, two group, linear control rate, one covariate......................................... 13
Continuous, one group.............................................................................................. 14
Diagnostic.................................................................................................................. 15
References..................................................................................................................... 16
model {
for (i in 1:N) {
rc[i] ~ dbin(pc[i],nc[i])
rt[i] ~ dbin(pt[i],nt[i])
logit(pc[i]) <- mu[i]
logit(pt[i]) <- mu[i] + d[i]
d[i] ~ dnorm(delta,invtau2)
mu[i] ~ dnorm(mu.bar, invtauc2)
d.exp[i] <- exp(d[i])
}
delta ~ dnorm(0.0, precnorm)
delta.exp <- exp(delta)
mu.bar ~ dnorm(0.0, precnorm)
invtau2 ~ dgamma(gamma.a, gamma.b)
invtauc2 ~ dgamma(gamma.c.a, gamma.c.b)
tau2 <- 1/invtau2
tauc2 <- 1/invtauc2
cr.bar <- exp(mu.bar) / (exp(mu.bar) + 1)
}
model {
for (i in 1:N) {
rc[i] ~ dbin(pc[i],nc[i])
rt[i] ~ dbin(pt[i],nt[i])
logit(pc[i]) <- mu[i]
log(pt[i]) <- mu[i] - log(1 + exp(mu[i])) + d[i]
d[i] ~ dnorm(delta,invtau2)
mu[i] ~ dnorm(mu.bar, invtauc2)
d.exp[i] <- exp(d[i])
}
delta ~ dnorm(0.0, precnorm)
delta.exp <- exp(delta)
mu.bar ~ dnorm(0.0, precnorm)
invtau2 ~ dgamma(gamma.a, gamma.b)
invtauc2 ~ dgamma(gamma.c.a, gamma.c.b)
tau2 <- 1/invtau2
tauc2 <- 1/invtauc2
cr.bar <- exp(mu.bar)
}
Here on we show only the odds ratio model files (the risk
ratio models are analogous).
Binary,
two group, no control rate, one covariate
model {
for (i in 1:N) {
rc[i] ~ dbin(pc[i],nc[i])
rt[i] ~ dbin(pt[i],nt[i])
logit(pc[i]) <- mu[i]
logit(pt[i]) <- mu[i] + d[i]
d.star[i] <- delta + cov0 * (x0[i] - mean(x0[]))
d[i] ~ dnorm(d.star[i],invtau2)
mu[i] ~ dnorm(mu.bar, invtauc2)
d.exp[i] <- exp(d[i])
}
delta ~ dnorm(0.0, precnorm)
delta.exp <- exp(delta)
mu.bar ~ dnorm(0.0, precnorm)
invtau2 ~ dgamma(gamma.a, gamma.b)
invtauc2 ~ dgamma(gamma.c.a, gamma.c.b)
tau2 <- 1/invtau2
tauc2 <- 1/invtauc2
cr.bar <- exp(mu.bar) / (exp(mu.bar) + 1)
cov0 ~ dnorm(0.0, precnorm)
}
model {
for (i in 1:N) {
rc[i] ~ dbin(pc[i],nc[i])
rt[i] ~ dbin(pt[i],nt[i])
logit(pc[i]) <- mu[i]
logit(pt[i]) <- mu[i] + d[i]
d.star[i] <- delta + beta*(mu[i] - mu.bar)
d[i] ~ dnorm(d.star[i],invtau2)
mu[i] ~ dnorm(mu.bar, invtauc2)
d.exp[i] <- exp(d[i])
}
delta ~ dnorm(0.0, precnorm)
delta.exp <- exp(delta)
beta ~ dnorm(0.0, precnorm)
mu.bar ~ dnorm(0.0, precnorm)
invtau2 ~ dgamma(gamma.a, gamma.b)
invtauc2 ~ dgamma(gamma.c.a, gamma.c.b)
tau2 <- 1/invtau2
tauc2 <- 1/invtauc2
cr.bar <- exp(mu.bar) / (exp(mu.bar) + 1)
}
model {
for (i in 1:N) {
rc[i] ~ dbin(pc[i],nc[i])
rt[i] ~ dbin(pt[i],nt[i])
logit(pc[i]) <- mu[i]
logit(pt[i]) <- mu[i] + d[i]
d.star[i] <- delta + beta*(mu[i] - mu.bar) + cov0 * (x0[i] - mean(x0[]))
d[i] ~ dnorm(d.star[i],invtau2)
mu[i] ~ dnorm(mu.bar, invtauc2)
d.exp[i] <- exp(d[i])
}
delta ~ dnorm(0.0, precnorm)
delta.exp <- exp(delta)
beta ~ dnorm(0.0, precnorm)
mu.bar ~ dnorm(0.0, precnorm)
invtau2 ~ dgamma(gamma.a, gamma.b)
invtauc2 ~ dgamma(gamma.c.a, gamma.c.b)
tau2 <- 1/invtau2
tauc2 <- 1/invtauc2
cr.bar <- exp(mu.bar) / (exp(mu.bar) + 1)
cov0 ~ dnorm(0.0, precnorm)
}
model {
for (i in 1:N) {
rc[i] ~ dbin(pc[i],nc[i])
rt[i] ~ dbin(pt[i],nt[i])
logit(pc[i]) <- mu[i]
logit(pt[i]) <- mu[i] + d[i]
d.star[i] <- delta + beta*(mu[i] - mu.bar) + beta1*((mu[i] - mu.bar) * (mu[i] - mu.bar))
d[i] ~ dnorm(d.star[i],invtau2)
mu[i] ~ dnorm(mu.bar, invtauc2)
d.exp[i] <- exp(d[i])
}
delta ~ dnorm(0.0, precnorm)
delta.exp <- exp(delta)
beta ~ dnorm(0.0, precnorm)
beta1 ~ dnorm(0.0, precnorm)
mu.bar ~ dnorm(0.0, precnorm)
invtau2 ~ dgamma(gamma.a, gamma.b)
invtauc2 ~ dgamma(gamma.c.a, gamma.c.b)
tau2 <- 1/invtau2
tauc2 <- 1/invtauc2
cr.bar <- exp(mu.bar) / (exp(mu.bar) + 1)
}
Binary,
two group, quadratic control rate, one covariate
model {
for (i in 1:N) {
rc[i] ~ dbin(pc[i],nc[i])
rt[i] ~ dbin(pt[i],nt[i])
logit(pc[i]) <- mu[i]
logit(pt[i]) <- mu[i] + d[i]
d.star[i] <- delta + beta*(mu[i] - mu.bar) + beta1*((mu[i] - mu.bar) * (mu[i] - mu.bar)) + cov0 * (x0[i] - mean(x0[]))
d[i] ~ dnorm(d.star[i],invtau2)
mu[i] ~ dnorm(mu.bar, invtauc2)
d.exp[i] <- exp(d[i])
}
delta ~ dnorm(0.0, precnorm)
delta.exp <- exp(delta)
beta ~ dnorm(0.0, precnorm)
beta1 ~ dnorm(0.0, precnorm)
mu.bar ~ dnorm(0.0, precnorm)
invtau2 ~ dgamma(gamma.a, gamma.b)
invtauc2 ~ dgamma(gamma.c.a, gamma.c.b)
tau2 <- 1/invtau2
tauc2 <- 1/invtauc2
cr.bar <- exp(mu.bar) / (exp(mu.bar) + 1)
cov0 ~ dnorm(0.0, precnorm)
}
model{
for (i in 1:N) {
r[i] ~ dbin(p[i],n[i])
logit(p[i]) <- mu[i]
mu[i] ~ dnorm(mu.bar, invtau2)
}
mu.bar ~ dnorm(0.0, precnorm)
invtau2 ~ dgamma(gamma.a, gamma.b)
tau2 <- 1/invtau2
psum <- exp(mu.bar) / (exp(mu.bar) + 1)
}
model {
for( i in 1 : N ) {
# N is number of studies
# the precisions for the mean responses
# which are stochastic nodes!
prec.t[i] <- 1/((sd.t[i]*sd.t[i])/n.t[i])
prec.c[i] <- 1/((sd.c[i]*sd.c[i])/n.c[i])
y.t[i] ~dnorm(theta.t[i], prec.t[i])
y.c[i] ~dnorm(theta.c[i], prec.c[i])
theta.t[i] <- delta.star[i] + theta.c[i]
theta.c[i] ~ dnorm(muc, inv.tauc2)
delta.star[i] ~ dnorm(delta, inv.tau2 )
mu[i] <- delta
}
muc ~ dnorm(0.0,precnorm)
delta ~ dnorm(0.0,precnorm)
inv.tau2 ~ dgamma(gamma.a,gamma.b)
tau2 <- 1/inv.tau2
tau <- sqrt(tau2)
inv.tauc2 ~ dgamma(gamma.c.a, gamma.c.b)
tauc2 <- 1/inv.tauc2
tauc <- sqrt(tauc2)
}
model {
for( i in 1 : N ) {
# N is number of studies
# the precisions for the mean responses
# which are stochastic nodes!
prec.t[i] <- 1/((sd.t[i]*sd.t[i])/n.t[i])
prec.c[i] <- 1/((sd.c[i]*sd.c[i])/n.c[i])
y.t[i] ~dnorm(theta.t[i], prec.t[i])
y.c[i] ~dnorm(theta.c[i], prec.c[i])
theta.t[i] <- delta.star[i] + theta.c[i]
theta.c[i] ~ dnorm(muc, inv.tauc2)
delta.star[i] ~ dnorm(mu[i], inv.tau2 )
mu[i] <- delta + cov0 * (x0[i] - mean(x0[]))
}
muc ~ dnorm(0.0,precnorm)
delta ~ dnorm(0.0,precnorm)
inv.tau2 ~ dgamma(gamma.a,gamma.b)
tau2 <- 1/inv.tau2
tau <- sqrt(tau2)
inv.tauc2 ~ dgamma(gamma.c.a, gamma.c.b)
tauc2 <- 1/inv.tauc2
tauc <- sqrt(tauc2)
cov0 ~ dnorm(0.0, precnorm)
}
model {
for( i in 1 : N ) {
# N is number of studies
# the precisions for the mean responses
# which are stochastic nodes!
prec.t[i] <- 1/((sd.t[i]*sd.t[i])/n.t[i])
prec.c[i] <- 1/((sd.c[i]*sd.c[i])/n.c[i])
y.t[i] ~dnorm(theta.t[i], prec.t[i])
y.c[i] ~dnorm(theta.c[i], prec.c[i])
theta.t[i] <- delta.star[i] + theta.c[i]
theta.c[i] ~ dnorm(muc, inv.tauc2)
delta.star[i] ~ dnorm(mu[i], inv.tau2 )
mu[i] <- delta + beta0 *(theta.c[i] - muc)
}
muc ~ dnorm(0.0,precnorm)
delta ~ dnorm(0.0,precnorm)
beta0 ~ dnorm(0.0,precnorm)
inv.tau2 ~ dgamma(gamma.a,gamma.b)
tau2 <- 1/inv.tau2
tau <- sqrt(tau2)
inv.tauc2 ~ dgamma(gamma.c.a, gamma.c.b)
tauc2 <- 1/inv.tauc2
tauc <- sqrt(tauc2)
}
model {
for( i in 1 : N ) {
# N is number of studies
# the precisions for the mean responses
# which are stochastic nodes!
prec.t[i] <- 1/((sd.t[i]*sd.t[i])/n.t[i])
prec.c[i] <- 1/((sd.c[i]*sd.c[i])/n.c[i])
y.t[i] ~dnorm(theta.t[i], prec.t[i])
y.c[i] ~dnorm(theta.c[i], prec.c[i])
theta.t[i] <- delta.star[i] + theta.c[i]
theta.c[i] ~ dnorm(muc, inv.tauc2)
delta.star[i] ~ dnorm(mu[i], inv.tau2 )
mu[i] <- delta + beta0 *(theta.c[i] - muc) + cov0 * (x0[i] - mean(x0[]))
}
muc ~ dnorm(0.0,precnorm)
delta ~ dnorm(0.0,precnorm)
beta0 ~ dnorm(0.0,precnorm)
inv.tau2 ~ dgamma(gamma.a,gamma.b)
tau2 <- 1/inv.tau2
tau <- sqrt(tau2)
inv.tauc2 ~ dgamma(gamma.c.a, gamma.c.b)
tauc2 <- 1/inv.tauc2
tauc <- sqrt(tauc2)
cov0 ~ dnorm(0.0, precnorm)
}
model {
for( i in 1 : N ) { # N is number of studies
# the precisions for the mean responses
# which are stochastic nodes!
y.t[i] ~ dnorm(theta[i], prec.y[i])
prec.y[i] <- 1/var.y[i]
var.y[i] <- (sd.t[i]*sd.t[i])/n.t[i]
theta[i] ~ dnorm(mu[i], inv.tau2)
mu[i] <- Ysum
}
Ysum ~ dnorm(0.0, precnorm)
inv.tau2 ~ dgamma(gamma.a, gamma.b)
tau2 <- 1/inv.tau2
tau <- sqrt(tau2)
}
For diagnostic data, we actually fit the binary models fitted to the various outcomes (e.g., specificity). The following metrics use the binary one group model file: Sensitivity, specificity, positive/negative predictive value, accuracy. Meanwhile, diagnostic odds ratio and likelihood ratio (positive and negative) use binary two group (the former uses the odds ratio metric; the latter, the risk ratio).