{"id":169,"date":"2018-06-25T20:54:54","date_gmt":"2018-06-25T19:54:54","guid":{"rendered":"https:\/\/blogs.ncl.ac.uk\/mep\/?p=169"},"modified":"2018-06-25T20:54:54","modified_gmt":"2018-06-25T19:54:54","slug":"bayesian-statistics-for-environmental-scientists-with-bugs-and-greta","status":"publish","type":"post","link":"https:\/\/blogs.ncl.ac.uk\/mep\/2018\/06\/25\/bayesian-statistics-for-environmental-scientists-with-bugs-and-greta\/","title":{"rendered":"Bayesian statistics for environmental scientists with BUGS and greta"},"content":{"rendered":"<h1 class=\"western\">Introduction<\/h1>\n<p class=\"first-paragraph\">Bayesian statistical have become very popular in the last 5 to 10 years amongst environmental scientists, due to their much greater flexibility than conventional frequentist approaches. They also have an intuitive appeal: many people still incorrectly mis-interpret p-values, thinking that they are testing the significance of a hypothesis, when of course in reality they are giving the probability of the data, given the null hypothesis. This \u2018back-to-front\u2019 approach of the traditional methods also causes problems for students learning statistical methods.<\/p>\n<p>Several excellent books have been published in the last few years on Bayesian stats, aimed at ecologists. I particularly like the approach taken by Marc Kery and colleagues, who now have now published three texts on the subject.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-171 size-medium alignleft\" src=\"https:\/\/blogs.ncl.ac.uk\/mep\/files\/2018\/06\/kery1-201x300.png\" alt=\"\" width=\"201\" height=\"300\" srcset=\"https:\/\/blogs.ncl.ac.uk\/mep\/files\/2018\/06\/kery1-201x300.png 201w, https:\/\/blogs.ncl.ac.uk\/mep\/files\/2018\/06\/kery1.png 592w\" sizes=\"auto, (max-width: 201px) 100vw, 201px\" \/> <img loading=\"lazy\" decoding=\"async\" class=\"wp-image-172 size-medium alignleft\" src=\"https:\/\/blogs.ncl.ac.uk\/mep\/files\/2018\/06\/kery2-200x300.png\" alt=\"\" width=\"200\" height=\"300\" srcset=\"https:\/\/blogs.ncl.ac.uk\/mep\/files\/2018\/06\/kery2-200x300.png 200w, https:\/\/blogs.ncl.ac.uk\/mep\/files\/2018\/06\/kery2.png 586w\" sizes=\"auto, (max-width: 200px) 100vw, 200px\" \/> <img loading=\"lazy\" decoding=\"async\" class=\"wp-image-173 size-medium alignleft\" src=\"https:\/\/blogs.ncl.ac.uk\/mep\/files\/2018\/06\/kery3-245x300.png\" alt=\"\" width=\"245\" height=\"300\" srcset=\"https:\/\/blogs.ncl.ac.uk\/mep\/files\/2018\/06\/kery3-245x300.png 245w, https:\/\/blogs.ncl.ac.uk\/mep\/files\/2018\/06\/kery3.png 587w\" sizes=\"auto, (max-width: 245px) 100vw, 245px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>You\u2019ll have spotted that the most recent book has \u2018Volume 1\u2019 in the title, so we look forward to the second volume in the series. As you\u2019ll have guessed from the titles, the difficulty and complexity of the models increases with each book. If you\u2019re new to Bayesian stats, start with the Introduction to WinBUGS for Ecologists. This covers models which could mainly be done with standard frequentist statistics (some of the mixture-models described in the last chapters would be tricky however). A big advantage of this approach is that the book initially covers straightforward analyses using the linear model <span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">lm<\/span><\/span> command, examines the outputs, and then shows the identical analysis done from a Bayesian approach. This approach rapidly illustrates the much \u2018richer\u2019 amount of information that can be obtained from a Bayesian rather than frequentist approach. So the book shows how to calculate a mean (yes, I know that sounds trivial, but still useful), equivalent of a t-test (but via <span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">lm<\/span><\/span> for the frequentist method), one- and two-way anova, regression, glm, and mixed-effects models. Yes, all these can be done by conventional methods. If I\u2019m doing a simple regression, I\u2019ll still use <span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">lm<\/span><\/span> rather than writing BUGS code, but as a way of describing Bayesian methods its clarity is difficult to fault.<\/p>\n<p>As you might expect, all the R code for the analyses described in the book can be downloaded from the web. But intriguingly, not the datasets. This is because Kery has a bottom-up approach to the data (see pages 7 and 8 of his introductory book):rather like a motorbike mechanic, you can only fully understand how the motorbike works if you have assembled all the pieces together before riding off on it. Likewise with a model: Bayesian models can become complex, so rather than presenting the reader with a set of data to analyse, the reader creates a set of data with known properties (mean, sd etc.), which is then assembled for modelling. Then the reader can look at the output of the model, and see how well it matches the original inputs. This avoids the \u2018black-box\u2019 problem of not understanding what the model is up to. It isn&#8217;t really needed for a simple familiar model like the Bayesian regression we&#8217;re about to discuss here, but for complex mixture, hierarchical random-effects or state-space models it seems an excellent method to test that your Bayesian code, in BUGS, JAGS, Stan or Greta, is doing what you think it should, before trying it out on real data.<\/p>\n<p>The book uses WinBUGS, although the code works fine for OpenBUGS (still under active development), and with minor tweaks for JAGS. More changes would be needed for Stan, the newest Bayesian framework. I\u2019ll admit here that there are a number of things that I strongly dislike about existing Bayesian methods:<\/p>\n<ol>\n<li>\n<p class=\"compact\">You have to learn yet another language. BUGS, JAGS and Stan all have a different syntax to R, with slightly different function names etc.<\/p>\n<\/li>\n<li>\n<p class=\"compact\">You have to write a set of instructions to an external text file outside of R, which is then called via the relevant R library (e.g.\u00a0R2OpenBUGS) to carry out the Bayesian analysis.<\/p>\n<\/li>\n<li>\n<p class=\"compact\">The BUGS\/JAGS\/Stan instructions cannot be debugged readily in R: it is fired off in one block for Bayesian analysis making debugging tricky with complex models. If you use RStudio, the IDE simply sees the code as a block of text and so ignores it.<\/p>\n<\/li>\n<\/ol>\n<p class=\"first-paragraph\">I was there very intrigued by the new <strong>G<i>reta<\/i><\/strong> R package by Nick Golding <a href=\"https:\/\/greta-dev.github.io\/greta\/\">https:\/\/greta-dev.github.io\/greta\/<\/a> which was released on CRAN a few months ago. Potentially, this has the potential of providing R users with a much more intuitive interface for running Bayesian models. It works directly in R (no more writing of external text files), calling the Google Tensorflow backend for the heavy lifting. So, out of curiosity, I thought I\u2019d try to run one of the simple examples from Marc Kery\u2019s first book via <span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">lm<\/span><\/span>, <span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">R2OpenBUGS<\/span><\/span> and <span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">greta<\/span><\/span> for comparison.<\/p>\n<p>This is a slightly simplified version of the example in Chapter 8 of Kery\u2019s book; a simple regression of Swiss wallcreeper numbers, which have declined rapidly in recent years:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-178 aligncenter\" src=\"https:\/\/blogs.ncl.ac.uk\/mep\/files\/2018\/06\/wallcreeper-300x270.png\" alt=\"\" width=\"300\" height=\"270\" srcset=\"https:\/\/blogs.ncl.ac.uk\/mep\/files\/2018\/06\/wallcreeper-300x270.png 300w, https:\/\/blogs.ncl.ac.uk\/mep\/files\/2018\/06\/wallcreeper-334x300.png 334w, https:\/\/blogs.ncl.ac.uk\/mep\/files\/2018\/06\/wallcreeper.png 574w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>As Kery comments, strictly-speaking it would be better to use a generalised linear model (since these are proportion data), but as a simple example this is OK. As usual, he generates the data to play with, for 16 years worth of data, intercept of 40, slope of -1.5 and variance (sigma-squared) of 25:<\/p>\n<p><span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">set.seed<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">(<\/span><\/span><span style=\"color: #0000cf\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">123<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">)<\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">n &lt;-<\/span><\/span> <span style=\"color: #0000cf\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">16<\/span><\/span><\/span> <span style=\"color: #8f5902\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\"><i># Number of years<\/i><\/span><\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">a &lt;-<\/span><\/span> <span style=\"color: #0000cf\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">40<\/span><\/span><\/span> <span style=\"color: #8f5902\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\"><i># Intercept<\/i><\/span><\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">b &lt;-<\/span><\/span> <span style=\"color: #ce5c00\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">&#8211;<\/span><\/span><\/span><span style=\"color: #0000cf\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">1.5<\/span><\/span><\/span> <span style=\"color: #8f5902\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\"><i># Slope<\/i><\/span><\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">sigma2 &lt;-<\/span><\/span> <span style=\"color: #0000cf\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">25<\/span><\/span><\/span> <span style=\"color: #8f5902\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\"><i># Residual variance<\/i><\/span><\/span><\/span><\/p>\n<p><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">x &lt;-<\/span><\/span> <span style=\"color: #0000cf\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">1<\/span><\/span><\/span><span style=\"color: #ce5c00\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">:<\/span><\/span><\/span><span style=\"color: #0000cf\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">16<\/span><\/span><\/span> <span style=\"color: #8f5902\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\"><i># Values of covariate year<\/i><\/span><\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">eps &lt;-<\/span><\/span> <span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">rnorm<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">(n, <\/span><\/span><span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">mean=<\/span><\/span><\/span><span style=\"color: #0000cf\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">0<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">, <\/span><\/span><span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">sd=<\/span><\/span><\/span><span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">sqrt<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">(sigma2))<\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">y &lt;-<\/span><\/span> <span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">a <\/span><\/span><span style=\"color: #ce5c00\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">+<\/span><\/span><\/span> <span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">b<\/span><\/span><span style=\"color: #ce5c00\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">*<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">x <\/span><\/span><span style=\"color: #ce5c00\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">+<\/span><\/span><\/span> <span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">eps <\/span><\/span><span style=\"color: #8f5902\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\"><i># Assemble the data set<\/i><\/span><\/span><\/span><br \/>\n<span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">plot<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">((x<\/span><\/span><span style=\"color: #ce5c00\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">+<\/span><\/span><\/span><span style=\"color: #0000cf\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">1989<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">), y, <\/span><\/span><span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">xlab=<\/span><\/span><\/span><span style=\"color: #4e9a06\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">&#8220;Year&#8221;<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">, <\/span><\/span><span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">las=<\/span><\/span><\/span><span style=\"color: #0000cf\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">1<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">, <\/span><\/span><span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">ylab=<\/span><\/span><\/span><span style=\"color: #4e9a06\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">&#8220;Prop. occupied (%)&#8221;<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">, <\/span><\/span><span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">cex=<\/span><\/span><\/span><span style=\"color: #0000cf\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">1.2<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">)<\/span><\/span><br \/>\n<span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">abline<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">(<\/span><\/span><span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">lm<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">(y <\/span><\/span><span style=\"color: #ce5c00\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">~<\/span><\/span><\/span> <span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">I<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">(x<\/span><\/span><span style=\"color: #ce5c00\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">+<\/span><\/span><\/span><span style=\"color: #0000cf\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">1989<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">)), <\/span><\/span><span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">col=<\/span><\/span><\/span><span style=\"color: #4e9a06\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">&#8220;blue&#8221;<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">, <\/span><\/span><span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">lwd=<\/span><\/span><\/span><span style=\"color: #0000cf\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">2<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">)<\/span><\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-181 size-full\" src=\"https:\/\/blogs.ncl.ac.uk\/mep\/files\/2018\/06\/regression.png\" alt=\"\" width=\"480\" height=\"384\" srcset=\"https:\/\/blogs.ncl.ac.uk\/mep\/files\/2018\/06\/regression.png 480w, https:\/\/blogs.ncl.ac.uk\/mep\/files\/2018\/06\/regression-300x240.png 300w, https:\/\/blogs.ncl.ac.uk\/mep\/files\/2018\/06\/regression-375x300.png 375w\" sizes=\"auto, (max-width: 480px) 100vw, 480px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Note: I have set a random seed, so your data should be the same. However, whilst the linear model results will be identical, the Bayesian results will still differ due to the MCMC.<\/p>\n<h1>Conventional analysis via linear model<\/h1>\n<p class=\"first-paragraph\">Let\u2019s look at the results from a standard analysis using <span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">lm<\/span><\/span><\/p>\n<p><span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">print<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">(<\/span><\/span><span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">summary<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">(<\/span><\/span><span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">lm<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">(y <\/span><\/span><span style=\"color: #ce5c00\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">~<\/span><\/span><\/span> <span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">x)))<\/span><\/span><\/p>\n<p><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">## Call:<\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">## lm(formula = y ~ x)<\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">## <\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">## Residuals:<\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">## Min 1Q Median 3Q Max <\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">## -7.5427 -3.3510 -0.3309 2.0411 7.5791 <\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">## <\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">## Coefficients:<\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">## Estimate Std. Error t value Pr(&gt;|t|) <\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">## (Intercept) 40.3328 2.4619 16.382 1.58e-10 ***<\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">## x -1.3894 0.2546 -5.457 8.45e-05 ***<\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">## &#8212;<\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">## Signif. codes: 0 &#8216;***&#8217; 0.001 &#8216;**&#8217; 0.01 &#8216;*&#8217; 0.05 &#8216;.&#8217; 0.1 &#8216; &#8216; 1<\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">## <\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">## Residual standard error: 4.695 on 14 degrees of freedom<\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">## Multiple R-squared: 0.6802, Adjusted R-squared: 0.6574 <\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">## F-statistic: 29.78 on 1 and 14 DF, p-value: 8.448e-05<\/span><\/span><\/p>\n<h1 class=\"western\">Bayesian analysis using OpenBUGS<\/h1>\n<p class=\"first-paragraph\">I\u2019m using OpenBUGS simply because WinBUGS is no longer being actively developed if I\u2019ve understood the changes correctly. Remember that the bulk of the commands go into an external file, before being called by the <span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">bugs<\/span><\/span> function. Kery\u2019s original code also calculates predicted and residuals for each observation, plus Bayesian p-values.<\/p>\n<p><a name=\"rstudio_console_output\"><\/a> <span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">library<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">(R2OpenBUGS) <\/span><\/span><span style=\"color: #8f5902\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\"><i># or library(R2WinBUGS) if using WinBUGS<\/i><\/span><\/span><\/span><br \/>\n<span style=\"color: #8f5902\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\"><i># Write model<\/i><\/span><\/span><\/span><br \/>\n<span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">sink<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">(<\/span><\/span><span style=\"color: #4e9a06\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">&#8220;linreg.txt&#8221;<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">)<\/span><\/span><br \/>\n<span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">cat<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">(<\/span><\/span><span style=\"color: #4e9a06\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">&#8220;<\/span><\/span><\/span><br \/>\n<span style=\"color: #4e9a06\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\"> model{<\/span><\/span><\/span><br \/>\n<span style=\"color: #4e9a06\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\"> # Priors<\/span><\/span><\/span><br \/>\n<span style=\"color: #4e9a06\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\"> alpha ~ dnorm(0,0.001)<\/span><\/span><\/span><br \/>\n<span style=\"color: #4e9a06\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\"> beta ~ dnorm(0,0.001)<\/span><\/span><\/span><br \/>\n<span style=\"color: #4e9a06\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\"> sigma ~ dunif(0,100)<\/span><\/span><\/span><\/p>\n<p><span style=\"color: #4e9a06\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\"> # Likelihood<\/span><\/span><\/span><br \/>\n<span style=\"color: #4e9a06\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\"> for(i in 1:n){<\/span><\/span><\/span><br \/>\n<span style=\"color: #4e9a06\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\"> y[i] ~ dnorm(mu[i], tau)<\/span><\/span><\/span><br \/>\n<span style=\"color: #4e9a06\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\"> mu[i] &lt;- alpha + beta*x[i]<\/span><\/span><\/span><br \/>\n<span style=\"color: #4e9a06\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\"> }<\/span><\/span><\/span><\/p>\n<p><span style=\"color: #4e9a06\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\"> # Precision<\/span><\/span><\/span><br \/>\n<span style=\"color: #4e9a06\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\"> tau &lt;- 1\/(sigma * sigma)<\/span><\/span><\/span><br \/>\n<span style=\"color: #4e9a06\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">}<\/span><\/span><\/span><br \/>\n<span style=\"color: #4e9a06\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">&#8220;<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">,<\/span><\/span><span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">fill=<\/span><\/span><\/span><span style=\"color: #8f5902\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">TRUE<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">)<\/span><\/span><br \/>\n<span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">sink<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">()<\/span><\/span><\/p>\n<p><span style=\"color: #8f5902\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\"><i># Bundle data<\/i><\/span><\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">win.data &lt;-<\/span><\/span> <span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">list<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">(<\/span><\/span><span style=\"color: #4e9a06\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">&#8220;x&#8221;<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">,<\/span><\/span><span style=\"color: #4e9a06\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">&#8220;y&#8221;<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">, <\/span><\/span><span style=\"color: #4e9a06\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">&#8220;n&#8221;<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">)<\/span><\/span><\/p>\n<p><span style=\"color: #8f5902\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\"><i># Inits function<\/i><\/span><\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">inits &lt;-<\/span><\/span> <span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">function<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">(){ <\/span><\/span><span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">list<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">(<\/span><\/span><span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">alpha=<\/span><\/span><\/span><span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">rnorm<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">(<\/span><\/span><span style=\"color: #0000cf\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">1<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">), <\/span><\/span><span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">beta=<\/span><\/span><\/span><span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">rnorm<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">(<\/span><\/span><span style=\"color: #0000cf\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">1<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">), <\/span><\/span><span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">sigma =<\/span><\/span><\/span> <span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">rlnorm<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">(<\/span><\/span><span style=\"color: #0000cf\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">1<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">))}<\/span><\/span><\/p>\n<p><span style=\"color: #8f5902\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\"><i># Parameters to estimate<\/i><\/span><\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">params &lt;-<\/span><\/span> <span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">c<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">(<\/span><\/span><span style=\"color: #4e9a06\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">&#8220;alpha&#8221;<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">,<\/span><\/span><span style=\"color: #4e9a06\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">&#8220;beta&#8221;<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">, <\/span><\/span><span style=\"color: #4e9a06\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">&#8220;sigma&#8221;<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">)<\/span><\/span><\/p>\n<p><span style=\"color: #8f5902\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\"><i># MCMC settings<\/i><\/span><\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">nc =<\/span><\/span> <span style=\"color: #0000cf\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">3<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\"> ; ni=<\/span><\/span><span style=\"color: #0000cf\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">1200<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\"> ; nb=<\/span><\/span><span style=\"color: #0000cf\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">200<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\"> ; nt=<\/span><\/span><span style=\"color: #0000cf\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">1<\/span><\/span><\/span><\/p>\n<p><span style=\"color: #8f5902\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\"><i># Start Gibbs sampler<\/i><\/span><\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">out &lt;-<\/span><\/span> <span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">bugs<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">(<\/span><\/span><span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">data =<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\"> win.data, <\/span><\/span><span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">inits =<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\"> inits, <\/span><\/span><span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">parameters =<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\"> params, <\/span><\/span><span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">model =<\/span><\/span><\/span> <span style=\"color: #4e9a06\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">&#8220;linreg.txt&#8221;<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">, <\/span><\/span><br \/>\n<span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">n.thin =<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\"> nt, <\/span><\/span><span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">n.chains =<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\"> nc, <\/span><\/span><span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">n.burnin =<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\"> nb, <\/span><\/span><span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">n.iter =<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\"> ni)<\/span><\/span><\/p>\n<p><span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">print<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">(out, <\/span><\/span><span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">dig =<\/span><\/span><\/span> <span style=\"color: #0000cf\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">3<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">)<\/span><\/span><br \/>\n<span style=\"font-size: medium\"><span style=\"font-family: Ubuntu Mono\">Inference for Bugs model at &#8220;linreg.txt&#8221;, <\/span><\/span><\/p>\n<pre><span style=\"font-size: medium\"><span style=\"font-family: Ubuntu Mono\">Current: 3 chains, each with 1200 iterations (first 200 discarded)<\/span><\/span>\r\n<span style=\"font-size: medium\"><span style=\"font-family: Ubuntu Mono\">Cumulative: n.sims = 3000 iterations saved<\/span><\/span>\r\n           <span style=\"font-family: Ubuntu Mono\"><span style=\"font-size: medium\">mean    sd   2.5%    25%    50%    75%  97.5%  Rhat n.eff<\/span><\/span>\r\n<span style=\"font-size: medium\"><span style=\"font-family: Ubuntu Mono\">alpha     39.896 2.729 34.389 38.210 39.970 41.710 44.981 1.006 1100<\/span><\/span>\r\n<span style=\"font-size: medium\"><span style=\"font-family: Ubuntu Mono\">beta      -1.348 0.277 -1.879 -1.524 -1.349 -1.178 -0.776 1.006  970<\/span><\/span>\r\n<span style=\"font-size: medium\"><span style=\"font-family: Ubuntu Mono\">sigma      5.204 1.155 3.533 4.393 5.006 5.773 8.186 1.001 3000<\/span><\/span>\r\n<span style=\"font-size: medium\"><span style=\"font-family: Ubuntu Mono\">deviance  96.374 3.015 93.000 94.187 95.600 97.652 104.200 1.001 2800<\/span><\/span>\r\n<span style=\"font-size: medium\"><span style=\"font-family: Ubuntu Mono\">For each parameter, n.eff is a crude measure of effective sample size,<\/span><\/span>\r\n<span style=\"font-size: medium\"><span style=\"font-family: Ubuntu Mono\">and Rhat is the potential scale reduction factor (at convergence, Rhat=1).<\/span><\/span>\r\n\r\n<span style=\"font-size: medium\"><span style=\"font-family: Ubuntu Mono\">DIC info (using the rule, pD = Dbar-Dhat)<\/span><\/span>\r\n<span style=\"font-size: medium\"><span style=\"font-family: Ubuntu Mono\">pD = 2.767 and DIC = 99.140<\/span><\/span>\r\n<span style=\"font-size: medium\"><span style=\"font-family: Ubuntu Mono\">DIC is an estimate of expected predictive error (lower deviance is better).<\/span><\/span><\/pre>\n<p><span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">detach<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">(<\/span><\/span><span style=\"color: #4e9a06\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">&#8220;package:R2OpenBUGS&#8221;<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">, <\/span><\/span><span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">unload=<\/span><\/span><\/span><span style=\"color: #8f5902\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">TRUE<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">)<\/span><\/span><\/p>\n<p>So the Bayesian analysis via BUGS is giving intercept of 39.9 and slope -1.4,, with sigma at 5.2 (we set sigma-squared at 25 when generating the data).<\/p>\n<h1>Greta package<\/h1>\n<p class=\"first-paragraph\">The new greta package (apparently named after a German computer scientist) requires Tensorflow to be setup. I\u2019ll admit that I\u2019ve struggled to get Tensorflow to run on a Windows PC (python bindings go astray) but it works fine on Linux.<\/p>\n<p><span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">library<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">(greta)<\/span><\/span><\/p>\n<p><span style=\"color: #8f5902\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\"><i># Note: R allows &lt;- or = to assign variables. Following greta documentation <\/i><\/span><\/span><\/span><br \/>\n<span style=\"color: #8f5902\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\"><i># advice to use &lt;- for deterministic and = for stochastic variables.<\/i><\/span><\/span><\/span><\/p>\n<p><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">x_g &lt;-<\/span><\/span> <span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">as_data<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">(x) <\/span><\/span><span style=\"color: #8f5902\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\"><i># Convert input data into greta arrays<\/i><\/span><\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">y_g &lt;-<\/span><\/span> <span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">as_data<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">(y)<\/span><\/span><\/p>\n<p><span style=\"color: #8f5902\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\"><i># variables and priors<\/i><\/span><\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">int =<\/span><\/span> <span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">normal<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">(<\/span><\/span><span style=\"color: #0000cf\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">0<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">, <\/span><\/span><span style=\"color: #0000cf\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">100<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">)<\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">coef =<\/span><\/span> <span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">normal<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">(<\/span><\/span><span style=\"color: #0000cf\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">0<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">, <\/span><\/span><span style=\"color: #0000cf\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">100<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">)<\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">sd =<\/span><\/span> <span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">normal<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">(<\/span><\/span><span style=\"color: #0000cf\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">0<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">,<\/span><\/span><span style=\"color: #0000cf\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">100<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">)<\/span><\/span><\/p>\n<p><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">mean &lt;-<\/span><\/span> <span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">int <\/span><\/span><span style=\"color: #ce5c00\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">+<\/span><\/span><\/span> <span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">coef <\/span><\/span><span style=\"color: #ce5c00\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">*<\/span><\/span><\/span> <span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">x_g <\/span><\/span><span style=\"color: #8f5902\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\"><i># define the operation of the linear model<\/i><\/span><\/span><\/span><br \/>\n<span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">distribution<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">(y_g) =<\/span><\/span> <span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">normal<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">(mean, sd) <\/span><\/span><span style=\"color: #8f5902\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\"><i># likelihood<\/i><\/span><\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">m &lt;-<\/span><\/span> <span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">model<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">(int, coef, sd) <\/span><\/span><span style=\"color: #8f5902\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\"><i># Set up the greta model<\/i><\/span><\/span><\/span><br \/>\n<span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">plot<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">(m) <\/span><\/span><span style=\"color: #8f5902\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\"><i># Visualise structure of the greta model<\/i><\/span><\/span><\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-174\" src=\"https:\/\/blogs.ncl.ac.uk\/mep\/files\/2018\/06\/greta_model.png\" alt=\"\" width=\"846\" height=\"574\" srcset=\"https:\/\/blogs.ncl.ac.uk\/mep\/files\/2018\/06\/greta_model.png 846w, https:\/\/blogs.ncl.ac.uk\/mep\/files\/2018\/06\/greta_model-300x204.png 300w, https:\/\/blogs.ncl.ac.uk\/mep\/files\/2018\/06\/greta_model-768x521.png 768w, https:\/\/blogs.ncl.ac.uk\/mep\/files\/2018\/06\/greta_model-442x300.png 442w\" sizes=\"auto, (max-width: 846px) 100vw, 846px\" \/><\/p>\n<p>I really like these greta model plots, as they explain even complex models clearly from a Bayesian perspective.\u00a0 This may at first glance look excessively detailed for a simple regression model, but the legend shows how it all fits together:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-188\" src=\"https:\/\/blogs.ncl.ac.uk\/mep\/files\/2018\/06\/greta_legend.png\" alt=\"\" width=\"3398\" height=\"498\" srcset=\"https:\/\/blogs.ncl.ac.uk\/mep\/files\/2018\/06\/greta_legend.png 3398w, https:\/\/blogs.ncl.ac.uk\/mep\/files\/2018\/06\/greta_legend-300x44.png 300w, https:\/\/blogs.ncl.ac.uk\/mep\/files\/2018\/06\/greta_legend-768x113.png 768w, https:\/\/blogs.ncl.ac.uk\/mep\/files\/2018\/06\/greta_legend-1024x150.png 1024w, https:\/\/blogs.ncl.ac.uk\/mep\/files\/2018\/06\/greta_legend-500x73.png 500w\" sizes=\"auto, (max-width: 3398px) 100vw, 3398px\" \/><\/p>\n<p>You can now see how the slope coefficient is multiplied by the x_g (year) predictor, then added to the int (intercept), but both the slope and intercept are sampled from a normal distribution, as is the residual error. The response variable, the proportion of sites occupied (y_g) is itself sampled from a normal distribution. This might strike you as confusing at first, if you are used to the conventional way of writing a linear model as:<\/p>\n<p style=\"text-align: center\"><em>y = a + b.x + \u03b5<\/em><\/p>\n<p>Here, the diagram shows the approach more commonly used in Bayesian methods:<\/p>\n<p style=\"text-align: center\"><em>y ~ N(a + b.x, sd)<\/em><\/p>\n<p>in other words, the response variable <em>y<\/em> is being sampled from a normal distribution with mean\u00a0<em>a + b.x<\/em>, and standard deviation sd.<\/p>\n<p><span style=\"color: #8f5902\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\"><i>#<\/i><\/span><\/span><\/span><span style=\"color: #8f5902\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\"><i> sampling<\/i><\/span><\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">draws &lt;-<\/span><\/span> <span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">mcmc<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">(m, <\/span><\/span><span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">n_samples =<\/span><\/span><\/span> <span style=\"color: #0000cf\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">1200<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">, <\/span><\/span><span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">warmup=<\/span><\/span><\/span><span style=\"color: #0000cf\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">200<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">)<\/span><\/span><br \/>\n<span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">print<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">(<\/span><\/span><span style=\"color: #204a87\"><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">summary<\/span><\/span><\/span><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">(draws))<\/span><\/span><\/p>\n<p><span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">## <\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">## Iterations = 1:1200<\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">## Thinning interval = 1 <\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">## Number of chains = 1 <\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">## Sample size per chain = 1200 <\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">## <\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">## 1. Empirical mean and standard deviation for each variable,<\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">## plus standard error of the mean:<\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">## <\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">## Mean SD Naive SE Time-series SE<\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">## int 40.209 2.7641 0.079791 0.20055<\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">## coef -1.378 0.2884 0.008324 0.02069<\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">## sd 5.200 1.1180 0.032274 0.05647<\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">## <\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">## 2. Quantiles for each variable:<\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">## <\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">## 2.5% 25% 50% 75% 97.5%<\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">## int 34.226 38.487 40.219 42.118 45.4184<\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">## coef -1.955 -1.561 -1.377 -1.200 -0.7697<\/span><\/span><br \/>\n<span style=\"font-family: Consolas, serif\"><span style=\"font-size: small\">## sd 3.679 4.403 4.976 5.833 7.6671<\/span><\/span><\/p>\n<p>Here the greta model has intercept of 40.2,\u00a0 slope -1.4, and sd (sigma) 5.2.<\/p>\n<h1>Conclusions<\/h1>\n<p class=\"first-paragraph\">The greta output is very similar to that from BUGS, but to my mind the code is simpler and more intuitive. Both packages can produce the usual MCM trace plots (or &#8216;hairy caterpillars&#8217; as I heard them described in one talk!). Greta is much slower to run than BUGS, so I suspect with large datasets CPU time might be an issue, and Tensorflow might be tricky to setup for some configurations.. The greta graphical description of the model, via the diagrammeR package, is particularly clear and intuitive, explaining the structure of the Bayesian model. This document was drafted in RMarkdown <a href=\"https:\/\/rmarkdown.rstudio.com\/\">https:\/\/rmarkdown.rstudio.com\/<\/a> which promptly crashed with BUGS, but was fine with greta.<\/p>\n<p>Greta is still in an early stage of development, but its website <a href=\"https:\/\/greta-dev.github.io\/greta\/\">https:\/\/greta-dev.github.io\/greta\/<\/a> has lots of useful examples. It is clear that people are already pushing it to its limits, implementing hierarchical models\u00a0<a href=\"https:\/\/github.com\/greta-dev\/greta\/issues\/44\">https:\/\/github.com\/greta-dev\/greta\/issues\/44<\/a> etc., so watch this space\u2026<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction Bayesian statistical have become very popular in the last 5 to 10 years amongst environmental scientists, due to their much greater flexibility than conventional frequentist approaches. They also have an intuitive appeal: many people still incorrectly mis-interpret p-values, thinking &hellip; <a href=\"https:\/\/blogs.ncl.ac.uk\/mep\/2018\/06\/25\/bayesian-statistics-for-environmental-scientists-with-bugs-and-greta\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":3152,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,3],"tags":[],"class_list":["post-169","post","type-post","status-publish","format-standard","hentry","category-bayesian","category-r"],"_links":{"self":[{"href":"https:\/\/blogs.ncl.ac.uk\/mep\/wp-json\/wp\/v2\/posts\/169","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.ncl.ac.uk\/mep\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.ncl.ac.uk\/mep\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.ncl.ac.uk\/mep\/wp-json\/wp\/v2\/users\/3152"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.ncl.ac.uk\/mep\/wp-json\/wp\/v2\/comments?post=169"}],"version-history":[{"count":15,"href":"https:\/\/blogs.ncl.ac.uk\/mep\/wp-json\/wp\/v2\/posts\/169\/revisions"}],"predecessor-version":[{"id":191,"href":"https:\/\/blogs.ncl.ac.uk\/mep\/wp-json\/wp\/v2\/posts\/169\/revisions\/191"}],"wp:attachment":[{"href":"https:\/\/blogs.ncl.ac.uk\/mep\/wp-json\/wp\/v2\/media?parent=169"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.ncl.ac.uk\/mep\/wp-json\/wp\/v2\/categories?post=169"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.ncl.ac.uk\/mep\/wp-json\/wp\/v2\/tags?post=169"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}