|
2 | 2 | "cells": [
|
3 | 3 | {
|
4 | 4 | "cell_type": "markdown",
|
| 5 | + "id": "e1e16d35", |
5 | 6 | "metadata": {},
|
6 | 7 | "source": [
|
7 | 8 | "# Discrete Markov Chain Distribution"
|
|
10 | 11 | {
|
11 | 12 | "cell_type": "code",
|
12 | 13 | "execution_count": 1,
|
| 14 | + "id": "cc15e4cd", |
13 | 15 | "metadata": {},
|
14 | 16 | "outputs": [],
|
15 | 17 | "source": [
|
|
20 | 22 | {
|
21 | 23 | "cell_type": "code",
|
22 | 24 | "execution_count": 2,
|
| 25 | + "id": "7c983797", |
23 | 26 | "metadata": {},
|
24 |
| - "outputs": [], |
| 27 | + "outputs": [ |
| 28 | + { |
| 29 | + "ename": "ModuleNotFoundError", |
| 30 | + "evalue": "No module named 'pymc_experimental'", |
| 31 | + "output_type": "error", |
| 32 | + "traceback": [ |
| 33 | + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", |
| 34 | + "\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", |
| 35 | + "Cell \u001b[0;32mIn[2], line 11\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mmatplotlib\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpyplot\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mplt\u001b[39;00m\n\u001b[1;32m 9\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mmatplotlib\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m ticker \u001b[38;5;28;01mas\u001b[39;00m mtick\n\u001b[0;32m---> 11\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpymc_experimental\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdistributions\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mtimeseries\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m DiscreteMarkovChain\n", |
| 36 | + "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'pymc_experimental'" |
| 37 | + ] |
| 38 | + } |
| 39 | + ], |
25 | 40 | "source": [
|
26 | 41 | "import arviz as az\n",
|
27 | 42 | "import numpy as np\n",
|
|
38 | 53 | },
|
39 | 54 | {
|
40 | 55 | "cell_type": "markdown",
|
| 56 | + "id": "a36d5e56", |
41 | 57 | "metadata": {},
|
42 | 58 | "source": [
|
43 | 59 | "## Demonstration of API "
|
44 | 60 | ]
|
45 | 61 | },
|
46 | 62 | {
|
47 | 63 | "cell_type": "code",
|
48 |
| - "execution_count": 3, |
| 64 | + "execution_count": null, |
| 65 | + "id": "05d16797", |
49 | 66 | "metadata": {},
|
50 |
| - "outputs": [ |
51 |
| - { |
52 |
| - "name": "stderr", |
53 |
| - "output_type": "stream", |
54 |
| - "text": [ |
55 |
| - "/home/ricardo/Documents/Projects/pymc-experimental/pymc_experimental/distributions/timeseries.py:159: UserWarning: Initial distribution not specified, defaulting to `Categorical.dist(p=pt.full((k_states, ), 1/k_states), shape=...)`. You can specify an init_dist manually to suppress this warning.\n", |
56 |
| - " warnings.warn(\n" |
57 |
| - ] |
58 |
| - } |
59 |
| - ], |
| 67 | + "outputs": [], |
60 | 68 | "source": [
|
61 | 69 | "with pm.Model() as model:\n",
|
62 | 70 | " logit_P = pm.Normal(\"logit_P\", sigma=0.1, size=(3, 3))\n",
|
|
66 | 74 | {
|
67 | 75 | "cell_type": "code",
|
68 | 76 | "execution_count": 4,
|
| 77 | + "id": "911fc178", |
69 | 78 | "metadata": {},
|
70 | 79 | "outputs": [
|
71 | 80 | {
|
|
131 | 140 | },
|
132 | 141 | {
|
133 | 142 | "cell_type": "markdown",
|
| 143 | + "id": "5d74be4c", |
134 | 144 | "metadata": {},
|
135 | 145 | "source": [
|
136 | 146 | "Dims of the output are `(batch, time)`."
|
|
139 | 149 | {
|
140 | 150 | "cell_type": "code",
|
141 | 151 | "execution_count": 5,
|
| 152 | + "id": "88acfab3", |
142 | 153 | "metadata": {},
|
143 | 154 | "outputs": [
|
144 | 155 | {
|
|
167 | 178 | },
|
168 | 179 | {
|
169 | 180 | "cell_type": "markdown",
|
| 181 | + "id": "2d67e342", |
170 | 182 | "metadata": {},
|
171 | 183 | "source": [
|
172 | 184 | "## Parameter Recovery\n",
|
|
177 | 189 | {
|
178 | 190 | "cell_type": "code",
|
179 | 191 | "execution_count": 6,
|
| 192 | + "id": "33081e17", |
180 | 193 | "metadata": {},
|
181 | 194 | "outputs": [],
|
182 | 195 | "source": [
|
|
201 | 214 | {
|
202 | 215 | "cell_type": "code",
|
203 | 216 | "execution_count": 7,
|
| 217 | + "id": "f92d551a", |
204 | 218 | "metadata": {},
|
205 | 219 | "outputs": [],
|
206 | 220 | "source": [
|
|
210 | 224 | {
|
211 | 225 | "cell_type": "code",
|
212 | 226 | "execution_count": 8,
|
| 227 | + "id": "31751f8c", |
213 | 228 | "metadata": {
|
214 | 229 | "scrolled": false
|
215 | 230 | },
|
|
287 | 302 | {
|
288 | 303 | "cell_type": "code",
|
289 | 304 | "execution_count": 9,
|
| 305 | + "id": "87bdb1e0", |
290 | 306 | "metadata": {},
|
291 | 307 | "outputs": [
|
292 | 308 | {
|
|
306 | 322 | },
|
307 | 323 | {
|
308 | 324 | "cell_type": "markdown",
|
| 325 | + "id": "610b3596", |
309 | 326 | "metadata": {},
|
310 | 327 | "source": [
|
311 | 328 | "## Hidden markov model\n",
|
|
318 | 335 | {
|
319 | 336 | "cell_type": "code",
|
320 | 337 | "execution_count": 10,
|
| 338 | + "id": "dc1f9e25", |
321 | 339 | "metadata": {},
|
322 | 340 | "outputs": [
|
323 | 341 | {
|
|
348 | 366 | {
|
349 | 367 | "cell_type": "code",
|
350 | 368 | "execution_count": 11,
|
| 369 | + "id": "67f7e824", |
351 | 370 | "metadata": {},
|
352 | 371 | "outputs": [
|
353 | 372 | {
|
|
524 | 543 | {
|
525 | 544 | "cell_type": "code",
|
526 | 545 | "execution_count": 12,
|
| 546 | + "id": "1b5d3444", |
527 | 547 | "metadata": {
|
528 | 548 | "scrolled": false
|
529 | 549 | },
|
|
594 | 614 | {
|
595 | 615 | "cell_type": "code",
|
596 | 616 | "execution_count": 13,
|
| 617 | + "id": "04de50a9", |
597 | 618 | "metadata": {},
|
598 | 619 | "outputs": [
|
599 | 620 | {
|
|
758 | 779 | },
|
759 | 780 | {
|
760 | 781 | "cell_type": "markdown",
|
| 782 | + "id": "44c1f25b", |
761 | 783 | "metadata": {},
|
762 | 784 | "source": [
|
763 | 785 | "It's quite difficult to sample this model, so I use a very high `target_accept` and a very large number of draws. It seems to be hard to get a sufficient number of effective samples for rare rates without a lot of draws. "
|
|
766 | 788 | {
|
767 | 789 | "cell_type": "code",
|
768 | 790 | "execution_count": 14,
|
| 791 | + "id": "e382b4d4", |
769 | 792 | "metadata": {},
|
770 | 793 | "outputs": [
|
771 | 794 | {
|
|
848 | 871 | },
|
849 | 872 | {
|
850 | 873 | "cell_type": "markdown",
|
| 874 | + "id": "f778d068", |
851 | 875 | "metadata": {},
|
852 | 876 | "source": [
|
853 | 877 | "### Post-Estimation Diagnostics\n",
|
|
858 | 882 | {
|
859 | 883 | "cell_type": "code",
|
860 | 884 | "execution_count": 15,
|
| 885 | + "id": "c45b726c", |
861 | 886 | "metadata": {},
|
862 | 887 | "outputs": [
|
863 | 888 | {
|
|
887 | 912 | },
|
888 | 913 | {
|
889 | 914 | "cell_type": "markdown",
|
| 915 | + "id": "b057e84c", |
890 | 916 | "metadata": {},
|
891 | 917 | "source": [
|
892 | 918 | "...but the trace plots look great! "
|
|
895 | 921 | {
|
896 | 922 | "cell_type": "code",
|
897 | 923 | "execution_count": 16,
|
| 924 | + "id": "34bb9eb9", |
898 | 925 | "metadata": {},
|
899 | 926 | "outputs": [
|
900 | 927 | {
|
|
915 | 942 | },
|
916 | 943 | {
|
917 | 944 | "cell_type": "markdown",
|
| 945 | + "id": "65bb1c27", |
918 | 946 | "metadata": {},
|
919 | 947 | "source": [
|
920 | 948 | "Even after 20,000 draws, we only have about 500 samples for the transition probabilities to the more rare state 1."
|
|
923 | 951 | {
|
924 | 952 | "cell_type": "code",
|
925 | 953 | "execution_count": 17,
|
| 954 | + "id": "2d050b4e", |
926 | 955 | "metadata": {},
|
927 | 956 | "outputs": [
|
928 | 957 | {
|
|
1133 | 1162 | },
|
1134 | 1163 | {
|
1135 | 1164 | "cell_type": "markdown",
|
| 1165 | + "id": "aa017801", |
1136 | 1166 | "metadata": {},
|
1137 | 1167 | "source": [
|
1138 | 1168 | "## Comparison with Statsmodels"
|
|
1141 | 1171 | {
|
1142 | 1172 | "cell_type": "code",
|
1143 | 1173 | "execution_count": 18,
|
| 1174 | + "id": "8200aae3", |
1144 | 1175 | "metadata": {},
|
1145 | 1176 | "outputs": [],
|
1146 | 1177 | "source": [
|
|
1155 | 1186 | {
|
1156 | 1187 | "cell_type": "code",
|
1157 | 1188 | "execution_count": 19,
|
| 1189 | + "id": "febd7972", |
1158 | 1190 | "metadata": {},
|
1159 | 1191 | "outputs": [
|
1160 | 1192 | {
|
|
1196 | 1228 | },
|
1197 | 1229 | {
|
1198 | 1230 | "cell_type": "markdown",
|
| 1231 | + "id": "5588a4f6", |
1199 | 1232 | "metadata": {},
|
1200 | 1233 | "source": [
|
1201 | 1234 | "## Posterior Prediction"
|
|
1204 | 1237 | {
|
1205 | 1238 | "cell_type": "code",
|
1206 | 1239 | "execution_count": 20,
|
| 1240 | + "id": "c4399802", |
1207 | 1241 | "metadata": {},
|
1208 | 1242 | "outputs": [
|
1209 | 1243 | {
|
|
1266 | 1300 | {
|
1267 | 1301 | "cell_type": "code",
|
1268 | 1302 | "execution_count": 21,
|
| 1303 | + "id": "47c8ce2a", |
1269 | 1304 | "metadata": {},
|
1270 | 1305 | "outputs": [],
|
1271 | 1306 | "source": [
|
|
1279 | 1314 | {
|
1280 | 1315 | "cell_type": "code",
|
1281 | 1316 | "execution_count": 22,
|
| 1317 | + "id": "9c047eb0", |
1282 | 1318 | "metadata": {},
|
1283 | 1319 | "outputs": [],
|
1284 | 1320 | "source": [
|
|
1288 | 1324 | {
|
1289 | 1325 | "cell_type": "code",
|
1290 | 1326 | "execution_count": 23,
|
| 1327 | + "id": "9a8b3055", |
1291 | 1328 | "metadata": {},
|
1292 | 1329 | "outputs": [
|
1293 | 1330 | {
|
|
1317 | 1354 | },
|
1318 | 1355 | {
|
1319 | 1356 | "cell_type": "markdown",
|
| 1357 | + "id": "92eb9a8f", |
1320 | 1358 | "metadata": {},
|
1321 | 1359 | "source": [
|
1322 | 1360 | "## Regime Inference\n",
|
|
1327 | 1365 | {
|
1328 | 1366 | "cell_type": "code",
|
1329 | 1367 | "execution_count": 24,
|
| 1368 | + "id": "4487098b", |
1330 | 1369 | "metadata": {},
|
1331 | 1370 | "outputs": [
|
1332 | 1371 | {
|
|
1364 | 1403 | {
|
1365 | 1404 | "cell_type": "code",
|
1366 | 1405 | "execution_count": null,
|
| 1406 | + "id": "7f037fb9", |
1367 | 1407 | "metadata": {},
|
1368 | 1408 | "outputs": [],
|
1369 | 1409 | "source": []
|
|
1372 | 1412 | "metadata": {
|
1373 | 1413 | "hide_input": false,
|
1374 | 1414 | "kernelspec": {
|
1375 |
| - "display_name": "pymc-experimental", |
| 1415 | + "display_name": "Python 3 (ipykernel)", |
1376 | 1416 | "language": "python",
|
1377 |
| - "name": "pymc-experimental" |
| 1417 | + "name": "python3" |
1378 | 1418 | },
|
1379 | 1419 | "language_info": {
|
1380 | 1420 | "codemirror_mode": {
|
|
1386 | 1426 | "name": "python",
|
1387 | 1427 | "nbconvert_exporter": "python",
|
1388 | 1428 | "pygments_lexer": "ipython3",
|
1389 |
| - "version": "3.10.6" |
| 1429 | + "version": "3.11.9" |
1390 | 1430 | },
|
1391 | 1431 | "toc": {
|
1392 | 1432 | "base_numbering": 1,
|
|
0 commit comments