JAGS/BUGS 中的 pow() 运算符

Mat*_*ers 3 r jags winbugs

这可能不重要,但我一直很好奇一段时间。

在 JAGS/BUGS 中构建模型时,我最初被教导使用pow()函数处理幂变换(例如tau <- pow(sigma, -2),在正态分布中从标准偏差转换为精度参数),但很多时候,我最终会使用简单的算术运算符代替.

我的问题是: 是否有程序上或句法上的好处pow(),还是仅仅是美学问题?

通过初步探索,这里有一个很好的、长期的玩具简单线性回归,指定了两种方式。我正在使用 JAGS,使用 R2jags 包在 R 中调用。

# first some fake data
N <- 1000
x <- 1:N
y <- x + rnorm(N)

# model 1
cat('model {
  for (i in 1:N) {
    y[i] ~ dnorm(y.hat[i], tau)
    y.hat[i] <- a + b * x[i]
  }
  a ~ dnorm(0, .0001)
  b ~ dnorm(0, .0001)
  tau <- pow(sigma, -2)   ### this is the only difference
  sigma ~ dunif(0, 100)
}', file="test1.jags")

# model 2
cat('model {
  for (i in 1:N) {
    y[i] ~ dnorm(y.hat[i], tau)
    y.hat[i] <- a + b * x[i]
  }
  a ~ dnorm(0, .0001)
  b ~ dnorm(0, .0001)
  tau <- 1/(sigma*sigma)   ### this is the only difference
  sigma ~ dunif(0, 100)
}', file="test2.jags")
Run Code Online (Sandbox Code Playgroud)

两者都产生基本相同的后验(未显示,您只需要相信我 ;) ),并且运行时间基本相同。

test.data <- list(x=x,y=y,N=N)

# give both a nice long run

system.time(test1.jags.out <- jags(model.file="test1.jags", data=test.data, 
                  parameters.to.save=c("a","b","tau","sigma"), n.chains=3, n.iter=100000))
   user  system elapsed 
 166.85    0.03  166.97 

system.time(test2.jags.out <- jags(model.file="test2.jags", data=test.data, 
                  parameters.to.save=c("a","b","tau","sigma"), n.chains=3, n.iter=100000))
   user  system elapsed 
 162.42    0.00  162.75 
Run Code Online (Sandbox Code Playgroud)

我没有看到有什么区别吗?

mfi*_*ino 6

至少从 Jags 版本 4.0.0 起,它们在这一点上是相同的。看这里

在 jags 论坛的那个特定帖子上重要的文字是:

“Pow 函数有别名“pow”,因此它可以作为“a^b”或“pow(a,b)”调用

继续使用您觉得更舒服的任何一种。相信原来pow功能的使用来自winbugs。