for循环中的锯齿先验

问题描述 投票:0回答:1

我正在尝试通过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语句。

r jags rjags
1个回答
0
投票

实际上在if中没有任何JAGS语句能以这种方式工作,如果尝试创建两个tautausprec对象,则会出错。有两种方法可以做到这一点。我更喜欢的方法是将参数名称附加到对象上。我的意思是:

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)相关联,但是希望该示例有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.