我正在尝试向数据增强捕获重新捕获模型添加一些代码,并且遇到了一些我以前从未遇到过的错误。简而言之,我想估计一系列生存阶段,每个阶段都持续一个以上的时间间隔。我希望该模型估计每个幸存阶段的长度,并使用它来改进捕获重新捕获模型。我尝试了几种不同的方法,但都失败了,现在我尝试使用生存阶段的切换状态数组来实现这一点:
for (t in 1:(n.occasions-1)){
phi1switch[t] ~ dunif(0,1)
phi2switch[t] ~ dunif(0,1)
phi3switch[t] ~ dunif(0,1)
phi4switch[t] ~ dunif(0,1)
psphi[1,t,1] <- 1-phi1switch[t]
psphi[1,t,2] <- phi1switch[t]
psphi[1,t,3] <- 0
psphi[1,t,4] <- 0
psphi[1,t,5] <- 0
psphi[2,t,1] <- 0
psphi[2,t,2] <- 1-phi2switch[t]
psphi[2,t,3] <- phi2switch[t]
psphi[2,t,4] <- 0
psphi[2,t,5] <- 0
psphi[3,t,1] <- 0
psphi[3,t,2] <- 0
psphi[3,t,3] <- 1-phi3switch[t]
psphi[3,t,4] <- phi3switch[t]
psphi[3,t,5] <- 0
psphi[4,t,1] <- 0
psphi[4,t,2] <- 0
psphi[4,t,3] <- 0
psphi[4,t,4] <- 1-phi4switch[t]
psphi[4,t,5] <- phi4switch[t]
psphi[5,t,1] <- 0
psphi[5,t,2] <- 0
psphi[5,t,3] <- 0
psphi[5,t,4] <- 0
psphi[5,t,5] <- 1
}
因此,这将创建一个 [5,t,5] 数组,其中幸存状态只能切换到后续状态而不能向后切换(例如,1 到 2、4 到 5,但不能从 4 到 3)。现在我创建一个定义生存状态的向量:
PhiState[1] <- 1
for (t in 2:(n.occasions-1)){
# State process: draw PhiState(t) given PhiState(t-1)
PhiState[t] ~ dcat(psphi[PhiState[t-1], t-1,])
}
我们总是从状态 1 开始,然后在每个时间步 't' 进行分类抽签,以保持当前状态或在给定数组内概率的情况下进入下一个状态。我想要最多 5 个状态(假设模型通过估计从状态 3 移动到 4 并接近 0 的概率,或者使后续状态的生存值相同或相似,如果它们属于到现实中相同的生存值)。所以我创建了 5 个分层生存概率:
for (a in 1:5){
mean.phi[a] ~ dunif(0,1)
phi.tau[a] <- pow(phi_sigma[a],-2)
phi.sigma[a] ~ dunif(0,20)
}
现在下一步是错误开始的地方。现在我已经为我的 PhiState 向量分配了值 1-5,它应该看起来像这样:
[1] 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 4 4 5
或者可能
[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2
我现在想将 mean.phi[] 分配给我的实际 phi[] 项,它会输入模型:
for(t in 1:(n.occasions-1)){
phi[t] ~ dnorm(mean.phi[PhiState[t]],phi.tau[PhiState[t]])
}
但是,当我尝试运行它时,我收到以下错误:
Error in jags.model(model.file, data = data, inits = init.values, n.chains = n.chains, :
RUNTIME ERROR:
Cannot insert node into mean.phi[1:5]. Dimension mismatch
值得注意的是,当我使用以下 phi[] 确定时,模型工作得很好:
phi[t] ~ dunif(0,1) #estimate independent annual phi's
或者
phi[t] ~ dnorm(mean.phi,phi_tau) #estimate hierarchical phi's from a single mean.phi
或者
#Set fixed survial periods (this works the best, but I don't want to have to tell it when
#the periods start/end and how many there are, hence the current exercise):
for (a in 1:21){
surv[a] ~ dnorm(mean.phi1,phi1_tau)
}
for (b in 22:30){
surv[b] ~ dnorm(mean.phi2,phi2_tau)
}
for (t in 1:(n.occasions-1)){
phi[t] <- surv[t]
}
我确实读过这篇文章:https ://sourceforge.net/p/mcmc-jags/discussion/610037/thread/36c48f25/
但我看不到在这种情况下我在哪里重新定义变量......任何解决这个问题的帮助或关于更好方法的建议都将受到欢迎!
非常感谢,乔希