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

Posted

技术标签:

【中文标题】jags.parallel - get(name, envir = envir) 中的错误:第一个参数无效【英文标题】:jags.parallel - Error in get(name, envir = envir) : invalid first argument 【发布时间】:2013-07-22 10:15:40 【问题描述】:

使用jags.parallel时,出现以下错误:

> 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));

【问题讨论】:

出现错误是因为get的第一个参数必须是命名函数的字符串。使用traceback 查看哪个函数调用get 并产生错误,然后使用debug 该函数调查函数体中的对象。或者您可以使用options(error=recover)(并通过options(error=NULL) 将其关闭)。 谢谢@Joshua!所以这实际上会导致调试 jags 包,而不是我的代码,对吧?如果我们断定这是一个错误,那么也许我最好的策略是向 jags 开发人员报告? 不确定。我不熟悉这些包并且没有运行代码,所以它仍然可能是您的功能之一(例如,inits 应该是"inits"jags.parallel 调用中?)...但这应该一旦你运行traceback,你就会清楚。 可能不相关:***.com/q/21367922/684229 【参考方案1】:

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

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

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

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

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

但是jags.parallel 发出错误“get(name, 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));

【讨论】:

谢谢!我可以补充一点,模型必须是文件名。 textConnection(modelString) 不起作用。我使用 sink()、cat() 和 file.remove() 来处理文件。 @Jonas,没错——我一直都这样。 @TMS,一个简单的问题,jags.parallel 实际上是并行化的吗?我的意思是,它是否需要像snow 这样的其他包来进行并行化,或者它本身是否并行化不同的链而我们不需要处理那部分?谢谢! @qkhhly 我实际上不记得了,但我认为它实际上是并行的。但是我完全放弃了使用 R2jags 和这个功能,因为有很多像这样的错误和奇怪的问题。我现在正在使用 runjags 包,我很满意。使用run.jags 函数,您只需指定method = "rjparallel",链将在不同的核心上运行。最好的是它确实有效 :-) @TMS & @qkhhly,我认为(至少 R2jags 版本 0.5-7)使用 R 包 parallel 来初始化集群等。它确实有一些很好的包装器用于将对象导出到集群。

以上是关于jags.parallel - get(name, envir = envir) 中的错误:第一个参数无效的主要内容,如果未能解决你的问题,请参考以下文章

unw_get_proc_name -- get name of current procedure

LR脚本信息函数-lr_get_host_name

db.get() 与 db.get_by_key_name() 性能(GAE BIgtable/Datastore)

是否有相当于 PHP 的 $name = $_GET['name'] 的 JQuery 或 JS

LR脚本信息函数-lr_get_master_host_name

odoo name_get与name_search