首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jags.parallel - get(name,envir = envir)错误:第一个参数无效

jags.parallel - get(name,envir = envir)错误:第一个参数无效
EN

Stack Overflow用户
提问于 2013-07-23 19:13:16
回答 1查看 3.8K关注 0票数 5

在使用jags.parallel时,我得到以下错误:

代码语言:javascript
复制
> 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 (稍作修改):

代码语言:javascript
复制
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));
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-23 07:03:33

Jags/R在这条线路上实际上有两个问题:

代码语言:javascript
复制
out <- jags.parallel(win.data, inits, params, "Poisson.OD.t.test.txt",
    nc, ni, nb, nt);

两者都与函数参数的评估有关-他可能无法解析引用其他R变量的参数:

1)与通常的WinBUGS/Jags一样,win.data被编码为变量名:

代码语言:javascript
复制
win.data <- list(C.OD = C.OD, x = as.numeric(x)-1, n = length(x))`

但是jags.parallel会发出错误"Error in get(name,envir = envir):invalid first argument“。他想要这种格式的数据:

代码语言:javascript
复制
windata <- list("C.OD", "x", "n")

为什么?别问我...我在阅读?jags的示例时发现了这一点。

2)函数调用中的参数nc, ni, nb, nt是一个问题!如果我放置常量,这是可以的,但对变量的引用对他来说是不可接受的。别问我为什么。在strange jags.parallel error / avoiding lazy evaluation in function call上找到了补救措施。

完整的修复方法如下所示:

代码语言:javascript
复制
out <- do.call(jags.parallel, list(names(win.data), inits, params, "Poisson.OD.t.test.txt",
    nc, ni, nb, nt));
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17808575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档