R functions to filter rjags results
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
A while back I was running a bunch of JAGS models through R, using the rjags (written by Martyn Plummer) and R2jags (by Yu-Sung Su) packages. These packages provide a great interface to the JAGS software, which allows analysis of Bayesian models (written in the BUGS language) through Markov chain Monte Carlo simulation.
Running a JAGS model using these tools returns an rjags object, which when printed to the screen, summarises the posterior distribution of each monitored node, giving its mean and standard deviation, a range of quantiles, and its Gelman-Rubin convergence diagnostic statistic (Rhat), which indicates the ratio of variance within chains to that among chains. The summary is great, but when monitoring a large number of nodes, printing these to the screen can cause R to hang, and can exceed the screen buffer (not to mention making it painful to find the nodes you’re immediately interested in).
To help deal with this I wrote a couple of simple R functions:
jagsresults:return a matrix containing summary results for just the nodes you are interested in (using regular expression pattern-matching, if desired).rhats: sort the output by the nodes’ Rhat values, making it easy to show the n least converged nodes.
Examples
Consider an rjags object that has the following summary (this is the result of the example model given in ?jagsresults). Note that in the examples below I’ve rounded the output to 3 decimal places to prevent line-wrapping/scrollbars on my website (although I’ve excluded the call to round()).
> jagsfit
Inference for Bugs model at "C:/Users/John/AppData/Local/Temp/RtmpIDmQOb/model112833e66869.txt", fit using jags,
3 chains, each with 10000 iterations (first 5000 discarded), n.thin = 5
n.sims = 3000 iterations saved
mu.vect sd.vect 2.5% 25% 50% 75% 97.5% Rhat n.eff
a 0.041 0.052 -0.057 0.005 0.041 0.076 0.146 1.001 3000
beta.rain 0.997 0.055 0.888 0.960 0.999 1.034 1.105 1.001 3000
beta.temp 1.414 0.054 1.310 1.377 1.415 1.451 1.519 1.001 2400
beta.wind -0.458 0.057 -0.570 -0.494 -0.458 -0.420 -0.342 1.001 3000
resid[1] -0.090 0.028 -0.144 -0.109 -0.090 -0.071 -0.035 1.001 3000
resid[2] -0.048 0.024 -0.094 -0.064 -0.048 -0.032 0.001 1.001 3000
resid[3] 0.076 0.031 0.015 0.055 0.075 0.097 0.138 1.001 3000
resid[4] 0.170 0.050 0.069 0.137 0.171 0.204 0.267 1.001 3000
resid[5] 0.110 0.028 0.054 0.091 0.109 0.129 0.165 1.001 3000
resid[6] 0.086 0.045 0.001 0.055 0.086 0.115 0.175 1.001 3000
resid[7] -0.016 0.025 -0.066 -0.033 -0.017 0.001 0.033 1.001 3000
resid[8] -0.226 0.027 -0.280 -0.243 -0.226 -0.207 -0.174 1.001 3000
resid[9] 0.250 0.023 0.204 0.235 0.250 0.266 0.294 1.001 3000
resid[10] -0.017 0.022 -0.060 -0.032 -0.017 -0.002 0.027 1.001 3000
resid[11] -0.069 0.025 -0.117 -0.085 -0.069 -0.052 -0.020 1.001 3000
resid[12] 0.145 0.022 0.102 0.131 0.145 0.159 0.187 1.001 3000
resid[13] -0.184 0.030 -0.246 -0.204 -0.184 -0.163 -0.128 1.001 3000
resid[14] -0.027 0.029 -0.085 -0.046 -0.027 -0.007 0.030 1.001 3000
resid[15] -0.015 0.027 -0.067 -0.032 -0.015 0.003 0.038 1.001 3000
resid[16] -0.176 0.028 -0.231 -0.195 -0.176 -0.158 -0.122 1.001 3000
resid[17] -0.083 0.032 -0.146 -0.105 -0.083 -0.062 -0.021 1.001 3000
resid[18] -0.010 0.030 -0.069 -0.030 -0.010 0.010 0.046 1.001 3000
resid[19] -0.122 0.030 -0.180 -0.142 -0.122 -0.101 -0.063 1.001 3000
resid[20] 0.111 0.024 0.064 0.096 0.111 0.127 0.158 1.001 3000
resid[21] -0.009 0.039 -0.085 -0.036 -0.010 0.018 0.070 1.001 3000
resid[22] -0.171 0.026 -0.223 -0.189 -0.171 -0.154 -0.118 1.001 3000
resid[23] -0.063 0.043 -0.147 -0.092 -0.064 -0.035 0.024 1.001 2800
resid[24] 0.069 0.037 -0.002 0.044 0.070 0.094 0.140 1.001 3000
resid[25] 0.061 0.029 0.003 0.042 0.062 0.081 0.119 1.001 3000
resid[26] 0.046 0.031 -0.017 0.025 0.045 0.066 0.106 1.001 3000
resid[27] 0.138 0.031 0.074 0.117 0.138 0.160 0.197 1.001 3000
resid[28] 0.116 0.020 0.076 0.102 0.116 0.129 0.155 1.001 3000
resid[29] -0.069 0.035 -0.141 -0.093 -0.069 -0.045 -0.002 1.001 3000
resid[30] -0.238 0.029 -0.294 -0.257 -0.238 -0.218 -0.183 1.001 3000
resid[31] 0.131 0.036 0.063 0.106 0.131 0.156 0.203 1.001 3000
resid[32] 0.024 0.036 -0.046 0.000 0.024 0.049 0.094 1.001 3000
resid[33] 0.073 0.036 0.002 0.049 0.073 0.097 0.140 1.001 3000
resid[34] -0.053 0.036 -0.123 -0.077 -0.053 -0.029 0.019 1.001 2700
resid[35] 0.106 0.030 0.047 0.086 0.106 0.126 0.164 1.001 3000
resid[36] 0.154 0.028 0.102 0.136 0.154 0.173 0.211 1.001 3000
resid[37] 0.166 0.029 0.111 0.147 0.166 0.186 0.223 1.001 2100
resid[38] -0.045 0.043 -0.129 -0.074 -0.045 -0.016 0.040 1.002 2700
resid[39] -0.076 0.036 -0.149 -0.101 -0.076 -0.052 -0.005 1.001 3000
resid[40] 0.181 0.032 0.117 0.159 0.181 0.203 0.243 1.001 3000
resid[41] 0.135 0.051 0.033 0.101 0.136 0.169 0.233 1.001 3000
resid[42] 0.118 0.026 0.068 0.101 0.119 0.136 0.170 1.001 3000
resid[43] 0.026 0.031 -0.034 0.005 0.025 0.046 0.085 1.001 3000
resid[44] -0.059 0.032 -0.120 -0.082 -0.059 -0.038 0.005 1.001 3000
resid[45] -0.035 0.041 -0.117 -0.062 -0.035 -0.007 0.043 1.001 3000
resid[46] 0.058 0.035 -0.013 0.035 0.058 0.082 0.126 1.001 3000
resid[47] 0.035 0.033 -0.030 0.013 0.036 0.057 0.100 1.001 3000
resid[48] 0.087 0.024 0.041 0.070 0.086 0.103 0.135 1.001 3000
resid[49] 0.070 0.026 0.017 0.053 0.070 0.087 0.119 1.001 3000
resid[50] 0.085 0.042 0.001 0.058 0.086 0.113 0.168 1.001 3000
resid[51] 0.018 0.034 -0.047 -0.005 0.018 0.040 0.085 1.002 2000
resid[52] -0.125 0.044 -0.210 -0.154 -0.125 -0.097 -0.040 1.001 2900
resid[53] 0.443 0.030 0.384 0.423 0.443 0.463 0.502 1.001 3000
resid[54] -0.351 0.036 -0.421 -0.375 -0.351 -0.326 -0.281 1.001 3000
resid[55] -0.204 0.021 -0.244 -0.218 -0.204 -0.190 -0.162 1.001 3000
resid[56] -0.079 0.027 -0.131 -0.098 -0.079 -0.062 -0.027 1.001 3000
resid[57] 0.025 0.029 -0.034 0.005 0.025 0.044 0.081 1.000 3000
resid[58] -0.149 0.043 -0.233 -0.177 -0.148 -0.120 -0.064 1.001 3000
resid[59] 0.058 0.041 -0.020 0.031 0.057 0.085 0.136 1.001 2200
resid[60] 0.050 0.019 0.012 0.037 0.050 0.063 0.088 1.001 3000
resid[61] 0.237 0.019 0.198 0.223 0.237 0.249 0.275 1.001 3000
resid[62] -0.062 0.031 -0.121 -0.083 -0.062 -0.041 -0.004 1.001 3000
resid[63] -0.196 0.030 -0.257 -0.216 -0.197 -0.175 -0.139 1.001 3000
resid[64] 0.009 0.032 -0.055 -0.012 0.010 0.031 0.073 1.001 3000
resid[65] 0.138 0.041 0.057 0.109 0.137 0.165 0.220 1.001 3000
resid[66] 0.124 0.030 0.066 0.103 0.124 0.144 0.183 1.002 1800
resid[67] 0.217 0.022 0.175 0.202 0.217 0.232 0.262 1.001 3000
resid[68] 0.043 0.036 -0.028 0.018 0.043 0.067 0.114 1.001 3000
resid[69] -0.224 0.034 -0.290 -0.246 -0.224 -0.200 -0.158 1.001 3000
resid[70] 0.072 0.028 0.019 0.053 0.072 0.090 0.128 1.001 3000
resid[71] -0.184 0.028 -0.238 -0.203 -0.184 -0.165 -0.129 1.001 3000
resid[72] 0.183 0.033 0.117 0.161 0.183 0.205 0.250 1.003 1600
resid[73] 0.041 0.028 -0.015 0.023 0.041 0.061 0.094 1.001 3000
resid[74] 0.131 0.025 0.079 0.114 0.131 0.147 0.180 1.001 3000
resid[75] -0.138 0.022 -0.182 -0.153 -0.138 -0.123 -0.095 1.001 3000
resid[76] 0.341 0.023 0.295 0.326 0.341 0.357 0.387 1.001 3000
resid[77] -0.394 0.045 -0.481 -0.424 -0.394 -0.365 -0.306 1.001 2700
resid[78] -0.306 0.027 -0.359 -0.324 -0.306 -0.287 -0.252 1.001 3000
resid[79] 0.041 0.035 -0.029 0.017 0.041 0.065 0.110 1.001 3000
resid[80] -0.295 0.030 -0.356 -0.315 -0.294 -0.274 -0.239 1.001 3000
resid[81] 0.159 0.036 0.087 0.135 0.160 0.183 0.226 1.002 3000
resid[82] 0.111 0.033 0.044 0.089 0.110 0.133 0.179 1.002 2000
resid[83] -0.075 0.025 -0.125 -0.092 -0.075 -0.058 -0.028 1.001 3000
resid[84] -0.336 0.031 -0.397 -0.356 -0.335 -0.313 -0.275 1.001 3000
resid[85] 0.203 0.019 0.167 0.191 0.203 0.216 0.241 1.001 3000
resid[86] 0.171 0.020 0.132 0.157 0.171 0.185 0.211 1.001 3000
resid[87] -0.021 0.032 -0.083 -0.042 -0.021 -0.001 0.041 1.001 3000
resid[88] -0.112 0.031 -0.173 -0.133 -0.112 -0.091 -0.052 1.001 3000
resid[89] 0.012 0.019 -0.026 -0.001 0.012 0.025 0.048 1.001 3000
resid[90] -0.025 0.031 -0.086 -0.046 -0.025 -0.004 0.034 1.001 3000
resid[91] 0.194 0.037 0.119 0.170 0.194 0.218 0.264 1.001 3000
resid[92] -0.060 0.036 -0.133 -0.084 -0.060 -0.035 0.009 1.001 3000
resid[93] -0.073 0.022 -0.117 -0.088 -0.072 -0.058 -0.028 1.001 3000
resid[94] 0.180 0.020 0.140 0.167 0.180 0.193 0.220 1.001 2900
resid[95] 0.050 0.031 -0.012 0.029 0.050 0.071 0.110 1.001 3000
resid[96] -0.246 0.023 -0.292 -0.261 -0.246 -0.230 -0.202 1.001 3000
resid[97] 0.020 0.037 -0.053 -0.004 0.021 0.045 0.093 1.001 3000
resid[98] -0.298 0.035 -0.368 -0.322 -0.298 -0.274 -0.229 1.001 3000
resid[99] -0.038 0.025 -0.089 -0.055 -0.038 -0.021 0.011 1.001 3000
resid[100] -0.209 0.033 -0.273 -0.231 -0.209 -0.187 -0.145 1.001 3000
sd 0.159 0.012 0.138 0.151 0.158 0.166 0.183 1.001 2900
deviance -85.830 3.245 -90.105 -88.214 -86.519 -84.102 -78.114 1.001 2500
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 = 5.3 and DIC = -80.6
DIC is an estimate of expected predictive error (lower deviance is better).
The jagsresults() function can be used to return a matrix containing just a and beta.wind:
> jagsresults(x=jagsfit, params=c('a', 'beta.wind'))
mean sd 2.5% 25% 50% 75% 97.5% Rhat n.eff
a 0.041 0.052 -0.057 0.005 0.041 0.076 0.146 1.001 3000
beta.wind -0.458 0.057 -0.570 -0.494 -0.458 -0.420 -0.342 1.001 3000
Or, by specifying invert=TRUE, we can return a matrix containing all parameters except for resid:
> jagsresults(x=jagsfit, params='resid', invert=TRUE)
mean sd 2.5% 25% 50% 75% 97.5% Rhat n.eff
a 0.041 0.052 -0.057 0.005 0.041 0.076 0.146 1.001 3000
beta.rain 0.997 0.055 0.888 0.960 0.999 1.034 1.105 1.001 3000
beta.temp 1.414 0.054 1.310 1.377 1.415 1.451 1.519 1.001 2400
beta.wind -0.458 0.057 -0.570 -0.494 -0.458 -0.420 -0.342 1.001 3000
deviance -85.830 3.245 -90.105 -88.214 -86.519 -84.102 -78.114 1.001 2500
sd 0.159 0.012 0.138 0.151 0.158 0.166 0.183 1.001 2900
The argument exact can be set to FALSE to return a matrix containing results for all parameters whose names contain (rather than match exactly) the strings given in params:
> jagsresults(x=jagsfit, params='beta', exact=FALSE)
mean sd 2.5% 25% 50% 75% 97.5% Rhat n.eff
beta.rain 0.997 0.055 0.888 0.960 0.999 1.034 1.105 1.001 3000
beta.temp 1.414 0.054 1.310 1.377 1.415 1.451 1.519 1.001 2400
beta.wind -0.458 0.057 -0.570 -0.494 -0.458 -0.420 -0.342 1.001 3000
Finally, regex=TRUE can be specified to use regular expression pattern-matching, where param is now the pattern to be matched. In this case, additional arguments accepted by the grep function can be supplied to jagsresults, such as perl=TRUE, which is required for the syntax of some patterns:
> jagsresults(x=jagsfit, param='^(?!res)', regex=TRUE, perl=TRUE)
mean sd 2.5% 25% 50% 75% 97.5% Rhat n.eff
a 0.041 0.052 -0.057 0.005 0.041 0.076 0.146 1.001 3000
beta.rain 0.997 0.055 0.888 0.960 0.999 1.034 1.105 1.001 3000
beta.temp 1.414 0.054 1.310 1.377 1.415 1.451 1.519 1.001 2400
beta.wind -0.458 0.057 -0.570 -0.494 -0.458 -0.420 -0.342 1.001 3000
deviance -85.830 3.245 -90.105 -88.214 -86.519 -84.102 -78.114 1.001 2500
sd 0.159 0.012 0.138 0.151 0.158 0.166 0.183 1.001 2900
Note, though, that the above (which returns all parameters except for resid) can be more simply produced by the earlier example demonstrating the use of the invert argument.
Standard matrix subsetting is possible for the resulting object, e.g.:
> jags.resids <- jagsresults(x=jagsfit, param='resid')
> jags.resids[c(1, 3, 10:15), c('mean', '2.5%', '97.5%')]
mean 2.5% 97.5%
resid[1] -0.08970919 -0.14412395 -0.03469326
resid[3] 0.07606610 0.01462996 0.13840041
resid[10] -0.01695619 -0.06031680 0.02725152
resid[11] -0.06851323 -0.11697671 -0.02024998
resid[12] 0.14516502 0.10249481 0.18689894
resid[13] -0.18398696 -0.24553446 -0.12795644
resid[14] -0.02688139 -0.08512743 0.02994298
resid[15] -0.01459422 -0.06701636 0.03812518
Installation
The simplest way to install the jagstools package is with install_github in the devtools package, which will grab the source directly from Github:
install.packages('devtools')
library(devtools)
install_github(repo='jagstools', username='johnbaums')
The package can also be downloaded from github.
Filed under: R Tagged: Bayesian, code, JAGS, MCMC, model, R, R2jags, rjags, rstats
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.