首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JAGS/BUGS中pow()运算符

JAGS/BUGS中pow()运算符
EN

Stack Overflow用户
提问于 2017-03-01 02:04:17
回答 1查看 4.7K关注 0票数 3

这可能并不重要,但这是我好奇了一段时间的事情。

在JAGS/BUGS中构建模型时,我最初被教导使用pow()函数(例如,tau <- pow(sigma, -2)将标准偏差转换为正态分布中的精度参数)来处理幂转换,但通常情况下,我最终会使用简单的算术运算符。

我的问题是:pow()有没有编程或语法上的好处,或者这只是一个美学问题?

作为初步探索,这里是一个简单的线性回归玩具的良好的长期运行,指定了两种方法。我使用的是JAGS,在R中使用R2jags包调用。

代码语言:javascript
复制
# 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")

两者产生的后置结果基本相同(未显示,您只能相信我; ),并且运行的时间基本相同。

代码语言:javascript
复制
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 

有什么我看不到的区别吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-01 22:44:07

在这一点上,它们是相同的,因为至少是Jags版本4.0.0。See here

在jags论坛上的这篇文章中,重要的文本是:

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

请继续使用您觉得更舒服的。我相信最初的pow函数的使用来自于winbugs。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42515795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档