2013-07-23 7 views
5

При использовании jags.parallel, я получаю следующее сообщение об ошибке:jags.parallel - Ошибка в GET (имя, Envir = ENVIR): Invalid первый аргумент

> 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 работает нормально. Я только нашел one thread on this topic, но есть только одно умозрительное предложение, которое не применяется и не работает здесь.

Воспроизводимый код, взятый из Introduction to WinBUGS for ecologists, see chapter 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)); 
+1

ошибка происходит потому, что первый аргумент 'get' должен быть строкой символов именования функции. Используйте 'traceback', чтобы увидеть, какая функция вызывает' get' и выдает ошибку, а затем 'debug' эту функцию для исследования объектов в теле функции. Или вы можете использовать 'options (error = recover)' (и отключить его через 'options (error = NULL)'). –

+0

Спасибо @Joshua! Так что это фактически приводит к отладке пакета jags, а не моего кода, правильно? Если мы завершим, что это ошибка, то, может быть, я лучше всего отчитаюсь разработчикам jags? – TMS

+0

Не уверен. Я не знаком с этими пакетами и не запускал код, поэтому он все равно может быть одной из ваших функций (например, возможно, 'inits' должен быть' 'inits'' в вызове' jags.parallel'?). но это должно быть ясно для вас, как только вы запустите 'traceback'. –

ответ

4

Зубцов/R был практически две проблем с этой линией:

out <- jags.parallel(win.data, inits, params, "Poisson.OD.t.test.txt", 
    nc, ni, nb, nt); 

Оба связаны с оценкой параметров функции - он вероятно, не в состоянии разрешить параметры, которые относятся к другим переменным R:

1) win.data был зашифрован как va riable имена, как правило, для WinBUGS/Зубцов:

win.data <- list(C.OD = C.OD, x = as.numeric(x)-1, n = length(x))` 

но jags.parallel выдает ошибку "Ошибка в ГЭТ (имя, Envir = Envir): недопустимый первый аргумент". Он хочет получить данные в таком формате:

windata <- list("C.OD", "x", "n") 

Почему? Не спрашивайте меня ... Я обнаружил это, читая пример ?jags.

2) Аргументы nc, ni, nb, nt в вызове функции являются проблемой! Если я ставлю константы, это нормально, но ссылки на переменные неприемлемы для него. Не спрашивай меня, почему. Помощь найдено по адресу strange jags.parallel error/avoiding lazy evaluation in function call.

Полное исправление выглядит следующим образом:

out <- do.call(jags.parallel, list(names(win.data), inits, params, "Poisson.OD.t.test.txt", 
    nc, ni, nb, nt)); 
+0

Спасибо! Я могу добавить, что модель ДОЛЖНА быть именем файла. Текстовое соединение (modelString) не работает. Я использовал sink(), cat() и file.remove() для обработки файла. –

+0

@ Джонас, точно - я все время так делаю. – TMS

+0

@TMS, быстрый вопрос, делает jags.parallel фактически распараллеливать? Я имею в виду, нужно ли другим пакетам, таким как '' снег'' выполнять распараллеливание, или он сам распараллеливает разные цепи, и нам не нужно заботиться об этой части? Благодаря! – qkhhly