1

我正在尝试向数据增强捕获重新捕获模型添加一些代码,并且遇到了一些我以前从未遇到过的错误。简而言之,我想估计一系列生存阶段,每个阶段都持续一个以上的时间间隔。我希望该模型估计每个幸存阶段的长度,并使用它来改进捕获重新捕获模型。我尝试了几种不同的方法,但都失败了,现在我尝试使用生存阶段的切换状态数组来实现这一点:

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/

但我看不到在这种情况下我在哪里重新定义变量......任何解决这个问题的帮助或关于更好方法的建议都将受到欢迎!

非常感谢,乔希

4

1 回答 1

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是向上移动到下一个(相邻)状态的概率向量。

于 2015-06-25T07:14:31.483 回答