r - 抑制 R 中的 JAGS "value out of range"警告

标签 r jags r2jags rjags

我使用 R2jags 包(使用 rjags 包来运行 JAGS)的 jags 函数在 R 中运行大量 JAGS 模型。

我在控制台中打印了很多警告:

value out of range in 'lgamma'

打印这些警告似乎会严重影响计算时间。我该如何抑制这种情况?

警告将作为输出打印,而不是 R 警告。

我尝试过但不起作用的事情包括:

  • 将我的调用包装在 try(...,silent = TRUE)suppressWarningsinvisible,或capture.output

  • jags 中的 jags.model 调用更改为 jags.model(..., 安静= TRUE)

这种现象也是 noted elsewhere ,我只是想将其关闭以减少大量不必要的打印到控制台的计算负载。

有什么建议吗?


这是一个基于 an example of the same issue on sourceforge 的长但可重现的示例。很抱歉这篇文章的长度,但我无法在任何较小的玩具模型中复制它。我不太关心这个特定的模型,但它合理地简单地复制了问题:

型号

cat('
model {
    K <- 1.1

    K.mvhypgeom <- exp( logfact(sum(n[])) - logfact(nMissing) - logfact( sum(n[]) - nMissing))

    p ~ dunif(0,1)

    for (t in 1:N) {
    X.missing[t] ~ dpois( missRate )
    }     

    nMissing ~ dsum(X.missing[1],X.missing[2],X.missing[3],X.missing[4],X.missing[5],X.missing[6],X.missing[7],X.missing[8],X.missing[9],X.missing[10])

    for (t in 1:N) {
    pX.missing[t] <- exp(logfact(n[t]) - logfact( X.missing[t]) - logfact( n[t] - X.missing[t]))
    ones2[t] ~ dbern(pX.missing[t]/K.mvhypgeom)
    }

    for (t in 1:N) {
    X[t] <- X.obs[t] + X.missing[t]

    likX[t] <- dbin( X[t], p, n[t])
    ones1[t] ~ dbern( likX[t] / K)    
    }
    }
  ',
    file = {example.model <- tempfile()},
    sep = ''
)

数据

simBinTS <- function(n, p , nMissing) {
  X.full <- X <- rbinom(N, size = n, prob = p)
  for (i in seq_len(nMissing)) {
    idx <- sample(1:N, size = 1, prob = X)
    X[idx] <- X[idx] - 1
  }
  return(data.frame(n = n, X = X, X.full = X.full))
}


N <- 10
p <- 0.3
set.seed(123)
n <- rpois(N, lambda = 30)
nMissing <- 10
missRate <- 1/10
ts <- simBinTS(p = p, n = n, nMissing = nMissing)
X.obs <- ts$X
n <- ts$n
X.full <- ts$X.full
ones1 <- rep(1,N)
ones2 <- rep(1,N)

jags.inits <- function(){
  list(X.missing = X.full-X.obs)
}

调用

library("R2jags")

jags(data = list("X.obs", "n", "N", "nMissing", "ones1", "ones2", "missRate"),
     inits = jags.inits,
     parameters.to.save = "p",
     model.file = example.model,
     n.chains = 3,
     n.iter = 1000,
     n.burnin = 500,
     n.thin = 1,
     progress.bar = "none")

输出 (大量重复的警告被修剪 - 同样,这些被打印为函数输出而不是警告消息)

value out of range in 'lgamma'
value out of range in 'lgamma'
value out of range in 'lgamma'
value out of range in 'lgamma'
value out of range in 'lgamma'
value out of range in 'lgamma'
Inference for Bugs model at "D:\Users\fish\AppData\Local\Temp\RtmpWufTIC\file1614244456e1", fit using jags,
 3 chains, each with 1000 iterations (first 500 discarded)
 n.sims = 1500 iterations saved
         mu.vect sd.vect    2.5%     25%     50%     75%   97.5%  Rhat
p          0.331   0.027   0.280   0.312   0.330   0.348   0.388 1.006
deviance 812.379   2.761 808.165 810.345 811.941 814.103 818.729 1.007
         n.eff
p         1300
deviance   670

For each parameter, n.eff is a crude measure of effective sample size,
and Rhat is the potential scale reduction factor (at convergence, Rhat=1).

DIC info (using the rule, pD = var(deviance)/2)
pD = 3.8 and DIC = 816.2
DIC is an estimate of expected predictive error (lower deviance is better).

最佳答案

问题出在 jagsR2Jags依赖于。

  • jags 使用 printf 而不是 fprintf 来显示警告。 Jags 不会将警告发送到 stderr,而是将警告发送到控制台而不是 stderr。因此,R 控制台无法过滤警告。

R2Jags依赖于jags应用。我从 Sourceforge 下载了 JAGS-4.3.0 的 jag 源代码,编译并安装了该库。这使我能够跟踪代码并确定 jags 通过以下方式抛出警告:

  • src/jrmath/lgamma.c:74 通过 ML_ERROR(ME_RANGE, "lgamma");

这解决了

  • src/jrmath/nmath.h:138 通过 MATHLIB_WARNING(msg, s);

解析为

  • src/jrmath/nmath.h:81
  • #define MATHLIB_WARNING(fmt,x) printf(fmt,x)

这里的问题是使用了printf而不是fprint(stderr,...),这可以这样修补:


快速解决方案:

如果您希望快速解决问题,可以下载源代码并应用以下修复:

$ diff nmath.h.orig nmath.h
81c81
< #define MATHLIB_WARNING(fmt,x)        printf(fmt,x)
---
> #define MATHLIB_WARNING(fmt,x)        fprintf(stderr,fmt,x)

现在您可以编译并安装 jag 库了:

>./configure
>sudo make uninstall && sudo make install 

完成此操作后,我们可以卸载 R2jags 库,重新安装它并使用 R CMD 和 stderr 重定向来抑制 stderr...

R CMD ./50635735.R 2> /dev/null

代码示例

#!/usr/bin/env Rscript

library("R2jags")

source("./model.R") # Source Model
source("./simbits.R") # Source simBinTS code...

jags.data <- list("X.obs", "n", "N", "nMissing", "ones1", "ones2", "missRate")

model <- jags(data = jags.data,
              inits = jags.inits,
              parameters.to.save = "p",
              model.file = example.model,
              n.chains = 3,
              n.iter = 1000,
              n.burnin = 500,
              n.thin = 1,
              progress.bar = "none")

model

控制台输出:

未修改的锯齿

$ R CMD ./50635735.R 2> /dev/null
1 checking for pkg-config... /usr/local/bin/pkg-config
2 configure: Setting compile and link flags according to pkg-config
3 configure: Compile flags are -I/usr/local/include/JAGS
4 configure: Link flags are -L/usr/local/lib -ljags
5 checking for gcc... ccache clang
6 checking whether we are using the GNU C compiler... no
7 checking whether ccache clang accepts -g... no
8 checking for ccache clang option to accept ISO C89... unsupported
9 checking for jags_version in -ljags... yes
10 checking version of JAGS library... OK
11 configure: creating ./config.status
12 config.status: creating src/Makevars
13 configure: creating ./config.status
14 config.status: creating src/Makevars
15 config.status: creating R/unix/zzz.R
16 ccache clang++ -I"/usr/local/Cellar/r/3.5.0_1/lib/R/include" -DNDEBUG -I/usr/local/include/JAGS   -I/usr/local/opt/gettext/include -I/usr/
17 ccache clang++ -I"/usr/local/Cellar/r/3.5.0_1/lib/R/include" -DNDEBUG -I/usr/local/include/JAGS   -I/usr/local/opt/gettext/include -I/usr/
18 ccache clang++ -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -L/usr/loc
19 Compiling model graph
20    Resolving undeclared variables
21    Allocating nodes
22 Graph information:
23    Observed stochastic nodes: 21
24    Unobserved stochastic nodes: 11
25    Total graph size: 174
26
27 Initializing model
28
29 value out of range in 'lgamma'
30 value out of range in 'lgamma'
31 value out of range in 'lgamma'
32 value out of range in 'lgamma'
...
...
...
10089 value out of range in 'lgamma'
10090 Inference for Bugs model at "/var/folders/md/03gdc4c14z18kbqwpfh4jdfc0000gp/T//Rtmp3P3FrI/file868156b0697", fit using jags,
10091  3 chains, each with 1000 iterations (first 500 discarded)
10092  n.sims = 1500 iterations saved
10093          mu.vect sd.vect    2.5%     25%     50%     75%   97.5%  Rhat n.eff
10094 p          0.333   0.027   0.281   0.315   0.332   0.350   0.391 1.003   590
10095 deviance 812.168   2.720 808.036 810.199 811.778 813.737 818.236 1.036    66
10096
10097 For each parameter, n.eff is a crude measure of effective sample size,
10098 and Rhat is the potential scale reduction factor (at convergence, Rhat=1).
10099
10100 DIC info (using the rule, pD = var(deviance)/2)
10101 pD = 3.6 and DIC = 815.8
10102
10103
10104
10105
10106
10107
10108
10109 BDIC is an estimate of expected predictive error (lower deviance is better).

修改 Jags 框架

$ R CMD ./50635735.R 2> /dev/null
checking for pkg-config... /usr/local/bin/pkg-config
configure: Setting compile and link flags according to pkg-config
configure: Compile flags are -I/usr/local/include/JAGS
configure: Link flags are -L/usr/local/lib -ljags
checking for gcc... ccache clang
checking whether we are using the GNU C compiler... no
checking whether ccache clang accepts -g... no
checking for ccache clang option to accept ISO C89... unsupported
checking for jags_version in -ljags... yes
checking version of JAGS library... OK
configure: creating ./config.status
config.status: creating src/Makevars
configure: creating ./config.status
config.status: creating src/Makevars
config.status: creating R/unix/zzz.R
ccache clang++ -I"/usr/local/Cellar/r/3.5.0_1/lib/R/include" -DNDEBUG -I/usr/local/include/JAGS   -I/usr/local/opt/gettext/include -I/usr/local/opt/readline/include -I/usr/local/include   -fPIC  -g -O2  -c jags.cc -o jags.o
ccache clang++ -I"/usr/local/Cellar/r/3.5.0_1/lib/R/include" -DNDEBUG -I/usr/local/include/JAGS   -I/usr/local/opt/gettext/include -I/usr/local/opt/readline/include -I/usr/local/include   -fPIC  -g -O2  -c parallel.cc -o parallel.o
ccache clang++ -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -L/usr/local/opt/gettext/lib -L/usr/local/opt/readline/lib -L/usr/local/lib -L/usr/local/Cellar/r/3.5.0_1/lib/R/lib -L/usr/local/opt/gettext/lib -L/usr/local/opt/readline/lib -L/usr/local/lib -o rjags.so jags.o parallel.o -L/usr/local/lib -ljags -L/usr/local/opt/icu4c/lib -L/usr/local/lib -L/usr/local/Cellar/r/3.5.0_1/lib/R/lib -lR -lintl -Wl,-framework -Wl,CoreFoundation
Compiling model graph
   Resolving undeclared variables
   Allocating nodes
Graph information:
   Observed stochastic nodes: 21
   Unobserved stochastic nodes: 11
   Total graph size: 174

Initializing model

Inference for Bugs model at "/var/folders/md/03gdc4c14z18kbqwpfh4jdfc0000gp/T//RtmpI80TnH/file8e70516d6f34", fit using jags,
 3 chains, each with 1000 iterations (first 500 discarded)
 n.sims = 1500 iterations saved
         mu.vect sd.vect    2.5%     25%     50%     75%   97.5%  Rhat n.eff
p          0.333   0.027   0.281   0.315   0.332   0.350   0.391 1.003   590
deviance 812.168   2.720 808.036 810.199 811.778 813.737 818.236 1.036    66

For each parameter, n.eff is a crude measure of effective sample size,
and Rhat is the potential scale reduction factor (at convergence, Rhat=1).

DIC info (using the rule, pD = var(deviance)/2)
pD = 3.6 and DIC = 815.8
DIC is an estimate of expected predictive error (lower deviance is better).

长期解决方案

通过 SourceForge 提交错误并提出修复建议。

关于r - 抑制 R 中的 JAGS "value out of range"警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50635735/

相关文章:

bayesian - 拟合贝叶斯线性回归并预测不可观察的值

r - 使用存储在行 R 中的 key 将数据帧从宽格式转换为长格式

r - 如何合并具有相同 doc_id 的主题建模行

rjags 错误 mat[, "deviance"] : subscript out of bounds 中的错误

winbugs - JAGS - 即使使用伪先验,分层模型比较也不会在模型之间跳转

winbugs - 当指定 burnin 和 thinning 时,JAGS/BUGS 节省了多少次迭代?

r - 在 R 中,如何根据另一个数据框中的范围对一个数据框中的值进行分类?

r - 如何从 postgresql 数据库中提取数据到我的 shinyapps.io

r - 如何覆盖观察节点的值?

r - 向量错误 ("list",n.chains) : invalid 'length' argument