[英]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.