{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# First steps with bayesloop\n", "\n", "*bayesloop* models feature a two-level hierarchical structure: the low-level, observation model filters out measurement noise and provides the parameters one is interested in (volatility of stock prices, diffusion coefficient of particles, directional persistence of migrating cancer cells, rate of randomly occurring events, ...). The observation model is, in most cases, given by a simple and well-known stochastic process: price changes are Gaussian-distributed, turning angles of moving cells follow a von-Mises distribution and the number of rare events within a given interval of time is Poisson-distributed. The aim of the observation model is to describe the measured data on a short time scale, while the parameters may change on longer time scales. The high-level, transition model describes *how* the parameters of the observation model change over time, i.e. whether there are abrupt parameter jumps or gradual variations. The transition model may itself depend on so-called hyper-parameters, for example the likelihood of parameter jumps, the magnitude of gradual parameter variations or the slope of a deterministic linear trend. The following tutorials show how to use the *bayesloop* module to infer both time-varying parameter values of the observation model as well as the hyper-parameter values of the transition model and compare different hypotheses about the parameter dynamics by approximating the model evidence, i.e. the probability of the measured data, given the observation model and transition model.\n", "\n", "The first section of the tutorial introduces the main class of the module, `Study`, which enables fits of time-varying parameter models with fixed hyper-parameter values and the optimization of such hyper-parameters based on the model evidence. We provide a detailed description of how to import data, set the observation model and transition model, and perform the model fit. Finally, a plotting function to display the results is discussed briefly. This tutorial therefore provides the basis for later tutorials that discuss the extended classes `HyperStudy`, `ChangepointStudy` and `OnlineStudy`. \n", "\n", "## Study class\n", "To start a new data study/analysis, create a new instance of the `Study` class:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "execution": { "iopub.execute_input": "2026-04-27T19:16:55.009744Z", "iopub.status.busy": "2026-04-27T19:16:55.009300Z", "iopub.status.idle": "2026-04-27T19:16:55.978505Z", "shell.execute_reply": "2026-04-27T19:16:55.977764Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "+ Created new study.\n" ] } ], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt # plotting\n", "plt.style.use('seaborn-v0_8-whitegrid') # plot styling\n", "\n", "import bayesloop as bl\n", "\n", "S = bl.Study()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This object is central to an analysis conducted with *bayesloop*. It stores the data and further provides the methods to perform probabilistic inference on the models defined within the class, as described below.\n", "\n", "## Data import\n", "In this first study, we use a simple, yet instructive example of heterogeneous time series, the annual number of coal mining accidents in the UK from 1851 to 1962. The data is imported as a NumPy array, together with corresponding timestamps. Note that setting timestamps is optional (if none are provided, timestamps are set to an integer sequence: 0, 1, 2,...)." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "execution": { "iopub.execute_input": "2026-04-27T19:16:55.979770Z", "iopub.status.busy": "2026-04-27T19:16:55.979609Z", "iopub.status.idle": "2026-04-27T19:16:56.020408Z", "shell.execute_reply": "2026-04-27T19:16:56.019888Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "+ Successfully imported array.\n" ] } ], "source": [ "import numpy as np\n", "\n", "data = np.array([5, 4, 1, 0, 4, 3, 4, 0, 6, 3, 3, 4, 0, 2, 6, 3, 3, 5, 4, 5, 3, 1, 4,\n", " 4, 1, 5, 5, 3, 4, 2, 5, 2, 2, 3, 4, 2, 1, 3, 2, 2, 1, 1, 1, 1, 3, 0,\n", " 0, 1, 0, 1, 1, 0, 0, 3, 1, 0, 3, 2, 2, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0,\n", " 0, 2, 1, 0, 0, 0, 1, 1, 0, 2, 3, 3, 1, 1, 2, 1, 1, 1, 1, 2, 3, 3, 0,\n", " 0, 0, 1, 4, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0])\n", "\n", "S.load_data(data, timestamps=np.arange(1852, 1962))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that this particular data set is also hard-coded into the `Study` class, for convenient testing:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "execution": { "iopub.execute_input": "2026-04-27T19:16:56.021446Z", "iopub.status.busy": "2026-04-27T19:16:56.021354Z", "iopub.status.idle": "2026-04-27T19:16:56.023414Z", "shell.execute_reply": "2026-04-27T19:16:56.022951Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "+ Successfully imported example data.\n" ] } ], "source": [ "S.load_example_data()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In case you have multiple observations for each time step, you may also provide the data in the form `np.array([[x1,y1,z1], [x2,y2,z2], ..., [xn,yn,zn]])`. Missing data points should be included as `np.nan`.\n", "\n", "## Observation model\n", "The first step to create a probabilistic model to explain the data is to define the **observation model**, or **likelihood**. The observation model states the probability (density) of a data point at time $t$, given the parameter values at time $t$ and possibly past data points. It therefore resembles the low-level model, in contrast to the transition model which describes how the parameters of the observation model change over time.\n", "\n", "As coal mining disasters fortunately are rare events, we may model the number of accidents per year by a [Poisson](https://en.wikipedia.org/wiki/Poisson_distribution) distribution. In *bayesloop*, this is done as follows:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "execution": { "iopub.execute_input": "2026-04-27T19:16:56.024374Z", "iopub.status.busy": "2026-04-27T19:16:56.024290Z", "iopub.status.idle": "2026-04-27T19:16:56.026418Z", "shell.execute_reply": "2026-04-27T19:16:56.026039Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "+ Observation model: Poisson. Parameter(s): ['accident_rate']\n" ] } ], "source": [ "L = bl.om.Poisson('accident_rate', bl.oint(0, 6, 1000))\n", "S.set(L)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We first define the observation model and provide two arguments: A name for the only parameter of the model, the `'accident_rate'`. We further have to provide discrete values for this parameter, as *bayesloop* computes all probability distributions on grids. As the Poisson distribution expects its parameter to be greater than zero, we choose an *open* interval between 0 and 6 with 1000 equally spaced values in between, by using the function `bl.oint()`. For closed intervals, one can also use `bl.cint()`, which acts exactly like the function `linspace` from NumPy. To avoid singularities in the probability values of the observation model, it is however recommended to use `bl.oint()` in most cases. Finally, we assign the defined observation model to our study instance with the method `set()`.\n", "\n", "As the parameter boundaries depend on the data at hand, *bayesloop* will estimate appropriate parameter values, if one does not provide them:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "execution": { "iopub.execute_input": "2026-04-27T19:16:56.027620Z", "iopub.status.busy": "2026-04-27T19:16:56.027543Z", "iopub.status.idle": "2026-04-27T19:16:56.029701Z", "shell.execute_reply": "2026-04-27T19:16:56.029313Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "+ Estimated parameter interval for \"accident_rate\": [0.007492507492507493, 7.492507492507493] (1000 values).\n", "+ Observation model: Poisson. Parameter(s): ['accident_rate']\n" ] } ], "source": [ "L = bl.om.Poisson('accident_rate')\n", "S.set(L)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that you can also use the following short form to define observation models: `L = bl.om.Poisson()`. All currently implemented observation models can be looked up in the [API Docs](../api.rst) or directly in `observation_models.py`. *bayesloop* further supports all probability distributions that are included in the [scipy.stats](http://docs.scipy.org/doc/scipy/reference/stats.html) as well as the [sympy.stats](http://docs.sympy.org/dev/modules/stats.html) module. See [this tutorial](customobservationmodels.ipynb) for instructions on how to build custom observation models from arbitrary distributions.\n", "\n", "In this example, the observation model only features a single parameter. If we wanted to model the annual number of accidents with a Gaussian distribution instead, we have to supply two parameter names (`mean` and `std`) and corresponding values:\n", "```\n", "L = bl.om.Gaussian('mean', bl.cint(0, 6, 200), 'std', bl.oint(0, 2, 200))\n", "S.set(L)\n", "```\n", "Again, if we are not sure about parameter boundaries, we may assign `None` to one or all parameters, and *bayesloop* will estimate them:\n", "```\n", "L = bl.om.Gaussian('mean', None, 'std', bl.oint(0, 2, 200))\n", "S.set(L)\n", "```\n", "The order has to remain `Name, Value, Name, Value, ...`, which is why we cannot simply omit the values and have to write `None` instead.\n", "\n", "## Transition model\n", "As the dynamics of many real-world systems are the result of a multitude of underlying processes that act on different spatial and time scales, common statistical models with static parameters often miss important aspects of the systems' dynamics (see e.g. this [article](http://www.nature.com/articles/ncomms8516)). *bayesloop* therefore calls for a second model, the **transition model**, which describes the temporal changes of the model parameters.\n", "\n", "In this example, we assume that the accident rate itself may change gradually over time and choose a Gaussian random walk with the standard deviation $\\sigma=0.2$ as transition model. As for the observation model, we supply a unique name for hyper-parameter $\\sigma$ (named `sigma`) that describes the standard deviation of the parameter fluctuations and therefore the magnitude of changes. Again, we have to assign values for `sigma`, but only choose a single fixed value of 0.2, instead of a whole set of values. This single value can be optimized, by maximizing the model evidence, see [here](hyperparameteroptimization.ipynb). To analyze and compare a set of different values, one may use an instance of a `HyperStudy` that is described in detail [here](hyperstudy.ipynb). in this first example, we simply take the value of 0.2 as given. As the observation model may contain several parameters, we further have specify the parameter `accident_rate` as the target of this transition model." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "execution": { "iopub.execute_input": "2026-04-27T19:16:56.030695Z", "iopub.status.busy": "2026-04-27T19:16:56.030620Z", "iopub.status.idle": "2026-04-27T19:16:56.032504Z", "shell.execute_reply": "2026-04-27T19:16:56.032153Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "+ Transition model: Gaussian random walk. Hyper-Parameter(s): ['sigma']\n" ] } ], "source": [ "T = bl.tm.GaussianRandomWalk('sigma', 0.2, target='accident_rate')\n", "S.set(T)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that you can also use the following short form to define transition models: `T = bl.tm.GaussianRandomWalk()`. All currently implemented transition models can be looked up in the [API Docs](../api.rst) or directly in `transition_models.py`.\n", "\n", "## Model fit\n", "\n", "At this point, the hierarchical time series model for the coal mining data set is properly defined and we may continue to perform the model fit. *bayesloop* employs a forward-backward algorithm that is based on [Hidden Markov models](http://www.cs.sjsu.edu/~stamp/RUA/HMM.pdf). It basically breaks down the high-dimensional inference problem of all time steps into many low-dimensional ones for each individual time step. The inference algorithm is implemented by the `fit` method:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "execution": { "iopub.execute_input": "2026-04-27T19:16:56.033515Z", "iopub.status.busy": "2026-04-27T19:16:56.033435Z", "iopub.status.idle": "2026-04-27T19:16:56.075648Z", "shell.execute_reply": "2026-04-27T19:16:56.075162Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "+ Started new fit:\n", " + Formatted data.\n", " + Set prior (function): jeffreys. Values have been re-normalized.\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "83a619df1a304e1e909f39374f1a3fff", "version_major": 2, "version_minor": 0 }, "text/plain": [ " 0%| | 0/110 [00:00" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(8, 4))\n", "\n", "# plot of raw data\n", "plt.bar(S.raw_timestamps, S.raw_data, align='center', facecolor='r', alpha=.5)\n", "\n", "# parameter plot\n", "S.plot('accident_rate')\n", "\n", "plt.xlim([1851, 1961])\n", "plt.xlabel('year');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "From this first analysis, we may conclude that before 1880, an average of $\\approx 3$ accidents per year were recorded. This changes significantly between 1880 and 1900, when the accident-rate drops to $\\approx 1$ per year. We can also directly inspect the distribution of the accident rate at specific points in time, using the `plot` method with specified keyword argument `t`:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "execution": { "iopub.execute_input": "2026-04-27T19:16:56.199521Z", "iopub.status.busy": "2026-04-27T19:16:56.199422Z", "iopub.status.idle": "2026-04-27T19:16:56.240575Z", "shell.execute_reply": "2026-04-27T19:16:56.240124Z" } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAq8AAAFuCAYAAACvPfERAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjksIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvJkbTWQAAAAlwSFlzAAAPYQAAD2EBqD+naQAAT9RJREFUeJzt3Qd4VGX2+PGTAgm9EwQEkSKIIG3BFVzFwmLbBRTXsgu2teP+bSigAioi6G91EQuiKLjYUMGC0ruodEIn9BoIkAAhISEh/+e8w2TTCCkzc9v38zzzJFMy8+ZObubc9573nLCsrKwsAQAAABwg3OoBAAAAAEVF8AoAAADHIHgFAACAYxC8AgAAwDEIXgEAAOAYBK8AAABwDIJXAAAAOEakuFBGRoYcPXpUoqKiJDyc+BwAAMBuTp8+LWlpaVKlShWJjIz0dvCqgeuOHTusHgYAAADO4YILLpAaNWqIp4NXnXFVDRo0kAoVKlg9HARZZmambN68WZo1ayYRERFsb5fj/fYW3m9v4f32lhMnTsiuXbuy4zZPB6/+VIHo6GgpX7681cNBCP7ZKX2vCV7dj/fbW3i/vYX325vvd3gxUzxJCAUAAIBjELwCAADAMQheAQAA4BgErwAAAHAMglcAAAA4BsErAAAAHIPgFQAAAI5B8AoAAADHIHgFAACAYxC8AgAAwDEIXgEAAOAYkVYPAAi0AwdEduwQOXZMpEwZkdq1RRo3FomKYlsDAAJgyBDHvF56err06tVLXnjhBenUqZO5bdmyZfLqq6/Ktm3bpGHDhvLss8/K5Zdfbu7LysqS0aNHy6RJkyQ1NVU6d+4sL774olSvXt3cn5aWJkOHDpUZM2ZIdHS03HvvveYSSgSvcI3t20XmzhXZuzf/fWXLirRvL3LllSLR0VaMDgCA0EpLS5OnnnpK4uLism87fPiwPPTQQ+by5z//WaZOnSqPPPKITJs2TerUqSNffvmlfP311/LGG29I1apVZciQITJo0CB57733zM+PHDlS1q5dK+PHj5d9+/aZwLdu3brSvXv3kP1epA3A8TIzRRYtqiwTJoQVGLiq9HSRX38VefddkZ07Qz1CAABCa8uWLXLbbbfJrl27ct2+YsUKiYiIkPvvv1/OP/98E8RGRUXJqlWrzP3z58+XG264QTp27CjNmjUzj/vtt9/MfSkpKWZGVoPZli1bynXXXWfunzhxYkh/N4JXOJoGpZ99Fibr1lUo0uM1lWDCBJHY2KAPDQAAyyxZssSkCehMak46m5qUlGRO+2uKwKxZs+TEiRMmUPXfP2/ePDlw4ICcPHnSzMy2aNHC3Ldx40bJyMiQtm3bZj9f+/btZfXq1XL69OmQ/W6kDcCxMjI0cBXZtq34M7WTJ2tej8illwZrdAAAWOfOO+8s8PYOHTrIXXfdJY8//riEh4dLZmamDB8+XC688EJz/6OPPioPP/yw/OlPfzIztLVq1coOgBMSEqRatWpSVnPxzqhZs6ZJT9CA2J8XG2zMvMKxNADVhVkloYHrd9/paZVAjwoAAPs6ceKE7N69Wx577DGTAqBpA6+88ops3brV3L93716zEOv999+XTz/91OTBDhw40NynC7hyBq7Kf10XhoUKwSscadEikXXrSvcceobj6681eT1QowIAwN4+/PBDky6gwavmrT7xxBNy6aWXyoQJE8ztugDrnnvuka5du5qUgLfeeksWL15sUgM0NzZvkOq/rgFvqBC8wnH27BGZMycwz3XypMikSb4UBAAA3G7dunXSvHnzXLdpTqtWDjhy5Ijs379fLrroouz7zjvvPJMqoDOyMTExkpiYaPJe/TSVQAPXypUrh+x3IHiFo5w65UsXCGReeHx84IJhAADsrHbt2qYSQU5a77V+/fpSpUoVkwbgTyFQGtBqPqver0FuZGRkdmUCtXz5cmnVqpXJnw0Vglc4yrx5wTnNr2W0du8O/PMCAGAnvXv3lgULFsgnn3xicl/166JFi8wCLw1MtaHBiBEjZOnSpbJ582Z55plnTFqBBqjlypWTHj16mNqvsbGxplLBuHHjpE+fPiH9Hag2AMc4eNAXZAaDLuD64QeRBx8UiYgIzmsAAFwi1B22AqhNmzby9ttvy6hRo+Q///mPNGrUSD744ANp2rSpuV8XZ2meqzY30CoC2nnr9ddfl7CwMHP/gAEDTPDat29fqVixovTr10+6desW0t8hLEuzc11Gi+hu2LDB1CyrVKmS1cNBgGh91oLKYmltufj4eLMisrSnLXT/O9MhDzalZV30lJX+A9YyLnA33m9v4f32luPHj5vZXU1HKF++fJF/jrQBOMLmzcWv51oS8+drGZHgvw4AACgZglfYnp4bmD07NK+VliYyd25oXgsAABQfwStsb+1akQMHQvd6K1ZQ+xUAALsieIXtZ131VH4oaRkuZl8BALAnglfY2vr1IocOhf51tXuXVjcAAAD2QvAKW1u40LoZ3wULrHltAABwdgSvsC1t8KHdr6yis6/BaIgAAABKjuAVthWshgTFmX1dvNjaMQAAgNwIXmFLmueao7WyZVavFklOtnoUAACUTHp6utx0003y+++/Z9+2du1a+dvf/iZt27aV2267zTR+yWnx4sXmZ7QtrLZ+1TayOWlL2SuuuML8vHbkSk1NDenbQ3tY2NKSJb6ZT6tlZPjGcvXVVo8EAODV7rAlfb20tDTT5jUuLi77tsOHD8vdd98t119/vbz66quycOFCueeee2Tq1KlSt25d2bdvnzz66KOm7asGqO+884488sgj8v3335sWsdOnT5fRo0eblrE1atQw7WL1+xdffFFChZlX2E56um/G0y6WL/cFsQAAOMWWLVvMrOquXbty3T5lyhSpWrWqDBkyRBo3bmwC2fbt28vnn39u7p80aZJccsklcu+990rTpk1l+PDhsnfvXlmiMzmmVfsE6du3r3Tt2lVat24tQ4cOlW+++Saks68Er7Cd2Fhfpyu70Haxa9ZYPQoAAIpOg81OnTrJl19+met2TQFo2bKlREREZN920UUXZacOrF69Wjp06JB9X7ly5czj9f7MzExZs2ZNrvvbtGkjp06dko0bN4bs7SFtALazbJnYztKlIm3bWj0KAACK5s477yzw9po1a+YLNOPj4yUxMdF8n5CQILVr1851v6YH6GOOHTtmUhFy3h8ZGWlmcvV+T828FpRMnNf69euld+/eJnn4lltuMcnGcJ99+6wtj1XYuPbssXoUgINp67qkJF/9uRAv7gDwP926dZPY2Fj56quvJCMjw+S8zp4928yeKj39X7Zs2Rw/Iea6xmonT57Mvl7Q/Z6ZeS0omTivlJQUeeCBB+Tmm2+W1157zeRlPPjggzJz5kwpX758SMeL4Fqxwt4zwvXrWz0KwEH0w1BzbvSiq5VzJo9XrizSrJlI+/Yi551n5SgBT2nWrJm8/PLL8sorr8jgwYOlRYsWcscdd2RPIEZFReULRPV65cqVzX3+63nv1/QCT8y8ni2ZOK+ffvrJbLD+/fub5OJBgwZJhQoVZNq0aSEbK4JPP9fsPKGuTQuYMAKKSFddjhol8v33Itu351/1eOyY74hw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tW/fvqbESr9+/aRbt25WDwtAKcyePdusRn3vvffMJadNmzaxbV1Ic970gEVTRf72t7+ZyYl//OMfTEYALqDx2UcffSSvvvqq3HLLLeZg5fbbby9y8BqWRYV3AAAAOISr0gYAAADgbgSvAAAAcAyCVwAAADgGwSsAAAAcg+AVAAAAjkHwCgAAAMcgeAUAAIBjELwCAADAMQheASBInnvuOXM5G+3f/u233wbktX799VfTRjdYgv38AFBUBK8AECSDBg0yl1C4++675dChQ459fgAoqsgiPxIAUCyVKlViiwFAgDHzCgBnLF++XO644w659NJLpU2bNvLPf/5TDh48aO5bsGCB9OzZ09z3l7/8xZxG9/vuu++ke/fu5r7bb79d1q9fX2DawBdffCFXXXWVtGvXTt59991c2z0rK0veeecd6dKli3To0EEeeugh2bdvX/b9F110kXmdm266SS655BK58847Zffu3dnpB6pPnz7y9ttvn/P99I9Lf48//vGPsmPHDtmyZYvcd9990rZtW2nVqpV5fn+aQEHPv2zZMunVq5e0bt1abr75Zpk+fTp/RwBCguAVAETk+PHj8uCDD0rnzp3lxx9/lI8++kh27dolH3zwgcTFxcnDDz8s1113XXYA+cgjj0hCQoIsXLjQpAb07dtXvv/+exNY6vOkp6fn2q76uGHDhsn/+3//T7788ktZs2aN7N27N/v+//73v/LDDz/I//3f/5n7a9SoIffee6+cOnUq+zEaOOpraZ5sYmKivPXWW+b2r7/+Ovt+/Zmi0N9DxzJmzBhp0KCBCZbr1atnbtcgOzMzU15//fUCn19/b/0dNXjVMd9///0mGNaAFgCCjbQBABCRkydPmoD0nnvukbCwMDn//POlW7duEhsba4I3nS3V+9UDDzwgKSkpcuzYMRNoajCrM7aqf//+UqZMGTl69Giu7Tpp0iQzQ9mjRw9z/dVXX5Urr7wy+/4PP/xQBg8eLJ06dTLXX3rpJTMLq0Gvf+ZTx6YzpUpfb+LEieb76tWrm69VqlSRChUqFOn91NlV//Pq76IzxjrbWr58eXObzjLrmAp6/rFjx8rll18uf//7383tDRs2lA0bNsj48ePNrDEABBPBKwCISK1atUxg+cknn5hATE+jb9q0yQSt27dvl5YtW+baTjprqfQ+Dfz8ypYtK88++2y+baqn4HM+rlq1aiZAVidOnJD4+Hh54oknJDw8PFdAraf0/TRI9KtYsWKuWdni0llWPw1YNRieMmWKrF27VrZt22ZSH2rWrFngz+r9c+fONSkGfjqWRo0alXg8AFBUBK8AICIHDhyQW265xQSpOqt42223ybx582T16tUSGXn2f5WF3ZeX5rXmpDO0Sk/Rq//85z/5AkCd7cz7+ECIiorK/l6D51tvvdUE1DobqzPJGqCOGzeuwJ/NyMgws8iaalDSbQEAJcV/GgAQkZkzZ5pAUXNA/T799FMTcPpPi+eks6j/+Mc/zH0bN27Mvl0DUc2N9eeL+jVt2tTkufolJyfLzp07zfeVK1c2Oa6aS6oLupTmzD755JPZi6iCacmSJWZhmuav+gPQRYsW5Qu2/TTAXrlyZa6ZYA10dcx5A1oACDQWbAGAiFStWtWs7tcqArqKXxdqzZgxwwRkekpdFyN9/PHHJuDUAFcXcWl+pwawulBr8uTJ5r7hw4eboC9vmoHmh/7888/y1VdfmRSCF1980aQF5Kyjqguw5syZY1IFnn/+eVmxYoVceOGFRXp/9NS/jkkXnpXkd9e811mzZsmePXtMfq7m0+ZcdJbz+TU3VtML3nzzTTNWDXr//e9/S926dflbAhB0zLwCgIhcf/31snTpUnn88cfNgi1d0KS5q7rCvk6dOuarVgLQIE1nUd9//32JiYkxF11opWWudOZUqw3ofdHR0bm2qwa6GthqgHrkyBGTotCiRYvs+3WGVU/fa1Crs7L6PFrxIGfaQGE0iB45cqSpkDBw4MBivac6s/voo4/K0KFDJS0tzZTl0nFoZQNNp9DfMe/z6+/4xhtvmDHq/f7SWwAQbGFZZzsvBAAAANgMaQMAAABwDNIGAMBFNC931KhRZ71fqwRoDVkAcCrSBgDARbRxgnbfOhutD6uVDQDAqQheAQAA4BjkvAIAAMAxCF4BAADgGASvAAAAcAyCVwAAADgGwSsAAAAcg+AVAAAAjkHwCgAAAHGK/w/H5TpZ8CCwxAAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(8, 4))\n", "\n", "S.plot('accident_rate', t=1880, facecolor='r', alpha=0.5, label='1880')\n", "S.plot('accident_rate', t=1900, facecolor='b', alpha=0.5, label='1900')\n", "\n", "plt.legend()\n", "plt.xlim([0, 5]);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Without the `plot=True` argument, this method returns the parameter grid values `x` and the corresponding probability values `p`. The returned probability values are normalized to 1, so we can directly evaluate conditions such as the probability that the accident rate was below 1 in the year 1900:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "execution": { "iopub.execute_input": "2026-04-27T19:55:38.739129Z", "iopub.status.busy": "2026-04-27T19:55:38.739053Z", "iopub.status.idle": "2026-04-27T19:55:38.741193Z", "shell.execute_reply": "2026-04-27T19:55:38.740786Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Probability accident_rate < 1 in 1900: 0.422\n" ] } ], "source": [ "x, p = S.get_parameter_distribution(1900, 'accident_rate', density=False)\n", "probability_below_one = np.sum(p[x < 1])\n", "print(f'Probability accident_rate < 1 in 1900: {probability_below_one:.3f}')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For probabilities involving a single inferred parameter, use the arrays returned by `get_parameter_distribution` or `get_parameter_distributions` directly.\n", "\n", "## Saving studies\n", "As the `Study` class instance (above denoted by `S`) of a conducted analysis contains all information about the inferred parameter values, it may be convenient to store the entire instance `S` to file. This way, it can be loaded again later, for example to refine the study, create different plots or perform further analyses based on the obtained results. *bayesloop* provides two functions, `bl.save()` and `bl.load()` to store and retrieve existing studies:\n", "```\n", "bl.save('file.bl', S)\n", "\n", "...\n", "\n", "S = bl.load('file.bl')\n", "```" ] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python 3", "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.12.4" }, "widgets": { "application/vnd.jupyter.widget-state+json": { "state": { "0aa2dd94e29a4be28a1d20cd3cda40f6": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HTMLView", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_2349c4f237b94dfb994cece5cb218d8c", "placeholder": "​", "style": "IPY_MODEL_171841c2ec804634bbb941fa08fd2b2a", "tabbable": null, "tooltip": null, "value": "100%" } }, "0e0637e6d6274597ba75e6dc9cb21136": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "0e8bc6c2722244229ba21f81ca4a0619": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "bar_color": null, "description_width": "" } }, "11fc610816b84204aad0b856ac128663": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "171841c2ec804634bbb941fa08fd2b2a": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "background": null, "description_width": "", "font_size": null, "text_color": null } }, "2349c4f237b94dfb994cece5cb218d8c": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "403051567b914846b18ab8f6555a0f71": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HTMLView", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_0e0637e6d6274597ba75e6dc9cb21136", "placeholder": "​", "style": "IPY_MODEL_6a68fac7dcef4f28be58679e8b09b927", "tabbable": null, "tooltip": null, "value": " 110/110 [00:00<00:00, 9307.89it/s]" } }, "50310d26b36740699f1737d87e927d78": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "6a68fac7dcef4f28be58679e8b09b927": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "background": null, "description_width": "", "font_size": null, "text_color": null } }, "70b85f24224344f1ab830a88035687a7": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HTMLView", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_11fc610816b84204aad0b856ac128663", "placeholder": "​", "style": "IPY_MODEL_ea165df47324421899c572a7e50b89aa", "tabbable": null, "tooltip": null, "value": "100%" } }, "73eba2343ef6440c9d400a8c78aa819b": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "background": null, "description_width": "", "font_size": null, "text_color": null } }, "74d9473b23034528bb92dfefdf212ca3": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "7deaad5c87154934a555afc901c30432": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "ProgressView", "bar_style": "success", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_d69cb971817a403c9d589bf10e9fcfbb", "max": 110.0, "min": 0.0, "orientation": "horizontal", "style": "IPY_MODEL_0e8bc6c2722244229ba21f81ca4a0619", "tabbable": null, "tooltip": null, "value": 110.0 } }, "83a619df1a304e1e909f39374f1a3fff": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_70b85f24224344f1ab830a88035687a7", "IPY_MODEL_7deaad5c87154934a555afc901c30432", "IPY_MODEL_cfbda0e474d24fa1a22e0587c184e956" ], "layout": "IPY_MODEL_50310d26b36740699f1737d87e927d78", "tabbable": null, "tooltip": null } }, "b96fd15272044c2a82ad7fa39ed78ff3": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "c5e833198b7f48d1967bf437637ed099": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_0aa2dd94e29a4be28a1d20cd3cda40f6", "IPY_MODEL_d711b90ee75b40ac9e765bc3aca83e92", "IPY_MODEL_403051567b914846b18ab8f6555a0f71" ], "layout": "IPY_MODEL_b96fd15272044c2a82ad7fa39ed78ff3", "tabbable": null, "tooltip": null } }, "cfbda0e474d24fa1a22e0587c184e956": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HTMLView", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_d44e9afac2774955816529216460583d", "placeholder": "​", "style": "IPY_MODEL_73eba2343ef6440c9d400a8c78aa819b", "tabbable": null, "tooltip": null, "value": " 110/110 [00:00<00:00, 8523.12it/s]" } }, "d44e9afac2774955816529216460583d": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "d69cb971817a403c9d589bf10e9fcfbb": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "d711b90ee75b40ac9e765bc3aca83e92": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "ProgressView", "bar_style": "success", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_74d9473b23034528bb92dfefdf212ca3", "max": 110.0, "min": 0.0, "orientation": "horizontal", "style": "IPY_MODEL_dfc49a82f9e345d7bf966d5322d716e5", "tabbable": null, "tooltip": null, "value": 110.0 } }, "dfc49a82f9e345d7bf966d5322d716e5": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "bar_color": null, "description_width": "" } }, "ea165df47324421899c572a7e50b89aa": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "background": null, "description_width": "", "font_size": null, "text_color": null } } }, "version_major": 2, "version_minor": 0 } } }, "nbformat": 4, "nbformat_minor": 1 }