2017-02-28 62 views
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 

我沒看到有什麼區別嗎?

回答

2

由於至少Jags版本4.0.0,它們在此處是相同的。 See here

是在那個特定的崗位尖齒論壇重要的文字是:

「pow函數有別名‘POW’,因此它可以被調用無論是作爲‘一個^ b’的 或」 POW (A,b)」

繼續使用哪一個你感覺更舒服我相信,利用原有pow功能來自WinBUGS軟件

+0

有趣 - 。謝謝! –