jags.parallel - ошибка в get(name, envir = envir): неверный первый аргумент
Когда используешь jags.parallel
Я получаю следующую ошибку:
> out <- jags.parallel(win.data, inits, params, "Poisson.OD.t.test.txt",
+ nc, ni, nb, nt);
Error in get(name, envir = envir) : invalid first argument
Тот же вызов с использованием jags
Функция работает нормально. Я нашел только одну ветку на эту тему, но есть только одно умозрительное предложение, которое здесь не применимо и не работает.
Воспроизводимый код, взятый из Введение в WinBUGS для экологов, см. Главу 14.1 (слегка изменено):
set.seed(123)
### 14.1.2. Data generation
n.site <- 10
x <- gl(n = 2, k = n.site, labels = c("grassland", "arable"))
eps <- rnorm(2*n.site, mean = 0, sd = 0.5)# Normal random effect
lambda.OD <- exp(0.69 +(0.92*(as.numeric(x)-1) + eps) )
lambda.Poisson <- exp(0.69 +(0.92*(as.numeric(x)-1)) ) # For comparison
C.OD <- rpois(n = 2*n.site, lambda = lambda.OD)
C.Poisson <- rpois(n = 2*n.site, lambda = lambda.Poisson)
### 14.1.4. Analysis using WinBUGS
# Define model
sink("Poisson.OD.t.test.txt")
cat("
model {
# Priors
alpha ~ dnorm(0,0.001)
beta ~ dnorm(0,0.001)
sigma ~ dunif(0, 10)
tau <- 1 / (sigma * sigma)
maybe_overdisp <- mean(exp_eps[])
# Likelihood
for (i in 1:n) {
C.OD[i] ~ dpois(lambda[i])
log(lambda[i]) <- alpha + beta *x[i] #+ eps[i]
eps[i] ~ dnorm(0, tau)
exp_eps[i] <- exp(eps[i])
}
}
",fill=TRUE)
sink()
# Bundle data
win.data <- list(C.OD = C.OD, x = as.numeric(x)-1, n = length(x))
# Inits function
inits <- function(){ list(alpha=rlnorm(1), beta=rlnorm(1), sigma = rlnorm(1))}
# Parameters to estimate
params <- c("lambda","alpha", "beta", "sigma", "maybe_overdisp")
# MCMC settings
nc <- 3 # Number of chains
ni <- 3000 # Number of draws from posterior per chain
nb <- 1000 # Number of draws to discard as burn-in
nt <- 5 # Thinning rate
require(R2jags)
# THIS WORKS FINE
out <- R2jags::jags(win.data, inits, params, "Poisson.OD.t.test.txt",
nc, ni, nb, nt);
# THIS PRODUCES ERROR
out <- jags.parallel(win.data, inits, params, "Poisson.OD.t.test.txt",
nc, ni, nb, nt);
# THIS ALSO PRODUCES ERROR
out <- do.call(jags.parallel, list(win.data, inits, params, "Poisson.OD.t.test.txt",
nc, ni, nb, nt));
2 ответа
У Jags/R были практически две проблемы с этой линией:
out <- jags.parallel(win.data, inits, params, "Poisson.OD.t.test.txt",
nc, ni, nb, nt);
Оба связаны с оценкой параметров функции - он, вероятно, не в состоянии разрешить параметры, которые относятся к другим переменным R:
1) win.data
был закодирован как имена переменных, как обычно для WinBUGS/Jags:
win.data <- list(C.OD = C.OD, x = as.numeric(x)-1, n = length(x))`
но jags.parallel
выдает ошибку "Ошибка в get(name, envir = envir): неверный первый аргумент". Он хочет данные в этом формате:
windata <- list("C.OD", "x", "n")
Зачем? Не спрашивайте меня... Я обнаружил это, читая пример ?jags
,
2) Аргументы nc, ni, nb, nt
в вызове функции есть проблема! Если я ставлю константы, это нормально, но ссылки на переменные для него неприемлемы. Не спрашивай меня почему. Способ устранения найден при странной ошибке jags.parallel / избегать ленивых вычислений при вызове функции.
Полное исправление выглядит так:
out <- do.call(jags.parallel, list(names(win.data), inits, params, "Poisson.OD.t.test.txt",
nc, ni, nb, nt));
иногда эта ошибка возникает, когда вы используете векторизованную функцию внутри parlapply. Я решил проблему, добавив функции «do.call» и «mapply» в файлuster.export.