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));

person Tomas    schedule 23.07.2013    source источник
comment
Ошибка возникает из-за того, что первый аргумент get должен быть символьной строкой, называющей функцию. Используйте traceback, чтобы увидеть, какая функция вызывает get и выдает ошибку, затем debug эту функцию, чтобы исследовать объекты в теле функции. Или вы можете использовать options(error=recover) (и выключить через options(error=NULL)).   -  person Joshua Ulrich    schedule 23.07.2013
comment
Спасибо, @Joshua! Так что это на самом деле приводит к отладке пакета jags, а не моего кода, верно? Если мы придем к выводу, что это ошибка, то, может быть, лучшая стратегия - сообщить разработчикам jags?   -  person Tomas    schedule 23.07.2013
comment
Не уверен. Я не знаком с этими пакетами и не запускал код, поэтому это может быть одна из ваших функций (например, может быть, inits должен быть "inits" в jags.parallel вызове?) ... но это должно быть вам ясно, как только вы запустить traceback.   -  person Joshua Ulrich    schedule 23.07.2013
comment
Возможно, имеет отношение к делу: stackoverflow.com/q/21367922/684229   -  person Tomas    schedule 26.01.2014


Ответы (1)


У 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));
person Tomas    schedule 22.11.2013
comment
Спасибо! Я могу добавить, что модель ДОЛЖНА быть именем файла. TextConnection (modelString) не работает. Я использовал функцииink (), cat () и file.remove () для обработки файла. - person Jonas Lindeløv; 21.04.2014
comment
@Jonas, именно так - я все время так делаю. - person Tomas; 22.04.2014
comment
@TMS, быстрый вопрос, действительно ли jags.parallel распараллеливается? Я имею в виду, нужны ли ему другие пакеты, такие как snow, для распараллеливания, или он сам распараллеливает различные цепочки, и нам не нужно заботиться об этой части? Спасибо! - person qkhhly; 28.03.2015
comment
@qkhhly На самом деле я не помню, но я думаю, что он действительно распараллеливается. Но я полностью отказался от использования R2jags и этой функции, поскольку было много ошибок и странных проблем, подобных этой. Сейчас я использую пакет runjags и доволен. С помощью функции run.jags вы можете просто указать method = "rjparallel", и цепочки будут выполняться на отдельных ядрах. И самое лучшее, что это действительно работает :-) - person Tomas; 29.03.2015
comment
@TMS & @qkhhly, я думаю (по крайней мере, R2jags версия 0.5-7) использует пакет R parallel для инициализации кластеров и т. Д. У него есть несколько хороших оболочек для экспорта объектов в кластер. - person Michael; 02.03.2020
comment
@TMS, почему этот формат для windata работает, может быть то, как пакет определяет, что экспортировать в кластер ... кстати. - person Michael; 02.03.2020