这可能并不重要,但这是我好奇了一段时间的事情。
在JAGS/BUGS中构建模型时,我最初被教导使用pow()函数(例如,tau <- pow(sigma, -2)将标准偏差转换为正态分布中的精度参数)来处理幂转换,但通常情况下,我最终会使用简单的算术运算符。
我的问题是:pow()有没有编程或语法上的好处,或者这只是一个美学问题?
作为初步探索,这里是一个简单的线性回归玩具的良好的长期运行,指定了两种方法。我使用的是JAGS,在R中使用R2jags包调用。
# 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")两者产生的后置结果基本相同(未显示,您只能相信我; ),并且运行的时间基本相同。
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 有什么我看不到的区别吗?
发布于 2017-03-01 22:44:07
在这一点上,它们是相同的,因为至少是Jags版本4.0.0。See here
在jags论坛上的这篇文章中,重要的文本是:
“Pow函数具有别名"pow”,因此可以作为"a^b“或"pow(a,b)”调用。“
请继续使用您觉得更舒服的。我相信最初的pow函数的使用来自于winbugs。
https://stackoverflow.com/questions/42515795
复制相似问题