Ошибка: слайсер застрял на значении с бесконечной плотностью, запущенной биномиальной бета-моделью в JAGS

Я пытаюсь запустить биномиальную бета-модель в JAGS (см. Пример кода ниже). Я все время получаю сообщение об ошибке: Ошибка: при попытке запустить модель JAGS возникла следующая ошибка:

Error in node a0
Slicer stuck at value with infinite density

что я изо всех сил пытаюсь понять. Я подумал, что, возможно, начальные условия отправили бета-распределение в бесконечные области пространства параметров, но после некоторого исследования, похоже, это не так. Есть какие-нибудь мысли о том, что означает эта ошибка или как изменить код для ее устранения?

Я поместил свой код ниже вместе с некоторыми надуманными примерами данных. Это те данные, которые я мог бы ожидать в своем наборе данных.

#Generate some sample data
counts = c(80,37,10,43,55,23,53,100,7,11)
 n = c(100,57,25,78,55,79,65,100,9,11)
consp = c(1.00, 0.57, 0.25, 0.78, 0.55, 0.79, 0.65, 1.00, 0.09, 0.11)
treat = c(0.5,0.5,0.2,0.9,0.5,0.2,0.5,0.9,0.5,0.2)

#Model spec
model1.string <-"model{
for (i in 1:length(counts)){
counts[i] ~ dbin(p[i],n[i])
p[i] ~ dbeta( ( mu[i] * theta[i]) , ((1-mu[i])*theta[i]))
mu[i] <- ilogit(m0 + m1*consp[i] + m2*treat[i])
theta[i] <- exp(n0 + n1*consp[i])
}
m0 ~ dnorm(0, 1)
m1 ~ dnorm(0, 1)
m2~ dnorm(-1, 1)
k0 ~ dnorm(1, 1)
k1 ~ dnorm(0, 1)
}"

#Specify number of chains
chains=5
#Generate initial conditions
inits=replicate(chains, list(m0 = runif(1, 0.05, 0.25),
m1 = runif(1, 0,0.2),
m2=runif(1,-1,0),
k0 = runif(1, 0.5, 1.5),
k1 = runif(1, 0, 0.3)),simsplify = F)

#Run
model1.spec<-textConnection(model1.string)
results <- autorun.jags(model1.string,startsample = 10000,
data = list('counts' = counts,
'n' = n,
'consp'=consp,
"treat"=treat),
startburnin=5000, 
psrf.target=1.02,
n.chains=5,
monitor = c("m0", "m1", "m2","k0", "k1"), inits = inits),

person C Yeates    schedule 06.11.2017    source источник


Ответы (1)


Сэмплер срезов (который используется JAGS) не работает, когда плотность вероятности выбранной переменной бесконечна в точке. Это может произойти с бета-распределением 0 или 1.

Чтобы обойти эту проблему, необходимо обрезать узел, который создает проблему, как в следующем примере:

p[i] ~ dbeta( ( mu[i] * theta[i]) , ((1-mu[i])*theta[i])) I(0.001,0.999)

(Я действительно не помню синтаксис, но JAGS окончательно разрешает усеченные случайные величины)

person altroware    schedule 07.11.2017
comment
Да, я думаю, вы правы; правильный синтаксис - p[i] ~ dbeta( ( mu[i] * theta[i]) , ((1-mu[i])*theta[i])) T(0.001,0.999), который, кажется, помогает! - person C Yeates; 09.11.2017
comment
У меня была такая же проблема, и добавление T(0.001,0.999) работает. Очень хорошо. - person Hello; 07.01.2021