rjagsr2jagsrjags

Suppress JAGS "value out of range" warnings in R


I'm running a large number of JAGS models in R using the jags function of the R2jags package (which uses the rjags package to run JAGS).

I get a lot of warnings printed in the console:

value out of range in 'lgamma'

Printing these warnings seems to heavily impinge on computing time. How do I suppress this?

The warnings are printed as output, rather than an R warning.

Thing's I've tried that don't work include:

The phenomenon is also noted elsewhere, I just want to shut it up to reduce computation load from squillions of unnecessary prints to console.

Any suggestions?


Here's a long but reproducible example based on an example of the same issue on sourceforge. Apologies for the length of this but I couldn't replicate it in any smaller toy models. I couldn't care less about this particular model, but it replicates the problem reasonably simply:

Model

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 = ''
)

Data

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

Call

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

Output (large number of repeats of warning trimmed - again these are printed as function output rather than as warning messages)

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

Solution

  • The issue is with the jags package that R2Jags relies upon.

    R2Jags relies upon the jags application. I downloaded the jags source code from Sourceforge for JAGS-4.3.0, compiled and installed the library. This allowed me to trace through the code and identify that jags throws a warning via:

    this resolves through to

    which resolves to

    the issue here is that printf is used not fprint(stderr,...), this can be patched thus:


    Quick Solution:

    If you wish to resolve quickly you can download the source and apply the following fix:

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

    now you can compile and install the jags library:

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

    with this done we can uninstall the R2jags library, reinstall it and repress stderr using R CMD with stderr redirect...

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

    Code Example

    #!/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
    

    Console Output:

    Unmodified jags

    $ 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).
    

    Modified Jags framework

    $ 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).
    

    Long-Term Solution

    Submit a bug and propose fix via SourceForge.