Я пытаюсь добавить немного кода в модель захвата-повторного захвата данных и придумываю некоторые ошибки, с которыми я раньше не сталкивался. Короче говоря, я хочу оценить серию фаз выживания, каждая из которых длится более одного временного интервала. Я хочу, чтобы модель оценивала продолжительность каждой фазы выживания и использовала это для улучшения модели повторной поимки. Я пробовал и потерпел неудачу с несколькими разными подходами, и теперь я пытаюсь достичь этого, используя массив состояний переключения для фаз выживания:
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
or
phi[t] ~ dnorm(mean.phi,phi_tau) #estimate hierarchical phi's from a single mean.phi
or
#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/
но я не вижу, где я переопределяю переменные в этом случае ... Любая помощь в исправлении этого или совет по лучшему подходу были бы очень кстати!
Большое спасибо, Джош