问题在于
jags
把它打包
R2Jags
依靠。
-
JAGS使用
printf
不
fprintf
显示警告。jags不会把警告发送给
stderr
,它将警告发送到控制台而不是stderr。因此,R控制台无法筛选警告。
R2JAGS
依赖于
贾格斯
申请。我从sourceforge下载了jags源代码
JAGS-4.3.0
,编译并安装库。这让我可以追踪代码并识别
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)
问题是
普林特
不使用
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)
现在您可以编译并安装jags库:
>./configure
>sudo make uninstall && sudo make install
完成后,我们可以卸载r2jags库,重新安装它,并使用带有stderr重定向的r cmd来抑制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
控制台输出:
未经改装的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).
改进的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).
长期解决方案
提交一个bug并通过sourceforge建议修复。