我试图在数据增强捕获 - 重新捕获模型中添加一些代码,并且遇到了一些我以前没有遇到过的错误。简而言之,我想估计一系列生存阶段,每个阶段持续超过一个时间间隔。我希望模型估计每个生存阶段的长度,并使用它来改进捕获重捕模型。我尝试了几种不同的方法并且失败了,现在我正在尝试使用切换状态数组来实现幸存阶段:
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开始,然后在每个时间步骤进行分类抽签&#39; t&#39;考虑到阵列中的概率,保持当前状态或继续下一个状态。我想要最多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)
}
现在下一步是错误开始的地方。既然我已将值1-5分配给我的PhiState向量,它应该看起来像这样:
[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/
但在这种情况下,我不知道我在哪里重新定义变量...我们非常欢迎任何帮助解决这个问题或建议采用更好的方法!
非常感谢, 约什
答案 0 :(得分:0)
我对您的实际数据(phi[t]
?)感到有点困惑,但以下内容可能会为您提供一个起点:
nt <- 29
nstate <- 5
M <- function() {
phi_state[1] <- 1
for (t in 2:nt) {
up[t-1] ~ dbern(p[t-1])
p[t-1] <- ifelse(phi_state[t-1]==nstate, 0, p_[t-1])
p_[t-1] ~ dunif(0, 1)
phi_state[t] <- phi_state[t-1] + equals(up[t-1], 1)
}
for (k in 1:nstate) {
mean_phi[k] ~ dunif(0, 1)
phi_sigma[k] ~ dunif(0, 20)
}
for(t in 1:(nt-1)){
phi[t] ~ dnorm(mean_phi[phi_state[t]], phi_sigma[phi_state[t]]^-2)
}
}
library(R2jags)
fit <- jags(list(nt=nt, nstate=nstate), NULL,
c('phi_state', 'phi', 'mean_phi', 'phi_sigma', 'p'),
M, DIC=FALSE)
请注意,上面p
是向上移动到下一个(相邻)状态的概率向量。