├── .github └── workflows │ └── ci.yaml ├── .gitignore ├── LICENSE.txt ├── README.md ├── data ├── algae.txt ├── drowning.txt ├── factory.txt ├── windshieldy1.txt └── windshieldy2.txt ├── demos_ch10 ├── demo10_1.ipynb ├── demo10_2.ipynb └── demo10_3.ipynb ├── demos_ch11 ├── demo11_1.ipynb ├── demo11_2.ipynb ├── gibbssampler1.mp4 ├── gibbssampler2.mp4 ├── metropolissampler1.mp4 └── metropolissampler2.mp4 ├── demos_ch2 ├── demo2_1.ipynb ├── demo2_2.ipynb ├── demo2_3.ipynb └── demo2_4.ipynb ├── demos_ch3 ├── demo3_1-4.ipynb ├── demo3_5.ipynb └── demo3_6.ipynb ├── demos_ch4 └── demo4_1.ipynb ├── demos_ch5 ├── demo5_1.ipynb └── demo5_2.ipynb ├── demos_ch6 ├── demo6_1.ipynb ├── demo6_2.ipynb ├── demo6_3.ipynb └── demo6_4.ipynb ├── demos_ch9 └── demo9_1.ipynb ├── demos_pystan ├── PyStan_test_installation.ipynb ├── bern.stan ├── binom.stan ├── binom2.stan ├── binomb.stan ├── diabetes.ipynb ├── grp_aov.stan ├── grp_prior_mean.stan ├── grp_prior_mean_var.stan ├── lin.stan ├── lin_std.stan ├── lin_t.stan ├── logistic_hs.stan ├── logistic_t.stan └── pystan_demo.ipynb ├── functions └── bioassaylp.py ├── requirements.txt └── utilities_and_data ├── demo11_1a.csv ├── demo11_1b.csv ├── demo11_2.npz ├── demo11_2a.csv ├── demo11_2b.csv ├── demo11_2c.csv ├── demo11_4.csv ├── demo5_2.npz ├── diabetes.csv ├── kilpisjarvi-summer-temp.csv ├── light.txt ├── plot_tools.py ├── psis.py ├── psrf.py ├── sinvchi2.py └── stan_utility.py /.github/workflows/ci.yaml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: [ push, pull_request ] 4 | 5 | jobs: 6 | test: 7 | name: Testing 8 | runs-on: ubuntu-latest 9 | steps: 10 | - uses: actions/checkout@v2 11 | - uses: actions/setup-python@v2 12 | with: 13 | python-version: '3.6' 14 | - uses: actions/cache@v2 15 | with: 16 | path: ~/.cache/pip 17 | key: ${{ runner.os }}-${{ env.pythonLocation }}-pip-${{ hashFiles('**/requirements.txt') }} 18 | restore-keys: | 19 | ${{ runner.os }}-${{ env.pythonLocation }}-pip- 20 | - uses: FedericoCarboni/setup-ffmpeg@v1 21 | with: 22 | token: ${{ secrets.GITHUB_TOKEN }} 23 | id: setup-ffmpeg 24 | - name: Install dependencies 25 | run: | 26 | pip install wheel pytest pytest-xdist nbval 27 | pip install -r requirements.txt 28 | - name: Run tests 29 | run: pytest -n 2 --junitxml=test_report.xml --nbval-lax . --dist loadscope 30 | - name: Upload test results 31 | if: always() 32 | uses: EnricoMi/publish-unit-test-result-action@v1 33 | with: 34 | files: ./test_report.xml 35 | check_name: Test results 36 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | *.ipynb_checkpoints* 3 | *cached-model-*.pkl 4 | *~ -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Bayesian Data Analysis Python Demos 2 | 3 | [![Binder](http://mybinder.org/badge.svg)](http://mybinder.org/repo/avehtari/bda_py_demos) to interactively run the IPython Notebooks in the browser. 4 | 5 | This repository contains some Python demos for the book [Bayesian Data 6 | Analysis, 3rd ed by Gelman, Carlin, Stern, Dunson, Vehtari, and Rubin (BDA3)](http://www.stat.columbia.edu/~gelman/book/). See also [Bayesian Data Analysis course material](https://github.com/avehtari/BDA_course_Aalto). 7 | 8 | Currently there are demos for BDA3 Chapters 2, 3, 4, 5, 6, 10 and 11. Furthermore, [PyStan](https://github.com/stan-dev/pystan) is also demoed. 9 | 10 | Demos are in jupyter notebook (.ipynb) format. These can be directly previewed in github without need 11 | to install or run anything. 12 | 13 | Corresponding demos were originally written for [Matlab/Octave](https://github.com/avehtari/BDA_m_demos) by [Aki Vehtari](http://users.aalto.fi/~ave/) and translated to Python by Tuomas Sivula. Some improvements were contributed by Pellervo Ruponen and Lassi Meronen. There are also corresponding [R demos](https://github.com/avehtari/BDA_R_demos). 14 | 15 | 16 | ## Requirements 17 | 18 | - python 3 19 | - ipython 20 | - numpy 21 | - scipy 22 | - matplotlib 2 23 | - pandas (for some demos) 24 | - pystan (for some demos) 25 | - ArviZ (for some demos) 26 | -------------------------------------------------------------------------------- /data/algae.txt: -------------------------------------------------------------------------------- 1 | 0 2 | 1 3 | 1 4 | 0 5 | 0 6 | 0 7 | 0 8 | 0 9 | 0 10 | 0 11 | 0 12 | 0 13 | 0 14 | 0 15 | 1 16 | 0 17 | 0 18 | 0 19 | 1 20 | 0 21 | 0 22 | 1 23 | 0 24 | 0 25 | 0 26 | 0 27 | 0 28 | 0 29 | 0 30 | 0 31 | 0 32 | 0 33 | 0 34 | 0 35 | 0 36 | 0 37 | 0 38 | 0 39 | 1 40 | 0 41 | 0 42 | 0 43 | 0 44 | 0 45 | 0 46 | 0 47 | 0 48 | 0 49 | 0 50 | 0 51 | 0 52 | 0 53 | 0 54 | 0 55 | 0 56 | 0 57 | 0 58 | 0 59 | 1 60 | 0 61 | 0 62 | 1 63 | 0 64 | 0 65 | 0 66 | 1 67 | 0 68 | 0 69 | 0 70 | 1 71 | 0 72 | 0 73 | 0 74 | 1 75 | 0 76 | 0 77 | 1 78 | 0 79 | 0 80 | 0 81 | 1 82 | 0 83 | 0 84 | 0 85 | 1 86 | 0 87 | 0 88 | 0 89 | 0 90 | 0 91 | 0 92 | 1 93 | 0 94 | 0 95 | 0 96 | 0 97 | 0 98 | 0 99 | 1 100 | 0 101 | 0 102 | 1 103 | 0 104 | 1 105 | 0 106 | 0 107 | 0 108 | 1 109 | 0 110 | 0 111 | 0 112 | 0 113 | 0 114 | 1 115 | 0 116 | 1 117 | 1 118 | 0 119 | 0 120 | 0 121 | 0 122 | 0 123 | 0 124 | 0 125 | 0 126 | 0 127 | 0 128 | 0 129 | 0 130 | 0 131 | 1 132 | 0 133 | 0 134 | 0 135 | 1 136 | 0 137 | 0 138 | 1 139 | 0 140 | 0 141 | 0 142 | 0 143 | 0 144 | 0 145 | 0 146 | 0 147 | 0 148 | 0 149 | 0 150 | 0 151 | 0 152 | 0 153 | 0 154 | 0 155 | 0 156 | 0 157 | 0 158 | 0 159 | 1 160 | 0 161 | 0 162 | 1 163 | 0 164 | 0 165 | 0 166 | 0 167 | 0 168 | 0 169 | 0 170 | 0 171 | 0 172 | 1 173 | 0 174 | 0 175 | 0 176 | 0 177 | 0 178 | 0 179 | 0 180 | 0 181 | 0 182 | 0 183 | 1 184 | 0 185 | 0 186 | 1 187 | 1 188 | 1 189 | 0 190 | 0 191 | 0 192 | 0 193 | 0 194 | 1 195 | 0 196 | 0 197 | 0 198 | 0 199 | 0 200 | 1 201 | 0 202 | 0 203 | 0 204 | 0 205 | 0 206 | 0 207 | 0 208 | 0 209 | 0 210 | 0 211 | 0 212 | 0 213 | 0 214 | 0 215 | 0 216 | 0 217 | 0 218 | 1 219 | 0 220 | 0 221 | 1 222 | 1 223 | 0 224 | 0 225 | 0 226 | 0 227 | 0 228 | 0 229 | 1 230 | 0 231 | 0 232 | 0 233 | 0 234 | 0 235 | 1 236 | 0 237 | 0 238 | 0 239 | 0 240 | 0 241 | 0 242 | 0 243 | 0 244 | 0 245 | 0 246 | 0 247 | 0 248 | 1 249 | 0 250 | 0 251 | 0 252 | 0 253 | 0 254 | 1 255 | 0 256 | 0 257 | 0 258 | 0 259 | 0 260 | 0 261 | 0 262 | 1 263 | 0 264 | 0 265 | 0 266 | 1 267 | 1 268 | 0 269 | 0 270 | 0 271 | 0 272 | 0 273 | 0 274 | 0 275 | -------------------------------------------------------------------------------- /data/drowning.txt: -------------------------------------------------------------------------------- 1 | 1980 274 2 | 1981 233 3 | 1982 266 4 | 1983 258 5 | 1984 245 6 | 1985 216 7 | 1986 268 8 | 1987 224 9 | 1988 311 10 | 1989 305 11 | 1990 231 12 | 1991 277 13 | 1992 266 14 | 1993 219 15 | 1994 228 16 | 1995 195 17 | 1996 171 18 | 1997 253 19 | 1998 196 20 | 1999 251 21 | 2000 209 22 | 2001 207 23 | 2002 228 24 | 2003 214 25 | 2004 195 26 | 2005 200 27 | 2006 204 28 | 2007 195 29 | 2008 168 30 | 2009 169 31 | 2010 191 32 | 2011 163 33 | 2012 117 34 | 2013 168 35 | -------------------------------------------------------------------------------- /data/factory.txt: -------------------------------------------------------------------------------- 1 | 83 117 101 105 79 57 2 | 92 109 93 119 97 92 3 | 92 114 92 116 103 104 4 | 46 104 86 102 79 77 5 | 67 87 67 116 92 100 6 | -------------------------------------------------------------------------------- /data/windshieldy1.txt: -------------------------------------------------------------------------------- 1 | 13.357 2 | 14.928 3 | 14.896 4 | 15.297 5 | 14.82 6 | 12.067 7 | 14.824 8 | 13.865 9 | 17.447 10 | -------------------------------------------------------------------------------- /data/windshieldy2.txt: -------------------------------------------------------------------------------- 1 | 15.98 2 | 14.206 3 | 16.011 4 | 17.25 5 | 15.993 6 | 15.722 7 | 17.143 8 | 15.23 9 | 15.125 10 | 16.609 11 | 14.735 12 | 15.881 13 | 15.789 14 | -------------------------------------------------------------------------------- /demos_ch11/gibbssampler1.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avehtari/BDA_py_demos/b3d63ea1f89df470a5cb9f34080ff1e49dbfc6b7/demos_ch11/gibbssampler1.mp4 -------------------------------------------------------------------------------- /demos_ch11/gibbssampler2.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avehtari/BDA_py_demos/b3d63ea1f89df470a5cb9f34080ff1e49dbfc6b7/demos_ch11/gibbssampler2.mp4 -------------------------------------------------------------------------------- /demos_ch11/metropolissampler1.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avehtari/BDA_py_demos/b3d63ea1f89df470a5cb9f34080ff1e49dbfc6b7/demos_ch11/metropolissampler1.mp4 -------------------------------------------------------------------------------- /demos_ch11/metropolissampler2.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avehtari/BDA_py_demos/b3d63ea1f89df470a5cb9f34080ff1e49dbfc6b7/demos_ch11/metropolissampler2.mp4 -------------------------------------------------------------------------------- /demos_ch2/demo2_1.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "### Bayesian Data Analysis, 3rd ed\n", 8 | "## Chapter 2, demo 1\n", 9 | "\n", 10 | "Authors:\n", 11 | "- Aki Vehtari \n", 12 | "- Tuomas Sivula \n", 13 | "\n", 14 | "Probability of a girl birth given placenta previa (BDA3 p. 37).\n", 15 | "437 girls and 543 boys have been observed. Calculate and plot the posterior distribution of the proportion of girls $\\theta $, using\n", 16 | "uniform prior on $\\theta $." 17 | ] 18 | }, 19 | { 20 | "cell_type": "code", 21 | "execution_count": 1, 22 | "metadata": { 23 | "collapsed": false 24 | }, 25 | "outputs": [], 26 | "source": [ 27 | "# import necessary packages\n", 28 | "\n", 29 | "# plotting\n", 30 | "%matplotlib inline\n", 31 | "import matplotlib.pyplot as plt\n", 32 | "\n", 33 | "# fast array routines for numerical calculation\n", 34 | "import numpy as np\n", 35 | "# scipy contains various scietific tools, such as beta distribution\n", 36 | "from scipy.stats import beta" 37 | ] 38 | }, 39 | { 40 | "cell_type": "code", 41 | "execution_count": 2, 42 | "metadata": { 43 | "collapsed": true 44 | }, 45 | "outputs": [], 46 | "source": [ 47 | "# add utilities directory to path\n", 48 | "import os, sys\n", 49 | "util_path = os.path.abspath(os.path.join(os.path.pardir, 'utilities_and_data'))\n", 50 | "if util_path not in sys.path and os.path.exists(util_path):\n", 51 | " sys.path.insert(0, util_path)\n", 52 | "\n", 53 | "# import from utilities\n", 54 | "import plot_tools" 55 | ] 56 | }, 57 | { 58 | "cell_type": "code", 59 | "execution_count": 3, 60 | "metadata": { 61 | "collapsed": false 62 | }, 63 | "outputs": [], 64 | "source": [ 65 | "# edit default plot settings\n", 66 | "plt.rc('font', size=12)" 67 | ] 68 | }, 69 | { 70 | "cell_type": "markdown", 71 | "metadata": {}, 72 | "source": [ 73 | "The posterior distribution is Beta(438, 544). Plot the distribution." 74 | ] 75 | }, 76 | { 77 | "cell_type": "code", 78 | "execution_count": 4, 79 | "metadata": { 80 | "collapsed": false 81 | }, 82 | "outputs": [ 83 | { 84 | "name": "stdout", 85 | "output_type": "stream", 86 | "text": [ 87 | "Uniform prior -> Posterior is Beta(438,544)\n" 88 | ] 89 | }, 90 | { 91 | "data": { 92 | "image/png": "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\n", 93 | "text/plain": [ 94 | "" 95 | ] 96 | }, 97 | "metadata": {}, 98 | "output_type": "display_data" 99 | } 100 | ], 101 | "source": [ 102 | "# create grid of 80 points from 0.36 to 0.54\n", 103 | "x = np.linspace(0.36, 0.54, 80)\n", 104 | "# freeze a beta distribution object with given parameters\n", 105 | "dist = beta(438, 544)\n", 106 | "# probability density function at x\n", 107 | "pd = dist.pdf(x)\n", 108 | "\n", 109 | "print('Uniform prior -> Posterior is Beta(438,544)')\n", 110 | "\n", 111 | "# plot pd\n", 112 | "plt.plot(x, pd)\n", 113 | "# show only x-axis\n", 114 | "plot_tools.modify_axes.only_x()\n", 115 | "\n", 116 | "# annotate the line\n", 117 | "plt.annotate(\n", 118 | " r'$p(\\theta|y,n)$',\n", 119 | " (x[35] - 0.005, pd[35]),\n", 120 | " ha='right' # horizontalalignment\n", 121 | ")\n", 122 | "\n", 123 | "# plot proportion of girl babies in general population as a vertical line\n", 124 | "# ``color='C1'`` corresponds to default color #2\n", 125 | "plt.axvline(0.485, color='C1')\n", 126 | "# annotate the line\n", 127 | "plt.annotate(\n", 128 | " 'proportion in general\\npopulation',\n", 129 | " (0.485 + 0.005, 14),\n", 130 | " ha='left' # horizontalalignment\n", 131 | ")\n", 132 | "\n", 133 | "# find the points in x that are between 2.5% and 97.5% quantile\n", 134 | "# dist.ppf is percent point function (inverse of cdf)\n", 135 | "x_95_idx = (x > dist.ppf(0.025)) & (x < dist.ppf(0.975))\n", 136 | "# shade the 95% central posterior interval\n", 137 | "plt.fill_between(x[x_95_idx], pd[x_95_idx], color='0.92')\n", 138 | "# add text into the shaded area\n", 139 | "plt.text(dist.median(), 8, \"95%\", horizontalalignment='center')\n", 140 | "# add labels and title\n", 141 | "plt.xlabel(r'$\\theta$')\n", 142 | "\n", 143 | "# scale x-axis tightly to the data.\n", 144 | "plt.autoscale(axis='x', tight=True);\n", 145 | "# N.B. the last semicolon is here just to prevent ipython notebook\n", 146 | "# from displaying the return value of the last command." 147 | ] 148 | } 149 | ], 150 | "metadata": { 151 | "kernelspec": { 152 | "display_name": "Python 3", 153 | "language": "python", 154 | "name": "python3" 155 | }, 156 | "language_info": { 157 | "codemirror_mode": { 158 | "name": "ipython", 159 | "version": 3 160 | }, 161 | "file_extension": ".py", 162 | "mimetype": "text/x-python", 163 | "name": "python", 164 | "nbconvert_exporter": "python", 165 | "pygments_lexer": "ipython3", 166 | "version": "3.5.2" 167 | } 168 | }, 169 | "nbformat": 4, 170 | "nbformat_minor": 0 171 | } 172 | -------------------------------------------------------------------------------- /demos_ch2/demo2_3.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "### Bayesian Data Analysis, 3rd ed\n", 8 | "## Chapter 2, demo 3\n", 9 | "\n", 10 | "Authors:\n", 11 | "- Aki Vehtari \n", 12 | "- Tuomas Sivula \n", 13 | "\n", 14 | "Probability of a girl birth given placenta previa (BDA3 p. 37).\n", 15 | "Simulate samples from Beta(438,544), draw a histogram with quantiles, and do the same for a transformed variable." 16 | ] 17 | }, 18 | { 19 | "cell_type": "code", 20 | "execution_count": 1, 21 | "metadata": {}, 22 | "outputs": [], 23 | "source": [ 24 | "# import necessary packages\n", 25 | "\n", 26 | "import numpy as np\n", 27 | "from scipy.stats import beta\n", 28 | "\n", 29 | "%matplotlib inline\n", 30 | "import matplotlib.pyplot as plt\n", 31 | "import arviz as az\n", 32 | "az.style.use(\"arviz-grayscale\")" 33 | ] 34 | }, 35 | { 36 | "cell_type": "code", 37 | "execution_count": 2, 38 | "metadata": {}, 39 | "outputs": [], 40 | "source": [ 41 | "# add utilities directory to path\n", 42 | "import os, sys\n", 43 | "util_path = os.path.abspath(os.path.join(os.path.pardir, 'utilities_and_data'))\n", 44 | "if util_path not in sys.path and os.path.exists(util_path):\n", 45 | " sys.path.insert(0, util_path)\n", 46 | "\n", 47 | "# import from utilities\n", 48 | "import plot_tools" 49 | ] 50 | }, 51 | { 52 | "cell_type": "code", 53 | "execution_count": 3, 54 | "metadata": {}, 55 | "outputs": [], 56 | "source": [ 57 | "# edit default plot settings\n", 58 | "plt.rc('font', size=12)" 59 | ] 60 | }, 61 | { 62 | "cell_type": "code", 63 | "execution_count": 4, 64 | "metadata": {}, 65 | "outputs": [], 66 | "source": [ 67 | "# plotting grid\n", 68 | "x = np.linspace(0.36, 0.54, 150)\n", 69 | "\n", 70 | "# draw n random samples from Beta(438,544)\n", 71 | "n = 10000\n", 72 | "th = beta.rvs(438, 544, size=n) # rvs comes from `random variates`\n", 73 | "\n", 74 | "# get samples for the transformed variable\n", 75 | "phi = (1-th)/th" 76 | ] 77 | }, 78 | { 79 | "cell_type": "code", 80 | "execution_count": 5, 81 | "metadata": {}, 82 | "outputs": [ 83 | { 84 | "data": { 85 | "image/png": "iVBORw0KGgoAAAANSUhEUgAABRgAAAHrCAYAAACkUfG5AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nOzda5hlZXkm4Kd27S4KFAQ5ScAMoJwUpEEIEhQuUVQ6EA0OahlEmSHCgI2gEuEijk4EdcTIQNKGGJwax5EeNByCiCQxohhgCIqgSCREIiqOiApjS1OHXbXmh+Oe1dW96Gavptde3ff9a1HHt7hqP+/Xb33rWyNFURQBAAAAABhAp+kCAAAAAID2MmAEAAAAAAZmwAgAAAAADMyAEQAAAAAYmAEjAAAAADAwA0YAAAAAYGAGjAAAAADAwAwYAQAAAICBGTACAAAAAAMzYAQAAAAABmbACAAAAAAMzIARaJXvfve7Offcc3PEEUdkv/32y5FHHpkLL7ww09PTTZcGAADr1SmnnJK99torN910U9OlADwhA0agNT7zmc/k1a9+da6//vrsscceeelLX5rHHnssl112Wd72trc1XR4AAKxXd911V0ZGRrL//vs3XQrAE+o2XQDAurjuuuvynve8JwceeGD+y3/5L9lxxx2TJD/72c9y3HHH5aabbsott9yS3/7t3264UgAAqO+BBx7II488kt122y3PeMYzmi4H4AnZwQgMvYceeijvec97svPOO+fjH/94f7iYJNtuu21+7/d+L0ly4403NlUiAACsV3feeWeSZPHixQ1XArB2djACQ+/P/uzPsnLlyvzxH/9xttxyy9Xev9122yVJfvjDH27o0gAAYL35wQ9+kL/8y7/MV7/61Tz00ENJkr/+67/Obbfdlt/5nd/J6aefns0337zhKgFWZwcjMNRWrFiRa6+9NjvssEOWLFmyxo+ZmppKkhRFsSFLAwCA9eaGG27I7/7u7+azn/1snv3sZ2d8fDxJcuihh+bRRx/NX/7lX+aMM85ouEqANbODERhqX/ziFzM1NZVtt90255133ho/5p577kmSbLPNNhuyNAAAWC9uvfXWvPOd78zmm2+eT33qU9l///1z4IEHZmxsLH/xF3+Rf/mXf8nxxx+fm266KbfeemsOPfTQpksGWIUBIzDUbrnlliTJgw8+mKuvvvoJP3a33XbbECUBAMB6Mzs7m/POOy+9Xi/vfe97c9BBB+Xb3/52ZmZmst9++2XRokXZZ5998uIXvzg33nhj/vEf/9GAERg6BozAUPvWt76VJLn++uvznOc8Z7X3T01N5eCDD+4vwAAAoE1uuOGGPPjgg3n+85+fY489Nkly9913J0me//zn9z9ul112SZI8/vjjG75IgLVwBiMwtHq9Xn7wgx8kySpPji67/fbbMzMzk/Hx8bzwhS/ckOUBAEBtf//3f58keeUrX9l/268HjPvuu2//bY888kiS//+AQ4BhYsAIDK3HHnssvV4vSfK0pz1tjR9zww03JEmOOuqojI2NbbDaAABgffj1HTsHHnhg/20LB4xFUeSOO+5IEnftAEPJgBEYWiMjI/3r2dnZ1d7/yCOP5POf/3yS5IQTTthgdQEAwPry8MMPJ0m22mqrJMn09HTuu+++bLbZZtljjz2SJHfddVd+9KMfZdttt11lEAkwLAwYgaG11VZb9Rda3/nOd1Z7/5/8yZ/k8ccfzytf+cosXrx4Q5cHAAC1bb755kmSH/3oR0l+te6dnZ3N3nvvnW63m/n5+Vx44YVJkje/+c1ZtGhRY7UCVDFgBIbaEUcckST52Mc+lvn5+SS/ukXkz//8z/PZz342v/Ebv5H/9J/+U5MlAgDAwA4++OAkySc/+cn0er1VHvDS6/XywQ9+MF/72tey33775d/9u3/XZKkAlUaKoiiaLgKgygMPPJDXvOY1WblyZXbffffsvffeueeee/K9730vu+66ay677LI8+9nPbrpMAAAYyL333ps3vOENWblyZZ7znOekKIrcf//92WeffbJixYr88Ic/zAEHHJA///M/zzbbbNN0uQBrZMAIDL177703F110Ub7+9a9ndnY2u+66a5YsWZI3v/nN2WyzzZouDwAAarnnnnvy0Y9+NHfccUcee+yxJL+6dXqPPfbIcccdl+OPPz7dbrfhKgGqGTACAADAEPjlL3+Zgw8+OE9/+tPzj//4j6s89BBgmDmDEQAAAIbA3Xffnfn5+ey7776Gi0CrGDACAADAEPjmN7+ZJHnBC17QcCUAT44BIwAAAAyBb33rW0mS/fbbr+FKAJ4cZzDSiG9+85u55pprctttt+XBBx/M1ltvnf333z9nnnlmdttttyf83KuuuirnnnvuGt/3D//wD9l+++2TJEVRZNmyZbniiivS6/VyzDHH5Oyzz87Y2Fj/4x977LG86lWvyh/+4R/m2GOPXX8/IPCk3H333bnooovyjW98I0VR5IADDsjZZ5+dffbZp/8xP/zhD/Oyl72s8mscf/zxOf/885/w++y1115rfPs73/nOvPWtb+3/99e//vWcf/75+d73vpd9990373vf+/Kc5zxnlc85//zz86//+q/5xCc+sS4/IgAbmPUmbLqsLWHD8xgqGnHZZZfljjvuyKte9arstddeefjhh/PpT386xx13XK644orsueeea/0aZ5xxRnbZZZdV3rbVVlv1r6+99tpceuml+YM/+INsvvnmufTSS7PddtvllFNO6X/MpZdemp133tliDxr07W9/O2984xuz00475W1ve1vm5+dz+eWX54QTTshnP/vZ7L777kmSZz7zmfnwhz+82ud/9atfzec+97kcdthh6/T9DjvssLz61a9e5W3Pe97z+tcrVqzIaaedlsWLF+d1r3tdrr766pxxxhm59tprMzo6miS577778pnPfCZXXXXVoD82AE8x603YNFlbQjMMGGnEW97ylnzkIx9Z5a+7S5YsybHHHpuPf/zj+chHPrLWr3H44Yc/4a0DX/7yl3Psscfm7W9/e5Jkeno6X/rSl/oLvu9///v57//9v+d//I//UfOnAeq4+OKLMz4+nv/5P/9nttlmmyTJ7/7u7+aVr3xlLrroovzpn/5pkmSLLbZYbfGWJFdffXWe/vSn58gjj1yn77frrruu8ev82je+8Y1MT0/nkksuyWabbZaXvOQlednLXpYHHnigvyD9wAc+kNe97nV57nOf+2R/XAA2EOtN2DRZW0IznMFIIw488MBVFnvJr4J5jz32yP3337/OX+eXv/xl5ubm1vi+qampPOMZz+j/9zOe8Yw8/vjj/f/+0Ic+lCVLljjfBBr2ta99LYceemh/AZgkO+ywQ37rt34rN954Yx577LHKz/3JT36S2267La94xSuy2WabrfP3nJqayvT09BrfNz09nc0226z/9bbeeuv+5yTJF7/4xdxzzz1ZunTpOn8/ADY8603YNFlbQjMMGBkaRVHkpz/96SqN4ImceOKJeeELX5j9998/p556ar73ve+t8v799tsv1113Xe68887ce++9ueKKK/pPY7v55pvzv/7X/8o73vGO9f1jAE/SzMxMxsfHV3v7+Ph4Zmdnc99991V+7vXXX5/5+fknddvZ1VdfncWLF+cFL3hBlixZks997nOrvH+fffbJihUr8l//63/Ngw8+mEsuuSRbbrlldtttt8zMzORDH/pQzjjjjFX+QQlAO1hvwsbP2hKa4RZphsa1116bhx56KGecccYTftz4+HiOO+64HHLIIXn605+eu+++O//tv/23vOENb8jVV1+dnXbaKcmvFoT/8A//kNe//vVJkj322CNLly5Nr9fLBz7wgZx66qn9A7qB5uy222658847Mzc31z+HZmZmJt/85jeTJA899FDl51577bXZfvvt86IXvWidvtcBBxyQo48+Orvsskt+8pOf5PLLL8+73vWurFixIm984xuTJLvsskve+c535iMf+Uj+83/+zxkfH88FF1zQP1tr8803zxve8IaaPzUATbDehI2ftSU0pIAh8C//8i/FgQceWLz+9a8ver3ek/7822+/vdhrr72K97znPau8fW5urrjvvvuKf/qnfypmZ2eLoiiKT37yk8XLX/7yYnp6urjvvvuKE044oXjxi19cvPOd7yxWrFixXn4eYN1dfvnlxZ577lm8+93vLu67777i3nvvLc4888zi+c9/frHnnnsW11xzzRo/7/777y/23HPP4gMf+MDA33t6ero45phjioMOOqh4/PHHV3nfww8/XHzjG98oHn300aIoiuLHP/5xsXjx4uKWW24ppqeniz/+4z8ujjjiiOK1r31t8bWvfW3gGgDYMKw3YdNgbQnNcIs0jXv44YdzyimnZMstt8zFF1/c/yvTk3HQQQdl//33z6233rrK2zudTp773Odm7733Trfbzc9//vP82Z/9Wd797ndnZGQkp5xySvbaa6987GMfy//+3/8773//+9fXjwWso4mJiZx66qm57rrr8ju/8zs59thj8/3vfz///t//+yTJ0572tDV+3q9vP6nzVM6xsbH8/u//fn7xi1/k7rvvXuV92223XRYvXty/XeUjH/lIDj300Bx66KFZtmxZbr311lx00UV5+ctfnlNOOSW/+MUvBq4DgKeW9SZsOqwtoRkGjDRqxYoV+YM/+IOsWLEil112WXbccceBv9aznvWs/J//83+e8GMuvvjiPO95z8vLX/7y3HXXXXn44Ydz9tlnZ7/99svSpUvz+c9/PvPz8wPXAAzmrLPOys0335xPf/rTufbaa3PllVemKIokvzqQf02uu+667Lbbbtl3331rfe9f3+b2RPlx55135m/+5m9yzjnnJEk+//nP5+STT84BBxyQU089NVtuuWVuvPHGWnUA8NSw3oRNj7UlbHjOYKQx09PT/cOyJycn89znPrfW1/vBD37whAd2f+c738mVV16Zq666KsmvnhC21VZb9Z/mtcMOO2R2djY///nPs91229WqBXjynvGMZ+Sggw7q//ctt9ySZz3rWdl9991X+9i77rorDzzwwFrP0FoXP/jBD5Ikz3zmM9f4/qIocv755+fEE0/Mb/7mbyb5VX7ssMMO/Y/ZYYcdnvA8HwCaYb0Jmy5rS9iw7GCkEXNzcznzzDNz55135uKLL84BBxywxo/7yU9+ku9+97uZnZ3tv+3nP//5ah/3la98Jd/+9rfzkpe8pPJ7XnDBBTn++OOz5557Jkm23XbbPPLII3n00UeTJPfff3+63e46P1UQeOpcf/31+da3vpU3v/nN6XRWb1Vru4Xl8ccfz3e/+91V8mJN2fHLX/4yn/zkJ7PNNtvk+c9//hq/1lVXXZUf//jHOfXUU/tv22677XL//fcnSWZnZ/PAAw84xB9gyFhvAr9mbQlPPTsYacSHPvShfOlLX8pLX/rSPProo/nrv/7rVd7/6le/Okny0Y9+NFdffXX+/u//PrvsskuS5A1veEP22Wef7Lvvvtlyyy1zzz335Morr8xOO+20SkiXfeELX8i9996bSy65pP+2Aw44INtuu23e/va35xWveEU+8YlP5KijjhroTB5gcLfffnuWLVuWww47LFtvvXXuuuuuXHXVVXnJS16SE088cbWPn5ubyxe+8IUsXry4/1ffhb75zW/mxBNPzNve9rYsXbo0SfLpT386X/ziF/PSl740v/Ebv5Gf/OQnueqqq/KjH/0oH/7whzM2Nrba1/nlL3+Ziy66KGeddVae/vSn99/+yle+MsuWLcv8/HzuuOOOTE9P54gjjlhP/0cAWB+sN2HTZG0JzTBgpBHf+c53kiQ33njjGs+W+PWCb02OPvrofOUrX8nNN9+cqampbL/99jn++OPztre9bY23mkxNTeXCCy/M0qVLV/lr8djYWJYtW5b3vve9+ZM/+ZP81m/9Vv7jf/yP6+GnA56MHXfcMaOjo/nEJz6Rxx57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QB36CFAmE6CaVwOt1el0snjx4v41wEJyAoA69BGgTCZAtZHCs9XZxCxfvrzpEoB1NDEx0XQJAPCErC1huFg/QjOM3AEAAACAgRkwAgAAAAADM2Cktaanp3PWWWflrLPOyvT0dNPlAENITgBQhz4ClMkEqOYhL7RWURT58Y9/3L8GWEhOAFCHPgKUyQSoZsBIa42NjeV973tf/xpgITkBQB36CFAmE6CaASOt1el0stdeezVdBjDE5AQAdegjQJlMgGrOYAQAAAAABmYHI601NzeX22+/PUly8MEHZ3R0tOGKgGEjJwCoQx8BymQCVBspnExKS01NTeWkk05KkkxOTmZ8fDxJsnz58ibLAtajiYmJWp9flRMAsC7KfWTJkiXpdu3PgLars760toRqOiSt1el0ss8++/SvARaSEwDU0el0su222yZJRkZGGq4GaJq1JVSzg5GNjh2MsPGou4MRAOqytoSNi/UlPDWM3AEAAACAgRkwAgAAAAADM2CktWZmZnLOOefknHPOyczMTNPlAENITgBQx8zMTL785S/ny1/+cubm5pouB2iYtSVU85AXWmt+fj4PPPBA/xpgITkBQB3z8/P5xS9+kSRxdD1gbQnVDBhprbGxsZx77rn9a4CF5AQAa/NED3EpiiIvetGLkiSjo6MbqiRgSFlbQjVPkWaj40l/sOnwFEAA6rJ2BMqsL2EwzmAEAAAAAAbmFmlaa25uLnfddVeSZP/993fbCrAaOQFAHfPz83n44YeTJNtvv306HfszYFNmbQnVDBhplfItLL1eL9dff32SZMmSJel2/ToDq5qdnc2FF16YJJmcnLQIBOBJmZ+fz2233ZbkV+tNA0bYtFlbQjUTGVprZGQkW2+9df8a2PSs7dysubm57L777kniH4UAPGnWm0BZp9OxtoQKHvJCqziEG3iyHNQNwBOxvgTKrB1hMEbuAAAAAMDADBgBAAAAgIE5g5HWmpubyy233JIk+e3f/m0H7AKrmZuby3vf+94kyXnnnZexsbGGKwKgTaw3gbKZmZlccMEFSawtYSEDRlqrKIo88sgj/WuAhYqiyD//8z8n+dWTQAHgybDeBMrm5+etLaGCASOt1el0cvDBB/evARbqdDp5xzvekSRZtGhRw9UA0DbWm0DZokWLrC2hggEjrdXpdLLTTjs1XQYwxMr/MASAJ8t6EzY9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R2MjR44dOnTAkiVLsHbtWvzpT3/CqFGjYGNjg1OnTiEjIwNTpkzBoEGDGnjL/o9RA4zAbwcfP/zwA7Zs2YKIiAiUlpZCkiQsXrxYP0hVm48++ggXL17E5cuX8fjxY+h0Ori4uGDKlCnw9/c36HDt7e2xf/9+/POf/8R///tfhIWFoby8HG3btsXUqVMxd+5cODs7G7spqiFHpqYYP348WrVqheDgYBw8eBAA4O7ujrlz58LLy6ve1lvflMgzIyMDwG8Hkdu2bav2NR4eHprsxJX6fDZWSuXZu3dvhISEYOvWrTh//jyePXsGFxcXzJkzB3PmzKnyo46WKJFnY+6T5MgzICAA165dw7lz5/DkyRNYW1ujY8eOmDt3LmbOnIkWLVrUy3qJXmVXrlxBWFhYlWlxcXGIi4vT/13xpeVlPvvsM0iShP3792PPnj2ws7PDqFGjsGjRInTs2FH2utVGrhxfXMaL0yZOnNhoBxjlyLDiuPratWu4du1ata9p7ANAcuQ4Z84cnDx5EvHx8Th58iTKy8vh5OQEHx8f+Pn5oXfv3vVSu5rItU+/6uTIcerUqYiOjsbly5eRm5sLnU6H119/Hf7+/ggICNDssbMx5Po8Tp8+He3atcPOnTtx5MgRlJWVoVu3bpg7d67in2cLIf7/c66JiIiIiIiIiIiIjKRTugAiIiIiIiIiIiLSLg4wEhERERERERERkck4wEhEREREREREREQm4wAjERERERERERERmYwDjERERERERERERGQyDjASERERERERERGRyTjASERERERERERERCbjACMRERERERERERGZjAOMREREREREREREZDIOMBIREREREREREZHJOMBIREREREREREREJuMAIxEREREREREREZmMA4xERERERERERERksv8H0fsmmwNXDjUAAAAASUVORK5CYII=\n", 86 | "text/plain": [ 87 | "
" 88 | ] 89 | }, 90 | "metadata": {}, 91 | "output_type": "display_data" 92 | } 93 | ], 94 | "source": [ 95 | "idata = az.from_dict({r'$\\theta$': th, r'$\\phi$': phi})\n", 96 | "quantiles = idata.posterior.quantile([0.025, 0.975])\n", 97 | "axes = az.plot_posterior(idata, kind='hist', point_estimate=None, hdi_prob=\"hide\")\n", 98 | "\n", 99 | "# draw quantile lines\n", 100 | "for idx, var in enumerate(quantiles):\n", 101 | " ymin, ymax = axes[idx].get_ylim()\n", 102 | " axes[idx].vlines(quantiles[var], ymin, ymax, color='C1', ls=\":\")\n", 103 | " axes[idx].text(\n", 104 | " quantiles[var].sel(quantile=0.025),\n", 105 | " ymax+15,\n", 106 | " '2.5%',\n", 107 | " horizontalalignment='center'\n", 108 | " )\n", 109 | " axes[idx].text(\n", 110 | " quantiles[var].sel(quantile=0.975),\n", 111 | " ymax+15,\n", 112 | " '97.5%',\n", 113 | " horizontalalignment='center'\n", 114 | " )" 115 | ] 116 | } 117 | ], 118 | "metadata": { 119 | "kernelspec": { 120 | "display_name": "Python 3", 121 | "language": "python", 122 | "name": "python3" 123 | }, 124 | "language_info": { 125 | "codemirror_mode": { 126 | "name": "ipython", 127 | "version": 3 128 | }, 129 | "file_extension": ".py", 130 | "mimetype": "text/x-python", 131 | "name": "python", 132 | "nbconvert_exporter": "python", 133 | "pygments_lexer": "ipython3", 134 | "version": "3.6.9" 135 | } 136 | }, 137 | "nbformat": 4, 138 | "nbformat_minor": 1 139 | } 140 | -------------------------------------------------------------------------------- /demos_ch6/demo6_2.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "### Bayesian data analysis\n", 8 | "## Chapter 6, demo 2\n", 9 | "\n", 10 | "Posterior predictive checking \n", 11 | "Binomial example - Testing sequential dependence example" 12 | ] 13 | }, 14 | { 15 | "cell_type": "code", 16 | "execution_count": 1, 17 | "metadata": { 18 | "collapsed": false 19 | }, 20 | "outputs": [], 21 | "source": [ 22 | "import numpy as np\n", 23 | "\n", 24 | "%matplotlib inline\n", 25 | "import matplotlib.pyplot as plt" 26 | ] 27 | }, 28 | { 29 | "cell_type": "code", 30 | "execution_count": 2, 31 | "metadata": { 32 | "collapsed": true 33 | }, 34 | "outputs": [], 35 | "source": [ 36 | "import os, sys\n", 37 | "# add utilities directory to path\n", 38 | "util_path = os.path.abspath(os.path.join(os.path.pardir, 'utilities_and_data'))\n", 39 | "if util_path not in sys.path and os.path.exists(util_path):\n", 40 | " sys.path.insert(0, util_path)\n", 41 | "\n", 42 | "# import from utilities\n", 43 | "import plot_tools" 44 | ] 45 | }, 46 | { 47 | "cell_type": "code", 48 | "execution_count": 3, 49 | "metadata": { 50 | "collapsed": false 51 | }, 52 | "outputs": [], 53 | "source": [ 54 | "# edit default plot settings\n", 55 | "plt.rc('font', size=12)" 56 | ] 57 | }, 58 | { 59 | "cell_type": "code", 60 | "execution_count": 4, 61 | "metadata": { 62 | "collapsed": false 63 | }, 64 | "outputs": [], 65 | "source": [ 66 | "# Testing sequential dependence example (Gelman et al p. 163)\n", 67 | "y = np.array([1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0])\n", 68 | "Ty = np.count_nonzero(np.diff(y))\n", 69 | "\n", 70 | "# sufficient statistics\n", 71 | "n = len(y)\n", 72 | "s = y.sum()\n", 73 | "\n", 74 | "nsamp = 10000\n", 75 | "t = np.random.beta(s+1, n-s+1, size=nsamp)\n", 76 | "yr = np.random.rand(n, nsamp) < t\n", 77 | "# sadly np.count_nonzero does not (yet) support axis parameter\n", 78 | "Tyr = (np.diff(yr, axis=0) != 0).sum(axis=0)" 79 | ] 80 | }, 81 | { 82 | "cell_type": "code", 83 | "execution_count": 5, 84 | "metadata": { 85 | "collapsed": false 86 | }, 87 | "outputs": [ 88 | { 89 | "data": { 90 | "image/png": "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\n", 91 | "text/plain": [ 92 | "" 93 | ] 94 | }, 95 | "metadata": {}, 96 | "output_type": "display_data" 97 | } 98 | ], 99 | "source": [ 100 | "# plot\n", 101 | "plt.hist(\n", 102 | " Tyr,\n", 103 | " np.arange(19),\n", 104 | " align='left',\n", 105 | " label='$T(y_\\mathrm{rep})$',\n", 106 | " color=plot_tools.lighten('C0', 0.3)\n", 107 | ")\n", 108 | "plt.axvline(Ty, color='red', label='$T(y)$')\n", 109 | "plt.xlim((-0.5, 17.5))\n", 110 | "plt.title(\n", 111 | " 'Binomial example - number of changes? \\n'\n", 112 | " r'$\\operatorname{Pr}(T(y_\\mathrm{rep},\\theta) \\leq T(y,\\theta)|y) = 0.03$',\n", 113 | " fontsize=16\n", 114 | ")\n", 115 | "plt.legend()\n", 116 | "plot_tools.modify_axes.only_x(plt.gca())\n", 117 | "plt.tight_layout()" 118 | ] 119 | } 120 | ], 121 | "metadata": { 122 | "kernelspec": { 123 | "display_name": "Python 3", 124 | "language": "python", 125 | "name": "python3" 126 | }, 127 | "language_info": { 128 | "codemirror_mode": { 129 | "name": "ipython", 130 | "version": 3 131 | }, 132 | "file_extension": ".py", 133 | "mimetype": "text/x-python", 134 | "name": "python", 135 | "nbconvert_exporter": "python", 136 | "pygments_lexer": "ipython3", 137 | "version": "3.5.2" 138 | } 139 | }, 140 | "nbformat": 4, 141 | "nbformat_minor": 0 142 | } 143 | -------------------------------------------------------------------------------- /demos_ch6/demo6_3.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "### Bayesian Data Analysis, 3rd ed\n", 8 | "## Chapter 6, demo 3\n", 9 | "\n", 10 | "Posterior predictive checking \n", 11 | "Light speed example with a poorly chosen test statistic" 12 | ] 13 | }, 14 | { 15 | "cell_type": "code", 16 | "execution_count": 1, 17 | "metadata": { 18 | "collapsed": false 19 | }, 20 | "outputs": [], 21 | "source": [ 22 | "import numpy as np\n", 23 | "\n", 24 | "%matplotlib inline\n", 25 | "import matplotlib.pyplot as plt" 26 | ] 27 | }, 28 | { 29 | "cell_type": "code", 30 | "execution_count": 2, 31 | "metadata": { 32 | "collapsed": true 33 | }, 34 | "outputs": [], 35 | "source": [ 36 | "import os, sys\n", 37 | "# add utilities directory to path\n", 38 | "util_path = os.path.abspath(os.path.join(os.path.pardir, 'utilities_and_data'))\n", 39 | "if util_path not in sys.path and os.path.exists(util_path):\n", 40 | " sys.path.insert(0, util_path)\n", 41 | "\n", 42 | "# import from utilities\n", 43 | "import plot_tools" 44 | ] 45 | }, 46 | { 47 | "cell_type": "code", 48 | "execution_count": 3, 49 | "metadata": { 50 | "collapsed": false 51 | }, 52 | "outputs": [], 53 | "source": [ 54 | "# edit default plot settings\n", 55 | "plt.rc('font', size=12)" 56 | ] 57 | }, 58 | { 59 | "cell_type": "code", 60 | "execution_count": 4, 61 | "metadata": { 62 | "collapsed": false 63 | }, 64 | "outputs": [], 65 | "source": [ 66 | "# data\n", 67 | "data_path = os.path.abspath(\n", 68 | " os.path.join(\n", 69 | " os.path.pardir,\n", 70 | " 'utilities_and_data',\n", 71 | " 'light.txt'\n", 72 | " )\n", 73 | ")\n", 74 | "y = np.loadtxt(data_path)\n", 75 | "# sufficient statistics\n", 76 | "n = len(y)\n", 77 | "s2 = np.var(y, ddof=1) # Here ddof=1 is used to get the sample estimate.\n", 78 | "my = np.mean(y)" 79 | ] 80 | }, 81 | { 82 | "cell_type": "code", 83 | "execution_count": 5, 84 | "metadata": { 85 | "collapsed": false 86 | }, 87 | "outputs": [], 88 | "source": [ 89 | "# A second example of replications\n", 90 | "nsamp = 1000\n", 91 | "pps = np.random.standard_t(n-1, size=(n,nsamp))*np.sqrt(s2*(1+1/n)) + my\n", 92 | "# Use the sample variance as a test statistic\n", 93 | "# This is a poor choice since it corresponds directly to\n", 94 | "# the variance parameter in the model which has been fitted\n", 95 | "# to the data.\n", 96 | "pp = np.var(pps, axis=0, ddof=1)" 97 | ] 98 | }, 99 | { 100 | "cell_type": "code", 101 | "execution_count": 6, 102 | "metadata": { 103 | "collapsed": false 104 | }, 105 | "outputs": [ 106 | { 107 | "data": { 108 | "image/png": "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\nqVOnPAsKCmTt2rWBAJCVleXp6+tbGhoaWnLixAnPGTNmNDcvGxYWVvzHH3+Ubf+IESPSDx065Pv6\n66+HFBQUSEFBgWzevNl/586dvl5eXrjxxhvTn3rqqeZZWVkeO3bs8F2xYoXLVorbb7/97Ndff914\n/fr1gfn5+fLII480V0qVRQvZ2dmeQUFBJY0bNy5NTEz0fe+998LNyzdt2rR4//79ZWWrbFvMdu/e\n7fPf//7XlpeXJ/7+/srX11d5eHioyj4DZ/vEe++9F2wfaNy0adNiEYE9L3cxmCEickPr1q3Rq1cv\n5OTk4Oabby4374033sD06dNhs9kwa9YsjBgxwu18bTYbXn31VYwYMQLBwcFYtmzZeflX5MUXX0Tn\nzp3Ro0cPhISE4PHHH0dpaSmio6OxevVqPPfcc2jatGlsVFRUlxdffDGitLRUSktL5ZVXXomIiorq\n0qRJk9jvvvvO9tZbbx12lv/cuXNTunbtmtO1a9eOXbp06di5c+fcuXPnpri5baUPPvhgSu/evdvb\nbLbYr776KqCyZVasWHGosLBQOnTo0KlJkyaxw4cPjzl+/Ljb3VrTpk07OWjQoPT+/fv/KSAgIO7K\nK69sv3Xr1nLrve6667JiYmI6DRgwoN19992X+re//S2zsnyXL19+0NvbW7Vv375TWFhY15dffjkC\nAKZMmXIiPz/fIzQ0NPbKK6/s0L9//wzzchMnTjyRkJAQHBQUFDt27Njo4ODg0rVr1+7/+OOPQyIj\nI7tERER0ffzxx1vYrzJasGDBkZycHI9mzZp1HTt27GW33XbbaWflAYDu3bvnP//880fGjh17WWRk\nZNfg4ODiiIiIslamF1544egnn3wSEhgYGDd+/PhWQ4YMSTMv/69//St5woQJrW02W+y7774bXNm2\nmOXn53s8+eSTLUJDQ2MjIiK6nj592mvevHnHK/sMnO0T27ZtC7j66qs7+Pv7xw0dOrTts88+e6Rj\nx44VtpY5EneaMi8RrIgGorbvL+LKY3MmAAD+PfXtSlLWH3fvjWI1e/fuRYcOHeq7GBezHfVdgIZg\n3759jdq3b9+5sLBwB+9HYz27d+8O7dq1a2tn89gyQ0RERJbGYIaIiIgs7eK4pzYREVEl2rVrV6iU\nYpfbRYgtM0RERGRpDGaIqEHgxQhE5Irx/VDqaj6DGSKqd97e3mUPRyQiclRYWOgtIi4vFWcwQ0T1\n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\n", 109 | "text/plain": [ 110 | "" 111 | ] 112 | }, 113 | "metadata": {}, 114 | "output_type": "display_data" 115 | } 116 | ], 117 | "source": [ 118 | "# plot\n", 119 | "plt.hist(\n", 120 | " pp,\n", 121 | " 20,\n", 122 | " label='Variances of the replicated data sets',\n", 123 | " color=plot_tools.lighten('C0', 0.3)\n", 124 | ")\n", 125 | "plt.axvline(s2, color='red', label='Variance of the original data')\n", 126 | "plt.title(\n", 127 | " 'Light speed example with poorly chosen test statistic\\n'\n", 128 | " r'$\\operatorname{Pr}(T(y_\\mathrm{rep},\\theta)\\leq T(y,\\theta)|y)=0.42$',\n", 129 | " fontsize=16\n", 130 | ")\n", 131 | "plt.legend(loc='center left', bbox_to_anchor=(0.7, 0.8))\n", 132 | "plot_tools.modify_axes.only_x(plt.gca())\n", 133 | "plt.tight_layout()" 134 | ] 135 | } 136 | ], 137 | "metadata": { 138 | "kernelspec": { 139 | "display_name": "Python 3", 140 | "language": "python", 141 | "name": "python3" 142 | }, 143 | "language_info": { 144 | "codemirror_mode": { 145 | "name": "ipython", 146 | "version": 3 147 | }, 148 | "file_extension": ".py", 149 | "mimetype": "text/x-python", 150 | "name": "python", 151 | "nbconvert_exporter": "python", 152 | "pygments_lexer": "ipython3", 153 | "version": "3.5.2" 154 | } 155 | }, 156 | "nbformat": 4, 157 | "nbformat_minor": 0 158 | } 159 | -------------------------------------------------------------------------------- /demos_ch6/demo6_4.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "### Bayesian data analysis\n", 8 | "## Chapter 6, demo 4\n", 9 | "\n", 10 | "Posterior predictive checking \n", 11 | "Light speed example" 12 | ] 13 | }, 14 | { 15 | "cell_type": "code", 16 | "execution_count": 1, 17 | "metadata": { 18 | "collapsed": false 19 | }, 20 | "outputs": [], 21 | "source": [ 22 | "import numpy as np\n", 23 | "from scipy import stats\n", 24 | "\n", 25 | "%matplotlib inline\n", 26 | "import matplotlib.pyplot as plt" 27 | ] 28 | }, 29 | { 30 | "cell_type": "code", 31 | "execution_count": 2, 32 | "metadata": { 33 | "collapsed": true 34 | }, 35 | "outputs": [], 36 | "source": [ 37 | "import os, sys\n", 38 | "# add utilities directory to path\n", 39 | "util_path = os.path.abspath(os.path.join(os.path.pardir, 'utilities_and_data'))\n", 40 | "if util_path not in sys.path and os.path.exists(util_path):\n", 41 | " sys.path.insert(0, util_path)\n", 42 | "\n", 43 | "# import from utilities\n", 44 | "import plot_tools" 45 | ] 46 | }, 47 | { 48 | "cell_type": "code", 49 | "execution_count": 3, 50 | "metadata": { 51 | "collapsed": false 52 | }, 53 | "outputs": [], 54 | "source": [ 55 | "# edit default plot settings\n", 56 | "plt.rc('font', size=12)" 57 | ] 58 | }, 59 | { 60 | "cell_type": "code", 61 | "execution_count": 4, 62 | "metadata": { 63 | "collapsed": false 64 | }, 65 | "outputs": [], 66 | "source": [ 67 | "# data\n", 68 | "data_path = os.path.abspath(\n", 69 | " os.path.join(\n", 70 | " os.path.pardir,\n", 71 | " 'utilities_and_data',\n", 72 | " 'light.txt'\n", 73 | " )\n", 74 | ")\n", 75 | "y = np.loadtxt(data_path)\n", 76 | "# sufficient statistics\n", 77 | "n = len(y)\n", 78 | "s2 = np.var(y, ddof=1)\n", 79 | "my = np.mean(y)" 80 | ] 81 | }, 82 | { 83 | "cell_type": "code", 84 | "execution_count": 5, 85 | "metadata": { 86 | "collapsed": false 87 | }, 88 | "outputs": [], 89 | "source": [ 90 | "# tail area probabilities of marginal predictive distributions\n", 91 | "Ty = stats.t.cdf(y, n-1, loc=my, scale=np.sqrt(s2*(1+1/n)))" 92 | ] 93 | }, 94 | { 95 | "cell_type": "code", 96 | "execution_count": 6, 97 | "metadata": { 98 | "collapsed": false 99 | }, 100 | "outputs": [ 101 | { 102 | "data": { 103 | "image/png": "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\nTkSuQmCC\n", 104 | "text/plain": [ 105 | "" 106 | ] 107 | }, 108 | "metadata": {}, 109 | "output_type": "display_data" 110 | } 111 | ], 112 | "source": [ 113 | "# plot\n", 114 | "plt.hist(Ty, np.arange(0, 1.01, 0.05))\n", 115 | "plt.xlim((0, 1))\n", 116 | "plt.title('Light speed example\\ndistribution of marginal posterior p-values')\n", 117 | "plot_tools.modify_axes.only_x(plt.gca())" 118 | ] 119 | } 120 | ], 121 | "metadata": { 122 | "kernelspec": { 123 | "display_name": "Python 3", 124 | "language": "python", 125 | "name": "python3" 126 | }, 127 | "language_info": { 128 | "codemirror_mode": { 129 | "name": "ipython", 130 | "version": 3 131 | }, 132 | "file_extension": ".py", 133 | "mimetype": "text/x-python", 134 | "name": "python", 135 | "nbconvert_exporter": "python", 136 | "pygments_lexer": "ipython3", 137 | "version": "3.5.2" 138 | } 139 | }, 140 | "nbformat": 4, 141 | "nbformat_minor": 0 142 | } 143 | -------------------------------------------------------------------------------- /demos_pystan/PyStan_test_installation.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "ein.tags": "worksheet-0", 7 | "slideshow": { 8 | "slide_type": "-" 9 | } 10 | }, 11 | "source": [ 12 | "This simple notebook can be used to test that PyStan has been succesfully installed." 13 | ] 14 | }, 15 | { 16 | "cell_type": "code", 17 | "execution_count": 5, 18 | "metadata": { 19 | "autoscroll": false, 20 | "collapsed": false, 21 | "ein.tags": "worksheet-0", 22 | "slideshow": { 23 | "slide_type": "-" 24 | } 25 | }, 26 | "outputs": [], 27 | "source": [ 28 | "import pystan\n", 29 | "%matplotlib inline\n", 30 | "import matplotlib.pyplot as plt" 31 | ] 32 | }, 33 | { 34 | "cell_type": "code", 35 | "execution_count": 3, 36 | "metadata": { 37 | "autoscroll": false, 38 | "collapsed": false, 39 | "ein.tags": "worksheet-0", 40 | "slideshow": { 41 | "slide_type": "-" 42 | } 43 | }, 44 | "outputs": [ 45 | { 46 | "name": "stderr", 47 | "output_type": "stream", 48 | "text": [ 49 | "INFO:pystan:COMPILING THE C++ CODE FOR MODEL anon_model_c119d6069f0316b80eefa9c12c3ce343 NOW.\n" 50 | ] 51 | } 52 | ], 53 | "source": [ 54 | "fit = pystan.stan(model_code=\"parameters {real theta;} model {theta ~ normal(0,1);}\")" 55 | ] 56 | }, 57 | { 58 | "cell_type": "code", 59 | "execution_count": 6, 60 | "metadata": { 61 | "autoscroll": false, 62 | "collapsed": false, 63 | "ein.tags": "worksheet-0", 64 | "slideshow": { 65 | "slide_type": "-" 66 | } 67 | }, 68 | "outputs": [ 69 | { 70 | "data": { 71 | "image/png": "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\n", 72 | "text/plain": [ 73 | "" 74 | ] 75 | }, 76 | "metadata": {}, 77 | "output_type": "display_data" 78 | } 79 | ], 80 | "source": [ 81 | "samples = fit.extract(permuted=True)\n", 82 | "plt.hist(samples['theta'], 50);" 83 | ] 84 | } 85 | ], 86 | "metadata": { 87 | "kernelspec": { 88 | "display_name": "Python 3", 89 | "name": "python3" 90 | }, 91 | "language_info": { 92 | "codemirror_mode": { 93 | "name": "ipython", 94 | "version": 3 95 | }, 96 | "file_extension": ".py", 97 | "mimetype": "text/x-python", 98 | "name": "python", 99 | "nbconvert_exporter": "python", 100 | "pygments_lexer": "ipython3", 101 | "version": "3.6.2" 102 | }, 103 | "name": "PyStan_test_installation.ipynb" 104 | }, 105 | "nbformat": 4, 106 | "nbformat_minor": 2 107 | } 108 | -------------------------------------------------------------------------------- /demos_pystan/bern.stan: -------------------------------------------------------------------------------- 1 | // Bernoulli model 2 | data { 3 | int N; 4 | int y[N]; 5 | } 6 | parameters { 7 | real theta; 8 | } 9 | model { 10 | theta ~ beta(1,1); 11 | y ~ bernoulli(theta); 12 | } 13 | -------------------------------------------------------------------------------- /demos_pystan/binom.stan: -------------------------------------------------------------------------------- 1 | // Binomial model with beta(1,1,) prior 2 | data { 3 | int N; 4 | int y; 5 | } 6 | parameters { 7 | real theta; 8 | } 9 | model { 10 | theta ~ beta(1,1); 11 | y ~ binomial(N,theta); 12 | } 13 | -------------------------------------------------------------------------------- /demos_pystan/binom2.stan: -------------------------------------------------------------------------------- 1 | // Comparison of two groups with Binomial 2 | data { 3 | int N1; 4 | int y1; 5 | int N2; 6 | int y2; 7 | } 8 | parameters { 9 | real theta1; 10 | real theta2; 11 | } 12 | model { 13 | theta1 ~ beta(1,1); 14 | theta2 ~ beta(1,1); 15 | y1 ~ binomial(N1,theta1); 16 | y2 ~ binomial(N2,theta2); 17 | } 18 | generated quantities { 19 | real oddsratio; 20 | oddsratio = (theta2/(1-theta2))/(theta1/(1-theta1)); 21 | } 22 | -------------------------------------------------------------------------------- /demos_pystan/binomb.stan: -------------------------------------------------------------------------------- 1 | // Binomial model with a roughly uniform prior for 2 | // the probability of success (theta) 3 | data { 4 | int N; 5 | int y; 6 | } 7 | parameters { 8 | real alpha; 9 | } 10 | transformed parameters { 11 | real theta; 12 | theta = inv_logit(alpha); 13 | } 14 | model { 15 | // roughly auniform prior for the number of successes 16 | alpha ~ normal(0,1.5); 17 | y ~ binomial_logit(N,alpha); 18 | } 19 | -------------------------------------------------------------------------------- /demos_pystan/grp_aov.stan: -------------------------------------------------------------------------------- 1 | // Comparison of k groups with common variance (ANOVA) 2 | data { 3 | int N; // number of data points 4 | int K; // number of groups 5 | int x[N]; // group indicator 6 | vector[N] y; // 7 | } 8 | parameters { 9 | vector[K] mu; // group means 10 | real sigma; // common std 11 | } 12 | model { 13 | y ~ normal(mu[x], sigma); 14 | } 15 | -------------------------------------------------------------------------------- /demos_pystan/grp_prior_mean.stan: -------------------------------------------------------------------------------- 1 | // Comparison of k groups with common variance and 2 | // hierarchical prior for the mean 3 | data { 4 | int N; // number of data points 5 | int K; // number of groups 6 | int x[N]; // group indicator 7 | vector[N] y; // 8 | } 9 | parameters { 10 | real mu0; // prior mean 11 | real sigma0; // prior std 12 | vector[K] mu; // group means 13 | real sigma; // common std 14 | } 15 | model { 16 | mu0 ~ normal(10,10); // weakly informative prior 17 | sigma0 ~ cauchy(0,4); // weakly informative prior 18 | mu ~ normal(mu0, sigma0); // population prior with unknown parameters 19 | sigma ~ cauchy(0,4); // weakly informative prior 20 | y ~ normal(mu[x], sigma); 21 | } 22 | -------------------------------------------------------------------------------- /demos_pystan/grp_prior_mean_var.stan: -------------------------------------------------------------------------------- 1 | // Comparison of k groups with unequal variance and 2 | // hierarchical priors for the mean and the variance 3 | data { 4 | int N; // number of data points 5 | int K; // number of groups 6 | int x[N]; // group indicator 7 | vector[N] y; // 8 | } 9 | parameters { 10 | real mu0; // prior mean 11 | real musigma0; // prior std 12 | vector[K] mu; // group means 13 | real lsigma0; // prior mean 14 | real lsigma0s; // prior std 15 | vector[K] sigma; // group stds 16 | } 17 | model { 18 | mu0 ~ normal(10, 10); // weakly informative prior 19 | musigma0 ~ cauchy(0,10); // weakly informative prior 20 | mu ~ normal(mu0, musigma0); // population prior with unknown parameters 21 | lsigma0 ~ normal(0,1); // weakly informative prior 22 | lsigma0s ~ normal(0,1); // weakly informative prior 23 | sigma ~ cauchy(lsigma0, lsigma0s); // population prior with unknown parameters 24 | y ~ normal(mu[x], sigma[x]); 25 | } 26 | -------------------------------------------------------------------------------- /demos_pystan/lin.stan: -------------------------------------------------------------------------------- 1 | // Gaussian linear model with adjustable priors 2 | data { 3 | int N; // number of data points 4 | vector[N] x; // 5 | vector[N] y; // 6 | real xpred; // input location for prediction 7 | real pmualpha; // prior mean for alpha 8 | real psalpha; // prior std for alpha 9 | real pmubeta; // prior mean for beta 10 | real psbeta; // prior std for beta 11 | } 12 | parameters { 13 | real alpha; 14 | real beta; 15 | real sigma; 16 | } 17 | transformed parameters { 18 | vector[N] mu; 19 | mu = alpha + beta*x; 20 | } 21 | model { 22 | alpha ~ normal(pmualpha, psalpha); 23 | beta ~ normal(pmubeta, psbeta); 24 | y ~ normal(mu, sigma); 25 | } 26 | generated quantities { 27 | real ypred; 28 | vector[N] log_lik; 29 | ypred = normal_rng(alpha + beta*xpred, sigma); 30 | for (i in 1:N) 31 | log_lik[i] = normal_lpdf(y[i] | mu[i], sigma); 32 | } 33 | -------------------------------------------------------------------------------- /demos_pystan/lin_std.stan: -------------------------------------------------------------------------------- 1 | // Gaussian linear model with standardized data 2 | data { 3 | int N; // number of data points 4 | vector[N] x; // 5 | vector[N] y; // 6 | real xpred; // input location for prediction 7 | } 8 | transformed data { 9 | vector[N] x_std; 10 | vector[N] y_std; 11 | real xpred_std; 12 | x_std = (x - mean(x)) / sd(x); 13 | y_std = (y - mean(y)) / sd(y); 14 | xpred_std = (xpred - mean(x)) / sd(x); 15 | } 16 | parameters { 17 | real alpha; 18 | real beta; 19 | real sigma_std; 20 | } 21 | transformed parameters { 22 | vector[N] mu_std; 23 | mu_std = alpha + beta*x_std; 24 | } 25 | model { 26 | alpha ~ normal(0, 1); 27 | beta ~ normal(0, 1); 28 | y_std ~ normal(mu_std, sigma_std); 29 | } 30 | generated quantities { 31 | vector[N] mu; 32 | real sigma; 33 | real ypred; 34 | vector[N] log_lik; 35 | mu = mu_std*sd(y) + mean(y); 36 | sigma = sigma_std*sd(y); 37 | ypred = normal_rng((alpha + beta*xpred_std)*sd(y)+mean(y), sigma*sd(y)); 38 | for (i in 1:N) 39 | log_lik[i] = normal_lpdf(y[i] | mu[i], sigma); 40 | } 41 | -------------------------------------------------------------------------------- /demos_pystan/lin_t.stan: -------------------------------------------------------------------------------- 1 | // Linear student-t model 2 | data { 3 | int N; // number of data points 4 | vector[N] x; // 5 | vector[N] y; // 6 | real xpred; // input location for prediction 7 | } 8 | parameters { 9 | real alpha; 10 | real beta; 11 | real sigma; 12 | real nu; 13 | } 14 | transformed parameters { 15 | vector[N] mu; 16 | mu = alpha + beta*x; 17 | } 18 | model { 19 | nu ~ gamma(2, 0.1); // Juarez and Steel(2010) 20 | y ~ student_t(nu, mu, sigma); 21 | } 22 | generated quantities { 23 | real ypred; 24 | vector[N] log_lik; 25 | ypred = normal_rng(alpha + beta*xpred, sigma); 26 | for (i in 1:N) 27 | log_lik[i] = student_t_lpdf(y[i] | nu, mu[i], sigma); 28 | } 29 | -------------------------------------------------------------------------------- /demos_pystan/logistic_hs.stan: -------------------------------------------------------------------------------- 1 | /** 2 | * Logistic regression HS-prior 3 | * 4 | * Priors: 5 | * weights - hierarchical shrinkage 6 | * intercept - student t 7 | */ 8 | 9 | data { 10 | int n; // number of data points 11 | int d; // explanatory variable dimension 12 | matrix[n, d] X; // explanatory variable 13 | int y[n]; // response variable 14 | int p_alpha_df; // prior alpha degrees of freedom 15 | real p_alpha_loc; // prior alpha location 16 | real p_alpha_scale; // prior scale alpha 17 | int p_beta_df; // prior beta degrees of freedom 18 | int p_beta_global_df; // prior beta global degrees of freedom 19 | real p_beta_global_scale; // prior beta global scale 20 | } 21 | 22 | parameters { 23 | 24 | // intercept 25 | real alpha; 26 | 27 | // auxiliary variables for the variance parameters 28 | vector[d] z; 29 | vector[d] lambda_r1; 30 | vector[d] lambda_r2; 31 | real tau_r1; 32 | real tau_r2; 33 | } 34 | 35 | transformed parameters { 36 | 37 | vector[d] lambda; // local variance parameter 38 | real tau; // global variance parameter 39 | vector[d] beta; // explanatory variable weights 40 | vector[n] eta; // linear predictor 41 | 42 | lambda = lambda_r1 .* sqrt(lambda_r2); 43 | tau = tau_r1 * sqrt(tau_r2); 44 | beta = z .* (lambda*tau); 45 | eta = alpha + X * beta; 46 | } 47 | 48 | model { 49 | 50 | // student t prior for intercept 51 | alpha ~ student_t(p_alpha_df, p_alpha_loc, p_alpha_scale); 52 | 53 | z ~ normal(0.0, 1.0); 54 | 55 | // half t priors for lambdas 56 | lambda_r1 ~ normal(0.0, 1.0); 57 | lambda_r2 ~ inv_gamma(0.5*p_beta_df, 0.5*p_beta_df); 58 | 59 | // half t priors for tau 60 | tau_r1 ~ normal(0.0, p_beta_global_scale); 61 | tau_r2 ~ inv_gamma(0.5*p_beta_global_df, 0.5*p_beta_global_df); 62 | 63 | // observation model 64 | y ~ bernoulli_logit(eta); 65 | } 66 | 67 | generated quantities { 68 | vector[n] log_lik; 69 | for (i in 1:n) 70 | log_lik[i] = bernoulli_logit_lpmf(y[i] | eta[i]); 71 | } 72 | -------------------------------------------------------------------------------- /demos_pystan/logistic_t.stan: -------------------------------------------------------------------------------- 1 | /** 2 | * Logistic regression t-prior 3 | * 4 | * Priors: 5 | * weights - student t 6 | * intercept - student t 7 | */ 8 | data { 9 | int n; // number of data points 10 | int d; // explanatory variable dimension 11 | matrix[n, d] X; // explanatory variable 12 | int y[n]; // response variable 13 | int p_alpha_df; // prior degrees of freedom for alpha 14 | real p_alpha_loc; // prior location for alpha 15 | real p_alpha_scale; // prior scale for alpha 16 | int p_beta_df; // prior degrees of freedom for beta 17 | real p_beta_loc; // prior location for beta 18 | real p_beta_scale; // prior scale for beta 19 | } 20 | parameters { 21 | real alpha; // intercept 22 | vector[d] beta; // explanatory variable weights 23 | } 24 | transformed parameters { 25 | // linear predictor 26 | vector[n] eta; 27 | eta = alpha + X * beta; 28 | } 29 | model { 30 | alpha ~ student_t(p_alpha_df, p_alpha_loc, p_alpha_scale); 31 | beta ~ student_t(p_beta_df, p_beta_loc, p_beta_scale); 32 | y ~ bernoulli_logit(eta); 33 | } 34 | generated quantities { 35 | vector[n] log_lik; 36 | for (i in 1:n) 37 | log_lik[i] = bernoulli_logit_lpmf(y[i] | eta[i]); 38 | } 39 | -------------------------------------------------------------------------------- /functions/bioassaylp.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | 3 | 4 | def bioassaylp(a,b,x,y,n): 5 | ''' 6 | unnormalized log posterior density for bioassay (assuming uniform prior) 7 | ''' 8 | 9 | # these help using chain rule in derivation 10 | t = a + b*x 11 | et = np.exp(t) 12 | z = et/(1.+et) 13 | 14 | # negative log posterior (error function to be minimized) 15 | lp = np.sum(y*np.log(z)+ (n-y)*np.log(1.-z)) 16 | return(lp) 17 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | arviz 2 | matplotlib 3 | numpy 4 | jupyter 5 | ipython 6 | pandas 7 | pystan 8 | scipy 9 | seaborn 10 | -------------------------------------------------------------------------------- /utilities_and_data/demo11_2.npz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avehtari/BDA_py_demos/b3d63ea1f89df470a5cb9f34080ff1e49dbfc6b7/utilities_and_data/demo11_2.npz -------------------------------------------------------------------------------- /utilities_and_data/demo5_2.npz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avehtari/BDA_py_demos/b3d63ea1f89df470a5cb9f34080ff1e49dbfc6b7/utilities_and_data/demo5_2.npz -------------------------------------------------------------------------------- /utilities_and_data/diabetes.csv: -------------------------------------------------------------------------------- 1 | Pregnancies,Glucose,BloodPressure,SkinThickness,Insulin,BMI,DiabetesPedigreeFunction,Age,Outcome 2 | 6,148,72,35,0,33.6,0.627,50,1 3 | 1,85,66,29,0,26.6,0.351,31,0 4 | 8,183,64,0,0,23.3,0.672,32,1 5 | 1,89,66,23,94,28.1,0.167,21,0 6 | 0,137,40,35,168,43.1,2.288,33,1 7 | 5,116,74,0,0,25.6,0.201,30,0 8 | 3,78,50,32,88,31,0.248,26,1 9 | 10,115,0,0,0,35.3,0.134,29,0 10 | 2,197,70,45,543,30.5,0.158,53,1 11 | 8,125,96,0,0,0,0.232,54,1 12 | 4,110,92,0,0,37.6,0.191,30,0 13 | 10,168,74,0,0,38,0.537,34,1 14 | 10,139,80,0,0,27.1,1.441,57,0 15 | 1,189,60,23,846,30.1,0.398,59,1 16 | 5,166,72,19,175,25.8,0.587,51,1 17 | 7,100,0,0,0,30,0.484,32,1 18 | 0,118,84,47,230,45.8,0.551,31,1 19 | 7,107,74,0,0,29.6,0.254,31,1 20 | 1,103,30,38,83,43.3,0.183,33,0 21 | 1,115,70,30,96,34.6,0.529,32,1 22 | 3,126,88,41,235,39.3,0.704,27,0 23 | 8,99,84,0,0,35.4,0.388,50,0 24 | 7,196,90,0,0,39.8,0.451,41,1 25 | 9,119,80,35,0,29,0.263,29,1 26 | 11,143,94,33,146,36.6,0.254,51,1 27 | 10,125,70,26,115,31.1,0.205,41,1 28 | 7,147,76,0,0,39.4,0.257,43,1 29 | 1,97,66,15,140,23.2,0.487,22,0 30 | 13,145,82,19,110,22.2,0.245,57,0 31 | 5,117,92,0,0,34.1,0.337,38,0 32 | 5,109,75,26,0,36,0.546,60,0 33 | 3,158,76,36,245,31.6,0.851,28,1 34 | 3,88,58,11,54,24.8,0.267,22,0 35 | 6,92,92,0,0,19.9,0.188,28,0 36 | 10,122,78,31,0,27.6,0.512,45,0 37 | 4,103,60,33,192,24,0.966,33,0 38 | 11,138,76,0,0,33.2,0.42,35,0 39 | 9,102,76,37,0,32.9,0.665,46,1 40 | 2,90,68,42,0,38.2,0.503,27,1 41 | 4,111,72,47,207,37.1,1.39,56,1 42 | 3,180,64,25,70,34,0.271,26,0 43 | 7,133,84,0,0,40.2,0.696,37,0 44 | 7,106,92,18,0,22.7,0.235,48,0 45 | 9,171,110,24,240,45.4,0.721,54,1 46 | 7,159,64,0,0,27.4,0.294,40,0 47 | 0,180,66,39,0,42,1.893,25,1 48 | 1,146,56,0,0,29.7,0.564,29,0 49 | 2,71,70,27,0,28,0.586,22,0 50 | 7,103,66,32,0,39.1,0.344,31,1 51 | 7,105,0,0,0,0,0.305,24,0 52 | 1,103,80,11,82,19.4,0.491,22,0 53 | 1,101,50,15,36,24.2,0.526,26,0 54 | 5,88,66,21,23,24.4,0.342,30,0 55 | 8,176,90,34,300,33.7,0.467,58,1 56 | 7,150,66,42,342,34.7,0.718,42,0 57 | 1,73,50,10,0,23,0.248,21,0 58 | 7,187,68,39,304,37.7,0.254,41,1 59 | 0,100,88,60,110,46.8,0.962,31,0 60 | 0,146,82,0,0,40.5,1.781,44,0 61 | 0,105,64,41,142,41.5,0.173,22,0 62 | 2,84,0,0,0,0,0.304,21,0 63 | 8,133,72,0,0,32.9,0.27,39,1 64 | 5,44,62,0,0,25,0.587,36,0 65 | 2,141,58,34,128,25.4,0.699,24,0 66 | 7,114,66,0,0,32.8,0.258,42,1 67 | 5,99,74,27,0,29,0.203,32,0 68 | 0,109,88,30,0,32.5,0.855,38,1 69 | 2,109,92,0,0,42.7,0.845,54,0 70 | 1,95,66,13,38,19.6,0.334,25,0 71 | 4,146,85,27,100,28.9,0.189,27,0 72 | 2,100,66,20,90,32.9,0.867,28,1 73 | 5,139,64,35,140,28.6,0.411,26,0 74 | 13,126,90,0,0,43.4,0.583,42,1 75 | 4,129,86,20,270,35.1,0.231,23,0 76 | 1,79,75,30,0,32,0.396,22,0 77 | 1,0,48,20,0,24.7,0.14,22,0 78 | 7,62,78,0,0,32.6,0.391,41,0 79 | 5,95,72,33,0,37.7,0.37,27,0 80 | 0,131,0,0,0,43.2,0.27,26,1 81 | 2,112,66,22,0,25,0.307,24,0 82 | 3,113,44,13,0,22.4,0.14,22,0 83 | 2,74,0,0,0,0,0.102,22,0 84 | 7,83,78,26,71,29.3,0.767,36,0 85 | 0,101,65,28,0,24.6,0.237,22,0 86 | 5,137,108,0,0,48.8,0.227,37,1 87 | 2,110,74,29,125,32.4,0.698,27,0 88 | 13,106,72,54,0,36.6,0.178,45,0 89 | 2,100,68,25,71,38.5,0.324,26,0 90 | 15,136,70,32,110,37.1,0.153,43,1 91 | 1,107,68,19,0,26.5,0.165,24,0 92 | 1,80,55,0,0,19.1,0.258,21,0 93 | 4,123,80,15,176,32,0.443,34,0 94 | 7,81,78,40,48,46.7,0.261,42,0 95 | 4,134,72,0,0,23.8,0.277,60,1 96 | 2,142,82,18,64,24.7,0.761,21,0 97 | 6,144,72,27,228,33.9,0.255,40,0 98 | 2,92,62,28,0,31.6,0.13,24,0 99 | 1,71,48,18,76,20.4,0.323,22,0 100 | 6,93,50,30,64,28.7,0.356,23,0 101 | 1,122,90,51,220,49.7,0.325,31,1 102 | 1,163,72,0,0,39,1.222,33,1 103 | 1,151,60,0,0,26.1,0.179,22,0 104 | 0,125,96,0,0,22.5,0.262,21,0 105 | 1,81,72,18,40,26.6,0.283,24,0 106 | 2,85,65,0,0,39.6,0.93,27,0 107 | 1,126,56,29,152,28.7,0.801,21,0 108 | 1,96,122,0,0,22.4,0.207,27,0 109 | 4,144,58,28,140,29.5,0.287,37,0 110 | 3,83,58,31,18,34.3,0.336,25,0 111 | 0,95,85,25,36,37.4,0.247,24,1 112 | 3,171,72,33,135,33.3,0.199,24,1 113 | 8,155,62,26,495,34,0.543,46,1 114 | 1,89,76,34,37,31.2,0.192,23,0 115 | 4,76,62,0,0,34,0.391,25,0 116 | 7,160,54,32,175,30.5,0.588,39,1 117 | 4,146,92,0,0,31.2,0.539,61,1 118 | 5,124,74,0,0,34,0.22,38,1 119 | 5,78,48,0,0,33.7,0.654,25,0 120 | 4,97,60,23,0,28.2,0.443,22,0 121 | 4,99,76,15,51,23.2,0.223,21,0 122 | 0,162,76,56,100,53.2,0.759,25,1 123 | 6,111,64,39,0,34.2,0.26,24,0 124 | 2,107,74,30,100,33.6,0.404,23,0 125 | 5,132,80,0,0,26.8,0.186,69,0 126 | 0,113,76,0,0,33.3,0.278,23,1 127 | 1,88,30,42,99,55,0.496,26,1 128 | 3,120,70,30,135,42.9,0.452,30,0 129 | 1,118,58,36,94,33.3,0.261,23,0 130 | 1,117,88,24,145,34.5,0.403,40,1 131 | 0,105,84,0,0,27.9,0.741,62,1 132 | 4,173,70,14,168,29.7,0.361,33,1 133 | 9,122,56,0,0,33.3,1.114,33,1 134 | 3,170,64,37,225,34.5,0.356,30,1 135 | 8,84,74,31,0,38.3,0.457,39,0 136 | 2,96,68,13,49,21.1,0.647,26,0 137 | 2,125,60,20,140,33.8,0.088,31,0 138 | 0,100,70,26,50,30.8,0.597,21,0 139 | 0,93,60,25,92,28.7,0.532,22,0 140 | 0,129,80,0,0,31.2,0.703,29,0 141 | 5,105,72,29,325,36.9,0.159,28,0 142 | 3,128,78,0,0,21.1,0.268,55,0 143 | 5,106,82,30,0,39.5,0.286,38,0 144 | 2,108,52,26,63,32.5,0.318,22,0 145 | 10,108,66,0,0,32.4,0.272,42,1 146 | 4,154,62,31,284,32.8,0.237,23,0 147 | 0,102,75,23,0,0,0.572,21,0 148 | 9,57,80,37,0,32.8,0.096,41,0 149 | 2,106,64,35,119,30.5,1.4,34,0 150 | 5,147,78,0,0,33.7,0.218,65,0 151 | 2,90,70,17,0,27.3,0.085,22,0 152 | 1,136,74,50,204,37.4,0.399,24,0 153 | 4,114,65,0,0,21.9,0.432,37,0 154 | 9,156,86,28,155,34.3,1.189,42,1 155 | 1,153,82,42,485,40.6,0.687,23,0 156 | 8,188,78,0,0,47.9,0.137,43,1 157 | 7,152,88,44,0,50,0.337,36,1 158 | 2,99,52,15,94,24.6,0.637,21,0 159 | 1,109,56,21,135,25.2,0.833,23,0 160 | 2,88,74,19,53,29,0.229,22,0 161 | 17,163,72,41,114,40.9,0.817,47,1 162 | 4,151,90,38,0,29.7,0.294,36,0 163 | 7,102,74,40,105,37.2,0.204,45,0 164 | 0,114,80,34,285,44.2,0.167,27,0 165 | 2,100,64,23,0,29.7,0.368,21,0 166 | 0,131,88,0,0,31.6,0.743,32,1 167 | 6,104,74,18,156,29.9,0.722,41,1 168 | 3,148,66,25,0,32.5,0.256,22,0 169 | 4,120,68,0,0,29.6,0.709,34,0 170 | 4,110,66,0,0,31.9,0.471,29,0 171 | 3,111,90,12,78,28.4,0.495,29,0 172 | 6,102,82,0,0,30.8,0.18,36,1 173 | 6,134,70,23,130,35.4,0.542,29,1 174 | 2,87,0,23,0,28.9,0.773,25,0 175 | 1,79,60,42,48,43.5,0.678,23,0 176 | 2,75,64,24,55,29.7,0.37,33,0 177 | 8,179,72,42,130,32.7,0.719,36,1 178 | 6,85,78,0,0,31.2,0.382,42,0 179 | 0,129,110,46,130,67.1,0.319,26,1 180 | 5,143,78,0,0,45,0.19,47,0 181 | 5,130,82,0,0,39.1,0.956,37,1 182 | 6,87,80,0,0,23.2,0.084,32,0 183 | 0,119,64,18,92,34.9,0.725,23,0 184 | 1,0,74,20,23,27.7,0.299,21,0 185 | 5,73,60,0,0,26.8,0.268,27,0 186 | 4,141,74,0,0,27.6,0.244,40,0 187 | 7,194,68,28,0,35.9,0.745,41,1 188 | 8,181,68,36,495,30.1,0.615,60,1 189 | 1,128,98,41,58,32,1.321,33,1 190 | 8,109,76,39,114,27.9,0.64,31,1 191 | 5,139,80,35,160,31.6,0.361,25,1 192 | 3,111,62,0,0,22.6,0.142,21,0 193 | 9,123,70,44,94,33.1,0.374,40,0 194 | 7,159,66,0,0,30.4,0.383,36,1 195 | 11,135,0,0,0,52.3,0.578,40,1 196 | 8,85,55,20,0,24.4,0.136,42,0 197 | 5,158,84,41,210,39.4,0.395,29,1 198 | 1,105,58,0,0,24.3,0.187,21,0 199 | 3,107,62,13,48,22.9,0.678,23,1 200 | 4,109,64,44,99,34.8,0.905,26,1 201 | 4,148,60,27,318,30.9,0.15,29,1 202 | 0,113,80,16,0,31,0.874,21,0 203 | 1,138,82,0,0,40.1,0.236,28,0 204 | 0,108,68,20,0,27.3,0.787,32,0 205 | 2,99,70,16,44,20.4,0.235,27,0 206 | 6,103,72,32,190,37.7,0.324,55,0 207 | 5,111,72,28,0,23.9,0.407,27,0 208 | 8,196,76,29,280,37.5,0.605,57,1 209 | 5,162,104,0,0,37.7,0.151,52,1 210 | 1,96,64,27,87,33.2,0.289,21,0 211 | 7,184,84,33,0,35.5,0.355,41,1 212 | 2,81,60,22,0,27.7,0.29,25,0 213 | 0,147,85,54,0,42.8,0.375,24,0 214 | 7,179,95,31,0,34.2,0.164,60,0 215 | 0,140,65,26,130,42.6,0.431,24,1 216 | 9,112,82,32,175,34.2,0.26,36,1 217 | 12,151,70,40,271,41.8,0.742,38,1 218 | 5,109,62,41,129,35.8,0.514,25,1 219 | 6,125,68,30,120,30,0.464,32,0 220 | 5,85,74,22,0,29,1.224,32,1 221 | 5,112,66,0,0,37.8,0.261,41,1 222 | 0,177,60,29,478,34.6,1.072,21,1 223 | 2,158,90,0,0,31.6,0.805,66,1 224 | 7,119,0,0,0,25.2,0.209,37,0 225 | 7,142,60,33,190,28.8,0.687,61,0 226 | 1,100,66,15,56,23.6,0.666,26,0 227 | 1,87,78,27,32,34.6,0.101,22,0 228 | 0,101,76,0,0,35.7,0.198,26,0 229 | 3,162,52,38,0,37.2,0.652,24,1 230 | 4,197,70,39,744,36.7,2.329,31,0 231 | 0,117,80,31,53,45.2,0.089,24,0 232 | 4,142,86,0,0,44,0.645,22,1 233 | 6,134,80,37,370,46.2,0.238,46,1 234 | 1,79,80,25,37,25.4,0.583,22,0 235 | 4,122,68,0,0,35,0.394,29,0 236 | 3,74,68,28,45,29.7,0.293,23,0 237 | 4,171,72,0,0,43.6,0.479,26,1 238 | 7,181,84,21,192,35.9,0.586,51,1 239 | 0,179,90,27,0,44.1,0.686,23,1 240 | 9,164,84,21,0,30.8,0.831,32,1 241 | 0,104,76,0,0,18.4,0.582,27,0 242 | 1,91,64,24,0,29.2,0.192,21,0 243 | 4,91,70,32,88,33.1,0.446,22,0 244 | 3,139,54,0,0,25.6,0.402,22,1 245 | 6,119,50,22,176,27.1,1.318,33,1 246 | 2,146,76,35,194,38.2,0.329,29,0 247 | 9,184,85,15,0,30,1.213,49,1 248 | 10,122,68,0,0,31.2,0.258,41,0 249 | 0,165,90,33,680,52.3,0.427,23,0 250 | 9,124,70,33,402,35.4,0.282,34,0 251 | 1,111,86,19,0,30.1,0.143,23,0 252 | 9,106,52,0,0,31.2,0.38,42,0 253 | 2,129,84,0,0,28,0.284,27,0 254 | 2,90,80,14,55,24.4,0.249,24,0 255 | 0,86,68,32,0,35.8,0.238,25,0 256 | 12,92,62,7,258,27.6,0.926,44,1 257 | 1,113,64,35,0,33.6,0.543,21,1 258 | 3,111,56,39,0,30.1,0.557,30,0 259 | 2,114,68,22,0,28.7,0.092,25,0 260 | 1,193,50,16,375,25.9,0.655,24,0 261 | 11,155,76,28,150,33.3,1.353,51,1 262 | 3,191,68,15,130,30.9,0.299,34,0 263 | 3,141,0,0,0,30,0.761,27,1 264 | 4,95,70,32,0,32.1,0.612,24,0 265 | 3,142,80,15,0,32.4,0.2,63,0 266 | 4,123,62,0,0,32,0.226,35,1 267 | 5,96,74,18,67,33.6,0.997,43,0 268 | 0,138,0,0,0,36.3,0.933,25,1 269 | 2,128,64,42,0,40,1.101,24,0 270 | 0,102,52,0,0,25.1,0.078,21,0 271 | 2,146,0,0,0,27.5,0.24,28,1 272 | 10,101,86,37,0,45.6,1.136,38,1 273 | 2,108,62,32,56,25.2,0.128,21,0 274 | 3,122,78,0,0,23,0.254,40,0 275 | 1,71,78,50,45,33.2,0.422,21,0 276 | 13,106,70,0,0,34.2,0.251,52,0 277 | 2,100,70,52,57,40.5,0.677,25,0 278 | 7,106,60,24,0,26.5,0.296,29,1 279 | 0,104,64,23,116,27.8,0.454,23,0 280 | 5,114,74,0,0,24.9,0.744,57,0 281 | 2,108,62,10,278,25.3,0.881,22,0 282 | 0,146,70,0,0,37.9,0.334,28,1 283 | 10,129,76,28,122,35.9,0.28,39,0 284 | 7,133,88,15,155,32.4,0.262,37,0 285 | 7,161,86,0,0,30.4,0.165,47,1 286 | 2,108,80,0,0,27,0.259,52,1 287 | 7,136,74,26,135,26,0.647,51,0 288 | 5,155,84,44,545,38.7,0.619,34,0 289 | 1,119,86,39,220,45.6,0.808,29,1 290 | 4,96,56,17,49,20.8,0.34,26,0 291 | 5,108,72,43,75,36.1,0.263,33,0 292 | 0,78,88,29,40,36.9,0.434,21,0 293 | 0,107,62,30,74,36.6,0.757,25,1 294 | 2,128,78,37,182,43.3,1.224,31,1 295 | 1,128,48,45,194,40.5,0.613,24,1 296 | 0,161,50,0,0,21.9,0.254,65,0 297 | 6,151,62,31,120,35.5,0.692,28,0 298 | 2,146,70,38,360,28,0.337,29,1 299 | 0,126,84,29,215,30.7,0.52,24,0 300 | 14,100,78,25,184,36.6,0.412,46,1 301 | 8,112,72,0,0,23.6,0.84,58,0 302 | 0,167,0,0,0,32.3,0.839,30,1 303 | 2,144,58,33,135,31.6,0.422,25,1 304 | 5,77,82,41,42,35.8,0.156,35,0 305 | 5,115,98,0,0,52.9,0.209,28,1 306 | 3,150,76,0,0,21,0.207,37,0 307 | 2,120,76,37,105,39.7,0.215,29,0 308 | 10,161,68,23,132,25.5,0.326,47,1 309 | 0,137,68,14,148,24.8,0.143,21,0 310 | 0,128,68,19,180,30.5,1.391,25,1 311 | 2,124,68,28,205,32.9,0.875,30,1 312 | 6,80,66,30,0,26.2,0.313,41,0 313 | 0,106,70,37,148,39.4,0.605,22,0 314 | 2,155,74,17,96,26.6,0.433,27,1 315 | 3,113,50,10,85,29.5,0.626,25,0 316 | 7,109,80,31,0,35.9,1.127,43,1 317 | 2,112,68,22,94,34.1,0.315,26,0 318 | 3,99,80,11,64,19.3,0.284,30,0 319 | 3,182,74,0,0,30.5,0.345,29,1 320 | 3,115,66,39,140,38.1,0.15,28,0 321 | 6,194,78,0,0,23.5,0.129,59,1 322 | 4,129,60,12,231,27.5,0.527,31,0 323 | 3,112,74,30,0,31.6,0.197,25,1 324 | 0,124,70,20,0,27.4,0.254,36,1 325 | 13,152,90,33,29,26.8,0.731,43,1 326 | 2,112,75,32,0,35.7,0.148,21,0 327 | 1,157,72,21,168,25.6,0.123,24,0 328 | 1,122,64,32,156,35.1,0.692,30,1 329 | 10,179,70,0,0,35.1,0.2,37,0 330 | 2,102,86,36,120,45.5,0.127,23,1 331 | 6,105,70,32,68,30.8,0.122,37,0 332 | 8,118,72,19,0,23.1,1.476,46,0 333 | 2,87,58,16,52,32.7,0.166,25,0 334 | 1,180,0,0,0,43.3,0.282,41,1 335 | 12,106,80,0,0,23.6,0.137,44,0 336 | 1,95,60,18,58,23.9,0.26,22,0 337 | 0,165,76,43,255,47.9,0.259,26,0 338 | 0,117,0,0,0,33.8,0.932,44,0 339 | 5,115,76,0,0,31.2,0.343,44,1 340 | 9,152,78,34,171,34.2,0.893,33,1 341 | 7,178,84,0,0,39.9,0.331,41,1 342 | 1,130,70,13,105,25.9,0.472,22,0 343 | 1,95,74,21,73,25.9,0.673,36,0 344 | 1,0,68,35,0,32,0.389,22,0 345 | 5,122,86,0,0,34.7,0.29,33,0 346 | 8,95,72,0,0,36.8,0.485,57,0 347 | 8,126,88,36,108,38.5,0.349,49,0 348 | 1,139,46,19,83,28.7,0.654,22,0 349 | 3,116,0,0,0,23.5,0.187,23,0 350 | 3,99,62,19,74,21.8,0.279,26,0 351 | 5,0,80,32,0,41,0.346,37,1 352 | 4,92,80,0,0,42.2,0.237,29,0 353 | 4,137,84,0,0,31.2,0.252,30,0 354 | 3,61,82,28,0,34.4,0.243,46,0 355 | 1,90,62,12,43,27.2,0.58,24,0 356 | 3,90,78,0,0,42.7,0.559,21,0 357 | 9,165,88,0,0,30.4,0.302,49,1 358 | 1,125,50,40,167,33.3,0.962,28,1 359 | 13,129,0,30,0,39.9,0.569,44,1 360 | 12,88,74,40,54,35.3,0.378,48,0 361 | 1,196,76,36,249,36.5,0.875,29,1 362 | 5,189,64,33,325,31.2,0.583,29,1 363 | 5,158,70,0,0,29.8,0.207,63,0 364 | 5,103,108,37,0,39.2,0.305,65,0 365 | 4,146,78,0,0,38.5,0.52,67,1 366 | 4,147,74,25,293,34.9,0.385,30,0 367 | 5,99,54,28,83,34,0.499,30,0 368 | 6,124,72,0,0,27.6,0.368,29,1 369 | 0,101,64,17,0,21,0.252,21,0 370 | 3,81,86,16,66,27.5,0.306,22,0 371 | 1,133,102,28,140,32.8,0.234,45,1 372 | 3,173,82,48,465,38.4,2.137,25,1 373 | 0,118,64,23,89,0,1.731,21,0 374 | 0,84,64,22,66,35.8,0.545,21,0 375 | 2,105,58,40,94,34.9,0.225,25,0 376 | 2,122,52,43,158,36.2,0.816,28,0 377 | 12,140,82,43,325,39.2,0.528,58,1 378 | 0,98,82,15,84,25.2,0.299,22,0 379 | 1,87,60,37,75,37.2,0.509,22,0 380 | 4,156,75,0,0,48.3,0.238,32,1 381 | 0,93,100,39,72,43.4,1.021,35,0 382 | 1,107,72,30,82,30.8,0.821,24,0 383 | 0,105,68,22,0,20,0.236,22,0 384 | 1,109,60,8,182,25.4,0.947,21,0 385 | 1,90,62,18,59,25.1,1.268,25,0 386 | 1,125,70,24,110,24.3,0.221,25,0 387 | 1,119,54,13,50,22.3,0.205,24,0 388 | 5,116,74,29,0,32.3,0.66,35,1 389 | 8,105,100,36,0,43.3,0.239,45,1 390 | 5,144,82,26,285,32,0.452,58,1 391 | 3,100,68,23,81,31.6,0.949,28,0 392 | 1,100,66,29,196,32,0.444,42,0 393 | 5,166,76,0,0,45.7,0.34,27,1 394 | 1,131,64,14,415,23.7,0.389,21,0 395 | 4,116,72,12,87,22.1,0.463,37,0 396 | 4,158,78,0,0,32.9,0.803,31,1 397 | 2,127,58,24,275,27.7,1.6,25,0 398 | 3,96,56,34,115,24.7,0.944,39,0 399 | 0,131,66,40,0,34.3,0.196,22,1 400 | 3,82,70,0,0,21.1,0.389,25,0 401 | 3,193,70,31,0,34.9,0.241,25,1 402 | 4,95,64,0,0,32,0.161,31,1 403 | 6,137,61,0,0,24.2,0.151,55,0 404 | 5,136,84,41,88,35,0.286,35,1 405 | 9,72,78,25,0,31.6,0.28,38,0 406 | 5,168,64,0,0,32.9,0.135,41,1 407 | 2,123,48,32,165,42.1,0.52,26,0 408 | 4,115,72,0,0,28.9,0.376,46,1 409 | 0,101,62,0,0,21.9,0.336,25,0 410 | 8,197,74,0,0,25.9,1.191,39,1 411 | 1,172,68,49,579,42.4,0.702,28,1 412 | 6,102,90,39,0,35.7,0.674,28,0 413 | 1,112,72,30,176,34.4,0.528,25,0 414 | 1,143,84,23,310,42.4,1.076,22,0 415 | 1,143,74,22,61,26.2,0.256,21,0 416 | 0,138,60,35,167,34.6,0.534,21,1 417 | 3,173,84,33,474,35.7,0.258,22,1 418 | 1,97,68,21,0,27.2,1.095,22,0 419 | 4,144,82,32,0,38.5,0.554,37,1 420 | 1,83,68,0,0,18.2,0.624,27,0 421 | 3,129,64,29,115,26.4,0.219,28,1 422 | 1,119,88,41,170,45.3,0.507,26,0 423 | 2,94,68,18,76,26,0.561,21,0 424 | 0,102,64,46,78,40.6,0.496,21,0 425 | 2,115,64,22,0,30.8,0.421,21,0 426 | 8,151,78,32,210,42.9,0.516,36,1 427 | 4,184,78,39,277,37,0.264,31,1 428 | 0,94,0,0,0,0,0.256,25,0 429 | 1,181,64,30,180,34.1,0.328,38,1 430 | 0,135,94,46,145,40.6,0.284,26,0 431 | 1,95,82,25,180,35,0.233,43,1 432 | 2,99,0,0,0,22.2,0.108,23,0 433 | 3,89,74,16,85,30.4,0.551,38,0 434 | 1,80,74,11,60,30,0.527,22,0 435 | 2,139,75,0,0,25.6,0.167,29,0 436 | 1,90,68,8,0,24.5,1.138,36,0 437 | 0,141,0,0,0,42.4,0.205,29,1 438 | 12,140,85,33,0,37.4,0.244,41,0 439 | 5,147,75,0,0,29.9,0.434,28,0 440 | 1,97,70,15,0,18.2,0.147,21,0 441 | 6,107,88,0,0,36.8,0.727,31,0 442 | 0,189,104,25,0,34.3,0.435,41,1 443 | 2,83,66,23,50,32.2,0.497,22,0 444 | 4,117,64,27,120,33.2,0.23,24,0 445 | 8,108,70,0,0,30.5,0.955,33,1 446 | 4,117,62,12,0,29.7,0.38,30,1 447 | 0,180,78,63,14,59.4,2.42,25,1 448 | 1,100,72,12,70,25.3,0.658,28,0 449 | 0,95,80,45,92,36.5,0.33,26,0 450 | 0,104,64,37,64,33.6,0.51,22,1 451 | 0,120,74,18,63,30.5,0.285,26,0 452 | 1,82,64,13,95,21.2,0.415,23,0 453 | 2,134,70,0,0,28.9,0.542,23,1 454 | 0,91,68,32,210,39.9,0.381,25,0 455 | 2,119,0,0,0,19.6,0.832,72,0 456 | 2,100,54,28,105,37.8,0.498,24,0 457 | 14,175,62,30,0,33.6,0.212,38,1 458 | 1,135,54,0,0,26.7,0.687,62,0 459 | 5,86,68,28,71,30.2,0.364,24,0 460 | 10,148,84,48,237,37.6,1.001,51,1 461 | 9,134,74,33,60,25.9,0.46,81,0 462 | 9,120,72,22,56,20.8,0.733,48,0 463 | 1,71,62,0,0,21.8,0.416,26,0 464 | 8,74,70,40,49,35.3,0.705,39,0 465 | 5,88,78,30,0,27.6,0.258,37,0 466 | 10,115,98,0,0,24,1.022,34,0 467 | 0,124,56,13,105,21.8,0.452,21,0 468 | 0,74,52,10,36,27.8,0.269,22,0 469 | 0,97,64,36,100,36.8,0.6,25,0 470 | 8,120,0,0,0,30,0.183,38,1 471 | 6,154,78,41,140,46.1,0.571,27,0 472 | 1,144,82,40,0,41.3,0.607,28,0 473 | 0,137,70,38,0,33.2,0.17,22,0 474 | 0,119,66,27,0,38.8,0.259,22,0 475 | 7,136,90,0,0,29.9,0.21,50,0 476 | 4,114,64,0,0,28.9,0.126,24,0 477 | 0,137,84,27,0,27.3,0.231,59,0 478 | 2,105,80,45,191,33.7,0.711,29,1 479 | 7,114,76,17,110,23.8,0.466,31,0 480 | 8,126,74,38,75,25.9,0.162,39,0 481 | 4,132,86,31,0,28,0.419,63,0 482 | 3,158,70,30,328,35.5,0.344,35,1 483 | 0,123,88,37,0,35.2,0.197,29,0 484 | 4,85,58,22,49,27.8,0.306,28,0 485 | 0,84,82,31,125,38.2,0.233,23,0 486 | 0,145,0,0,0,44.2,0.63,31,1 487 | 0,135,68,42,250,42.3,0.365,24,1 488 | 1,139,62,41,480,40.7,0.536,21,0 489 | 0,173,78,32,265,46.5,1.159,58,0 490 | 4,99,72,17,0,25.6,0.294,28,0 491 | 8,194,80,0,0,26.1,0.551,67,0 492 | 2,83,65,28,66,36.8,0.629,24,0 493 | 2,89,90,30,0,33.5,0.292,42,0 494 | 4,99,68,38,0,32.8,0.145,33,0 495 | 4,125,70,18,122,28.9,1.144,45,1 496 | 3,80,0,0,0,0,0.174,22,0 497 | 6,166,74,0,0,26.6,0.304,66,0 498 | 5,110,68,0,0,26,0.292,30,0 499 | 2,81,72,15,76,30.1,0.547,25,0 500 | 7,195,70,33,145,25.1,0.163,55,1 501 | 6,154,74,32,193,29.3,0.839,39,0 502 | 2,117,90,19,71,25.2,0.313,21,0 503 | 3,84,72,32,0,37.2,0.267,28,0 504 | 6,0,68,41,0,39,0.727,41,1 505 | 7,94,64,25,79,33.3,0.738,41,0 506 | 3,96,78,39,0,37.3,0.238,40,0 507 | 10,75,82,0,0,33.3,0.263,38,0 508 | 0,180,90,26,90,36.5,0.314,35,1 509 | 1,130,60,23,170,28.6,0.692,21,0 510 | 2,84,50,23,76,30.4,0.968,21,0 511 | 8,120,78,0,0,25,0.409,64,0 512 | 12,84,72,31,0,29.7,0.297,46,1 513 | 0,139,62,17,210,22.1,0.207,21,0 514 | 9,91,68,0,0,24.2,0.2,58,0 515 | 2,91,62,0,0,27.3,0.525,22,0 516 | 3,99,54,19,86,25.6,0.154,24,0 517 | 3,163,70,18,105,31.6,0.268,28,1 518 | 9,145,88,34,165,30.3,0.771,53,1 519 | 7,125,86,0,0,37.6,0.304,51,0 520 | 13,76,60,0,0,32.8,0.18,41,0 521 | 6,129,90,7,326,19.6,0.582,60,0 522 | 2,68,70,32,66,25,0.187,25,0 523 | 3,124,80,33,130,33.2,0.305,26,0 524 | 6,114,0,0,0,0,0.189,26,0 525 | 9,130,70,0,0,34.2,0.652,45,1 526 | 3,125,58,0,0,31.6,0.151,24,0 527 | 3,87,60,18,0,21.8,0.444,21,0 528 | 1,97,64,19,82,18.2,0.299,21,0 529 | 3,116,74,15,105,26.3,0.107,24,0 530 | 0,117,66,31,188,30.8,0.493,22,0 531 | 0,111,65,0,0,24.6,0.66,31,0 532 | 2,122,60,18,106,29.8,0.717,22,0 533 | 0,107,76,0,0,45.3,0.686,24,0 534 | 1,86,66,52,65,41.3,0.917,29,0 535 | 6,91,0,0,0,29.8,0.501,31,0 536 | 1,77,56,30,56,33.3,1.251,24,0 537 | 4,132,0,0,0,32.9,0.302,23,1 538 | 0,105,90,0,0,29.6,0.197,46,0 539 | 0,57,60,0,0,21.7,0.735,67,0 540 | 0,127,80,37,210,36.3,0.804,23,0 541 | 3,129,92,49,155,36.4,0.968,32,1 542 | 8,100,74,40,215,39.4,0.661,43,1 543 | 3,128,72,25,190,32.4,0.549,27,1 544 | 10,90,85,32,0,34.9,0.825,56,1 545 | 4,84,90,23,56,39.5,0.159,25,0 546 | 1,88,78,29,76,32,0.365,29,0 547 | 8,186,90,35,225,34.5,0.423,37,1 548 | 5,187,76,27,207,43.6,1.034,53,1 549 | 4,131,68,21,166,33.1,0.16,28,0 550 | 1,164,82,43,67,32.8,0.341,50,0 551 | 4,189,110,31,0,28.5,0.68,37,0 552 | 1,116,70,28,0,27.4,0.204,21,0 553 | 3,84,68,30,106,31.9,0.591,25,0 554 | 6,114,88,0,0,27.8,0.247,66,0 555 | 1,88,62,24,44,29.9,0.422,23,0 556 | 1,84,64,23,115,36.9,0.471,28,0 557 | 7,124,70,33,215,25.5,0.161,37,0 558 | 1,97,70,40,0,38.1,0.218,30,0 559 | 8,110,76,0,0,27.8,0.237,58,0 560 | 11,103,68,40,0,46.2,0.126,42,0 561 | 11,85,74,0,0,30.1,0.3,35,0 562 | 6,125,76,0,0,33.8,0.121,54,1 563 | 0,198,66,32,274,41.3,0.502,28,1 564 | 1,87,68,34,77,37.6,0.401,24,0 565 | 6,99,60,19,54,26.9,0.497,32,0 566 | 0,91,80,0,0,32.4,0.601,27,0 567 | 2,95,54,14,88,26.1,0.748,22,0 568 | 1,99,72,30,18,38.6,0.412,21,0 569 | 6,92,62,32,126,32,0.085,46,0 570 | 4,154,72,29,126,31.3,0.338,37,0 571 | 0,121,66,30,165,34.3,0.203,33,1 572 | 3,78,70,0,0,32.5,0.27,39,0 573 | 2,130,96,0,0,22.6,0.268,21,0 574 | 3,111,58,31,44,29.5,0.43,22,0 575 | 2,98,60,17,120,34.7,0.198,22,0 576 | 1,143,86,30,330,30.1,0.892,23,0 577 | 1,119,44,47,63,35.5,0.28,25,0 578 | 6,108,44,20,130,24,0.813,35,0 579 | 2,118,80,0,0,42.9,0.693,21,1 580 | 10,133,68,0,0,27,0.245,36,0 581 | 2,197,70,99,0,34.7,0.575,62,1 582 | 0,151,90,46,0,42.1,0.371,21,1 583 | 6,109,60,27,0,25,0.206,27,0 584 | 12,121,78,17,0,26.5,0.259,62,0 585 | 8,100,76,0,0,38.7,0.19,42,0 586 | 8,124,76,24,600,28.7,0.687,52,1 587 | 1,93,56,11,0,22.5,0.417,22,0 588 | 8,143,66,0,0,34.9,0.129,41,1 589 | 6,103,66,0,0,24.3,0.249,29,0 590 | 3,176,86,27,156,33.3,1.154,52,1 591 | 0,73,0,0,0,21.1,0.342,25,0 592 | 11,111,84,40,0,46.8,0.925,45,1 593 | 2,112,78,50,140,39.4,0.175,24,0 594 | 3,132,80,0,0,34.4,0.402,44,1 595 | 2,82,52,22,115,28.5,1.699,25,0 596 | 6,123,72,45,230,33.6,0.733,34,0 597 | 0,188,82,14,185,32,0.682,22,1 598 | 0,67,76,0,0,45.3,0.194,46,0 599 | 1,89,24,19,25,27.8,0.559,21,0 600 | 1,173,74,0,0,36.8,0.088,38,1 601 | 1,109,38,18,120,23.1,0.407,26,0 602 | 1,108,88,19,0,27.1,0.4,24,0 603 | 6,96,0,0,0,23.7,0.19,28,0 604 | 1,124,74,36,0,27.8,0.1,30,0 605 | 7,150,78,29,126,35.2,0.692,54,1 606 | 4,183,0,0,0,28.4,0.212,36,1 607 | 1,124,60,32,0,35.8,0.514,21,0 608 | 1,181,78,42,293,40,1.258,22,1 609 | 1,92,62,25,41,19.5,0.482,25,0 610 | 0,152,82,39,272,41.5,0.27,27,0 611 | 1,111,62,13,182,24,0.138,23,0 612 | 3,106,54,21,158,30.9,0.292,24,0 613 | 3,174,58,22,194,32.9,0.593,36,1 614 | 7,168,88,42,321,38.2,0.787,40,1 615 | 6,105,80,28,0,32.5,0.878,26,0 616 | 11,138,74,26,144,36.1,0.557,50,1 617 | 3,106,72,0,0,25.8,0.207,27,0 618 | 6,117,96,0,0,28.7,0.157,30,0 619 | 2,68,62,13,15,20.1,0.257,23,0 620 | 9,112,82,24,0,28.2,1.282,50,1 621 | 0,119,0,0,0,32.4,0.141,24,1 622 | 2,112,86,42,160,38.4,0.246,28,0 623 | 2,92,76,20,0,24.2,1.698,28,0 624 | 6,183,94,0,0,40.8,1.461,45,0 625 | 0,94,70,27,115,43.5,0.347,21,0 626 | 2,108,64,0,0,30.8,0.158,21,0 627 | 4,90,88,47,54,37.7,0.362,29,0 628 | 0,125,68,0,0,24.7,0.206,21,0 629 | 0,132,78,0,0,32.4,0.393,21,0 630 | 5,128,80,0,0,34.6,0.144,45,0 631 | 4,94,65,22,0,24.7,0.148,21,0 632 | 7,114,64,0,0,27.4,0.732,34,1 633 | 0,102,78,40,90,34.5,0.238,24,0 634 | 2,111,60,0,0,26.2,0.343,23,0 635 | 1,128,82,17,183,27.5,0.115,22,0 636 | 10,92,62,0,0,25.9,0.167,31,0 637 | 13,104,72,0,0,31.2,0.465,38,1 638 | 5,104,74,0,0,28.8,0.153,48,0 639 | 2,94,76,18,66,31.6,0.649,23,0 640 | 7,97,76,32,91,40.9,0.871,32,1 641 | 1,100,74,12,46,19.5,0.149,28,0 642 | 0,102,86,17,105,29.3,0.695,27,0 643 | 4,128,70,0,0,34.3,0.303,24,0 644 | 6,147,80,0,0,29.5,0.178,50,1 645 | 4,90,0,0,0,28,0.61,31,0 646 | 3,103,72,30,152,27.6,0.73,27,0 647 | 2,157,74,35,440,39.4,0.134,30,0 648 | 1,167,74,17,144,23.4,0.447,33,1 649 | 0,179,50,36,159,37.8,0.455,22,1 650 | 11,136,84,35,130,28.3,0.26,42,1 651 | 0,107,60,25,0,26.4,0.133,23,0 652 | 1,91,54,25,100,25.2,0.234,23,0 653 | 1,117,60,23,106,33.8,0.466,27,0 654 | 5,123,74,40,77,34.1,0.269,28,0 655 | 2,120,54,0,0,26.8,0.455,27,0 656 | 1,106,70,28,135,34.2,0.142,22,0 657 | 2,155,52,27,540,38.7,0.24,25,1 658 | 2,101,58,35,90,21.8,0.155,22,0 659 | 1,120,80,48,200,38.9,1.162,41,0 660 | 11,127,106,0,0,39,0.19,51,0 661 | 3,80,82,31,70,34.2,1.292,27,1 662 | 10,162,84,0,0,27.7,0.182,54,0 663 | 1,199,76,43,0,42.9,1.394,22,1 664 | 8,167,106,46,231,37.6,0.165,43,1 665 | 9,145,80,46,130,37.9,0.637,40,1 666 | 6,115,60,39,0,33.7,0.245,40,1 667 | 1,112,80,45,132,34.8,0.217,24,0 668 | 4,145,82,18,0,32.5,0.235,70,1 669 | 10,111,70,27,0,27.5,0.141,40,1 670 | 6,98,58,33,190,34,0.43,43,0 671 | 9,154,78,30,100,30.9,0.164,45,0 672 | 6,165,68,26,168,33.6,0.631,49,0 673 | 1,99,58,10,0,25.4,0.551,21,0 674 | 10,68,106,23,49,35.5,0.285,47,0 675 | 3,123,100,35,240,57.3,0.88,22,0 676 | 8,91,82,0,0,35.6,0.587,68,0 677 | 6,195,70,0,0,30.9,0.328,31,1 678 | 9,156,86,0,0,24.8,0.23,53,1 679 | 0,93,60,0,0,35.3,0.263,25,0 680 | 3,121,52,0,0,36,0.127,25,1 681 | 2,101,58,17,265,24.2,0.614,23,0 682 | 2,56,56,28,45,24.2,0.332,22,0 683 | 0,162,76,36,0,49.6,0.364,26,1 684 | 0,95,64,39,105,44.6,0.366,22,0 685 | 4,125,80,0,0,32.3,0.536,27,1 686 | 5,136,82,0,0,0,0.64,69,0 687 | 2,129,74,26,205,33.2,0.591,25,0 688 | 3,130,64,0,0,23.1,0.314,22,0 689 | 1,107,50,19,0,28.3,0.181,29,0 690 | 1,140,74,26,180,24.1,0.828,23,0 691 | 1,144,82,46,180,46.1,0.335,46,1 692 | 8,107,80,0,0,24.6,0.856,34,0 693 | 13,158,114,0,0,42.3,0.257,44,1 694 | 2,121,70,32,95,39.1,0.886,23,0 695 | 7,129,68,49,125,38.5,0.439,43,1 696 | 2,90,60,0,0,23.5,0.191,25,0 697 | 7,142,90,24,480,30.4,0.128,43,1 698 | 3,169,74,19,125,29.9,0.268,31,1 699 | 0,99,0,0,0,25,0.253,22,0 700 | 4,127,88,11,155,34.5,0.598,28,0 701 | 4,118,70,0,0,44.5,0.904,26,0 702 | 2,122,76,27,200,35.9,0.483,26,0 703 | 6,125,78,31,0,27.6,0.565,49,1 704 | 1,168,88,29,0,35,0.905,52,1 705 | 2,129,0,0,0,38.5,0.304,41,0 706 | 4,110,76,20,100,28.4,0.118,27,0 707 | 6,80,80,36,0,39.8,0.177,28,0 708 | 10,115,0,0,0,0,0.261,30,1 709 | 2,127,46,21,335,34.4,0.176,22,0 710 | 9,164,78,0,0,32.8,0.148,45,1 711 | 2,93,64,32,160,38,0.674,23,1 712 | 3,158,64,13,387,31.2,0.295,24,0 713 | 5,126,78,27,22,29.6,0.439,40,0 714 | 10,129,62,36,0,41.2,0.441,38,1 715 | 0,134,58,20,291,26.4,0.352,21,0 716 | 3,102,74,0,0,29.5,0.121,32,0 717 | 7,187,50,33,392,33.9,0.826,34,1 718 | 3,173,78,39,185,33.8,0.97,31,1 719 | 10,94,72,18,0,23.1,0.595,56,0 720 | 1,108,60,46,178,35.5,0.415,24,0 721 | 5,97,76,27,0,35.6,0.378,52,1 722 | 4,83,86,19,0,29.3,0.317,34,0 723 | 1,114,66,36,200,38.1,0.289,21,0 724 | 1,149,68,29,127,29.3,0.349,42,1 725 | 5,117,86,30,105,39.1,0.251,42,0 726 | 1,111,94,0,0,32.8,0.265,45,0 727 | 4,112,78,40,0,39.4,0.236,38,0 728 | 1,116,78,29,180,36.1,0.496,25,0 729 | 0,141,84,26,0,32.4,0.433,22,0 730 | 2,175,88,0,0,22.9,0.326,22,0 731 | 2,92,52,0,0,30.1,0.141,22,0 732 | 3,130,78,23,79,28.4,0.323,34,1 733 | 8,120,86,0,0,28.4,0.259,22,1 734 | 2,174,88,37,120,44.5,0.646,24,1 735 | 2,106,56,27,165,29,0.426,22,0 736 | 2,105,75,0,0,23.3,0.56,53,0 737 | 4,95,60,32,0,35.4,0.284,28,0 738 | 0,126,86,27,120,27.4,0.515,21,0 739 | 8,65,72,23,0,32,0.6,42,0 740 | 2,99,60,17,160,36.6,0.453,21,0 741 | 1,102,74,0,0,39.5,0.293,42,1 742 | 11,120,80,37,150,42.3,0.785,48,1 743 | 3,102,44,20,94,30.8,0.4,26,0 744 | 1,109,58,18,116,28.5,0.219,22,0 745 | 9,140,94,0,0,32.7,0.734,45,1 746 | 13,153,88,37,140,40.6,1.174,39,0 747 | 12,100,84,33,105,30,0.488,46,0 748 | 1,147,94,41,0,49.3,0.358,27,1 749 | 1,81,74,41,57,46.3,1.096,32,0 750 | 3,187,70,22,200,36.4,0.408,36,1 751 | 6,162,62,0,0,24.3,0.178,50,1 752 | 4,136,70,0,0,31.2,1.182,22,1 753 | 1,121,78,39,74,39,0.261,28,0 754 | 3,108,62,24,0,26,0.223,25,0 755 | 0,181,88,44,510,43.3,0.222,26,1 756 | 8,154,78,32,0,32.4,0.443,45,1 757 | 1,128,88,39,110,36.5,1.057,37,1 758 | 7,137,90,41,0,32,0.391,39,0 759 | 0,123,72,0,0,36.3,0.258,52,1 760 | 1,106,76,0,0,37.5,0.197,26,0 761 | 6,190,92,0,0,35.5,0.278,66,1 762 | 2,88,58,26,16,28.4,0.766,22,0 763 | 9,170,74,31,0,44,0.403,43,1 764 | 9,89,62,0,0,22.5,0.142,33,0 765 | 10,101,76,48,180,32.9,0.171,63,0 766 | 2,122,70,27,0,36.8,0.34,27,0 767 | 5,121,72,23,112,26.2,0.245,30,0 768 | 1,126,60,0,0,30.1,0.349,47,1 769 | 1,93,70,31,0,30.4,0.315,23,0 -------------------------------------------------------------------------------- /utilities_and_data/kilpisjarvi-summer-temp.csv: -------------------------------------------------------------------------------- 1 | year;temp.june;temp.july;temp.august;temp.summer 2 | 1952;8.2;10;6.7;8.3 3 | 1953;11.1;11.4;10.3;10.9 4 | 1954;6.8;12.8;8.5;9.4 5 | 1955;3.8;10.4;10;8.1 6 | 1956;6.5;10.5;7.4;8.1 7 | 1957;5.1;10.3;7.8;7.7 8 | 1958;6.2;8.8;10.9;8.6 9 | 1959;7.1;10.6;9.7;9.1 10 | 1960;8;14;10.9;11 11 | 1961;8.3;12.2;9.8;10.1 12 | 1962;5.9;8.7;8.2;7.6 13 | 1963;7;9;10.5;8.8 14 | 1964;6.1;10.5;8.3;8.3 15 | 1965;6;7.4;8.1;7.2 16 | 1966;8.7;11.1;8.1;9.3 17 | 1967;6.5;9.8;10;8.8 18 | 1968;6.6;8.5;7.7;7.6 19 | 1969;8.6;11.2;11.7;10.5 20 | 1970;10.4;12.1;10.5;11 21 | 1971;8.2;9.2;9.4;8.9 22 | 1972;10.3;13.2;10.3;11.3 23 | 1973;8.3;13.8;8;10 24 | 1974;9.3;11.4;9.5;10.1 25 | 1975;4.6;7.9;6.8;6.4 26 | 1976;6.4;9.3;9;8.2 27 | 1977;5.1;10.6;9.4;8.4 28 | 1978;8.6;11.2;8.8;9.5 29 | 1979;8.4;11.8;9.6;9.9 30 | 1980;10.1;11.8;9.8;10.6 31 | 1981;4.3;10.2;8.2;7.6 32 | 1982;3.6;10.7;8.8;7.7 33 | 1983;6.6;10.4;7.2;8.1 34 | 1984;8;9;8.2;8.4 35 | 1985;6.8;12.2;10;9.7 36 | 1986;9.5;11;7.9;9.5 37 | 1987;6.1;9;6.9;7.3 38 | 1988;8.4;13;9.6;10.3 39 | 1989;8.8;9.5;10.5;9.6 40 | 1990;8.3;11.6;11.1;10.3 41 | 1991;8.2;10.7;10.4;9.8 42 | 1992;9.2;9.5;8.2;9 43 | 1993;5.4;12.1;9.7;9.1 44 | 1994;7;11.2;10.4;9.5 45 | 1995;7.5;9.7;9;8.7 46 | 1996;7;10.7;11.9;9.9 47 | 1997;7.6;12.7;11.3;10.5 48 | 1998;6.6;12.5;9.1;9.4 49 | 1999;9.1;10.7;7.1;9 50 | 2000;6.4;11.1;9.5;9 51 | 2001;8.8;10.4;10;9.7 52 | 2002;10.1;12.2;11.8;11.4 53 | 2003;7.7;14;10.3;10.7 54 | 2004;6.7;13.2;10.4;10.1 55 | 2005;8.8;13.1;10.6;10.8 56 | 2006;8.6;11.1;11.6;10.4 57 | 2007;8.6;12.2;10.2;10.3 58 | 2008;7.1;11;8.4;8.8 59 | 2009;7.1;10.8;11.5;9.8 60 | 2010;6;11.3;9.1;8.8 61 | 2011;10.4;11.7;10.3;10.8 62 | 2012;6.5;10.2;9;8.6 63 | 2013;10.5;11.6;11.3;11.1 64 | -------------------------------------------------------------------------------- /utilities_and_data/light.txt: -------------------------------------------------------------------------------- 1 | 28 2 | 26 3 | 33 4 | 24 5 | 34 6 | -44 7 | 27 8 | 16 9 | 40 10 | -2 11 | 29 12 | 22 13 | 24 14 | 21 15 | 25 16 | 30 17 | 23 18 | 29 19 | 31 20 | 19 21 | 24 22 | 20 23 | 36 24 | 32 25 | 36 26 | 28 27 | 25 28 | 21 29 | 28 30 | 29 31 | 37 32 | 25 33 | 28 34 | 26 35 | 30 36 | 32 37 | 36 38 | 26 39 | 30 40 | 22 41 | 36 42 | 23 43 | 27 44 | 27 45 | 28 46 | 27 47 | 31 48 | 27 49 | 26 50 | 33 51 | 26 52 | 32 53 | 32 54 | 24 55 | 39 56 | 28 57 | 24 58 | 25 59 | 32 60 | 25 61 | 29 62 | 27 63 | 28 64 | 29 65 | 16 66 | 23 67 | -------------------------------------------------------------------------------- /utilities_and_data/plot_tools.py: -------------------------------------------------------------------------------- 1 | """Custom plot tools.""" 2 | 3 | # Author: Tuomas Sivula 4 | 5 | import numpy as np 6 | import matplotlib as mpl 7 | import matplotlib.pyplot as plt 8 | 9 | 10 | class modify_axes: 11 | """Utility methods for modifying plot axes.""" 12 | 13 | @staticmethod 14 | def only_x(axes=None, position='zero'): 15 | """Remove all spines except the x-axis. 16 | 17 | Parameters 18 | ---------- 19 | axes : matplotlib.axes or array of such, optional 20 | The axes to operate on. If not provided, the currently active axes 21 | is operated. 22 | 23 | position : {'zero', 'center', 2-tuple}, optional 24 | The position of the only remaining spine. See options in 25 | :meth:`matplotlib.spines.Spine.set_position()`. 26 | Default is to set the axis to zero. 27 | 28 | """ 29 | if axes is None: 30 | # get the active axes 31 | axes = plt.gca() 32 | # iterate over all the axes 33 | for ax in np.asanyarray(axes).flat: 34 | # remove other spines 35 | ax.spines['top'].set_visible(False) 36 | ax.spines['right'].set_visible(False) 37 | ax.spines['left'].set_visible(False) 38 | # remove y-ticks completely 39 | ax.set_yticks(()) 40 | # ensure x-ticks are at the bottom 41 | ax.xaxis.tick_bottom() 42 | # store the x-axis tick labels 43 | old_labels = ax.xaxis.get_ticklabels() 44 | # move x-axis to the desired position 45 | ax.spines['bottom'].set_position(position) 46 | # ensure original tick label visibility 47 | for new_label, old_label in zip( 48 | ax.xaxis.get_ticklabels(), old_labels): 49 | new_label.set_visible(old_label.get_visible()) 50 | 51 | 52 | 53 | # custom styles for matplotlib usable with plt.style.use() 54 | custom_styles = dict( 55 | gray_background = { 56 | 'axes.axisbelow': True, 57 | 'axes.edgecolor': 'white', 58 | 'axes.facecolor': '#f0f0f0', 59 | 'axes.grid': True, 60 | 'axes.linewidth': 0.0, 61 | 'grid.color': 'white', 62 | 'xtick.top': False, 63 | 'xtick.bottom': False, 64 | 'ytick.left': False, 65 | 'ytick.right': False, 66 | 'legend.facecolor': 'white' 67 | } 68 | ) 69 | 70 | 71 | def mix_colors(color1, color2, proportion=0.5): 72 | """Mix two colors with given ratio. 73 | 74 | Parameters 75 | ---------- 76 | color1, color2 : matplotlib color specification 77 | Valid matplotlib color specifications. Examples: 78 | 'r' : color abbreviation 79 | 'olive' : html color name 80 | '0.6' : gray shade percentage 81 | (0.2, 0.4, 0.8) : rgb component sequence 82 | '#a0f0a6' : hex code 83 | 'C2' : current cycle color 2 84 | 85 | proportion : float, optional 86 | Float in the range [0, 1] indicating the desired proportion of color1 87 | in the resulting mix. Default value is 0.5 for even mix. 88 | 89 | Returns 90 | ------- 91 | RGB color specification as a sequence of 3 floats. 92 | 93 | Notes 94 | ----- 95 | Alpha channel is silently dropped. 96 | 97 | """ 98 | color1 = mpl.colors.to_rgb(color1) 99 | color2 = mpl.colors.to_rgb(color2) 100 | if proportion < 0 or 1 < proportion: 101 | raise ValueError('`proportion` has to be in the range [0, 1].') 102 | p1 = proportion 103 | p2 = 1 - proportion 104 | return tuple(p1*comp1 + p2*comp2 for comp1, comp2 in zip(color1, color2)) 105 | 106 | 107 | def lighten(color, proportion=0.5): 108 | """Make color lighter. 109 | 110 | Parameters 111 | ---------- 112 | color : matplotlib color specification 113 | Valid matplotlib color specifications. See :meth:`mix_colors` for 114 | examples. 115 | 116 | proportion : float, optional 117 | Float in the range [0, 1] indicating the desired lightness percentage. 118 | Proportion 0 produces the original color and 1 produces white. 119 | 120 | Returns 121 | ------- 122 | RGB color specification as a sequence of 3 floats. 123 | 124 | Notes 125 | ----- 126 | Alpha channel is silently dropped. 127 | 128 | """ 129 | return mix_colors((1.0, 1.0, 1.0), color, proportion=proportion) 130 | 131 | 132 | def darken(color, proportion=0.5): 133 | """Make color darker. 134 | 135 | Parameters 136 | ---------- 137 | color : matplotlib color specification 138 | Valid matplotlib color specifications. See :meth:`mix_colors` for 139 | examples. 140 | 141 | proportion : float, optional 142 | Float in the range [0, 1] indicating the desired darkness percentage. 143 | Proportion 0 produces the original color and 1 produces black. 144 | 145 | Returns 146 | ------- 147 | RGB color specification as a sequence of 3 floats. 148 | 149 | Notes 150 | ----- 151 | Alpha channel is silently dropped. 152 | 153 | """ 154 | return mix_colors((0.0, 0.0, 0.0), color, proportion=proportion) 155 | 156 | 157 | def hist_multi_sharex( 158 | samples, rowlabels=None, n_bins=20, sharey=None, color=None, 159 | x_lines=None, x_line_colors=None, **kwargs): 160 | """Plot multiple histograms sharing the x-axis. 161 | 162 | Additional keyword arguments are passed for the subplot figure creation in 163 | :meth:`matplotlib.pyplot.subplots`. 164 | 165 | Parameters 166 | ---------- 167 | samples : sequence of ndarray 168 | the samples to be plotted 169 | 170 | rowlabels : sequence of str, optional 171 | Names for the rows, by default no name labels are used. 172 | 173 | n_bins : int, optional 174 | number of bins in the whole plot range 175 | 176 | sharey : bool, optional 177 | If True, the y axis (count) of each histogram is explicitly shared. 178 | By default, if the sample size is constant, the y-axis is shared, 179 | otherwise not. 180 | 181 | color : matplotlib color specification, optional 182 | color for the histograms 183 | 184 | x_lines : sequence of scalar or scalar, optional 185 | Sequence of locations in x-axis in which a line spanning through all 186 | the histograms is plotted. 187 | 188 | x_line_colors : sequence of colors or color, optional 189 | Respective line colors for each `x_line`. Default color is ``'C1'``. 190 | 191 | Returns 192 | ------- 193 | fig, axes 194 | the figure object and the array of axes 195 | 196 | """ 197 | 198 | # get range of all samples 199 | x_range = [ 200 | min(np.min(sample) for sample in samples), 201 | max(np.max(sample) for sample in samples), 202 | ] 203 | 204 | # use same explicit bin edges for all the plots 205 | bins = np.linspace(x_range[0], x_range[1], n_bins+1) 206 | 207 | if sharey is None: 208 | # check if sample size is constant 209 | sharey = all(len(samples[0]) == len(sample) for sample in samples[1:]) 210 | 211 | if color is None: 212 | color = lighten('C0', 0.25) 213 | 214 | # set up multiple plots 215 | fig, axes = plt.subplots( 216 | nrows=len(samples), 217 | ncols=1, 218 | sharex=True, 219 | sharey=sharey, 220 | **kwargs 221 | ) 222 | 223 | # plot histograms 224 | for i, (ax, sample) in enumerate(zip(axes, samples)): 225 | ax.hist(sample, bins=bins, color=color) 226 | if rowlabels is not None: 227 | ax.set_ylabel(rowlabels[i], rotation='horizontal', ha='right') 228 | ax.spines['top'].set_visible(False) 229 | ax.spines['left'].set_visible(False) 230 | ax.spines['right'].set_visible(False) 231 | ax.set_yticks(()) 232 | 233 | # draw lines across all the figures 234 | if x_lines is not None: 235 | # ensure sequences provided 236 | if np.isscalar(x_lines): 237 | x_lines = (x_lines,) 238 | if x_line_colors is not None: 239 | x_line_colors = (x_line_colors,) 240 | for i, x_location in enumerate(x_lines): 241 | if x_location < x_range[0] or x_range[1] < x_location: 242 | # x location out of range 243 | continue 244 | spanning_line = mpl.patches.ConnectionPatch( 245 | xyA=(x_location, 0), 246 | xyB=(x_location, axes[0].get_ylim()[1]), 247 | coordsA="data", 248 | coordsB="data", 249 | axesA=axes[-1], 250 | axesB=axes[0], 251 | color=x_line_colors[i] if x_line_colors is not None else 'C1' 252 | ) 253 | axes[-1].add_artist(spanning_line) 254 | 255 | return fig, axes 256 | -------------------------------------------------------------------------------- /utilities_and_data/psis.py: -------------------------------------------------------------------------------- 1 | from __future__ import division # For Python 2 compatibility 2 | """Pareto smoothed importance sampling (PSIS) 3 | 4 | This module implements Pareto smoothed importance sampling (PSIS) and PSIS 5 | leave-one-out (LOO) cross-validation for Python (Numpy). 6 | 7 | Included functions 8 | ------------------ 9 | psisloo 10 | Pareto smoothed importance sampling leave-one-out log predictive densities. 11 | 12 | psislw 13 | Pareto smoothed importance sampling. 14 | 15 | gpdfitnew 16 | Estimate the parameters for the Generalized Pareto Distribution (GPD). 17 | 18 | gpinv 19 | Inverse Generalised Pareto distribution function. 20 | 21 | sumlogs 22 | Sum of vector where numbers are represented by their logarithms. 23 | 24 | References 25 | ---------- 26 | Aki Vehtari, Andrew Gelman and Jonah Gabry (2016). Practical 27 | Bayesian model evaluation using leave-one-out cross-validation 28 | and WAIC. Statistics and Computing, doi:10.1007/s11222-016-9696-4. 29 | 30 | Aki Vehtari, Andrew Gelman and Jonah Gabry (2016). Pareto 31 | smoothed importance sampling. arXiv preprint arXiv:1507.02646v4. 32 | 33 | """ 34 | 35 | # 3-Clause BSD License 36 | """ 37 | Copyright 2017 Aki Vehtari, Tuomas Sivula 38 | 39 | Redistribution and use in source and binary forms, with or without modification, 40 | are permitted provided that the following conditions are met: 41 | 42 | 1. Redistributions of source code must retain the above copyright notice, this 43 | list of conditions and the following disclaimer. 44 | 45 | 2. Redistributions in binary form must reproduce the above copyright notice, 46 | this list of conditions and the following disclaimer in the documentation and/or 47 | other materials provided with the distribution. 48 | 49 | 3. Neither the name of the copyright holder nor the names of its contributors 50 | may be used to endorse or promote products derived from this software without 51 | specific prior written permission. 52 | 53 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 54 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 55 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 56 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR 57 | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 58 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 59 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 60 | ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 61 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 62 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. """ 63 | 64 | 65 | import numpy as np 66 | 67 | 68 | def psisloo(log_lik, **kwargs): 69 | r"""PSIS leave-one-out log predictive densities. 70 | 71 | Computes the log predictive densities given posterior samples of the log 72 | likelihood terms :math:`p(y_i|\theta^s)` in input parameter `log_lik`. 73 | Returns a sum of the leave-one-out log predictive densities `loo`, 74 | individual leave-one-out log predictive density terms `loos` and an estimate 75 | of Pareto tail indices `ks`. If tail index k > 0.5, variance of the raw 76 | estimate does not exist and if tail index k > 1 the mean of the raw estimate 77 | does not exist and the PSIS estimate is likely to have large variation and 78 | some bias. 79 | 80 | Parameters 81 | ---------- 82 | log_lik : ndarray 83 | Array of size n x m containing n posterior samples of the log likelihood 84 | terms p(y_i|theta^s). 85 | 86 | Additional keyword arguments are passed to the psislw() function (see the 87 | corresponding documentation). 88 | 89 | Returns 90 | ------- 91 | loo : scalar 92 | sum of the leave-one-out log predictive densities 93 | 94 | loos : ndarray 95 | individual leave-one-out log predictive density terms 96 | 97 | ks : ndarray 98 | estimated Pareto tail indices 99 | 100 | """ 101 | # ensure overwrite flag in passed arguments 102 | kwargs['overwrite_lw'] = True 103 | # log raw weights from log_lik 104 | lw = -log_lik 105 | # compute Pareto smoothed log weights given raw log weights 106 | lw, ks = psislw(lw, **kwargs) 107 | # compute 108 | lw += log_lik 109 | loos = sumlogs(lw, axis=0) 110 | loo = loos.sum() 111 | return loo, loos, ks 112 | 113 | 114 | def psislw(lw, wcpp=20, wtrunc=3/4, overwrite_lw=False): 115 | """Pareto smoothed importance sampling (PSIS). 116 | 117 | Parameters 118 | ---------- 119 | lw : ndarray 120 | Array of size n x m containing m sets of n log weights. It is also 121 | possible to provide one dimensional array of length n. 122 | 123 | wcpp : number 124 | Percentage of samples used for GPD fit estimate (default is 20). 125 | 126 | wtrunc : float 127 | Positive parameter for truncating very large weights to ``n**wtrunc``. 128 | Providing False or 0 disables truncation. Default values is 3/4. 129 | 130 | overwrite_lw : bool, optional 131 | If True, the input array `lw` is smoothed in-place. By default, a new 132 | array is allocated. 133 | 134 | Returns 135 | ------- 136 | lw_out : ndarray 137 | smoothed log weights 138 | kss : ndarray 139 | Pareto tail indices 140 | 141 | """ 142 | if lw.ndim == 2: 143 | n, m = lw.shape 144 | elif lw.ndim == 1: 145 | n = len(lw) 146 | m = 1 147 | else: 148 | raise ValueError("Argument `lw` must be 1 or 2 dimensional.") 149 | if n <= 1: 150 | raise ValueError("More than one log-weight needed.") 151 | 152 | if overwrite_lw: 153 | # in-place operation 154 | lw_out = lw 155 | else: 156 | # allocate new array for output 157 | lw_out = np.copy(lw, order='K') 158 | 159 | # allocate output array for kss 160 | kss = np.empty(m) 161 | 162 | # precalculate constants 163 | cutoffmin = np.log(np.finfo(float).tiny) 164 | logn = np.log(n) 165 | 166 | # loop over sets of log weights 167 | for i, x in enumerate(lw_out.T if lw_out.ndim == 2 else lw_out[None,:]): 168 | # improve numerical accuracy 169 | x -= np.max(x) 170 | # divide log weights into body and right tail 171 | xcutoff = max( 172 | np.percentile(x, 100 - wcpp), 173 | cutoffmin 174 | ) 175 | expxcutoff = np.exp(xcutoff) 176 | tailinds, = np.where(x > xcutoff) 177 | x2 = x[tailinds] 178 | n2 = len(x2) 179 | if n2 <= 4: 180 | # not enough tail samples for gpdfitnew 181 | k = np.inf 182 | else: 183 | # order of tail samples 184 | x2si = np.argsort(x2) 185 | # fit generalized Pareto distribution to the right tail samples 186 | np.exp(x2, out=x2) 187 | x2 -= expxcutoff 188 | k, sigma = gpdfitnew(x2, sort=x2si) 189 | # compute ordered statistic for the fit 190 | sti = np.arange(0.5, n2) 191 | sti /= n2 192 | qq = gpinv(sti, k, sigma) 193 | qq += expxcutoff 194 | np.log(qq, out=qq) 195 | # place the smoothed tail into the output array 196 | x[tailinds[x2si]] = qq 197 | if wtrunc > 0: 198 | # truncate too large weights 199 | lwtrunc = wtrunc * logn - logn + sumlogs(x) 200 | x[x > lwtrunc] = lwtrunc 201 | # renormalize weights 202 | x -= sumlogs(x) 203 | # store tail index k 204 | kss[i] = k 205 | 206 | # If the provided input array is one dimensional, return kss as scalar. 207 | if lw_out.ndim == 1: 208 | kss = kss[0] 209 | 210 | return lw_out, kss 211 | 212 | 213 | def gpdfitnew(x, sort=True, sort_in_place=False): 214 | """Estimate the parameters for the Generalized Pareto Distribution (GPD) 215 | 216 | Returns empirical Bayes estimate for the parameters of the two-parameter 217 | generalized Parato distribution given the data. 218 | 219 | Parameters 220 | ---------- 221 | x : ndarray 222 | One dimensional data array 223 | 224 | sort : bool or ndarray, optional 225 | If known in advance, one can provide an array of indices that would 226 | sort the input array `x`. If the input array is already sorted, provide 227 | False. If True (default behaviour), the array is sorted internally. 228 | 229 | sort_in_place : bool, optional 230 | If `sort` is True and `sort_in_place` is True, the array is sorted 231 | in-place (False by default). 232 | 233 | Returns 234 | ------- 235 | k, sigma : float 236 | estimated parameter values 237 | 238 | Notes 239 | ----- 240 | This function returns a negative of Zhang and Stephens's k, because it is 241 | more common parameterisation. 242 | 243 | """ 244 | if x.ndim != 1 or len(x) <= 1: 245 | raise ValueError("Invalid input array.") 246 | 247 | # check if x should be sorted 248 | if sort is True: 249 | if sort_in_place: 250 | x.sort() 251 | xsorted = True 252 | else: 253 | sort = np.argsort(x) 254 | xsorted = False 255 | elif sort is False: 256 | xsorted = True 257 | else: 258 | xsorted = False 259 | 260 | n = len(x) 261 | m = 80 + int(np.sqrt(n)) 262 | 263 | bs = np.arange(1, m + 1, dtype=float) 264 | bs -= 0.5 265 | np.divide(m, bs, out=bs) 266 | np.sqrt(bs, out=bs) 267 | np.subtract(1, bs, out=bs) 268 | if xsorted: 269 | bs /= 3 * x[int(n/4 + 0.5) - 1] 270 | bs += 1 / x[-1] 271 | else: 272 | bs /= 3 * x[sort[int(n/4 + 0.5) - 1]] 273 | bs += 1 / x[sort[-1]] 274 | 275 | ks = np.negative(bs) 276 | temp = ks[:,None] * x 277 | np.log1p(temp, out=temp) 278 | np.mean(temp, axis=1, out=ks) 279 | 280 | L = bs / ks 281 | np.negative(L, out=L) 282 | np.log(L, out=L) 283 | L -= ks 284 | L -= 1 285 | L *= n 286 | 287 | temp = L - L[:,None] 288 | np.exp(temp, out=temp) 289 | w = np.sum(temp, axis=1) 290 | np.divide(1, w, out=w) 291 | 292 | # remove negligible weights 293 | dii = w >= 10 * np.finfo(float).eps 294 | if not np.all(dii): 295 | w = w[dii] 296 | bs = bs[dii] 297 | # normalise w 298 | w /= w.sum() 299 | 300 | # posterior mean for b 301 | b = np.sum(bs * w) 302 | # Estimate for k, note that we return a negative of Zhang and 303 | # Stephens's k, because it is more common parameterisation. 304 | temp = (-b) * x 305 | np.log1p(temp, out=temp) 306 | k = np.mean(temp) 307 | # estimate for sigma 308 | sigma = -k / b 309 | 310 | return k, sigma 311 | 312 | 313 | def gpinv(p, k, sigma): 314 | """Inverse Generalised Pareto distribution function.""" 315 | x = np.empty(p.shape) 316 | x.fill(np.nan) 317 | if sigma <= 0: 318 | return x 319 | ok = (p > 0) & (p < 1) 320 | if np.all(ok): 321 | if np.abs(k) < np.finfo(float).eps: 322 | np.negative(p, out=x) 323 | np.log1p(x, out=x) 324 | np.negative(x, out=x) 325 | else: 326 | np.negative(p, out=x) 327 | np.log1p(x, out=x) 328 | x *= -k 329 | np.expm1(x, out=x) 330 | x /= k 331 | x *= sigma 332 | else: 333 | if np.abs(k) < np.finfo(float).eps: 334 | # x[ok] = - np.log1p(-p[ok]) 335 | temp = p[ok] 336 | np.negative(temp, out=temp) 337 | np.log1p(temp, out=temp) 338 | np.negative(temp, out=temp) 339 | x[ok] = temp 340 | else: 341 | # x[ok] = np.expm1(-k * np.log1p(-p[ok])) / k 342 | temp = p[ok] 343 | np.negative(temp, out=temp) 344 | np.log1p(temp, out=temp) 345 | temp *= -k 346 | np.expm1(temp, out=temp) 347 | temp /= k 348 | x[ok] = temp 349 | x *= sigma 350 | x[p == 0] = 0 351 | if k >= 0: 352 | x[p == 1] = np.inf 353 | else: 354 | x[p == 1] = -sigma / k 355 | return x 356 | 357 | 358 | def sumlogs(x, axis=None, out=None): 359 | """Sum of vector where numbers are represented by their logarithms. 360 | 361 | Calculates ``np.log(np.sum(np.exp(x), axis=axis))`` in such a fashion that 362 | it works even when elements have large magnitude. 363 | 364 | """ 365 | maxx = x.max(axis=axis, keepdims=True) 366 | xnorm = x - maxx 367 | np.exp(xnorm, out=xnorm) 368 | out = np.sum(xnorm, axis=axis, out=out) 369 | if isinstance(out, np.ndarray): 370 | np.log(out, out=out) 371 | else: 372 | out = np.log(out) 373 | out += np.squeeze(maxx) 374 | return out 375 | -------------------------------------------------------------------------------- /utilities_and_data/psrf.py: -------------------------------------------------------------------------------- 1 | from __future__ import division 2 | 3 | # Copyright (C) 1999 Simo Sarkka 4 | # Copyright (C) 2003-2004,2013 Aki Vehtari 5 | # Copyright (C) 2015 Tuomas Sivula 6 | 7 | # This software is distributed under the GNU General Public Licence (version 3 8 | # or later); please refer to the file LICENSE.txt, included with the software, 9 | # for details. 10 | 11 | import numpy as np 12 | 13 | def psrf(X, return_extra=False): 14 | """Potential Scale Reduction Factor 15 | 16 | Potential Scale Reduction Factor (PSRF) for a collection of 17 | MCMC-simulations. The idea of the PSRF is that if R is not close to 1 18 | (below 1.1 for example) one may conclude that the tested samples were not 19 | from the same distribution (chain might not have been converged yet). 20 | 21 | Original method: 22 | Brooks, S.P. and Gelman, A. (1998) General methods for monitoring 23 | convergence of iterative simulations. Journal of Computational and 24 | Graphical Statistics. 7, 434-455. 25 | Current version: 26 | Split chains, return square-root definition of R, and compute n_eff using 27 | variogram estimate and Geyer's initial positive sequence as described in 28 | Gelman et al (2013), Bayesian Data Analsyis, 3rd ed, sections 11.4-11.5. 29 | 30 | Parameters 31 | ---------- 32 | X : array_like 33 | Input array of shape (M,N,D) consisting of M MCMC simulations of length 34 | N, each with dimension D. Only one simulation can be provided as array 35 | with shape (N,D). Preferably X should be C-contiguous with even number 36 | of samples N. 37 | 38 | return_extra : bool, optional 39 | If True, some extra information is also returned, see section returns. 40 | 41 | Returns 42 | ------- 43 | R : ndarray 44 | PSRF (R=sqrt(V/W)) in array of length D. 45 | 46 | neff : ndarray 47 | Estimated effective number of samples M*N/(1+2*sum(rhohat)). 48 | 49 | V : ndarray 50 | Estimated mixture-of-sequences variances. 51 | 52 | W : ndarray 53 | Estimated within sequence variances. 54 | 55 | B : ndarray 56 | Estimated between sequence variances. 57 | 58 | """ 59 | 60 | # Handle input 61 | X = np.asarray(X) 62 | if X.ndim == 2: 63 | X = X[np.newaxis] 64 | # Split chains 65 | M = X.shape[0]*2 66 | N = X.shape[1]//2 67 | D = X.shape[2] 68 | if X.shape[1]%2 == 0: 69 | X = X.reshape((M,N,D)) 70 | else: 71 | # Discard the middle samples (data copied) 72 | X_in = X 73 | X = np.empty((M,N,D), dtype=X_in.dtype) 74 | np.copyto(X[:X_in.shape[0]], X_in[:,:N]) 75 | np.copyto(X[X_in.shape[0]:], X_in[:,-N:]) 76 | 77 | if N <= 2: 78 | raise ValueError("Too few samples") 79 | 80 | # Means of the variances 81 | W = np.mean(np.var(X, axis=1, ddof=1), axis=0) 82 | # Variances of the means 83 | B = np.var(np.mean(X, axis=1), axis=0, ddof=1) 84 | 85 | # Calculate reduction factors 86 | Vh = W*(N-1)/N + B 87 | B *= N 88 | R = np.sqrt(Vh/W) 89 | 90 | if not return_extra: 91 | return R 92 | 93 | else: 94 | # Autocorrelation 95 | temp_1 = np.empty_like(X) 96 | rho = np.ones((N,D)) 97 | for t in xrange(1,N): 98 | tempslice = temp_1[:,:-t] 99 | np.subtract(X[:,:-t], X[:,t:], out=tempslice) 100 | np.square(tempslice, out=tempslice) 101 | np.sum(tempslice, axis=(0,1), out=rho[t]) 102 | rho[t] /= 2*M*(N-t)*Vh 103 | np.subtract(1, rho[1:], out=rho[1:]) 104 | 105 | # Effective sample size 106 | mid = N//2 107 | cp = np.sum(np.reshape(rho[:2*mid], (mid,2,D)), axis=1) 108 | # The following could be Cythonised 109 | ci = np.argmax(cp<0, axis=0) 110 | no_init_pos = np.nonzero(np.all(cp>=0, axis=0))[0] 111 | if len(no_init_pos) > 0: 112 | print ( 113 | "Initial positive could not be found for variable(s) {}, " 114 | "maxlag value used.".format(no_init_pos+1) 115 | ) 116 | ci[no_init_pos] = mid 117 | cp *= np.arange(mid)[:,np.newaxis] < ci 118 | tau = -1 + 2*np.sum(cp, axis=0) 119 | neff = M*N/tau 120 | 121 | return R, neff, Vh, W, B, tau 122 | 123 | -------------------------------------------------------------------------------- /utilities_and_data/sinvchi2.py: -------------------------------------------------------------------------------- 1 | from __future__ import division 2 | """Module containing functions for scaled inverse chi-squared distribution.""" 3 | 4 | # Copyright (C) 2003 Aki Vehtari 5 | # Copyright (C) 2015 Tuomas Sivula 6 | 7 | # This software is distributed under the GNU General Public Licence (version 3 8 | # or later); please refer to the file LICENSE.txt, included with the software, 9 | # for details. 10 | 11 | import numpy as np 12 | from scipy.special import gammaln 13 | 14 | def logpdf(x, nu, s2=1): 15 | """Log of the scaled inverse chi-squared probability density function. 16 | 17 | Parameters 18 | ---------- 19 | x : array_like 20 | quantiles 21 | 22 | nu : array_like 23 | degrees of freedom 24 | 25 | s2 : array_like, optional 26 | scale (default 1) 27 | 28 | Returns 29 | ------- 30 | logpdf : ndarray 31 | Log of the probability density function evaluated at `x`. 32 | 33 | """ 34 | x = np.asarray(x) 35 | nu = np.asarray(nu) 36 | s2 = np.asarray(s2) 37 | nu_2 = nu/2 38 | y = np.log(x) 39 | y *= (nu_2 +1) 40 | np.negative(y, out=y) 41 | y -= (nu_2*s2)/x 42 | y += np.log(s2)*nu_2 43 | y -= gammaln(nu_2) 44 | y += np.log(nu_2)*nu_2 45 | return y 46 | 47 | 48 | def pdf(x, nu, s2=1): 49 | """Scaled inverse chi-squared probability density function. 50 | 51 | Parameters 52 | ---------- 53 | x : array_like 54 | quantiles 55 | 56 | nu : array_like 57 | degrees of freedom 58 | 59 | s2 : array_like, optional 60 | scale (default 1) 61 | 62 | Returns 63 | ------- 64 | pdf : ndarray 65 | Probability density function evaluated at `x`. 66 | 67 | """ 68 | return np.exp(logpdf(x, nu, s2)) 69 | 70 | 71 | def rvs(nu, s2=1, size=None, random_state=None): 72 | """Random variates from scaled inverse chi-squared distribution. 73 | 74 | Parameters 75 | ---------- 76 | nu : array_like 77 | degrees of freedom 78 | 79 | s2 : array_like, optional 80 | scale (default 1) 81 | 82 | size : int or tuple of ints, optional 83 | Number of samples. If not provided or None, the broadcasted shape of 84 | `nu` and `s2` is used. 85 | 86 | random_state : {None, scalar, numpy.random.RandomState}, optional 87 | Seed for the sampling. None corresponds to random seed. 88 | 89 | Returns 90 | ------- 91 | rvs : ndarray or scalar 92 | Random variates of given `size`. 93 | 94 | """ 95 | if not isinstance(random_state, np.random.RandomState): 96 | random_state = np.random.RandomState(seed=random_state) 97 | scale = nu*s2 98 | if size is None: 99 | size = scale.shape 100 | rvs = random_state.chisquare(nu, size=size) 101 | np.divide(scale, rvs, out=rvs) 102 | return rvs 103 | 104 | -------------------------------------------------------------------------------- /utilities_and_data/stan_utility.py: -------------------------------------------------------------------------------- 1 | # Copyright: Michael Betancourt 2 | # License: BSD (3 clause) 3 | # See also http://mc-stan.org/users/documentation/case-studies/pystan_workflow.html 4 | 5 | import pystan 6 | import pickle 7 | import numpy 8 | 9 | def check_div(fit): 10 | """Check transitions that ended with a divergence""" 11 | sampler_params = fit.get_sampler_params(inc_warmup=False) 12 | divergent = [x for y in sampler_params for x in y['divergent__']] 13 | n = sum(divergent) 14 | N = len(divergent) 15 | print('{} of {} iterations ended with a divergence ({}%)'.format(n, N, 16 | 100 * n / N)) 17 | if n > 0: 18 | print('Try running with larger adapt_delta to remove the divergences') 19 | 20 | def check_treedepth(fit, max_depth = 10): 21 | """Check transitions that ended prematurely due to maximum tree depth limit""" 22 | sampler_params = fit.get_sampler_params(inc_warmup=False) 23 | depths = [x for y in sampler_params for x in y['treedepth__']] 24 | n = sum(1 for x in depths if x == max_depth) 25 | N = len(depths) 26 | print(('{} of {} iterations saturated the maximum tree depth of {}' 27 | + ' ({}%)').format(n, N, max_depth, 100 * n / N)) 28 | if n > 0: 29 | print('Run again with max_depth set to a larger value to avoid saturation') 30 | 31 | def check_energy(fit): 32 | """Checks the energy Bayesian fraction of missing information (E-BFMI)""" 33 | sampler_params = fit.get_sampler_params(inc_warmup=False) 34 | for chain_num, s in enumerate(sampler_params): 35 | energies = s['energy__'] 36 | numer = sum((energies[i] - energies[i - 1])**2 for i in range(1, len(energies))) / len(energies) 37 | denom = numpy.var(energies) 38 | if numer / denom < 0.2: 39 | print('Chain {}: E-BFMI = {}'.format(chain_num, numer / denom)) 40 | print('E-BFMI below 0.2 indicates you may need to reparameterize your model') 41 | 42 | def _by_chain(unpermuted_extraction): 43 | num_chains = len(unpermuted_extraction[0]) 44 | result = [[] for _ in range(num_chains)] 45 | for c in range(num_chains): 46 | for i in range(len(unpermuted_extraction)): 47 | result[c].append(unpermuted_extraction[i][c]) 48 | return numpy.array(result) 49 | 50 | def _shaped_ordered_params(fit): 51 | ef = fit.extract(permuted=False, inc_warmup=False) # flattened, unpermuted, by (iteration, chain) 52 | ef = _by_chain(ef) 53 | ef = ef.reshape(-1, len(ef[0][0])) 54 | ef = ef[:, 0:len(fit.flatnames)] # drop lp__ 55 | shaped = {} 56 | idx = 0 57 | for dim, param_name in zip(fit.par_dims, fit.extract().keys()): 58 | length = int(numpy.prod(dim)) 59 | shaped[param_name] = ef[:,idx:idx + length] 60 | shaped[param_name].reshape(*([-1] + dim)) 61 | idx += length 62 | return shaped 63 | 64 | def partition_div(fit): 65 | """ Returns parameter arrays separated into divergent and non-divergent transitions""" 66 | sampler_params = fit.get_sampler_params(inc_warmup=False) 67 | div = numpy.concatenate([x['divergent__'] for x in sampler_params]).astype('int') 68 | params = _shaped_ordered_params(fit) 69 | nondiv_params = dict((key, params[key][div == 0]) for key in params) 70 | div_params = dict((key, params[key][div == 1]) for key in params) 71 | return nondiv_params, div_params 72 | 73 | def compile_model(filename, model_name=None, **kwargs): 74 | """This will automatically cache models - great if you're just running a 75 | script on the command line. 76 | 77 | See http://pystan.readthedocs.io/en/latest/avoiding_recompilation.html""" 78 | from hashlib import md5 79 | 80 | with open(filename) as f: 81 | model_code = f.read() 82 | code_hash = md5(model_code.encode('ascii')).hexdigest() 83 | if model_name is None: 84 | cache_fn = 'cached-model-{}.pkl'.format(code_hash) 85 | else: 86 | cache_fn = 'cached-{}-{}.pkl'.format(model_name, code_hash) 87 | try: 88 | sm = pickle.load(open(cache_fn, 'rb')) 89 | except: 90 | sm = pystan.StanModel(model_code=model_code) 91 | with open(cache_fn, 'wb') as f: 92 | pickle.dump(sm, f) 93 | else: 94 | print("Using cached StanModel") 95 | return sm 96 | --------------------------------------------------------------------------------