{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Chapter 7. Ulysses’ Compass" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "!pip install -q numpyro arviz" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import os\n", "import warnings\n", "\n", "import arviz as az\n", "import matplotlib.pyplot as plt\n", "import pandas as pd\n", "\n", "import jax.numpy as jnp\n", "from jax import lax, random, vmap\n", "from jax.scipy.special import logsumexp\n", "\n", "import numpyro\n", "import numpyro.distributions as dist\n", "import numpyro.optim as optim\n", "from numpyro.diagnostics import print_summary\n", "from numpyro.infer import Predictive, SVI, Trace_ELBO, init_to_value, log_likelihood\n", "from numpyro.infer.autoguide import AutoLaplaceApproximation\n", "\n", "if \"SVG\" in os.environ:\n", " %config InlineBackend.figure_formats = [\"svg\"]\n", "warnings.formatwarning = lambda message, category, *args, **kwargs: \"{}: {}\\n\".format(\n", " category.__name__, message\n", ")\n", "az.style.use(\"arviz-darkgrid\")\n", "numpyro.set_platform(\"cpu\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Code 7.1" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "sppnames = [\n", " \"afarensis\",\n", " \"africanus\",\n", " \"habilis\",\n", " \"boisei\",\n", " \"rudolfensis\",\n", " \"ergaster\",\n", " \"sapiens\",\n", "]\n", "brainvolcc = jnp.array([438, 452, 612, 521, 752, 871, 1350])\n", "masskg = jnp.array([37.0, 35.5, 34.5, 41.5, 55.5, 61.0, 53.5])\n", "d = pd.DataFrame({\"species\": sppnames, \"brain\": brainvolcc, \"mass\": masskg})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Code 7.2" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "d[\"mass_std\"] = (d.mass - d.mass.mean()) / d.mass.std()\n", "d[\"brain_std\"] = d.brain / d.brain.max()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Code 7.3" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 1000/1000 [00:00<00:00, 1593.52it/s, init loss: 115.9437, avg. loss [951-1000]: 3.6486]\n" ] } ], "source": [ "def model(mass_std, brain_std=None):\n", " a = numpyro.sample(\"a\", dist.Normal(0.5, 1))\n", " b = numpyro.sample(\"b\", dist.Normal(0, 10))\n", " log_sigma = numpyro.sample(\"log_sigma\", dist.Normal(0, 1))\n", " mu = numpyro.deterministic(\"mu\", a + b * mass_std)\n", " numpyro.sample(\"brain_std\", dist.Normal(mu, jnp.exp(log_sigma)), obs=brain_std)\n", "\n", "\n", "m7_1 = AutoLaplaceApproximation(model)\n", "svi = SVI(\n", " model,\n", " m7_1,\n", " optim.Adam(0.3),\n", " Trace_ELBO(),\n", " mass_std=d.mass_std.values,\n", " brain_std=d.brain_std.values,\n", ")\n", "svi_result = svi.run(random.PRNGKey(0), 1000)\n", "p7_1 = svi_result.params" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Code 7.4" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 1000/1000 [00:00<00:00, 1700.78it/s, init loss: 118.9001, avg. loss [951-1000]: 6.6802]\n" ] } ], "source": [ "def model(mass_std, brain_std):\n", " intercept = numpyro.sample(\"intercept\", dist.Normal(0, 10))\n", " b_mass_std = numpyro.sample(\"b_mass_std\", dist.Normal(0, 10))\n", " sigma = numpyro.sample(\"sigma\", dist.HalfCauchy(2))\n", " mu = intercept + b_mass_std * mass_std\n", " numpyro.sample(\"brain_std\", dist.Normal(mu, sigma), obs=brain_std)\n", "\n", "\n", "m7_1_OLS = AutoLaplaceApproximation(model)\n", "svi = SVI(\n", " model,\n", " m7_1_OLS,\n", " optim=optim.Adam(0.01),\n", " loss=Trace_ELBO(),\n", " mass_std=d.mass_std.values,\n", " brain_std=d.brain_std.values,\n", ")\n", "svi_result = svi.run(random.PRNGKey(0), 1000)\n", "p7_1_OLS = svi_result.params\n", "post = m7_1_OLS.sample_posterior(random.PRNGKey(1), p7_1_OLS, sample_shape=(1000,))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Code 7.5" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DeviceArray(0.45580828, dtype=float32)" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "post = m7_1.sample_posterior(random.PRNGKey(12), p7_1, sample_shape=(1000,))\n", "s = Predictive(m7_1.model, post)(random.PRNGKey(2), d.mass_std.values)\n", "r = jnp.mean(s[\"brain_std\"], 0) - d.brain_std.values\n", "resid_var = jnp.var(r, ddof=1)\n", "outcome_var = jnp.var(d.brain_std.values, ddof=1)\n", "1 - resid_var / outcome_var" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Code 7.6" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "def R2_is_bad(quap_fit):\n", " quap, params = quap_fit\n", " post = quap.sample_posterior(random.PRNGKey(1), params, sample_shape=(1000,))\n", " s = Predictive(quap.model, post)(random.PRNGKey(2), d.mass_std.values)\n", " r = jnp.mean(s[\"brain_std\"], 0) - d.brain_std.values\n", " return 1 - jnp.var(r, ddof=1) / jnp.var(d.brain_std.values, ddof=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Code 7.7" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 2000/2000 [00:00<00:00, 3029.44it/s, init loss: 19.0172, avg. loss [1901-2000]: 6.6510]\n" ] } ], "source": [ "def model(mass_std, brain_std=None):\n", " a = numpyro.sample(\"a\", dist.Normal(0.5, 1))\n", " b = numpyro.sample(\"b\", dist.Normal(0, 10).expand([2]))\n", " log_sigma = numpyro.sample(\"log_sigma\", dist.Normal(0, 1))\n", " mu = numpyro.deterministic(\"mu\", a + b[0] * mass_std + b[1] * mass_std**2)\n", " numpyro.sample(\"brain_std\", dist.Normal(mu, jnp.exp(log_sigma)), obs=brain_std)\n", "\n", "\n", "m7_2 = AutoLaplaceApproximation(\n", " model, init_loc_fn=init_to_value(values={\"b\": jnp.repeat(0.0, 2)})\n", ")\n", "svi = SVI(\n", " model,\n", " m7_2,\n", " optim.Adam(0.3),\n", " Trace_ELBO(),\n", " mass_std=d.mass_std.values,\n", " brain_std=d.brain_std.values,\n", ")\n", "svi_result = svi.run(random.PRNGKey(0), 2000)\n", "p7_2 = svi_result.params" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Code 7.8" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 2000/2000 [00:00<00:00, 2905.53it/s, init loss: 22.2387, avg. loss [1901-2000]: 8.8866]\n", "100%|██████████| 2000/2000 [00:00<00:00, 2911.48it/s, init loss: 25.4603, avg. loss [1901-2000]: 10.8298]\n", "100%|██████████| 2000/2000 [00:00<00:00, 2650.21it/s, init loss: 28.6818, avg. loss [1901-2000]: 8.2608]\n" ] } ], "source": [ "def model(mass_std, brain_std=None):\n", " a = numpyro.sample(\"a\", dist.Normal(0.5, 1))\n", " b = numpyro.sample(\"b\", dist.Normal(0, 10).expand([3]))\n", " log_sigma = numpyro.sample(\"log_sigma\", dist.Normal(0, 1))\n", " mu = numpyro.deterministic(\n", " \"mu\", a + b[0] * mass_std + b[1] * mass_std**2 + b[2] * mass_std**3\n", " )\n", " numpyro.sample(\"brain_std\", dist.Normal(mu, jnp.exp(log_sigma)), obs=brain_std)\n", "\n", "\n", "m7_3 = AutoLaplaceApproximation(\n", " model, init_loc_fn=init_to_value(values={\"b\": jnp.repeat(0.0, 3)})\n", ")\n", "svi = SVI(\n", " model,\n", " m7_3,\n", " optim.Adam(0.01),\n", " Trace_ELBO(),\n", " mass_std=d.mass_std.values,\n", " brain_std=d.brain_std.values,\n", ")\n", "svi_result = svi.run(random.PRNGKey(0), 2000)\n", "p7_3 = svi_result.params\n", "\n", "\n", "def model(mass_std, brain_std=None):\n", " a = numpyro.sample(\"a\", dist.Normal(0.5, 1))\n", " b = numpyro.sample(\"b\", dist.Normal(0, 10).expand([4]))\n", " log_sigma = numpyro.sample(\"log_sigma\", dist.Normal(0, 1))\n", " mu = numpyro.deterministic(\n", " \"mu\", a + jnp.sum(b * jnp.power(mass_std[..., None], jnp.arange(1, 5)), -1)\n", " )\n", " numpyro.sample(\"brain_std\", dist.Normal(mu, jnp.exp(log_sigma)), obs=brain_std)\n", "\n", "\n", "m7_4 = AutoLaplaceApproximation(\n", " model, init_loc_fn=init_to_value(values={\"b\": jnp.repeat(0.0, 4)})\n", ")\n", "svi = SVI(\n", " model,\n", " m7_4,\n", " optim.Adam(0.01),\n", " Trace_ELBO(),\n", " mass_std=d.mass_std.values,\n", " brain_std=d.brain_std.values,\n", ")\n", "svi_result = svi.run(random.PRNGKey(0), 2000)\n", "p7_4 = svi_result.params\n", "\n", "\n", "def model(mass_std, brain_std=None):\n", " a = numpyro.sample(\"a\", dist.Normal(0.5, 1))\n", " b = numpyro.sample(\"b\", dist.Normal(0, 10).expand([5]))\n", " log_sigma = numpyro.sample(\"log_sigma\", dist.Normal(0, 1))\n", " mu = numpyro.deterministic(\n", " \"mu\", a + jnp.sum(b * jnp.power(mass_std[..., None], jnp.arange(1, 6)), -1)\n", " )\n", " numpyro.sample(\"brain_std\", dist.Normal(mu, jnp.exp(log_sigma)), obs=brain_std)\n", "\n", "\n", "m7_5 = AutoLaplaceApproximation(\n", " model, init_loc_fn=init_to_value(values={\"b\": jnp.repeat(0.0, 5)})\n", ")\n", "svi = SVI(\n", " model,\n", " m7_5,\n", " optim.Adam(0.01),\n", " Trace_ELBO(),\n", " mass_std=d.mass_std.values,\n", " brain_std=d.brain_std.values,\n", ")\n", "svi_result = svi.run(random.PRNGKey(0), 2000)\n", "p7_5 = svi_result.params" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Code 7.9" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 5000/5000 [00:00<00:00, 5220.55it/s, init loss: 31.9033, avg. loss [4751-5000]: 9.2877]\n" ] } ], "source": [ "def model(mass_std, brain_std=None):\n", " a = numpyro.sample(\"a\", dist.Normal(0.5, 1))\n", " b = numpyro.sample(\"b\", dist.Normal(0, 10).expand([6]))\n", " log_sigma = numpyro.sample(\"log_sigma\", dist.Normal(0, 1))\n", " mu = numpyro.deterministic(\n", " \"mu\", a + jnp.sum(b * jnp.power(mass_std[..., None], jnp.arange(1, 7)), -1)\n", " )\n", " numpyro.sample(\"brain_std\", dist.Normal(mu, jnp.exp(log_sigma)), obs=brain_std)\n", "\n", "\n", "m7_6 = AutoLaplaceApproximation(\n", " model, init_loc_fn=init_to_value(values={\"b\": jnp.repeat(0.0, 6)})\n", ")\n", "svi = SVI(\n", " model,\n", " m7_6,\n", " optim.Adam(0.003),\n", " Trace_ELBO(),\n", " mass_std=d.mass_std.values,\n", " brain_std=d.brain_std.values,\n", ")\n", "svi_result = svi.run(random.PRNGKey(0), 5000)\n", "p7_6 = svi_result.params" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Code 7.10" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "post = m7_1.sample_posterior(random.PRNGKey(1), p7_1, sample_shape=(1000,))\n", "post.pop(\"mu\")\n", "mass_seq = jnp.linspace(d.mass_std.min(), d.mass_std.max(), num=100)\n", "l = Predictive(m7_1.model, post, return_sites=[\"mu\"])(\n", " random.PRNGKey(2), mass_std=mass_seq\n", ")[\"mu\"]\n", "mu = jnp.mean(l, 0)\n", "ci = jnp.percentile(l, jnp.array([5.5, 94.5]), 0)\n", "az.plot_pair(d[[\"mass_std\", \"brain_std\"]].to_dict(\"list\"))\n", "plt.plot(mass_seq, mu, \"k\")\n", "plt.fill_between(mass_seq, ci[0], ci[1], color=\"k\", alpha=0.2)\n", "plt.title(\"m7.1: R^2 = {:0.2f}\".format(R2_is_bad((m7_1, p7_1)).item()))\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Code 7.11" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "i = 1\n", "d_minus_i = d.drop(i)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Code 7.12" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DeviceArray(0.61086434, dtype=float32)" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p = jnp.array([0.3, 0.7])\n", "-jnp.sum(p * jnp.log(p))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Code 7.13" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DeviceArray([ 0.6177206 , 0.6550026 , 0.54556274, 0.6307907 ,\n", " 0.4702301 , 0.43731594, -0.8560524 ], dtype=float32)" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def lppd_fn(seed, quad, params, num_samples=1000):\n", " post = quad.sample_posterior(random.PRNGKey(1), params, sample_shape=(num_samples,))\n", " logprob = log_likelihood(quad.model, post, d.mass_std.values, d.brain_std.values)\n", " logprob = logprob[\"brain_std\"]\n", " return logsumexp(logprob, 0) - jnp.log(logprob.shape[0])\n", "\n", "\n", "lppd_fn(random.PRNGKey(1), m7_1, p7_1, int(1e4))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Code 7.14" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DeviceArray([ 0.6177206 , 0.6550026 , 0.54556274, 0.6307907 ,\n", " 0.4702301 , 0.43731594, -0.8560524 ], dtype=float32)" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "post = m7_1.sample_posterior(random.PRNGKey(1), p7_1, sample_shape=(int(1e4),))\n", "logprob = log_likelihood(m7_1.model, post, d.mass_std.values, d.brain_std.values)\n", "logprob = logprob[\"brain_std\"]\n", "n = logprob.shape[1]\n", "ns = logprob.shape[0]\n", "f = lambda i: logsumexp(logprob[:, i]) - jnp.log(ns)\n", "lppd = vmap(f)(jnp.arange(n))\n", "lppd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Code 7.15" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "UserWarning: Hessian of log posterior at the MAP point is singular. Posterior samples from AutoLaplaceApproxmiation will be constant (equal to the MAP point). Please consider using an AutoNormal guide.\n" ] }, { "data": { "text/plain": [ "[2.500570297241211,\n", " 2.5938844680786133,\n", " 3.6698102951049805,\n", " 5.338682174682617,\n", " 14.092883110046387,\n", " 19.871124267578125]" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[\n", " jnp.sum(lppd_fn(random.PRNGKey(1), m[0], m[1])).item()\n", " for m in (\n", " (m7_1, p7_1),\n", " (m7_2, p7_2),\n", " (m7_3, p7_3),\n", " (m7_4, p7_4),\n", " (m7_5, p7_5),\n", " (m7_6, p7_6),\n", " )\n", "]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Code 7.16" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n", "2\n", "3\n", "4\n", "5\n" ] } ], "source": [ "def model(mm, y, b_sigma):\n", " a = numpyro.param(\"a\", jnp.array([0.0]))\n", " Bvec = a\n", " k = mm.shape[1]\n", " if k > 1:\n", " b = numpyro.sample(\"b\", dist.Normal(0, b_sigma).expand([k - 1]))\n", " Bvec = jnp.concatenate([Bvec, b])\n", " mu = jnp.matmul(mm, Bvec)\n", " numpyro.sample(\"y\", dist.Normal(mu, 1), obs=y)\n", "\n", "\n", "def sim_train_test(i, N=20, k=3, rho=[0.15, -0.4], b_sigma=100):\n", " n_dim = max(k, 3)\n", " Rho = jnp.identity(n_dim)\n", " Rho = Rho.at[1 : len(rho) + 1, 0].set(jnp.array(rho))\n", " Rho = Rho.at[0, 1 : len(rho) + 1].set(jnp.array(rho))\n", "\n", " X_train = dist.MultivariateNormal(jnp.zeros(n_dim), Rho).sample(\n", " random.fold_in(random.PRNGKey(0), i), (N,)\n", " )\n", " mm_train = jnp.ones((N, 1))\n", " if k > 1:\n", " mm_train = jnp.concatenate([mm_train, X_train[:, 1:k]], axis=1)\n", "\n", " if k > 1:\n", " m = AutoLaplaceApproximation(\n", " model, init_loc_fn=init_to_value(values={\"b\": jnp.zeros(k - 1)})\n", " )\n", " else:\n", " m = lambda mm, y, b_sigma: None\n", " svi = SVI(\n", " model,\n", " m,\n", " optim.Adam(0.3),\n", " Trace_ELBO(),\n", " mm=mm_train,\n", " y=X_train[:, 0],\n", " b_sigma=b_sigma,\n", " )\n", " svi_result = svi.run(random.fold_in(random.PRNGKey(1), i), 1000, progress_bar=False)\n", " params = svi_result.params\n", " coefs = params[\"a\"]\n", " if k > 1:\n", " coefs = jnp.concatenate([coefs, m.median(params)[\"b\"]])\n", "\n", " logprob = dist.Normal(jnp.matmul(mm_train, coefs)).log_prob(X_train[:, 0])\n", " dev_train = (-2) * jnp.sum(logprob)\n", "\n", " X_test = dist.MultivariateNormal(jnp.zeros(n_dim), Rho).sample(\n", " random.fold_in(random.PRNGKey(2), i), (N,)\n", " )\n", " mm_test = jnp.ones((N, 1))\n", " if k > 1:\n", " mm_test = jnp.concatenate([mm_test, X_test[:, 1:k]], axis=1)\n", " logprob = dist.Normal(jnp.matmul(mm_test, coefs)).log_prob(X_test[:, 0])\n", " dev_test = (-2) * jnp.sum(logprob)\n", " return jnp.stack([dev_train, dev_test])\n", "\n", "\n", "def dev_fn(N, k):\n", " print(k)\n", " r = lax.map(lambda i: sim_train_test(i, N, k), jnp.arange((int(1e4))))\n", " return jnp.concatenate([jnp.mean(r, 0), jnp.std(r, 0)])\n", "\n", "\n", "N = 20\n", "kseq = range(1, 6)\n", "dev = jnp.stack([dev_fn(N, k) for k in kseq], axis=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Code 7.17" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "def dev_fn(N, k):\n", " print(k)\n", " r = vmap(lambda i: sim_train_test(i, N, k))(jnp.arange((int(1e4))))\n", " return jnp.concatenate([jnp.mean(r, 0), jnp.std(r, 0)])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Code 7.18" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "image/png": "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1/EAAABAVVPmsH3PPfeUa73s3bt3u30sAAAAUBWVOWwPGDCgSNhOT0/XF198IYvFopYtW6p+/fqSpBMnTig1NVWGYah79+5levgNAAAAcKUpc9h+9dVXnd6npaVp8ODB6tq1q8aNG6err77aaf+PP/6ov/3tb9qzZ4/mz5/vmdoCAAAAkrKzpUaNLg7oHj0qr10i1+2H2rz55puy2+2aMWNGkaAtSVdffbWmTZsmu92uN954o1yVBAAAAKoit8P2xo0b1b59e1WrVq3EMtWrV1f79u21ceNGdy8DAAAAVFluh+2srCylp6dftlx6erqys7PdvQwAAABQZbkdtps3b66tW7cqOTm5xDLJycnasmWLmjdv7u5lAAAAgCrL7YfaPPjgg/rLX/6iBx54QAMGDNCtt96q+vXry2Kx6Pjx4/rss8+0dOlSFRQU6MEHH/RknQEAAIAqwe2wfcstt2jcuHF6/fXXNX/+fC1YsMBpv2EY8vf319ixY3XLLbeUu6IAAABAVVOux7UnJiaqR48eWrRokbZv3660tDQZhqGoqChdf/31GjRokBo1auSpugIAAABVSrnCtiQ1aNBAf/nLXzxRFwAAAOCK4vYNkgAAAABKR9gGAAAATELYBgAAAExC2AYAAABMQtgGAAAATELYBgAAAExC2AYAAABMQtgGAAAATELYBgAAAExC2AYAAABMQtgGAAAATELYBgAAAExC2AYAAABMQtgGAAAATELYBgAAAExC2AYAAABMQtgGAAAATELYBgAAAExC2AYAAABMQtgGAAAATELYBgAAAExiq+wKAPB+M2fO1L59+7R3716dOnVKffr00QsvvFCknGEYWrNmjRYtWqQjR44oOztboaGhatq0qXr27Kn+/fs7ynbu3Nnx2s/PT0FBQapTp47i4uLUt29fxcXFVchnAwDATIRtAJf10UcfqVmzZurWrZuWL19eYrkZM2Zo7ty56t+/v4YOHaqgoCD99NNP2rZtmzZs2OAUtiWpZ8+eGjJkiAzDUHZ2tg4cOKCVK1dqyZIluvPOOzVmzBizPxoAAKYibAO4rHXr1snP7+Kss88++6zYMrm5uZo/f7769OmjZ555xmlf3759VVBQUOSY8PBwpxHszp0766677tKrr76qBQsW6KqrrtIf/vAHD34SAAAqFnO2AVxWYdAuTW5urvLy8lS7dm23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GXDYtGmTcezYMcMwDGPWrFlGdHS08fHHH7t0jm+++caIjo42hgwZYpw/f96x/euvvzZiYmKMoUOHerTOlckT7bV582YjOjramDJlihlV9Cqff/65sXXr1iLbt27darRq1cro2LGjU58pia/0MU+1ly/1sfz8fOPChQtFtp89e9bo06ePER0dbezdu/ey5/GVPuap9vKlPlYoPz/f+MMf/mDcfvvtxhNPPGFER0cb3333XZmP95U+Vqi87eVLfaxHjx5Gjx49ynUOb+tfzNm+RJcuXdSgQYNynWPhwoWSpMcee0wBAQGO7TfccIO6deumrVu36scffyzXNbyFJ9rLl/Tu3Vvt27cvsr19+/bq1KmTzpw5oz179lz2PL7SxzzVXr7EarXKZiv6hWVwcLC6desmSTp8+PBlz+MrfcxT7eWLkpKSlJqaqgkTJshqtbp8vK/0sULlbS+4xtv6F2Hbw7799lsFBgaqXbt2RfYV/vDeunVrRVfL6x06dEjvvfee3n77bS1fvlynT5+u7CpVqMJf+MX94v8t+phr7VXIl/vY+fPntXnzZlksljJ9derrfczV9irkK31s7969mjZtmh5++GE1b97crXP4Uh/zRHsV8pU+lpeXp8WLF2vmzJn64IMPlJqa6tLx3ta/mLPtQTk5OTp16pSio6OL/cu1cEL+oUOHKrZiVcDy5cu1fPlyx/vq1avr0Ucf1fDhwyuxVhXjxIkT+vrrrxUZGano6OhSy9LHXGuvS/lSH8vMzNS7776rgoIC/frrr9qwYYN++uknPfLII5e9McgX+1h52utSvtDH8vPzNXbsWF1zzTX605/+5NY5fKmPeaK9LuULfUySTp06pbFjxzptu/HGG/X6668rPDy81GO9sX8Rtj3o7Nmzki5+BVmcwu1ZWVkVVidvFx4erqeeeko333yz6tevr8zMTH377bd644039Pe//13BwcG66667Kruaprlw4YKeeuop5eXl6Yknnrjs14u+3sdcbS/JN/tYZmampk2b5njv7++vp556Svfff/9lj/XFPlae9pJ8q4/NnDlTe/bs0YIFC+Tv7+/WOXypj3mivSTf6mODBg1Sx44d1axZMwUEBOjAgQOaNm2aNmzYoBEjRujDDz8sdZUgb+xfhG1UqubNmzt9rVajRg3169dPLVq00KBBgzR16lTdeeed8vO78mY8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NBUUFBRb19OnT+u1117TLbfcomuvvVYdOnTQ8OHDtXXr1iKf6d577y3S7jExMZo6dapT2WPHjumFF15Qz549FRcXp86dO2vUqFFKTU0tcv1PPvnEcY4ff/xRo0ePVpcuXdSiRQutWbNGkpSTk6O3335b/fv3V/v27dW2bVv16tVLo0aN0ldffVXs5wJgHqaRADDFhQsXdP/992v//v269tpr1bRpU23dulVvvvmmsrOzNXr0aI9da8KECfroo4/Upk0bNWzYUFu2bNEbb7yhc+fOqWvXrnrggQfUoEEDde7cWampqVq7dq327dunTz/9VNWrVy9yvs8++0wffvih4uLi1KNHD+3Zs0erV6/W5s2bNW/ePLVo0cKp/HvvvacJEybIz89PrVu3VlRUlPbt26e5c+dq/fr1+vDDDxUVFVXkOsuXL9fChQsVFxenm266SUeOHJHFYrns533hhRc0f/58VatWTZ07d1b16tW1ZcsWTZo0SevXr9ecOXMcn2vgwIE6deqUNm7cqMaNG+v666+XJDVt2rTM7etKexw7dkzjxo1TRESEmjZtqtatW+uXX37Rd999p+TkZB08eFCPPvposdcprT1ef/117d69W82bN1fnzp2Vl5enXbt2KSkpSV988YXmz5+voKCgIufMyMjQ4MGDdf78eV133XU6deqUtm/frvvvv18LFy7U/PnztWDBArVp00YNGjTQli1bNHXqVF24cKFIHz1w4ID++Mc/6uTJk2rcuLG6d++uM2fOaPPmzdq0aZNef/11JSQkSJKuv/76Yttdklq2bOl4nZycrIceekhZWVlq3ry5evbsqbS0NK1atUpffvmlZs2apc6dOxf5XD/++KNuv/121apVS506dVJmZqZsNpvsdrvuv/9+fffdd6pbt646duwof39/nTx5Ul988YUCAwN14403lvnfHoAHGADgQUePHjWio6ON6OhoY8iQIcavv/7q2Pf9998bsbGxRps2bYysrKwixyQmJhZ7zilTphjR0dHGxx9/7LS9R48eRnR0tHHjjTcae/fudWzfv3+/ERcXZ7Rp08bo0aOHMXv2bMe+8+fPG/fee68RHR1tLFq0yOl8Tz/9tKPu8+fPd2wvKCgw/v73vxvR0dHGwIEDnY757rvvjBYtWhg9evQwdu/e7XTMtGnTjOjoaOPRRx8t8TorVqwoqSmL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/fTTSk5OLnKukydPevQR6YUPqJk6darTSHFWVpZeeeUVGYahwYMHO6ZYeIIr7dGkSRNlZmYWCehz5szRt99+69b1mzRpIuni6h2Xztnev3+/3njjDbfO6apbbrlFTZs21eLFi/X2228XmTuel5enVatWac+ePY5thSP+P/74Y7HnHDx4sMLDwzVr1ix9/PHHRf5oyMnJ0ZIlS1z6Zmfz5s36+uuvi0y9On78uA4cOCCLxVLiPHYA5mAaCQCvMHLkSD3wwAOaMGGCVq5cqYiICO3atUvnzp3TwIEDtXjx4gqry913361x48Zp/vz5aty4sfbs2aN9+/YpKChIEydOdCrboUMHPffcc5owYYKGDh2qmJgYNWnSROfPn9eJEyd04MABBQYGemye7K233qrBgwdr/vz56tu3r9NDbU6fPq3rrrtOo0aN8si1CrnSHn/605/05JNPavTo0Xr//fdVt25dpaam6uDBgxo2bJjmzJnj8vUHDRqk2bNna/369br11lt17bXXKiMjQ1u3blV8fLx++OGHyz4RtLxsNpumTZum4cOH680339R7772nmJgYBQcH6+eff9bBgweVmZmp6dOnO55q2rBhQ8XExGjnzp26/fbb1bx5c/n5+alnz56Kj49XaGiopk2bphEjRujZZ5/V9OnT1bx5cwUEBOjEiRM6ePCgI3CXdMPxb6WmpmrixIkKDw9Xq1atHKuubN26VefPn9d9991H2AYqGGEbgFfo0qWL3nrrLU2bNk27du1SYGCgbrjhBj3xxBMVGrQl6fe//726d++uWbNmae3atbLZbIqPj9eYMWPUrFmzIuUTExN13XXXac6cOUpOTta6desUFBSkOnXq6K677iqyhnJ5jR8/Xu3atdNHH32kLVu2yG63q3Hjxrrvvvs0bNiwYudyl4cr7dGvXz+FhoZqxowZ2r17t/bu3au4uDi9+OKLMgzDrbAdFhamRYsW6e9//7u2bt2qdevWqWHDhho1apQeeOAB/e53v/PQJy3dNddcoyVLlmju3LlavXq1tm/fLsMwFBkZqfbt2+t3v/tdkSUgp06dqtdff13JycnatWuXCgoKVLduXce87+uvv17Lli3TnDlz9MUXX2jz5s3y8/NTVFSUbr75Zv3ud7/TNddcU+Y69ujRQ2fOnNG3336r1NRUnTlzRuHh4Wrfvr2GDBlS4jKDAMxjMSpishsAoMoZO3asFi9erPfee0+dOnWq7OoAQJXEnG0AAADAJIRtAAAAwCSEbQAAAMAkzNkGAAAATMLINgAAAGASwjYAAABgEsI2AAAAYBLCNgAAAGASwjYAAABgEsI2AAAAYBLCNgAAAGASwjYAAABgkv8HZRSkOc0tdmwAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.subplot(\n", " ylim=(jnp.min(dev[0]).item() - 5, jnp.max(dev[0]).item() + 12),\n", " xlim=(0.9, 5.2),\n", " xlabel=\"number of parameters\",\n", " ylabel=\"deviance\",\n", ")\n", "plt.title(\"N = {}\".format(N))\n", "plt.scatter(jnp.arange(1, 6), dev[0], s=80, color=\"b\")\n", "plt.scatter(jnp.arange(1.1, 6), dev[1], s=80, color=\"k\")\n", "pts_int = (dev[0] - dev[2], dev[0] + dev[2])\n", "pts_out = (dev[1] - dev[3], dev[1] + dev[3])\n", "plt.vlines(jnp.arange(1, 6), pts_int[0], pts_int[1], color=\"b\")\n", "plt.vlines(jnp.arange(1.1, 6), pts_out[0], pts_out[1], color=\"k\")\n", "plt.annotate(\n", " \"in\", (2, dev[0][1]), xytext=(-25, -5), textcoords=\"offset pixels\", color=\"b\"\n", ")\n", "plt.annotate(\"out\", (2.1, dev[1][1]), xytext=(10, -5), textcoords=\"offset pixels\")\n", "plt.annotate(\n", " \"+1SD\",\n", " (2.1, pts_out[1][1]),\n", " xytext=(10, -5),\n", " textcoords=\"offset pixels\",\n", " fontsize=12,\n", ")\n", "plt.annotate(\n", " \"-1SD\",\n", " (2.1, pts_out[0][1]),\n", " xytext=(10, -5),\n", " textcoords=\"offset pixels\",\n", " fontsize=12,\n", ")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Code 7.19" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 5000/5000 [00:00<00:00, 5122.07it/s, init loss: 210883.8125, avg. loss [4751-5000]: 227.2560]\n" ] } ], "source": [ "cars = pd.read_csv(\"../data/cars.csv\", sep=\",\")\n", "\n", "\n", "def model(speed, cars_dist):\n", " a = numpyro.sample(\"a\", dist.Normal(0, 100))\n", " b = numpyro.sample(\"b\", dist.Normal(0, 10))\n", " sigma = numpyro.sample(\"sigma\", dist.Exponential(1))\n", " mu = a + b * speed\n", " numpyro.sample(\"dist\", dist.Normal(mu, sigma), obs=cars_dist)\n", "\n", "\n", "m = AutoLaplaceApproximation(model)\n", "svi = SVI(\n", " model,\n", " m,\n", " optim.Adam(1),\n", " Trace_ELBO(),\n", " speed=cars.speed.values,\n", " cars_dist=cars.dist.values,\n", ")\n", "svi_result = svi.run(random.PRNGKey(0), 5000)\n", "params = svi_result.params\n", "post = m.sample_posterior(random.PRNGKey(94), params, sample_shape=(1000,))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Code 7.20" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "n_samples = 1000\n", "\n", "\n", "def logprob_fn(s):\n", " mu = post[\"a\"][s] + post[\"b\"][s] * cars.speed.values\n", " return dist.Normal(mu, post[\"sigma\"][s]).log_prob(cars.dist.values)\n", "\n", "\n", "logprob = vmap(logprob_fn, out_axes=1)(jnp.arange(n_samples))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Code 7.21" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "n_cases = cars.shape[0]\n", "lppd = logsumexp(logprob, 1) - jnp.log(n_samples)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Code 7.22" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "pWAIC = jnp.var(logprob, 1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Code 7.23" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DeviceArray(422.99088, dtype=float32)" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "-2 * (jnp.sum(lppd) - jnp.sum(pWAIC))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Code 7.24" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DeviceArray(17.235405, dtype=float32)" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "waic_vec = -2 * (lppd - pWAIC)\n", "jnp.sqrt(n_cases * jnp.var(waic_vec))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Code 7.25" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 1000/1000 [00:00<00:00, 1252.99it/s, init loss: 279.8950, avg. loss [951-1000]: 204.3793]\n", "100%|██████████| 1000/1000 [00:01<00:00, 821.21it/s, init loss: 151456.4062, avg. loss [951-1000]: 168.2294]\n", "100%|██████████| 1000/1000 [00:01<00:00, 981.14it/s, init loss: 87469.1172, avg. loss [951-1000]: 198.4736]\n", "UserWarning: For one or more samples the posterior variance of the log predictive densities exceeds 0.4. This could be indication of WAIC starting to fail. \n", "See http://arxiv.org/abs/1507.04544 for details\n" ] }, { "data": { "text/plain": [ "Computed from 1000 by 100 log-likelihood matrix\n", "\n", " Estimate SE\n", "deviance_waic 337.37 11.86\n", "p_waic 3.36 -\n", "\n", "There has been a warning during the calculation. Please check the results." ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "with numpyro.handlers.seed(rng_seed=71):\n", " # number of plants\n", " N = 100\n", "\n", " # simulate initial heights\n", " h0 = numpyro.sample(\"h0\", dist.Normal(10, 2).expand([N]))\n", "\n", " # assign treatments and simulate fungus and growth\n", " treatment = jnp.repeat(jnp.arange(2), repeats=N // 2)\n", " fungus = numpyro.sample(\n", " \"fungus\", dist.Binomial(total_count=1, probs=(0.5 - treatment * 0.4))\n", " )\n", " h1 = h0 + numpyro.sample(\"diff\", dist.Normal(5 - 3 * fungus))\n", "\n", " # compose a clean data frame\n", " d = pd.DataFrame({\"h0\": h0, \"h1\": h1, \"treatment\": treatment, \"fungus\": fungus})\n", "\n", "\n", "def model(h0, h1):\n", " p = numpyro.sample(\"p\", dist.LogNormal(0, 0.25))\n", " sigma = numpyro.sample(\"sigma\", dist.Exponential(1))\n", " mu = h0 * p\n", " numpyro.sample(\"h1\", dist.Normal(mu, sigma), obs=h1)\n", "\n", "\n", "m6_6 = AutoLaplaceApproximation(model)\n", "svi = SVI(model, m6_6, optim.Adam(0.1), Trace_ELBO(), h0=d.h0.values, h1=d.h1.values)\n", "svi_result = svi.run(random.PRNGKey(0), 1000)\n", "p6_6 = svi_result.params\n", "\n", "\n", "def model(treatment, fungus, h0, h1):\n", " a = numpyro.sample(\"a\", dist.LogNormal(0, 0.2))\n", " bt = numpyro.sample(\"bt\", dist.Normal(0, 0.5))\n", " bf = numpyro.sample(\"bf\", dist.Normal(0, 0.5))\n", " sigma = numpyro.sample(\"sigma\", dist.Exponential(1))\n", " p = a + bt * treatment + bf * fungus\n", " mu = h0 * p\n", " numpyro.sample(\"h1\", dist.Normal(mu, sigma), obs=h1)\n", "\n", "\n", "m6_7 = AutoLaplaceApproximation(model)\n", "svi = SVI(\n", " model,\n", " m6_7,\n", " optim.Adam(0.3),\n", " Trace_ELBO(),\n", " treatment=d.treatment.values,\n", " fungus=d.fungus.values,\n", " h0=d.h0.values,\n", " h1=d.h1.values,\n", ")\n", "svi_result = svi.run(random.PRNGKey(0), 1000)\n", "p6_7 = svi_result.params\n", "\n", "\n", "def model(treatment, h0, h1):\n", " a = numpyro.sample(\"a\", dist.LogNormal(0, 0.2))\n", " bt = numpyro.sample(\"bt\", dist.Normal(0, 0.5))\n", " sigma = numpyro.sample(\"sigma\", dist.Exponential(1))\n", " p = a + bt * treatment\n", " mu = h0 * p\n", " numpyro.sample(\"h1\", dist.Normal(mu, sigma), obs=h1)\n", "\n", "\n", "m6_8 = AutoLaplaceApproximation(model)\n", "svi = SVI(\n", " model,\n", " m6_8,\n", " optim.Adam(1),\n", " Trace_ELBO(),\n", " treatment=d.treatment.values,\n", " h0=d.h0.values,\n", " h1=d.h1.values,\n", ")\n", "svi_result = svi.run(random.PRNGKey(0), 1000)\n", "p6_8 = svi_result.params\n", "\n", "post = m6_7.sample_posterior(random.PRNGKey(11), p6_7, sample_shape=(1000,))\n", "logprob = log_likelihood(\n", " m6_7.model,\n", " post,\n", " treatment=d.treatment.values,\n", " fungus=d.fungus.values,\n", " h0=d.h0.values,\n", " h1=d.h1.values,\n", ")\n", "az6_7 = az.from_dict(sample_stats={\"log_likelihood\": logprob[\"h1\"][None, ...]})\n", "az.waic(az6_7, scale=\"deviance\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Code 7.26" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "UserWarning: The default method used to estimate the weights for each model,has changed from BB-pseudo-BMA to stacking\n", "UserWarning: For one or more samples the posterior variance of the log predictive densities exceeds 0.4. This could be indication of WAIC starting to fail. \n", "See http://arxiv.org/abs/1507.04544 for details\n", "UserWarning: For one or more samples the posterior variance of the log predictive densities exceeds 0.4. This could be indication of WAIC starting to fail. \n", "See http://arxiv.org/abs/1507.04544 for details\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
rankwaicp_waicd_waicweightsedsewarningwaic_scale
m6.70337.2444303.3081650.0000001.000000e+0011.8445690.000000Truedeviance
m6.81399.7584703.08942962.5140390.000000e+0014.94181713.865603Truedeviance
m6.62409.2007951.71208771.9563647.406298e-1212.40200412.789497Falsedeviance
\n", "
" ], "text/plain": [ " rank waic p_waic d_waic weight se \\\n", "m6.7 0 337.244430 3.308165 0.000000 1.000000e+00 11.844569 \n", "m6.8 1 399.758470 3.089429 62.514039 0.000000e+00 14.941817 \n", "m6.6 2 409.200795 1.712087 71.956364 7.406298e-12 12.402004 \n", "\n", " dse warning waic_scale \n", "m6.7 0.000000 True deviance \n", "m6.8 13.865603 True deviance \n", "m6.6 12.789497 False deviance " ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "post = m6_6.sample_posterior(random.PRNGKey(77), p6_6, sample_shape=(1000,))\n", "logprob = log_likelihood(m6_6.model, post, h0=d.h0.values, h1=d.h1.values)\n", "az6_6 = az.from_dict({}, log_likelihood={\"h1\": logprob[\"h1\"][None, ...]})\n", "post = m6_7.sample_posterior(random.PRNGKey(77), p6_7, sample_shape=(1000,))\n", "logprob = log_likelihood(\n", " m6_7.model,\n", " post,\n", " treatment=d.treatment.values,\n", " fungus=d.fungus.values,\n", " h0=d.h0.values,\n", " h1=d.h1.values,\n", ")\n", "az6_7 = az.from_dict({}, log_likelihood={\"h1\": logprob[\"h1\"][None, ...]})\n", "post = m6_8.sample_posterior(random.PRNGKey(77), p6_8, sample_shape=(1000,))\n", "logprob = log_likelihood(\n", " m6_8.model, post, treatment=d.treatment.values, h0=d.h0.values, h1=d.h1.values\n", ")\n", "az6_8 = az.from_dict({}, log_likelihood={\"h1\": logprob[\"h1\"][None, ...]})\n", "az.compare({\"m6.6\": az6_6, \"m6.7\": az6_7, \"m6.8\": az6_8}, ic=\"waic\", scale=\"deviance\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Code 7.27" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "UserWarning: For one or more samples the posterior variance of the log predictive densities exceeds 0.4. This could be indication of WAIC starting to fail. \n", "See http://arxiv.org/abs/1507.04544 for details\n", "UserWarning: For one or more samples the posterior variance of the log predictive densities exceeds 0.4. This could be indication of WAIC starting to fail. \n", "See http://arxiv.org/abs/1507.04544 for details\n" ] }, { "data": { "text/plain": [ "DeviceArray(13.789175, dtype=float32)" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "post = m6_7.sample_posterior(random.PRNGKey(91), p6_7, sample_shape=(1000,))\n", "logprob = log_likelihood(\n", " m6_7.model,\n", " post,\n", " treatment=d.treatment.values,\n", " fungus=d.fungus.values,\n", " h0=d.h0.values,\n", " h1=d.h1.values,\n", ")\n", "az6_7 = az.from_dict({}, log_likelihood={\"h1\": logprob[\"h1\"][None, ...]})\n", "waic_m6_7 = az.waic(az6_7, pointwise=True, scale=\"deviance\")\n", "post = m6_8.sample_posterior(random.PRNGKey(91), p6_8, sample_shape=(1000,))\n", "logprob = log_likelihood(\n", " m6_8.model, post, treatment=d.treatment.values, h0=d.h0.values, h1=d.h1.values\n", ")\n", "az6_8 = az.from_dict({}, log_likelihood={\"h1\": logprob[\"h1\"][None, ...]})\n", "waic_m6_8 = az.waic(az6_8, pointwise=True, scale=\"deviance\")\n", "n = waic_m6_7.n_data_points\n", "diff_m6_7_m6_8 = waic_m6_7.waic_i.values - waic_m6_8.waic_i.values\n", "jnp.sqrt(n * jnp.var(diff_m6_7_m6_8))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Code 7.28" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DeviceArray([12.960003, 67.03999 ], dtype=float32, weak_type=True)" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "40.0 + jnp.array([-1, 1]) * 10.4 * 2.6" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Code 7.29" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "UserWarning: The default method used to estimate the weights for each model,has changed from BB-pseudo-BMA to stacking\n", "UserWarning: For one or more samples the posterior variance of the log predictive densities exceeds 0.4. This could be indication of WAIC starting to fail. \n", "See http://arxiv.org/abs/1507.04544 for details\n", "UserWarning: For one or more samples the posterior variance of the log predictive densities exceeds 0.4. This could be indication of WAIC starting to fail. \n", "See http://arxiv.org/abs/1507.04544 for details\n" ] }, { "data": { "image/png": "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YMAA0yUAAGBrhDFYqlq1qukSAACwNYYpYen777/X999/b7oMAABsizAGS8ePH9fx48dNlwEAgG0RxgAAAAwijAEAABhEGAMAADCIMAYAAGCQh8PhcJguAgAA4E7FnTEAAACDCGMAAAAGEcYAAAAMIowBAAAYRBgDAAAwiDCGMklMTNSAAQMUFhamdu3aacCAAVq3bt0t950xY4ZCQkL0wQcfFNmem5urN954Q506dVL79u314osv6ty5cxVQvb2VpjcpKSkaM2aMwsLC1LZtW0VFRSklJcX5OL1xnZL6k52drVmzZqlr165q06aNHnvsMf3lL38pcg76UzGWLl2qkJAQvfHGG85tDodDixYtUkREhNq0aaPf//73+vHHH4scR38qxo39ycvL09tvv61+/fqpXbt2ioiI0IQJE5SamlrkOHfuD2EMZVK3bl299NJLWr16tT777DMNGDBA06ZN0/bt24vst3nzZv3www8KDg6+6Rx//OMflZSUpNjYWMXFxen8+fN68cUXxSort6ek3pw8eVJPP/20GjdurI8++kh///vfNW7cONWoUcN5DnrjOiX1Z+7cufriiy/05ptvasOGDRoxYoTmzZtXJLDRH9fbt2+fEhISFBISUmT7n/70J3300UeaOXOmEhISVLNmTT333HO6cuWKcx/643q36s+VK1d06NAhjR49WomJiVqyZIlOnz6t559/Xvn5+c793Lo/DuA2DRgwwDFv3jznx6dOnXJEREQ4jh8/7ujRo4djxYoVzscuXbrkaNWqlWP9+vXObcePH3e0aNHC8Y9//KNC674TXN+b8ePHO8aPH1/svvSm4l3fnyeeeMKxcOHCIo8/88wzjtdff93hcNCfinDp0iVHZGSkIzk52TFs2DDnc19YWOjo0qWLY+nSpUX2bd26tWPdunXOj+mPaxXXn1s5duyYo0WLFo4jR444j3Xn/nBnDL9ZYWGhvv76a6WkpCgsLEySlJ+frwkTJmj06NFq3rz5TcccOHBAeXl56ty5s3Nb8+bN1aBBA+3bt6+iSre9G3tTWFiozz//XPfdd59GjBih8PBwDRo0SBs3bnQeQ28qzq1eOx06dNAXX3yh06dPS5K+++47HTlyRA8//LAk+lMRZsyYoccee0zh4eFFtp86dUppaWlFnns/Pz+1adPG+dzTH9crrj+38ssvv0iSateuLcn9++NpugBUPqmpqXriiSeUm5urKlWq6LXXXlO3bt0kSYsXL1bt2rX1zDPP3PLY8+fPq2rVqgoICCiyPTAwUOfPn3d57XZXXG/S0tL066+/aunSpRo3bpxeeeUV7dq1SxMnTlSNGjXUvXt3elMBrF4706dPV0xMjLp37y5Pz6vfmqdNm6YePXpI4rXjagkJCfrXv/6lt95666bH0tLSJF0dar7e9c89/XEtq/7cKDc3V3PnzlWPHj1Ur149Se7fH8IYyiw4OFjr1q1Tdna2vv76a82ZM0eNGzdW1apVlZiYqE8//bTM53Q4HPLw8HBBtXeW4nrTrFkzSVJkZKSGDx8uSXrggQf0ww8/KD4+Xt27dy/2nPSm/BTXn/DwcP31r3/Vt99+qyVLlqhx48bat2+f3nzzTQUHB+uRRx4p9pz05/b9+OOPWrBggeLj4+Xt7V3sfjc+z6V57unP7SttfySpoKBAkyZN0sWLF7VkyZISz+0u/SGMocw8PT11zz33SJJatmypEydOaNmyZerYsaPS0tIUERHh3LegoEDz5s3TRx99pC+//FKBgYEqKChQRkaG6tSp49zvwoULN/3WibIrrjfLly+Xp6fnTUPHzZs3dw5V0hvXK64/7du317x58xQbG6vIyEhJUkhIiI4fP67ly5frkUceoT8utG/fPmVkZKhfv37ObQUFBfrHP/6hTz75RH//+98lXb270qBBA+c+Fy5c0H333SeJ148rldSfffv2ydvb2zlN5siRI4qLiyvSB3fvD2EMt62wsFA5OTl65pln9NhjjxV57LnnnlPfvn315JNPSpJat24tLy8v7dq1S3369JF0dbmF1NRUtWvXrqJLt71rvfH29lZoaGiRZSwk6cSJE2rYsKEkemPCtf7k5+crPz9fVaoUncZbtWpV5//pj+v06tVLrVu3LrJt6tSpatKkiUaOHKmmTZsqKChIO3fuVGhoqKSrc5K+//57vrdVgJL64+Xlpby8PL3yyis6duyYVq5cedM7+d29P4QxlMnChQvVqVMnNWrUSDk5Odq+fbs+++wzvfbaa6pbt+5Nv2F4eXkpMDDQOUzm5+enQYMG6a233lJAQID8/Pw0e/ZstWnTRh07djTxKdmGVW8k6fnnn9fLL7+ssLAwPfTQQ9q9e7c2btyo9957TxK9cTWr/vj6+urBBx/UvHnzVL16dTVu3FjfffedVq9erVGjRkmiP65Uq1Yt1apVq8i2GjVqyN/fXy1atJAk/f73v9fy5cvVrFkz3XXXXVq4cKECAwOdv4DSH9cpqT/5+fkaO3asDhw4oKVLl6pKlSrOeX5+fn6qVq2a2/eHMIYyuXTpkl599VWdO3dONWrUUNOmTfX22287f9MojWnTpqlKlSoaN26ccnNz1blzZ8XExLjFuH1lVlJvevXqpTfeeEPLli3TH//4R91zzz168803i8wXozeuU1J/FixYoAULFmjy5MnKzMxUgwYNNHLkSD3//PPOc9Afc1544QVdvnxZM2fO1KVLl9S+fXutWLFC1apVc+5Df8w4c+aMPv/8c0nSwIEDizw2Z84c5zZ37o+Hw+EOq50BAADcmVhnDAAAwCDCGAAAgEGEMQAAAIMIYwAAAAYRxgAAAAwijAEAABhEGAMAADCIMAYAAGAQYQyAW1m8eLFCQkIUEhKi+++/X7/73e80aNAgvfPOO84/cVLeQkJCtGrVKpecGwBKwp9DAuB2/Pz8tGLFCklSVlaWDh06pI8//lirV6/WihUrbvqjwbdr9erVaty4cbmeEwBKiz+HBMCtLF68WKtWrdLu3buLbL906ZKGDh2qK1euaPPmzapataqhCgGgfDFMCaBSqFWrliZOnKh//etf2rFjhyQpJydHb731lrp166bWrVurf//+2r59u/OYyZMn6z//8z9vOtfHH3+sNm3aKDs7W9LNw5Tbtm3T8OHDFR4erg4dOujJJ5/Ul19+WeQcixcvVqdOnXTw4EENHjxYbdu21YABA7Rnz56brpeQkKB+/fopNDRUnTt31tixY5WVleV8fM+ePRo2bJjatm2rTp06afr06frll19u7wkDUGkQxgBUGuHh4fL09NT+/fslSWPHjtXatWs1cuRILV26VK1atdLo0aN1+PBhSVKfPn30ww8/6OTJk0XOs3HjRnXv3l01a9a85XVOnTqlnj176q233tLixYvVoUMHjRgx4qagdeXKFU2ZMkVDhgzRokWL5O3trRdffFGXL1927rNkyRK99tprevDBB/Xee+8pJiZGvr6++vXXXyVJ3377rZ599lkFBgZq0aJFmjp1qrZt26Zp06aV2/MGwL0xZwxApeHt7a2AgACdP39eO3fu1LZt2xQXF6cHH3xQkhQREaETJ07o/fff16JFi9SlSxfVrl1bmzZt0ogRIyRJ586d0549e/TOO+8Ue51hw4Y5/19YWKhOnTrp+PHjWrNmjcLCwpyPXblyRdOmTVN4eLgkKSgoSFFRUfrmm2/UrVs3Xbp0ScuWLdPw4cM1efJk53GPPvqo8//z589X+/btFRsb69wWHBys4cOH65///KdatGhxe08aALfHnTEAlcq1aa7JyckKCgpShw4dlJ+f7/zXpUsXHThwQJLk6empRx99VBs3bnQev3nzZlWrVk3du3cv9hqpqan6n//5Hz388MNq2bKlWrVqpR07dujEiRNF9vPy8lKnTp2cH997772SpLNnz0qS9u7dqytXrmjAgAG3vM7ly5e1b98+Pf7440U+h7CwMHl5eengwYNlfXoAVELcGQNQaeTk5CgzM1OBgYE6e/as0tLS1KpVq5v2u35yf58+fZSQkKCUlBQ1bdpUGzduVM+ePVWtWrVbXqOwsFCjR4/W5cuXNXbsWN1zzz2qXr26Fi1apPT09CL71qxZU1Wq/Pt3Wm9vb0lSbm6uJCkzM1PS1Ttmt3Lp0iUVFBTo9ddf1+uvv37T46dPn7Z4NgDYBWEMQKWxa9cu5efnq127dtq1a5fq1aun9957z/KYTp06KSgoSBs3blRUVJT27dunF154odj9f/rpJx05ckR/+tOf1LVrV+f2K1eulLne2rVrS5LS0tJUp06dmx738/OTh4eHxowZo27dut30eHBwcJmvCaDyIYwBqBQuXbqkefPm6e6771bnzp3l4eGhDz/8UDVq1FDz5s2LPa5KlSp67LHHtGnTJvn4+MjX11cPP/xwsfvn5ORIujoEec3PP/+svXv3lnn+Vvv27VWtWjWtW7euyJyxa2rUqKF27dopJSVFY8aMKdO5AdgHYQyA2ykoKNC+ffskSdnZ2Tp48KA+/vhjXb58WStWrFDVqlXVpUsXRURE6A9/+INeeOEF3Xvvvfrll1905MgR5eTkaMKECc7zPf7441q1apX+8pe/6JFHHnEOJ95Ks2bNVL9+fc2dO1evvPKKsrOztWjRot90l6pWrVr67//+b73zzjvKy8tT165dlZubq+3bt2vMmDGqV6+eJk6cqGeffdYZGmvWrKnTp09r27ZteuWVV9S0adMyXxdA5UIYA+B2srKyNGTIEHl4eMjX11d33323+vfvr2HDhjnnX3l4eOjdd9/V0qVL9dFHH+n06dOqXbu27r///iLvhpSkjh07qkGDBjp9+rT69OljeW1vb28tXrxYb7zxhsaOHasGDRpo9OjR2rVrl/75z3+W+XMZOXKk/P39tXLlSn3yySfy9/dXWFiYc1mNsLAwxcfHa9GiRZo0aZIKCwvVsGFDPfzwwwoMDCzz9QBUPqzADwAAYBBLWwAAABhEGAMAADCIMAYAAGAQYQwAAMAgwhgAAIBBhDEAAACDCGMAAAAGEcYAAAAMIowBAAAYRBgDAAAwiDAGAABg0P8DAIqnwX2NyMgAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "compare = az.compare(\n", " {\"m6.6\": az6_6, \"m6.7\": az6_7, \"m6.8\": az6_8}, ic=\"waic\", scale=\"deviance\"\n", ")\n", "az.plot_compare(compare)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Code 7.30" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DeviceArray(7.524193, dtype=float32)" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "post = m6_6.sample_posterior(random.PRNGKey(92), p6_6, sample_shape=(1000,))\n", "logprob = log_likelihood(m6_6.model, post, h0=d.h0.values, h1=d.h1.values)\n", "az6_6 = az.from_dict({}, log_likelihood={\"h1\": logprob[\"h1\"][None, ...]})\n", "waic_m6_6 = az.waic(az6_6, pointwise=True, scale=\"deviance\")\n", "diff_m6_6_m6_8 = waic_m6_6.waic_i.values - waic_m6_8.waic_i.values\n", "jnp.sqrt(n * jnp.var(diff_m6_6_m6_8))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Code 7.31" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "UserWarning: For one or more samples the posterior variance of the log predictive densities exceeds 0.4. This could be indication of WAIC starting to fail. \n", "See http://arxiv.org/abs/1507.04544 for details\n", "UserWarning: For one or more samples the posterior variance of the log predictive densities exceeds 0.4. This could be indication of WAIC starting to fail. \n", "See http://arxiv.org/abs/1507.04544 for details\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
m6.6m6.7m6.8
m6.60.012.70803457.5581884
m6.712.70803450.013.690906
m6.87.558188413.6909060.0
\n", "
" ], "text/plain": [ " m6.6 m6.7 m6.8\n", "m6.6 0.0 12.7080345 7.5581884\n", "m6.7 12.7080345 0.0 13.690906\n", "m6.8 7.5581884 13.690906 0.0" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "post = m6_6.sample_posterior(random.PRNGKey(93), p6_6, sample_shape=(1000,))\n", "logprob = log_likelihood(m6_6.model, post, h0=d.h0.values, h1=d.h1.values)\n", "az6_6 = az.from_dict({}, log_likelihood={\"h1\": logprob[\"h1\"][None, ...]})\n", "waic_m6_6 = az.waic(az6_6, pointwise=True, scale=\"deviance\")\n", "post = m6_7.sample_posterior(random.PRNGKey(93), p6_7, sample_shape=(1000,))\n", "logprob = log_likelihood(\n", " m6_7.model,\n", " post,\n", " treatment=d.treatment.values,\n", " fungus=d.fungus.values,\n", " h0=d.h0.values,\n", " h1=d.h1.values,\n", ")\n", "az6_7 = az.from_dict({}, log_likelihood={\"h1\": logprob[\"h1\"][None, ...]})\n", "waic_m6_7 = az.waic(az6_7, pointwise=True, scale=\"deviance\")\n", "post = m6_8.sample_posterior(random.PRNGKey(93), p6_8, sample_shape=(1000,))\n", "logprob = log_likelihood(\n", " m6_8.model, post, treatment=d.treatment.values, h0=d.h0.values, h1=d.h1.values\n", ")\n", "az6_8 = az.from_dict({}, log_likelihood={\"h1\": logprob[\"h1\"][None, ...]})\n", "waic_m6_8 = az.waic(az6_8, pointwise=True, scale=\"deviance\")\n", "dSE = lambda waic1, waic2: jnp.sqrt(\n", " n * jnp.var(waic1.waic_i.values - waic2.waic_i.values)\n", ")\n", "data = {\"m6.6\": waic_m6_6, \"m6.7\": waic_m6_7, \"m6.8\": waic_m6_8}\n", "pd.DataFrame(\n", " {\n", " row: {col: dSE(row_val, col_val) for col, col_val in data.items()}\n", " for row, row_val in data.items()\n", " }\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Code 7.32" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 1000/1000 [00:00<00:00, 1334.71it/s, init loss: 2138.6682, avg. loss [951-1000]: 60.6515]\n", "100%|██████████| 1000/1000 [00:00<00:00, 1365.18it/s, init loss: 962.7464, avg. loss [951-1000]: 67.4809]\n", "100%|██████████| 1000/1000 [00:00<00:00, 1106.15it/s, init loss: 3201.7393, avg. loss [951-1000]: 60.7879]\n" ] } ], "source": [ "WaffleDivorce = pd.read_csv(\"../data/WaffleDivorce.csv\", sep=\";\")\n", "d = WaffleDivorce\n", "d[\"A\"] = d.MedianAgeMarriage.pipe(lambda x: (x - x.mean()) / x.std())\n", "d[\"D\"] = d.Divorce.pipe(lambda x: (x - x.mean()) / x.std())\n", "d[\"M\"] = d.Marriage.pipe(lambda x: (x - x.mean()) / x.std())\n", "\n", "\n", "def model(A, D=None):\n", " a = numpyro.sample(\"a\", dist.Normal(0, 0.2))\n", " bA = numpyro.sample(\"bA\", dist.Normal(0, 0.5))\n", " sigma = numpyro.sample(\"sigma\", dist.Exponential(1))\n", " mu = numpyro.deterministic(\"mu\", a + bA * A)\n", " numpyro.sample(\"D\", dist.Normal(mu, sigma), obs=D)\n", "\n", "\n", "m5_1 = AutoLaplaceApproximation(model)\n", "svi = SVI(model, m5_1, optim.Adam(1), Trace_ELBO(), A=d.A.values, D=d.D.values)\n", "svi_result = svi.run(random.PRNGKey(0), 1000)\n", "p5_1 = svi_result.params\n", "\n", "\n", "def model(M, D=None):\n", " a = numpyro.sample(\"a\", dist.Normal(0, 0.2))\n", " bM = numpyro.sample(\"bM\", dist.Normal(0, 0.5))\n", " sigma = numpyro.sample(\"sigma\", dist.Exponential(1))\n", " mu = a + bM * M\n", " numpyro.sample(\"D\", dist.Normal(mu, sigma), obs=D)\n", "\n", "\n", "m5_2 = AutoLaplaceApproximation(model)\n", "svi = SVI(model, m5_2, optim.Adam(1), Trace_ELBO(), M=d.M.values, D=d.D.values)\n", "svi_result = svi.run(random.PRNGKey(0), 1000)\n", "p5_2 = svi_result.params\n", "\n", "\n", "def model(M, A, D=None):\n", " a = numpyro.sample(\"a\", dist.Normal(0, 0.2))\n", " bM = numpyro.sample(\"bM\", dist.Normal(0, 0.5))\n", " bA = numpyro.sample(\"bA\", dist.Normal(0, 0.5))\n", " sigma = numpyro.sample(\"sigma\", dist.Exponential(1))\n", " mu = numpyro.deterministic(\"mu\", a + bM * M + bA * A)\n", " numpyro.sample(\"D\", dist.Normal(mu, sigma), obs=D)\n", "\n", "\n", "m5_3 = AutoLaplaceApproximation(model)\n", "svi = SVI(\n", " model, m5_3, optim.Adam(1), Trace_ELBO(), M=d.M.values, A=d.A.values, D=d.D.values\n", ")\n", "svi_result = svi.run(random.PRNGKey(0), 1000)\n", "p5_3 = svi_result.params" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Code 7.33" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "UserWarning: The default method used to estimate the weights for each model,has changed from BB-pseudo-BMA to stacking\n", "UserWarning: For one or more samples the posterior variance of the log predictive densities exceeds 0.4. This could be indication of WAIC starting to fail. \n", "See http://arxiv.org/abs/1507.04544 for details\n", "UserWarning: For one or more samples the posterior variance of the log predictive densities exceeds 0.4. This could be indication of WAIC starting to fail. \n", "See http://arxiv.org/abs/1507.04544 for details\n", "UserWarning: For one or more samples the posterior variance of the log predictive densities exceeds 0.4. This could be indication of WAIC starting to fail. \n", "See http://arxiv.org/abs/1507.04544 for details\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
rankwaicp_waicd_waicweightsedsewarningwaic_scale
m5.10126.5158474.1081740.0000008.879604e-0113.5805290.000000Truedeviance
m5.31128.6096015.4906802.0937545.354823e-1514.1738501.047467Truedeviance
m5.22139.7759243.28265313.2600771.120396e-0110.4586739.845431Truedeviance
\n", "
" ], "text/plain": [ " rank waic p_waic d_waic weight se \\\n", "m5.1 0 126.515847 4.108174 0.000000 8.879604e-01 13.580529 \n", "m5.3 1 128.609601 5.490680 2.093754 5.354823e-15 14.173850 \n", "m5.2 2 139.775924 3.282653 13.260077 1.120396e-01 10.458673 \n", "\n", " dse warning waic_scale \n", "m5.1 0.000000 True deviance \n", "m5.3 1.047467 True deviance \n", "m5.2 9.845431 True deviance " ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "post = m5_1.sample_posterior(random.PRNGKey(24071847), p5_1, sample_shape=(1000,))\n", "logprob = log_likelihood(m5_1.model, post, A=d.A.values, D=d.D.values)[\"D\"]\n", "az5_1 = az.from_dict(\n", " posterior={k: v[None, ...] for k, v in post.items()},\n", " log_likelihood={\"D\": logprob[None, ...]},\n", ")\n", "post = m5_2.sample_posterior(random.PRNGKey(24071847), p5_2, sample_shape=(1000,))\n", "logprob = log_likelihood(m5_2.model, post, M=d.M.values, D=d.D.values)[\"D\"]\n", "az5_2 = az.from_dict(\n", " posterior={k: v[None, ...] for k, v in post.items()},\n", " log_likelihood={\"D\": logprob[None, ...]},\n", ")\n", "post = m5_3.sample_posterior(random.PRNGKey(24071847), p5_3, sample_shape=(1000,))\n", "logprob = log_likelihood(m5_3.model, post, A=d.A.values, M=d.M.values, D=d.D.values)[\n", " \"D\"\n", "]\n", "az5_3 = az.from_dict(\n", " posterior={k: v[None, ...] for k, v in post.items()},\n", " log_likelihood={\"D\": logprob[None, ...]},\n", ")\n", "az.compare({\"m5.1\": az5_1, \"m5.2\": az5_2, \"m5.3\": az5_3}, ic=\"waic\", scale=\"deviance\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Code 7.34" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "UserWarning: Estimated shape parameter of Pareto distribution is greater than 0.7 for one or more samples. You should consider using a more robust model, this is because importance sampling is less likely to work well if the marginal posterior and LOO posterior are very different. This is more likely to happen with a non-robust model and highly influential observations.\n", "UserWarning: For one or more samples the posterior variance of the log predictive densities exceeds 0.4. This could be indication of WAIC starting to fail. \n", "See http://arxiv.org/abs/1507.04544 for details\n" ] }, { "data": { "image/png": "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NjZW27dvz/O19OjRI1NwTUhI0FNPPaVt27bp7bff1kcffZTncwIAsmLMNgDkU4sWLdS5c2dJ0rJlyyRJFy9e1KpVqyRJr776aqagLUk+Pj5q3bq10z20S5culSQNGzYsU9CWbMNZwsPD1b9//wJdhySVL19ew4cPlyT98ssvSk1NLfA5AQCEbQAokDp16kiSTpw4Ick27CMtLU2SLcAWVGJioiQpKCiowOfKjX0M+aVLlxzP+8svv2jEiBG6//77FRYWpgYNGqhz58765JNPlJKSkuUc8+bNU61atRQZGakDBw5o6NChat68uWrXru34QCJJu3bt0osvvqi77rpLdevWVcuWLTVixAgdPXo00/nuvvtuTZw4UZI0YsQI1apVy/Hfhg0bMh373Xff6ZFHHlFYWJjq16+vTp06afLkybp06ZJL6rN79261bNlSdevWVXR0tEvOCaD4I2wDQAFcuHBBklSqVClJtlBcunRpSdI333xT4PNXqlRJkjRr1iyZplng812L/VokydfXV5L073//Wz/88IPKli2ru+66S40aNdKJEyf0wQcf6KmnnlJ6enq25zpw4IC6d++uLVu2qEmTJmrRooV8fGwjF5csWaKHHnpIixYtUoUKFXT33XerQoUKmjdvnh566CHt2bPHcZ57771XtWvXlmQbZ961a1fHf1f29P/nP//RK6+8ou3btys8PFytW7fWqVOn9P7776t///66ePFigWrz66+/qk+fPkpKStKkSZP0wAMPFOh8AEoOxmwDQD6ZpqlffvlF0uUZS3x9ffXggw9q9uzZevfdd/XDDz+odevWatCggRo2bJhlWEluevTooQ8++EAzZszQ+vXr1a5dOzVo0EBhYWEu6Tm/0s8//yzJFvDLlSsnSRozZoyaN28uf39/x3FJSUkaNmyYfv75Z/3vf/9Tly5dspxr8eLF6tOnj1599VV5e3s7th85ckSvvPKK/Pz8NGXKlEw3dn733Xd65ZVXNGLECH377beSpFdeeUWRkZHauXNnlnHmdkuWLNGsWbNUqVIlRUVFOW78TEpK0tNPP63Y2Fh99NFHevnll/NVl1WrVun555+Xj4+PvvjiCzVq1Chf5wFQMtGzDQB5lJ6eroMHD+rVV1/Vr7/+Kl9fXz300EOO/a+++qoefPBBGYahbdu26eOPP9ZTTz2lJk2aqG/fvlq9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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "PSIS_m5_3 = az.loo(az5_3, pointwise=True, scale=\"deviance\")\n", "WAIC_m5_3 = az.waic(az5_3, pointwise=True, scale=\"deviance\")\n", "penalty = az5_3.log_likelihood.stack(sample=(\"chain\", \"draw\")).var(dim=\"sample\")\n", "plt.plot(PSIS_m5_3.pareto_k.values, penalty.D.values, \"o\", mfc=\"none\")\n", "plt.gca().set(xlabel=\"PSIS Pareto k\", ylabel=\"WAIC penalty\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Code 7.35" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 1000/1000 [00:00<00:00, 1067.98it/s, init loss: 194.5655, avg. loss [951-1000]: 63.3271]\n" ] } ], "source": [ "def model(M, A, D=None):\n", " a = numpyro.sample(\"a\", dist.Normal(0, 0.2))\n", " bM = numpyro.sample(\"bM\", dist.Normal(0, 0.5))\n", " bA = numpyro.sample(\"bA\", dist.Normal(0, 0.5))\n", " sigma = numpyro.sample(\"sigma\", dist.Exponential(1))\n", " mu = a + bM * M + bA * A\n", " numpyro.sample(\"D\", dist.StudentT(2, mu, sigma), obs=D)\n", "\n", "\n", "m5_3t = AutoLaplaceApproximation(model)\n", "svi = SVI(\n", " model,\n", " m5_3t,\n", " optim.Adam(0.3),\n", " Trace_ELBO(),\n", " M=d.M.values,\n", " A=d.A.values,\n", " D=d.D.values,\n", ")\n", "svi_result = svi.run(random.PRNGKey(0), 1000)\n", "p5_3t = svi_result.params" ] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.6" } }, "nbformat": 4, "nbformat_minor": 4 }