Ошибка выполнения JAGS: не удается вставить узел в X []. Несоответствие размеров

Я пытаюсь добавить немного кода в модель захвата-повторного захвата данных и придумываю некоторые ошибки, с которыми я раньше не сталкивался. Короче говоря, я хочу оценить серию фаз выживания, каждая из которых длится более одного временного интервала. Я хочу, чтобы модель оценивала продолжительность каждой фазы выживания и использовала это для улучшения модели повторной поимки. Я пробовал и потерпел неудачу с несколькими разными подходами, и теперь я пытаюсь достичь этого, используя массив состояний переключения для фаз выживания:

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/

но я не вижу, где я переопределяю переменные в этом случае ... Любая помощь в исправлении этого или совет по лучшему подходу были бы очень кстати!

Большое спасибо, Джош


person stewart6    schedule 12.05.2015    source источник


Ответы (1)


Я немного не понимаю, каковы ваши фактические данные (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 - это вектор вероятностей перехода к следующему (соседнему) состоянию.

person jbaums    schedule 25.06.2015