2013-07-23 3 views
5

Lorsque vous utilisez jags.parallel, je reçois l'erreur suivante:jags.parallel - Erreur dans get (nom, Envir = Envir): premier argument invalide

> 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 

Le même appel en utilisant la fonction jags exécute OK. J'ai seulement trouvé one thread on this topic, mais il y a seulement une suggestion spéculative qui ne s'applique pas et ne fonctionne pas ici.

Code Reproductibles, pris de Introduction to WinBUGS for ecologists, see chapter 14.1 (légèrement modifié):

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

L'erreur se produit parce que le premier argument de 'get' doit être une chaîne de caractères nommant une fonction. Utilisez 'traceback' pour voir quelle fonction appelle' get' et produit l'erreur, puis 'debug' pour explorer les objets dans le corps de la fonction. Ou vous pouvez utiliser 'options (error = recover)' (et le désactiver via 'options (error = NULL)'). –

+0

Merci @Joshua! Donc, cela conduit réellement à déboguer le paquet Jags, pas mon code, non? Si nous concluons que c'est un bug, alors peut-être que la meilleure stratégie est de rapporter aux développeurs de jags? – TMS

+0

Pas certain. Je ne suis pas familier avec ces paquets et n'ai pas exécuté le code, donc ça pourrait toujours être une de vos fonctions (par exemple, 'inits' devrait être' 'inits '' dans l'appel 'jags.parallel'?). mais cela devrait être clair pour vous une fois que vous avez exécuté 'traceback'. –

Répondre

4

Jags/R avait pratiquement deux problèmes avec cette ligne:

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

Les deux sont liés à l'évaluation des paramètres de la fonction - il n'est probablement pas capable de résoudre les paramètres qui se réfèrent à d'autres variables R:

1) Le win.data a été codé en tant que va Les noms riable comme d'habitude pour WinBugs/Jags:

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

mais jags.parallel problèmes l'erreur "Erreur dans get (nom, Envir = Envir): premier argument non valide". Il veut les données dans ce format:

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

Pourquoi? Ne me demandez pas ... Je l'ai découvert en lisant l'exemple de ?jags.

2) Les arguments nc, ni, nb, nt dans l'appel de fonction sont un problème! Si je mets des constantes, c'est OK, mais les références aux variables sont inacceptables pour lui. Ne me demande pas pourquoi. Remède trouvé au strange jags.parallel error/avoiding lazy evaluation in function call.

La solution complète ressemble:

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

Merci! Je peux ajouter que le modèle DOIT être un nom de fichier. Un textConnection (modelString) ne fonctionne pas. J'ai utilisé sink(), cat() et file.remove() pour gérer le fichier. –

+0

@Jonas, exactement - Je le fais comme ça tout le temps. – TMS

+0

@TMS, une question rapide, est-ce que jags.parallel parallélise? Je veux dire, a-t-il besoin d'autres paquets comme '' snow'' pour faire la parallélisation, ou est-ce qu'il parallélise différentes chaînes par lui-même et que nous n'avons pas besoin de prendre soin de cette partie? Merci! – qkhhly

Questions connexes