Перевести отрицательную биномиальную дисперсионную модель типа I и II из glmmTMB в JAGS - PullRequest
0 голосов
/ 12 февраля 2020

Я хочу перевести модель nbinom1 из glmmTMB в JAGS. Но я не знаю, как перевести формулу дисперсии в JAGS. В этом примере я использую nbinom2, потому что он проще, но на самом деле я бы предпочел реализовать модель дисперсии из семейства nbinom1 от glmmTMB до JAGS.

Обратите внимание, что пример регрессии здесь полностью вне контекста и не имеет смысл. Это только для того, чтобы предоставить код, поскольку фактическая модель, с которой я работаю, намного сложнее.

У нас есть отрицательная биномиальная модель, которая определена в R следующим образом:

library(glmmTMB)
library(rjags)

Owls <- transform(Owls,Nest=reorder(Nest,NegPerChick),NCalls=SiblingNegotiation,FT=FoodTreatment)

fit_nbinom2 <- glmmTMB(
  NCalls~ FT,
  data=Owls,
  dispformula = ~SexParent,
  family=nbinom2)


runjags::template.jags(formula = NCalls ~ FT + ArrivalTime
                       ,data = Owls
                       ,family = "negative binomial")

Модифицированная вывод из runjags :: template.jags выглядит следующим образом:

model{
  # In the BUGS/JAGS language we must use an explicit for loop:
  for (i in 1:N) {
    # These lines describe the response distribution and linear model terms:
    NCalls[i] ~ dpois(regression_fitted[i])
    regression_residual[i] <- NCalls[i] - regression_fitted[i]
    dispersion[i] ~ dgamma(k, k)
    regression_fitted[i] <- regression_mean[i] * dispersion[i]
    # Note: this formulation of a gamma-Poisson is exactly equivalent to a Negative Binomial
    log(regression_mean[i]) <-
      intercept + ArrivalTime_coefficient * ArrivalTime[i] + FT_effect[FT[i]]
  }

  # These lines give the prior distributions for the parameters to be estimated:
  k ~ dgamma(0.001, 0.001)
  intercept ~ dnorm(0, 10 ^ -6)
  ArrivalTime_coefficient ~ dnorm(0, 10 ^ -6)

  FT_effect[1] <- 0    # Factor level Deprived
  FT_effect[2] ~ dnorm(0, 10 ^ -6)    # Factor level Satiated
}

Как вы могли бы реализовать dispformula = ~SexParent часть из модели glmmTMB?

Справка ?glmmTMB::sigma.glmmTMB говорит это:

nbinom1

возвращает параметр чрезмерной дисперсии (обычно обозначается как альфа, как в Hardin and Hilbe (2007)): ​​так, что дисперсия равна mu (1 + альфа).

nbinom2

возвращает параметр избыточной дисперсии (обычно обозначаемый как тета или k); в отличие от большинства других семейств, большая тета соответствует более низкой дисперсии, которая равна mu (1 + mu / theta).

Из этого я попытался сделать параметр дисперсии зависимым от переменной SexParent. Вот так

model{
  # In the BUGS/JAGS language we must use an explicit for loop:
  for (i in 1:N) {
    # These lines describe the response distribution and linear model terms:
    NCalls[i] ~ dpois(regression_fitted[i])
    regression_residual[i] <- NCalls[i] - regression_fitted[i]
    dispersion[i] ~ dgamma(k[SexParent[i]], k[SexParent[i]])
    regression_fitted[i] <- regression_mean[i] * dispersion[i]
    # Note: this formulation of a gamma-Poisson is exactly equivalent to a Negative Binomial
    log(regression_mean[i]) <-
      intercept + ArrivalTime_coefficient * ArrivalTime[i] + FT_effect[FT[i]]
  }

  # These lines give the prior distributions for the parameters to be estimated:
  #k ~ dgamma(0.001, 0.001)
  intercept ~ dnorm(0, 10 ^ -6)
  ArrivalTime_coefficient ~ dnorm(0, 10 ^ -6)

  FT_effect[1] <- 0    # Factor level Deprived
  FT_effect[2] ~ dnorm(0, 10 ^ -6)    # Factor level Satiated
  for (i_sex in 1:N.parent){
    k[i_sex] ~ dgamma(0.001, 0.001)
  }  

}

Но иногда я сталкиваюсь с проблемами, потому что k должно быть> 0, или я получаю разные результаты для параметров, как в summary(fit_nbinom2). Я просто не знаю, как воспроизвести эти результаты.

Правильно ли я смоделировал дисперсию? У меня такое чувство, что я что-то упускаю. Было бы здорово, если бы кто-то мог помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...