簡體   English   中英

如何在 JAGS 中指定零膨脹負二項式 model

[英]How to specify zero-inflated negative binomial model in JAGS

我目前正在使用計數數據構建 JAGS 中的零膨脹負二項式 model 到 model 豐度的年度變化,目前我對如何最好地指定 model 有點迷茫。我已經包含了一個基數 model I 的示例在下面使用。 我正在努力解決的主要問題是,在 model output 中,我的收斂性很差(高 Rhat 值,低 Neff 值)並且 95% 的可信區間很大。 我意識到,如果沒有看到/運行實際數據,可能沒有多少人可以提供幫助,但我想我至少會嘗試看看我指定基本 model 的方式是否有任何明顯的錯誤。 我還嘗試擬合各種其他 model 類型(正則負二項式、泊松和零膨脹泊松),但決定使用 ZINB 擬合 go,因為它在所有模型中的 DIC 分數最低,而且對我來說也最直觀,給定我的數據結構。

library(R2jags)

# Create example dataframe

years <- c(1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2)
sites <- c(1,1,1,2,2,2,3,3,3,1,1,1,2,2,2,3,3,3)
months <- c(1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3)

# Count data
day1 <- floor(runif(18,0,7))
day2 <- floor(runif(18,0,7))
day3 <- floor(runif(18,0,7))
day4 <- floor(runif(18,0,7))
day5 <- floor(runif(18,0,7))

df <- as.data.frame(cbind(years, sites, months, day1, day2, day3, day4, day5))


# Put count data into array
y <- array(NA,dim=c(2,3,3,5))                

for(m in 1:2){
  for(k in 1:3){
    sel.rows <- df$years == m & 
      df$months==k
    y[m,k,,] <- as.matrix(df)[sel.rows,4:8]
  }
}

# JAGS model
sink("model1.txt")
cat("
    model {
    
    # PRIORS
    
    for(m in 1:2){
      r[m] ~ dunif(0,50)
    }         
    t.int ~ dlogis(0,1)
    b.int ~ dlogis(0,1)
    p.det ~ dunif(0,1)
    
    
    # LIKELIHOOD
    # ECOLOGICAL SUBMODEL FOR TRUE ABUNDANCE
      for (m in 1:2) {  
    
        zero[m] ~ dbern(pi[m])
    
        pi[m] <- ilogit(mu.binary[m])

        mu.binary[m] <- t.int
        
        for (k in 1:3) {                          
        
          for (i in 1:3) {                        
    
            N[m,k,i] ~ dnegbin(p[m,k,i], r)
    
            p[m,k,i] <- r[m] / (r[m] + (1 - zero[m]) * lambda.count[m,k,i]) - 1e-10 * zero[m]
    
            lambda.count[m,k,i] <- exp(mu.count[m,k,i])
    
            log(mu.count[m,k,i]) <- b.int
    
    # OBSERVATIONAL SUBMODEL FOR DETECTION
    
            for (j in 1:5) {                     
            
              y[m,k,i,j] ~ dbin(p.det, N[m,k,i])   
                                                      
            }#j
          }#i
        }#k
      }#m

  }#END", fill=TRUE)
sink()

win.data <- list(y = y)

Nst <- apply(y,c(1,2,3),max)+1

inits <- function()list(N = Nst)

params <- c("N") 

nc <- 3
nt <- 1
ni <- 50000
nb <- 5000

out <- jags(win.data, inits, params, "model1.txt", 
            n.chains = nc, n.thin = nt, n.iter = ni, n.burnin = nb, 
            working.directory = getwd())

print(out)

嘗試使用上面指定的代碼在 JAGS 中安裝 ZINB model,但 model 收斂有問題。

我傾向於指定零膨脹模型的方式是 model 數據作為泊松分布,如果該個體是零膨脹組的一部分,則平均值為零,否則根據伽馬分布分布。 就像是:

Obs[i] ~ dpois(lambda[i] * is_zero[i])
is_zero[i] ~ dbern(zero_prob)
lambda[i] ~ dgamma(k, k/mean)

本文中首次使用了與此類似的東西: https://www.researchgate.net/publication/5231190_The_distribution_of_the_pathogenic_nematode_Nematodirus_battus_in_lambs_is_zero-inflated

這些模型通常可以收斂,盡管性能當然不如更簡單的模型。 您還需要確保為 is_zero 提供初始值,以便 model 從適當組中所有具有正計數的個體開始。

在您的情況下,您有多個時間點,因此您需要確定零膨脹是否隨時間點固定(即個人不能隨時間切換到零膨脹組或從零膨脹組切換),或者每個觀察是否完全獨立到零通脹狀態。 您還需要決定是否要讓年/月/站點的協變量影響平均計數(即伽瑪部分)或正計數的概率(即零通貨膨脹部分)。 對於前者,您需要通過 i 對均值(在我的公式中)進行索引,然后使用類似 GLM 的公式(可能使用日志鏈接)將其與適當的協變量相關聯。 對於后者,您需要通過 i 為 zero_prob 建立索引,然后使用類似 GLM 的公式(可能使用 logit 鏈接)將其與適當的協變量相關聯。 也可以兩者都做,但是如果您嘗試在兩個部分中使用相同的協變量,那么您可能會遇到收斂問題!

可以說,使用均值和 k 的“生態參數化”,用單個負二項分布替換單獨的泊松伽馬分布會更好。 目前 JAGS 中未實現此功能,但我會在下次更新時添加它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM