2
這可能並不重要,但是我一直在好奇。當我在JAGS/BUGS中構建一個模型時,我最初被教導使用pow()
函數處理能量轉換(例如tau <- pow(sigma, -2)
將標準偏差轉換爲正態分佈的精度參數),但很多時候我會結束而是使用簡單的算術運算符。JAGS/BUGS中的pow()運算符
我的問題是這樣的嗎?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
我沒看到有什麼區別嗎?
有趣 - 。謝謝! –