2017-08-25 52 views
1

我正在用R中的JAGS對離散值擬合威布爾模型。我對連續數據擬合威布爾沒有問題,但是當我切換到離散數據時遇到麻煩值。在JAGS或BUGS中指定R的離散威布爾分佈

這裏有一些數據和代碼在JAGS以適應泊爾模型:

#draw data from a weibull distribution 
y <- rweibull(200, shape = 1, scale = 0.9) 
#y <- round(y) 

#load jags, specify a jags model. 
library(runjags) 

j.model =" 
model{ 
for (i in 1:N){ 
y[i] ~ dweib(shape[i], scale[i]) 

shape[i] <- b1 
scale[i] <- b2 
} 

#priors 
b1 ~ dnorm(0, .0001) I(0,) 
b2 ~ dnorm(0, .0001) I(0,) 
} 
" 

#load data as list 
data <- list(y=y, N = length(y)) 

#run jags model. 
jags.out <-  run.jags(j.model, 
         data=data, 
         n.chains=3, 
         monitor=c('b1','b2') 
         ) 
summary(jags.out) 

這種模式適合的罰款。但是,如果我使用y <- round(y)將y值轉換爲離散值,並運行相同的模型,則會失敗,並顯示錯誤Error in node y[7], Node inconsistent with parents。每次我嘗試時節點的特定號碼都會改變,但是它總是一個很低的數字。

我知道我可以通過爲我的所有值添加一個非常小的數字來運行此操作,但是,這並不說明數據是離散的。我知道存在離散的威布爾分佈,但是我怎樣才能在JAGS中實現一個?

回答

2

您可以使用'ones trick'在JAGS中實現離散威布爾分佈。使用PMF here我們可以做一個函數生成一些數據:

pmf_weib <- function(x, scale, shape){ 

    exp(-(x/scale)^shape) - exp(-((x+1)/scale)^shape) 
} 

# probability of getting 0 through 200 with scale = 7 and shape = 4 
probs <- pmf_weib(seq(0,200), 7, 4) 

y <- sample(0:200, 100, TRUE, probs) # sample from those probabilities 

對於「那些把戲」工作,你通常有一些大的常數來劃分新的PMF以確保概率是0到1之間1.雖然看起來離散威布爾的pmf已經確保了這一點,但我們仍然在模型中添加了一些大的常數。所以,這裏是什麼型號貌似現在:我們在1)的人的矢量和數據參數大常數,2)離散Weibull的PMF和

j.model =" 
data{ 
C <- 10000 
for(i in 1:N){ 
ones[i] <- 1 
} 
} 
model{ 
for (i in 1:N){ 
discrete_weib[i] <- exp(-(y[i]/scale)^shape) - exp(-((y[i]+1)/scale)^shape) 

ones[i] ~ dbern(discrete_weib[i]/C) 
} 

#priors 
scale ~ dnorm(0, .0001) I(0,) 
shape ~ dnorm(0, .0001) I(0,) 
} 
" 

注3)我們通過伯努利試驗運行該概率。

您可以使用上面相同的代碼來擬合模型,下面是顯示模型成功恢復參數值(scale = 7和shape = 4)的摘要。

 Lower95 Median Upper95  Mean  SD Mode  MCerr MC%ofSD SSeff 
scale 6.968277 7.289216 7.629413 7.290810 0.1695400 NA 0.001364831  0.8 15431 
shape 3.843055 4.599420 5.357713 4.611583 0.3842862 NA 0.003124576  0.8 15126