我正在尝试通过for循环来最小化我的jags代码。我的原始代码是
data<- list(r1=c(16, 62, 14, 23, 570, 63, 63, 116),
r2=c(10, 66, 20, 27, 522, 31, 31, 95),
n1=c(53, 106, 56, 82, 1012, 201, 201, 2049),
n2=c(53, 107, 94, 82, 1081, 149, 149, 3097))
NS <- length(data$r1)
library(rjags)
library(coda)
ma <- function(o){
out <- "
model{
for(i in 1:NS){
delta[i,1] <- 0
mu[i] ~ dnorm(0, 0.0001)
for(k in 1:2){
r[i,k] ~ dbin(p[i,k], n[i,k])
logit(p[i,k]) <- mu[i] + delta[i,k]
}
delta[i,2] ~ dnorm(lor, prec)
}
lor ~ dnorm(0, 0.0001)
############## 1 inverse Gamma Dist.
tau2 <- 1/prec
taus <- sqrt(1/prec)
prec ~ dgamma(0.1,0.1)
# prec ~ dgamma(0.01,0.01)
# prec ~ dgamma(0.001,0.001)
############## 2 Uniform Dist.
# tau2 <- tau*tau
# prec <- 1/tau2
# taus <- tau
# tau ~ dunif(0, 2)
# tau ~ dunif(0, 5)
# tau ~ dunif(0, 10)
### Transform ln(OR) into OR
OR <- exp ( lor )
}"
return(out)
}
如您所见,我是先手动运行每个程序,而不是我想在for循环中运行它们;
# hyper-parameters
IG <- c(a1=0.1, a2=0.01, a3=0.001,b1=0.1, b2=0.01, b3=0.001)
U <- c(a1=0, a2=0, a3=0, b1=2, b2=5, b3=10)
# priors
prior <- data.frame(IG,U)
if (prior == "IG"){
for (i in 1:3){
tau2[i] <- 1/prec[i]
taus[i] <- sqrt(1/prec[i])
prec[i] ~ dgamma(a[i],b[i])}
}
if (prior == "U"){
for (i in 1:3){
tau2[i] <- tau[i]*tau[i]
prec[i] <- 1/tau2[i]
tau[i] ~ dunif(a[i],b[i])}
}
有没有办法在rjags中做到这一点,因为我不确定JAGS软件中是否有if语句。
实际上在if
中没有任何JAGS
语句能以这种方式工作,如果尝试创建两个tau
,taus
和prec
对象,则会出错。有两种方法可以做到这一点。我更喜欢的方法是将参数名称附加到对象上。我的意思是:
for(i in 1:3){
# IG priors
tau2_IG[i] <- 1/prec_IG[i]
taus_IG[i] <- sqrt(1/prec_IG[i])
prec_IG[i] ~ dgamma(a_IG[i],b_IG[i])
# U priors
tau2_U[i] <- 1/prec_U[i]
taus_U[i] <- sqrt(1/prec_U[i])
prec_U[i] ~ dgamma(a_U[i],b_U[i])
}
另一种方法是确定这两个条件所需的先验总数(在此示例中为6)。但是,这要求您确保在整个模型中将它们输入正确的位置(然后必须记住与tau[1:3]
相比,tau[1:6]
与哪些参数相关联。
[我真的看不到您打算如何将第二个代码块(包含所有超参数)与JAGS
模型(之前只有1个prec
)相关联,但是希望该示例有所帮助。