#r #bayesian #jags
#r #байесовский #jags
Вопрос:
Я супер новичок в байесовском анализе и пытаюсь практиковаться на примере классических моделей захвата-повторного захвата: Mh2
Это мой код
nind <- dim(venados)[1]
K <- 43
ntraps <- 13
M <- 150
nz <- M - nind
Yaug <- array(0, dim = c(M, ntraps, K))
Yaug[1:nind,,] <- venados
y <- apply(Yaug, c(1,3), sum)
y[y > 1] <- 1
Bundle data
data1 <- list(y = y, nz = nz, nind = nind, K = K, sup = Buffer)
# Model JAGS
sink("Mh2_jags.txt")
cat("
model{
# Priors
p0 ~ dunif(0,1)
mup <- log(p0/(1-p0))
sigmap ~ dunif(0,10)
taup <- 1/(sigmap*sigmap)
psi ~ dunif(0,1)
# Likelihood
for (i in 1:(nind nz)) {
z[i] ~ dbern(psi)
lp[i] ~ dnorm(mup,taup)
logit(p[i]) <- lp[i]
y[i] ~ dbin(mu[i],K)
} # i
N <- sum(z[1:(nind nz)])
D <- N/sup*100
} # modelo
",fill = TRUE)
sink()
# Inicial values
inits <- function(){list(z = as.numeric(y >= 1), psi = 0.6, p0 = runif(1), sigmap = runif(1, 0.7, 1.2), lp = rnorm(M, -0.2))}
params1 <- c("p0","sigmap","psi","N","D")
# MCMC
ni <- 10000; nt <- 1; nb <- 1000; nc <- 3
# JAGS and posteriors
fM2 <- jags(data1, inits, params1, "Mh2_jags.txt", n.chains = nc, n.thin = nt, n.iter = ni, n.burnin = nb)
Я получил это сообщение об ошибке
Processing function input.......
Done.
Compiling model graph
Resolving undeclared variables
Deleting model
Error in jags.model(file = model.file, data = data, inits = inits, n.chains = n.chains, :
RUNTIME ERROR:
Compilation error on line 16.
Dimension mismatch in subset expression of y
Я читал, что некоторые буквы, такие как s и n, должны быть изменены. Однако,
Я не знаю, что делать. Пожалуйста, если бы вы могли дать совет.
Большое вам спасибо
Ответ №1:
Проблема в том, что y
является двумерной, но модель предполагает, что она одномерная. Если вы предполагаете, что вторичные опросы являются i.i.d. испытаниями Бернулли (и в каждой сессии были K
испытания) n, тогда вам просто нужно было бы взять сумму строк y
матрицы. Предполагая, что это так, вам просто нужно изменить пару строк в верхней части этого скрипта.
nind <- dim(venados)[1]
K <- 43
ntraps <- 13
M <- 150
nz <- M - nind
Yaug <- array(0, dim = c(M, ntraps, K))
Yaug[1:nind,,] <- venados
y <- apply(Yaug, c(1,3), sum)
y[y > 1] <- 1
# Take the rowSum
y_vector <- rowSums(y)
# Use y_vector instead of y
data1 <- list(y = y_vector, nz = nz, nind = nind, K = K, sup = Buffer)
И наоборот, если бы вы хотели включить ковариаты для процесса наблюдения (а эти ковариаты варьируются в зависимости от опроса), вы бы использовали матрицу y
и модифицировали модель.
sink("Mh2_jags_Kloop.txt")
cat("
model{
# Priors
p0 ~ dunif(0,1)
mup <- log(p0/(1-p0))
sigmap ~ dunif(0,10)
taup <- 1/(sigmap*sigmap)
psi ~ dunif(0,1)
# Likelihood
for (i in 1:(nind nz)) {
z[i] ~ dbern(psi)
lp[i] ~ dnorm(mup,taup)
logit(p[i]) <- lp[i]
# Loop over K surveys
for(j in 1:K){
y[i,j] ~ dbern(p[i]*z[i])
}
} # i
N <- sum(z[1:(nind nz)])
D <- N/sup*100
} # modelo
",fill = TRUE)
sink()
Наконец, вы не указываете, что mu
находится внутри модели. Я думаю, вы хотите, чтобы это было p
, но вам также необходимо связать модель скрытого состояния с моделью состояния наблюдения (если z=0
тогда этот индивидуум не может быть выбран. В этом случае вы бы интерпретировали psi
как вероятность того, что nind nz
люди находятся на вашем сайте.
# Model JAGS
sink("Mh2_jags.txt")
cat("
model{
# Priors
p0 ~ dunif(0,1)
mup <- log(p0/(1-p0))
sigmap ~ dunif(0,10)
taup <- 1/(sigmap*sigmap)
psi ~ dunif(0,1)
# Likelihood
for (i in 1:(nind nz)) {
z[i] ~ dbern(psi)
lp[i] ~ dnorm(mup,taup)
logit(p[i]) <- lp[i]
y[i] ~ dbin(p[i] * z[i],K)
} # i
N <- sum(z[1:(nind nz)])
D <- N/sup*100
} # modelo
",fill = TRUE)
sink()