我使用R中的JAGS将weibull模型拟合到离散值。我将weibull拟合到连续数据没有问题,但是当我切换到离散值时,我遇到了麻烦。
以下是一些数据,以及适合JAGS中weibull模型的代码:
#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
而失败。每次尝试时节点的特定数量都会改变,但它总是一个较低的数字。
我知道我可以通过在我的所有值中添加一个非常小的数字来实现此操作,但是,这并不能解释数据是离散的这一事实。我知道存在离散的weibull分布,但是如何在JAGS中实现呢?
答案 0 :(得分:2)
您可以使用'ones trick'在JAGS中实现离散的weibull分布。使用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之间。虽然看起来离散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, )
}
"
请注意,我们在数据参数中添加了1)1和一个大常量的向量,2)离散weibull的pmf,以及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