我试图从Vafance发表的论文“贝叶斯声明严重性与混合分布”中应用本尼迪克特·埃斯科托的方法。我似乎遇到了JAGS模拟问题。当我运行代码时,JAGS给出了以下错误:
节点错误[1]节点与父母不一致
数据是双重的。首先,有一份基本保险索赔清单。提供有关其年龄,免赔额(截断)以及是否已被限制(审查,判断为真或假)的信息。其次,有一个混合指数分布的先验平均值和相应的概率权重列表。
我注意到的一件事是,它适用于混合指数分布的一组先验数据,但对另一组则失败。
适用于:
平均体重 50 0.3 100 0.25 500 0.25 1500 0.1 5000 0.07 20000 0.03
但它失败了:
平均体重 3 0.72 14 0.19 42 0.05 138 0.02 503 0.01 1501 0.01
因此,它可能与混合指数的参数要求有关。
JAGS的数据包汇总如下
jags.data <- list(claims=(claim.df$x[!claim.df$capped]
- claim.df$truncation[!claim.df$capped]),
capped.claims=(claim.df$x[claim.df$capped]
- claim.df$truncation[claim.df$capped]),
alpha=alpha,
means=actual.means,
ones=rep(1, length(claim.df$[claim.df$capped])),
ages=claim.df$age[!claim.df$capped],
capped.ages=claim.df$age[claim.df$capped],
trend.shape=trend.shape,
trend.rate=1/trend.scale)
请注意,对于每个上限声明,对象“ones”的值为1。
初始值如下:
jags.init <- list(means=list(weights=prior.weights),
equal=list(weights=rep(1/m,m)))
提供了一些杂项值如下:
m <- length(actual.means)
alpha0 <- 20
alpha <- prior.weights * alpha0
trend.prior.mu <- .05
trend.prior.sigma <- .01
trend.scale <- trend.prior.sigma^2 / (1+trend.prior.mu)
trend.shape <- (1+trend.prior.mu)/trend.scale
JAGS模型编码如下:
model <- "model {
weights ~ ddirch(alpha)
trend.factor ~ dgamma(trend.shape, trend.rate)
for (i in 1:length(claims)) {
buckets[i] ~ dcat(weights)
mu[i] <- means[buckets[i]] / trend.factor^ages[i]
claims[i] ~ dexp(1/mu[i])
}
for (i in 1:length(capped.claims)) {
capped.buckets[i] ~ dcat(weights)
capped.mu[i] <- means[capped.buckets[i]]/trend.factor^capped.ages[i]
prob.capped[i] <- exp(-capped.claims[i]/capped.mu[i])
ones[i] ~ dbern(prob.capped[i])
}
}"
Dirichlet,Categorical和Gamma分布用于先验。 Ones是伯努利分发的,将索赔描述为上限或无上限。
最后,该模型在JAGS中运行,具有以下内容:
model.out <- autorun.jags(model, data=jags.data, inits=jags.init,
monitor=c("weights","trend.factor"),
startburnin=1000, startsample=5000,
n.chains=n.chains, interactive=FALSE, thin=thin.factor)
有人会知道出了什么问题吗?感谢