JAGS/BUGS 中的 pow() 运算符
The pow() operator in JAGS/BUGS
这可能不重要,但我一直很好奇。
在 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")
两者都产生基本相同的后验(未显示,你只需要相信我;)),并且 运行 在基本相同的时间内。
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
有什么我没发现的区别吗?
至少从 Jags 版本 4.0.0 开始,它们在这一点上是相同的。 See here
在 jags 论坛的特定 post 上重要的文本是:
"The Pow function has alias "pow" 所以它可以被调用为 "a^b"
或 "pow(a,b)"
继续使用您觉得更舒服的那个。我相信原始pow
函数的使用来自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")
两者都产生基本相同的后验(未显示,你只需要相信我;)),并且 运行 在基本相同的时间内。
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
有什么我没发现的区别吗?
至少从 Jags 版本 4.0.0 开始,它们在这一点上是相同的。 See here
在 jags 论坛的特定 post 上重要的文本是:
"The Pow function has alias "pow" 所以它可以被调用为 "a^b" 或 "pow(a,b)"
继续使用您觉得更舒服的那个。我相信原始pow
函数的使用来自winbugs。