По поводу предупреждающего сообщения в JAGS для R

Я экспериментирую с пакетом rjags r, изучая байесовский. Я применил следующую многомерную модель, используя набор данных о табаке из пакета rrr.

введите описание изображения здесь

где \ gamma - случайный перехват, который измеряет корреляцию между результатами. Также я намеренно делаю некоторые значения ответа как отсутствующие, чтобы изучить результаты с несбалансированной структурой данных. В то же время я добавил переменную AID, которая обозначает идентификаторы субъектов.

Я приспособил эту модель, используя rjags следующим образом.

library(rrr)
require(dplyr)
library(rjags)
data("tobacco")
tobacco <- as_data_frame(tobacco)

tobacco$AID=seq(1:25)
tobacco[4,1]=NA
tobacco[14,1]=NA
tobacco[8,1]=NA
tobacco[6,2]=NA
tobacco[1,2]=NA
tobacco[19,2]=NA
tobacco[21,2]=NA


N1=length(tobacco$Y1.BurnRate)
bayes_model_mul="model {
for(i in 1:N1){
Y1.BurnRate[i]~dnorm(mu1[i],tau1)
Y2.PercentSugar[i]~dnorm(mu2[i],tau2)
mu1[i]=beta1[1] + beta1[2]*X2.PercentChlorine[i] + beta1[3]*X3.PercentPotassium[i] + gamma[AID[i]]
mu2[i]=beta2[1] + beta2[3]*X2.PercentChlorine[i] + beta2[2]*X1.PercentNitrogen[i]+
beta2[4]*X3.PercentPotassium[i]+gamma[AID[i]]
gamma[i] ~ dmnorm(0,tau_u)

}
for (l in 1:3) { beta1[l] ~dnorm(0, 0.001) }
for (l in 1:4) { beta2[l] ~dnorm(0, 0.001) }
tau1 ~ dgamma(.01,.01)
sigma_tau1 = 1/tau1 

tau2 ~ dgamma(.01,.01)
sigma_tau2 = 1/tau2

tau_u ~ dgamma(.01,.01)
sigma_tau_u = 1/tau_u 
}"


model3 <- jags.model(textConnection(bayes_model_mul), 
                     data = list(Y1.BurnRate=tobacco$Y1.BurnRate,
                                 Y2.PercentSugar=tobacco$Y2.PercentSugar
                                 ,X1.PercentNitrogen=tobacco$X1.PercentNitrogen,
                                 N1=N1,X2.PercentChlorine=tobacco$X2.PercentChlorine,
                                 X3.PercentPotassium=tobacco$X3.PercentPotassium,AID=tobacco$AID),
                     n.chains=1)
params <- c('beta1','sigma_tau1','sigma_tau2','beta2','sigma_tau_u','gamma')
samps.1 <- coda.samples(model3, params, n.iter = 10000)
burn.in=1000
summary.model.1=summary(window(samps.1, start = burn.in))

Я не получил ни одной ошибки. Но я получил следующее предупреждающее сообщение.

Warning message:
In FUN(X[[i]], ...) : start value not changed

Может ли кто-нибудь помочь мне понять, о чем это сообщение об ошибке?

Спасибо.


person student_R123    schedule 20.08.2020    source источник


Ответы (1)


Функция window используется для выбора диапазона образцов. Принимает параметры start и end. Значение, которое принимает start, должно быть больше суммы количества итераций, переданных в n.adapt в jags.models и n.iter в update, если явно задано количество образцов записи.

Вы можете взглянуть на объект, настроенный jags.model, чтобы увидеть, как изменяется количество итераций.

# Define the model
model3 <- jags.model(textConnection(bayes_model_mul), n.adapt=1234,
                     data = list(Y1.BurnRate=tobacco$Y1.BurnRate,Y2.PercentSugar=tobacco$Y2.PercentSugar,X1.PercentNitrogen=tobacco$X1.PercentNitrogen,N1=N1,X2.PercentChlorine=tobacco$X2.PercentChlorine,X3.PercentPotassium=tobacco$X3.PercentPotassium,AID=tobacco$AID),
                     n.chains=1)
# Look at the number of iterations (== n.adapt)
model3$iter()
#1234

# Add some burnin iterations: iterations are updated to n.adapt + burnin
update(model3, n.iter=1111)
model3$iter()
# 2345

# Draw more samples -> iterations updated to n.adapt + burnin + n.iter
samps.1 <- coda.samples(model3, n.iter = 10000, variable.names=c('beta1','sigma_tau1','sigma_tau2','beta2','sigma_tau_u','gamma'))
model3$iter()
# 12345

Когда мы используем window, ожидается, что начальное значение будет больше, чем n.adapt + burnin, поскольку эти итерации были отброшены. Если это не так, значение start извлекается из объекта coda.samples (см. mcpar(samps.1[[1]])), а ваше ручное start значение не используется.

Таким образом, использование w=window(samps.1, start=2345) дает предупреждение, которое вы видите

Предупреждающее сообщение:
В FUN (X [[i]], ...): начальное значение не изменилось.

Но следующее нормально, поскольку start больше n.adapt + burnin

w=window(samps.1, start=2346)

Помните, что это всего лишь предупреждения, и в данном случае они не так важны. Но если вы перезапустите coda.samples без повторного запуска jags.model, это снова обновит итерации, что немного затруднит отслеживание того, какие значения передать в window (и тогда могут возникнуть ошибки)

person user20650    schedule 20.08.2020