2013-07-23 7 views
5

jags.parallelを使用して、私は次のエラーを取得する:jags.parallel - GET(名前、ENVIR = ENVIR)でエラー:無効な最初の引数

> 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機能を使用して、同じ呼び出しがOKに実行されます。私はone thread on this topicしか見つけられませんでしたが、ここには適用されず、またここでは働かない推測的提案が1つしかありません。

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' 'の最初の引数は、関数を命名する文字列でなければならないため、エラーが発生しました。どの関数が 'get'を呼び出してエラーを生成するのかを見るには' traceback'を使い、次に関数本体のオブジェクトを調べる 'debug'関数を使います。あるいは、 'options(error = recover)'を使うことができます( 'options(error = NULL)'を介して)。 –

+0

ありがとう@ジョシュア!だから、これは実際に私のコードではなく、jagsパッケージのデバッグにつながるのですか?私たちはそれがバグだと判断した場合、おそらく私は最高の戦略はジャグの開発者に報告することです? – TMS

+0

わかりません。私はこれらのパッケージに精通しておらず、コードを実行していないので、それはあなたの関数の1つである可能性があります( 'jits.parallel'呼び出しで' inits'が '' inits "'でしょうか?しかし、一度 'traceback'を実行すると、それはあなたには明らかです。 –

答えて

4

ぎざぎざ/ Rはこの線と実質的に二つの問題を有していた:

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

両方が機能パラメータの評価に関連している - 彼はおそらく他のR変数を参照するパラメータを解決することができないでしょう:

1)win.dataはva通常WinBUGS /ぎざぎざ用としてriable名:

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

しかしjags.parallel問題エラー "GETでエラーが発生しました(名前、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

ありがとう!モデルをファイル名にする必要があります。 textConnection(modelString)は機能しません。私はsink()、cat()、file.remove()を使ってファイルを処理していました。 –

+0

@Jonas、まさに - これはいつも好きです。 – TMS

+0

@TMS、簡単な質問ですが、jags.parallelは実際には並列化していますか?つまり、並列化を行うために「雪」のような他のパッケージが必要なのでしょうか、それとも別のチェーンをそれ自体で並列化するので、その部分を世話する必要はありませんか?ありがとう! – qkhhly