[英]Specify a discrete weibull distribution in JAGS or BUGS for R
我正在使用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
出现Error in node y[7], Node inconsistent with parents
。 每次尝试时,节点的特定数量都会更改,但是它始终是一个很小的数字。
我知道可以通过在所有值中添加一个很小的数字来进行此操作,但是,这不能说明数据是离散的这一事实。 我知道存在离散的weibull分布,但是如何在JAGS中实现一个呢?
您可以使用“一个把戏”在JAGS中实现离散的weibull分布。 在这里使用pmf ,我们可以创建一个函数来生成一些数据:
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)一个矢量和一个大常数的向量,2)离散weibull的pmf,以及3)通过伯努利试验运行该概率。
您可以使用与上面相同的代码来拟合模型,这是摘要,表明该模型成功恢复了参数值(比例= 7和形状= 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.