2013-07-23 16 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 기능을 사용하여 같은 전화 확인을 실행합니다. 나는 단지 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

: 같은

전체 수정 보인다. 'traceback'을 사용하여 어떤 함수가'get'을 호출하고 오류를 생성하는지 확인한 다음 함수 본문의 객체를 조사하는 함수 인'debug'를 사용하십시오. 또는'options (error = recover)'를 사용할 수 있습니다 ('options (error = NULL)'을 통해). –

+0

감사합니다. @Joshua! 그래서 실제로 이것은 jags 패키지를 디버깅하는 것이지 내 코드는 디버깅하지 않습니다. 우리가 버그라고 결론을 내린다면 아마도 최고의 전략은 재그 개발자들에게보고하는 것일까? – TMS

+0

확실하지 않습니다. 나는이 패키지들에 익숙하지 않고 코드를 실행하지 않았기 때문에 여전히 당신의 함수 중 하나가 될 수있다. (예를 들어,'inits'는''jags.parallel' 호출에서''inits "'이어야한다.) .. 하지만 일단 추적 추적을 실행하면 그것은 분명해야합니다. –

답변

4

취기/R이 줄을 실질적으로 두 가지 문제가 있었다 :

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

모두가 함수 매개 변수의 평가에 관련을 - 그

1) win.data 버지니아로 인코딩 된 : 아마 다른 R 변수 참조 매개 변수를 해결할 수 없습니다 보통의 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입니다. `get`에 첫 번째 인수가 함수 이름을 지정 문자열이어야합니다 때문에 오류가 발생

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