|
15 | 15 | },
|
16 | 16 | {
|
17 | 17 | "cell_type": "code",
|
18 |
| - "execution_count": 2, |
| 18 | + "execution_count": 1, |
19 | 19 | "metadata": {},
|
20 |
| - "outputs": [], |
| 20 | + "outputs": [ |
| 21 | + { |
| 22 | + "name": "stderr", |
| 23 | + "output_type": "stream", |
| 24 | + "text": [ |
| 25 | + "/opt/anaconda3/envs/aims/lib/python3.9/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", |
| 26 | + " from .autonotebook import tqdm as notebook_tqdm\n" |
| 27 | + ] |
| 28 | + } |
| 29 | + ], |
21 | 30 | "source": [
|
22 | 31 | "#!pip install geopandas\n",
|
23 | 32 | "\n",
|
|
81 | 90 | },
|
82 | 91 | {
|
83 | 92 | "cell_type": "code",
|
84 |
| - "execution_count": 3, |
| 93 | + "execution_count": 2, |
85 | 94 | "metadata": {},
|
86 | 95 | "outputs": [],
|
87 | 96 | "source": [
|
|
104 | 113 | },
|
105 | 114 | {
|
106 | 115 | "cell_type": "code",
|
107 |
| - "execution_count": 4, |
| 116 | + "execution_count": 3, |
108 | 117 | "metadata": {},
|
109 | 118 | "outputs": [
|
110 | 119 | {
|
|
196 | 205 | "4 2015-05-21 14:28:26+00:00 MULTIPOLYGON (((27.15761 -32.83846, 27.15778 -... "
|
197 | 206 | ]
|
198 | 207 | },
|
199 |
| - "execution_count": 4, |
| 208 | + "execution_count": 3, |
200 | 209 | "metadata": {},
|
201 | 210 | "output_type": "execute_result"
|
202 | 211 | }
|
|
207 | 216 | },
|
208 | 217 | {
|
209 | 218 | "cell_type": "code",
|
210 |
| - "execution_count": 5, |
| 219 | + "execution_count": 4, |
211 | 220 | "metadata": {},
|
212 | 221 | "outputs": [
|
213 | 222 | {
|
|
266 | 275 | },
|
267 | 276 | {
|
268 | 277 | "cell_type": "code",
|
269 |
| - "execution_count": 6, |
| 278 | + "execution_count": 5, |
270 | 279 | "metadata": {},
|
271 | 280 | "outputs": [
|
272 | 281 | {
|
|
316 | 325 | },
|
317 | 326 | {
|
318 | 327 | "cell_type": "code",
|
319 |
| - "execution_count": 7, |
| 328 | + "execution_count": 6, |
320 | 329 | "metadata": {},
|
321 | 330 | "outputs": [
|
322 | 331 | {
|
|
408 | 417 | },
|
409 | 418 | {
|
410 | 419 | "cell_type": "code",
|
411 |
| - "execution_count": 8, |
| 420 | + "execution_count": 7, |
412 | 421 | "metadata": {},
|
413 | 422 | "outputs": [],
|
414 | 423 | "source": [
|
|
436 | 445 | },
|
437 | 446 | {
|
438 | 447 | "cell_type": "code",
|
439 |
| - "execution_count": 9, |
| 448 | + "execution_count": 8, |
440 | 449 | "metadata": {},
|
441 | 450 | "outputs": [
|
442 | 451 | {
|
|
482 | 491 | },
|
483 | 492 | {
|
484 | 493 | "cell_type": "code",
|
485 |
| - "execution_count": 10, |
| 494 | + "execution_count": 9, |
486 | 495 | "metadata": {},
|
487 | 496 | "outputs": [],
|
488 | 497 | "source": [
|
|
516 | 525 | },
|
517 | 526 | {
|
518 | 527 | "cell_type": "code",
|
519 |
| - "execution_count": 11, |
| 528 | + "execution_count": 10, |
520 | 529 | "metadata": {},
|
521 | 530 | "outputs": [
|
522 | 531 | {
|
|
624 | 633 | },
|
625 | 634 | {
|
626 | 635 | "cell_type": "code",
|
627 |
| - "execution_count": 21, |
| 636 | + "execution_count": 54, |
628 | 637 | "metadata": {},
|
629 | 638 | "outputs": [
|
630 | 639 | {
|
|
633 | 642 | "text": [
|
634 | 643 | "\n",
|
635 | 644 | " mean std median 5.0% 95.0% n_eff r_hat\n",
|
636 |
| - " alpha 0.19 0.13 0.16 0.01 0.36 722.47 1.00\n", |
637 |
| - " b0 2.87 0.36 2.88 2.22 3.37 531.64 1.00\n", |
638 |
| - " tau 1.48 0.23 1.45 1.13 1.83 638.90 1.00\n", |
| 645 | + " alpha 0.52 0.29 0.53 0.10 0.98 423.86 1.00\n", |
| 646 | + " b0[0] -0.34 0.95 -0.35 -1.77 1.36 2364.36 1.00\n", |
| 647 | + " b0[1] -0.35 0.90 -0.31 -1.79 1.16 2275.78 1.00\n", |
| 648 | + " b0[2] 0.42 0.93 0.41 -1.16 1.79 2083.11 1.00\n", |
| 649 | + " b0[3] -0.35 0.95 -0.36 -1.98 1.14 1676.72 1.00\n", |
| 650 | + " b0[4] 0.37 0.95 0.36 -1.08 1.89 1556.56 1.00\n", |
| 651 | + " b0[5] -0.35 1.00 -0.35 -2.21 1.08 2306.75 1.00\n", |
| 652 | + " b0[6] -0.33 0.89 -0.31 -1.79 1.03 1577.57 1.00\n", |
| 653 | + " b0[7] -0.39 0.93 -0.36 -1.77 1.17 1486.90 1.00\n", |
| 654 | + "car_std[0] -0.51 1.11 -0.54 -2.28 1.29 573.28 1.00\n", |
| 655 | + "car_std[1] -0.28 0.65 -0.22 -1.22 0.87 279.22 1.00\n", |
| 656 | + "car_std[2] -0.07 0.69 -0.04 -1.13 1.11 332.45 1.00\n", |
| 657 | + "car_std[3] -0.20 0.63 -0.17 -1.34 0.74 301.13 1.00\n", |
| 658 | + "car_std[4] 0.20 1.03 0.21 -1.42 1.88 700.18 1.00\n", |
| 659 | + "car_std[5] -0.60 1.08 -0.55 -2.27 1.18 538.32 1.00\n", |
| 660 | + "car_std[6] -0.46 0.85 -0.42 -1.80 0.97 358.95 1.00\n", |
| 661 | + "car_std[7] -0.29 0.62 -0.25 -1.38 0.61 260.76 1.00\n", |
| 662 | + " tau 1.48 0.86 1.35 0.19 2.61 1352.22 1.00\n", |
639 | 663 | "\n",
|
640 | 664 | "Number of divergences: 0\n"
|
641 | 665 | ]
|
642 | 666 | }
|
643 | 667 | ],
|
644 | 668 | "source": [
|
| 669 | + "def expit(x):\n", |
| 670 | + " return 1/(1 + jnp.exp(-x))\n", |
| 671 | + "\n", |
645 | 672 | "def car_model(y, A):\n",
|
646 | 673 | "\n",
|
647 | 674 | " n = A.shape[0]\n",
|
648 |
| - " d = jnp.diag(jnp.sum(A, axis=1))\n", |
| 675 | + " d = jnp.sum(A, axis=1)\n", |
649 | 676 | " D = jnp.diag(d)\n",
|
650 | 677 | "\n",
|
651 |
| - " b0 = numpyro.sample('b0', dist.Normal(0,1))\n", |
| 678 | + " b0 = numpyro.sample('b0', dist.Normal(0,1).expand([n]))\n", |
652 | 679 | " tau = numpyro.sample('tau', dist.Gamma(3, 2)) \n",
|
653 |
| - " alpha = numpyro.sample('alpha', dist.Uniform(low=0.01, high=0.99))\n", |
| 680 | + " alpha = numpyro.sample('alpha', dist.Uniform(low=0., high=0.99))\n", |
654 | 681 | "\n",
|
655 | 682 | " Q_std = D - alpha*A\n",
|
656 |
| - " Q = tau * Q_std\n", |
657 |
| - " \n", |
658 |
| - " numpyro.sample('y', dist.Normal(b0, Q), obs=y)\n", |
| 683 | + " car_std = numpyro.sample('car_std', dist.MultivariateNormal(loc=jnp.zeros(n), precision_matrix=Q_std))\n", |
| 684 | + " sigma = numpyro.deterministic('sigma', 1./jnp.sqrt(tau))\n", |
| 685 | + " car = numpyro.deterministic('car', sigma * car_std)\n", |
| 686 | + "\n", |
| 687 | + " lin_pred = b0 + car\n", |
| 688 | + " p = numpyro.deterministic('p', expit(lin_pred))\n", |
| 689 | + "\n", |
| 690 | + " # likelihood\n", |
| 691 | + " numpyro.sample(\"obs\", dist.Bernoulli(p), obs=y)\n", |
659 | 692 | "\n",
|
660 | 693 | "\n",
|
661 | 694 | "# spatial data 'y' and adjacency structure 'adj'\n",
|
662 |
| - "y = np.array([1.2, 2.5, 3.8, 4.1, 5.2]) # Replace with your data\n", |
| 695 | + "y = jnp.array([0, 0, 1, 0, 1, 0, 0, 0])\n", |
663 | 696 | "\n",
|
664 |
| - "A = np.array([[0, 1, 0, 0, 0],\n", |
665 |
| - " [1, 0, 1, 0, 0],\n", |
666 |
| - " [0, 1, 0, 1, 0],\n", |
667 |
| - " [0, 0, 1, 0, 1],\n", |
668 |
| - " [0, 0, 0, 1, 0]]) \n", |
| 697 | + "A = np.array([[0, 1, 0, 0, 0, 0, 0, 0],\n", |
| 698 | + " [1, 0, 1, 1, 0, 0, 0, 1],\n", |
| 699 | + " [0, 1, 0, 1, 0, 0, 0, 1],\n", |
| 700 | + " [0, 1, 1, 0, 1, 0, 0, 1],\n", |
| 701 | + " [0, 0, 0, 1, 0, 0, 0, 0],\n", |
| 702 | + " [0, 0, 0, 0, 0, 0, 1, 0],\n", |
| 703 | + " [0, 0, 0, 0, 0, 1, 0, 1],\n", |
| 704 | + " [0, 1, 1, 1, 0, 0, 1, 0]])\n", |
669 | 705 | "\n",
|
670 | 706 | "# Run MCMC to infer the parameters\n",
|
671 | 707 | "nuts_kernel = NUTS(car_model)\n",
|
|
685 | 721 | "`````{admonition} Task 28\n",
|
686 | 722 | ":class: tip\n",
|
687 | 723 | "\n",
|
688 |
| - "- Simulate data from the CAR model using South African boundaries and neighbourhood structure (use `adjacency_matrix_sa` as `A`, and `y=None` to create simulations)\n", |
| 724 | + "- Simulate data from the CAR model using South African boundaries and neighbourhood structure (use `adjacency_matrix_sa` as `A`, and `y=None` to create simulations) with Bernoulli likelihood\n", |
689 | 725 | "- Fit the CAR model to the data which you have simluated (make adjustments if necessary).\n",
|
690 | 726 | "- Plot posterior distribution of $\\alpha$, and add the true velue of $\\alpha$ to this plot. What do you observe?\n",
|
691 | 727 | "- Make sactter plots of $f_\\text{true}$ vs $f_\\text{fitted}$, and add a diagonal line to this plot. What do you observe?\n",
|
|
0 commit comments