сходимость производной величины в JAGS/R2Jags

ОБНОВЛЕНИЕ: теперь с примером Traceplot

Traceplot

ОБНОВЛЕНИЕ: теперь с новым графиком трассировки Правильная трассировка

Я пытаюсь адаптировать Outhwaite et. als 2018 для моделирования заполняемости и у меня есть пара вопросов, на которые я никак не могу найти ответ...

Код, используемый для создания модели

cat(
  "model{ 
  
  ### Model ###

        # State model
        for (i in 1:nsite){ 
          for (t in 1:nyear){   
            z[i,t] ~ dbern(psi[i,t]) 
            logit(psi[i,t])<- b[t] + u[i] 
          }}   
        
        # Observation model 
        for(j in 1:nvisit) {
          y[j] ~  dbern(Py[j]+0.0001)
          Py[j]<- z[Site[j],Year[j]]*p[j]      
          logit(p[j]) <- a[Year[j]] + c*logL[j]
        }
        
   ### Priors ###

      # State model priors
          for(t in 1:nyear){
            b[t] ~ dunif(-10,10)        # fixed year effect
          }                 
          
          for (i in 1:nsite) {
            u[i] ~ dnorm(0, tau.u)  # random site effect      
          } 
          
          tau.u <- 1/(sd.u * sd.u)  
          sd.u ~ dunif(0, 5)        # half-uniform hyperpriors
          
        
      # Observation model priors 
          for (t in 1:nyear) {
            a[t] ~ dnorm(mu.a, tau.a)   # random year effect           
          }
          
          mu.a ~ dnorm(0, 0.01)                         
          tau.a <- 1 / (sd.a * sd.a)    
          sd.a ~ dunif(0, 5)        # half-uniform hyperpriors             
          
          c ~ dunif(-10, 10)        # sampling effort effect
  
   
  ### Derived parameters ###
  # Finite sample occupancy - proportion of occupied sites
  for (t in 1:nyear) {  
    psi.fs[t] <- sum(z[1:nsite,t])/nsite
  } 
  
  #data# nyear, nsite, nvisit, y, logL, Site, Year
  
}", file="bmmodel.txt"
)

Обратите внимание, что dbern(Py[j]+0,0001) включает поправочный коэффициент, поскольку dbern(0) не поддерживается в JAGS.

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

Вопрос номер 1 (ОТВЕЧЕН): Меня интересует количество psi.fs[t]. Но поскольку модель вычисляет эту величину после фактического процесса моделирования, можно ли оценить конвергенцию для psi.fs[t]?

Код R для работающей модели с R2JAGS

jagsrespsi<-jags(data.list, inits=test.inits,
     n.chains=2, n.iter=15000, n.thin=3,
     DIC=T, 
     model.file=paste0(modeltype,"model.txt"), parameters.to.save=c("psi.fs"))

Вопрос номер 2. Когда я использую traceplot(jagsrespsi) для построения графика, трассировка кажется разбросанной по всему месту, но Rhat для jagsrespsi$BUGSoutput равен 1 за все мои годы? gelman.diag(as.mcmc(jagsrespsi)) также указывает на сходимость. То же самое касается мониторинга psi!

Я очень удивлен поведением этой модели и подозреваю, что что-то не так... но не знаю, где искать


person Gmichael    schedule 27.04.2021    source источник


Ответы (1)


Да, вы можете проверить psi.ft[] на сходимость точно так же, как вы проверяете сходимость параметров модели. Это именно то, что происходит, например, в логистической регрессии, где подобранные вероятности ответа вычисляются как exp(z)/(1 + exp(z)) для некоторого линейного предиктора z.

Когда вы говорите, что трассировка повсюду, что вы имеете в виду? Это может быть как хорошо, так и плохо. Можете ли вы показать пример? Хорошая трассировочная диаграмма выглядит как толстая волосатая гусеница: последовательные выборки, взятые из всех областей выборочного пространства, горизонтальный волосяной комок. Хотя эта страница написана для SAS дает разумное высокоуровневое описание того, как выглядит хороший график трассировки, и какие проблемы могут быть обозначены далеко не идеальными примерами.

В ответ на ваше редактирование, чтобы включить график трассировки...

Мне это не кажется особенно хорошей трассировкой: кажется, что между последовательными выборками существует некоторая отрицательная автокорреляция. Рассчитали ли вы эффективный объем выборки [ESS]?

Но сюжет может выглядеть немного странно, потому что ваша цепочка очень короткая, ИМХО. Вы можете использовать ESS для получения очень грубой аппроксимации точности оценочной вероятности: наихудший случай полуширинного CI биномиальной пропорции равен +/-2 * sqrt(0.5*0.5/N), где N — размер выборки (или ESS в данном случае). Таким образом, даже если эффективность вашего процесса MCMC равна 1, то есть ESS равна длине цепочки, точность ваших оценок составляет всего +/- 0,02. Для оценки вероятности с точностью до 2 знаков после запятой (чтобы полуширина доверительного интервала была не более 0,005) требуется ESS 40 000.

Нет ничего плохого в использовании коротких цепей во время тестирования, но для производственных циклов я всегда буду использовать длину чан, намного превышающую 2500. (И я бы также использовал несколько цепочек, чтобы использовать статистику Гельмана-Рубина для проверки сходимости.)

person Limey    schedule 27.04.2021
comment
Ладно, по крайней мере, это НЕ было моей ошибкой. Я обновил график трассировки, похоже, есть проблема, поскольку я вижу только 2500 итераций, и обычно (по крайней мере, для run.jags из пакета runjags) вы отбрасываете прожиг... - person Gmichael; 27.04.2021
comment
Оказывается, в R2JAGS есть ошибка, которая показывает только период выгорания, однако моя фактическая трассировка, сделанная с помощью plot(as.mcmc(jagsrespsi)) так же плоха. Я все еще очень смущен тем, что мой Rhat равен 1, а трассировка выглядит так ужасно. - person Gmichael; 27.04.2021
comment
использовал gelman.diag(), и это показало значения, приближающиеся к 1 с верхним CI psrf ‹‹1.1... снова что-то, что не совпадает с моими трассировочными диаграммами - person Gmichael; 27.04.2021