{ "cells": [ { "cell_type": "markdown", "id": "91f05010-b82d-42f3-b882-4f689eaa946c", "metadata": {}, "source": [ "(migration_guide)=\n", "# ArviZ migration guide\n", "\n", "We have been working on refactoring ArviZ to allow more flexibility and extensibility of its elements\n", "while keeping as much as possible a friendly user-interface that gives sensible results with little to no arguments.\n", "\n", "One important change is enhanced modularity. Everything will still be available through a common namespace `arviz`,\n", "but ArviZ will now be composed of 3 smaller libraries:\n", "\n", "* [arviz-base](https://arviz-base.readthedocs.io/en/latest/) data related functionality, including converters from different PPLs.\n", "* [arviz-stats](https://arviz-stats.readthedocs.io/en/latest/) for statistical functions and diagnostics.\n", "* [arviz-plots](https://arviz-plots.readthedocs.io/en/latest/) for visual checks built on top of arviz-stats and arviz-base.\n", "\n", "Each library has a minimal set of dependencies, with a lot of functionality built on top of optional dependencies.\n", "This keeps ArviZ smaller and easier to install as you can install only the components you really need. The main examples are:\n", "\n", "* `arviz-base` has no I/O library as a dependency, but you can use `netcdf4`, `h5netcdf` or `zarr` to read and write your data, allowing you to install only the one you need.\n", "* `arviz-plots` has no plotting library as a dependency, but it can generate plots with `matplotlib`, `bokeh` or `plotly` if they are installed." ] }, { "cell_type": "code", "execution_count": 1, "id": "f41bc2a7-3694-4cb1-97b1-8379515da0d6", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [ "remove-cell" ] }, "outputs": [], "source": [ "import xarray as xr\n", "xr.set_options(display_expand_attrs=False, display_expand_coords=False);" ] }, { "cell_type": "code", "execution_count": 2, "id": "4074f836-233b-4b10-8483-d2177cad7424", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [ "import arviz as az" ] }, { "cell_type": "markdown", "id": "a28ab6bd-d3c1-4f71-981f-3444f39ee249", "metadata": {}, "source": [ "Check all 3 libraries have been exposed correctly:" ] }, { "cell_type": "code", "execution_count": 3, "id": "7c792e9f-9a22-4ba0-ad11-138fbc510784", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Status information for ArviZ 1.0.0rc0\n", "\n", "arviz_base 0.9.0.dev0 available, exposing its functions as part of the `arviz` namespace\n", "arviz_stats 0.9.0.dev available, exposing its functions as part of the `arviz` namespace\n", "arviz_plots 0.9.0.dev0 available, exposing its functions as part of the `arviz` namespace\n" ] } ], "source": [ "print(az.info)" ] }, { "cell_type": "markdown", "id": "dba357f5-cc19-4fe3-918c-6a540723c3e9", "metadata": {}, "source": [ "## `arviz-base`" ] }, { "cell_type": "markdown", "id": "f9f0a3a9", "metadata": {}, "source": [ "### Credible intervals and rcParams\n", "\n", "Some global configuration settings have changed. For example, the default credible interval probability (`ci_prob`) has been updated from 0.94 to 0.89. Using 0.89 produces intervals with lower variability, leading to more stable summaries. At the same time, keeping a non-standard value (rather than 0.90 or 0.95) serves as a friendly reminder that the choice of interval can depend on the problem at hand.\n", "\n", "In addition, a new setting `ci_kind` has been introduced, which defaults to \"eti\" (equal-tailed interval). This controls the method used to compute credible intervals. The alternative is \"hdi\" (highest density interval), which was previously the default.\n", "\n", "\n", "Defaults set via `rcParams` are not fixed rules, they’re meant to be adjusted to fit the needs of your analysis. `rcParams` offers a convenient way to establish global defaults for your workflow, while most functions that compute credible intervals also provide `ci_prob` and `ci_kind` arguments to override these settings locally.\n", "\n", "\n", "You can check all default settings with:" ] }, { "cell_type": "code", "execution_count": 4, "id": "6e2e42a9", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "RcParams({'data.http_protocol': 'https',\n", " 'data.index_origin': 0,\n", " 'data.sample_dims': ('chain', 'draw'),\n", " 'data.save_warmup': False,\n", " 'plot.backend': 'matplotlib',\n", " 'plot.density_kind': 'kde',\n", " 'plot.max_subplots': 40,\n", " 'stats.ci_kind': 'eti',\n", " 'stats.ci_prob': 0.89,\n", " 'stats.envelope_prob': 0.99,\n", " 'stats.ic_compare_method': 'stacking',\n", " 'stats.ic_pointwise': True,\n", " 'stats.ic_scale': 'log',\n", " 'stats.module': 'base',\n", " 'stats.point_estimate': 'mean',\n", " 'stats.round_to': '2g'})" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "az.rcParams" ] }, { "cell_type": "markdown", "id": "b73c5b99-234c-4b5d-ab3e-adfce2fb2edc", "metadata": {}, "source": [ "### `DataTree`\n", "One of the main differences is that the `arviz.InferenceData` object doesn't exist anymore.\n", "`arviz-base` uses {class}`xarray.DataTree` instead. This is a new data structure in xarray,\n", "so it might still have some rough edges, but it is much more flexible and powerful.\n", "To give some examples, I/O will now be more flexible, and any format supported by\n", "xarray is automatically available to you, no need to add wrappers on top of them within ArviZ.\n", "It is also possible to have arbitrary nesting of variables within groups and subgroups.\n", "\n", ":::{important}\n", "Not all the functionality on `xarray.DataTree` will be compatible with ArviZ as it would be too much\n", "work for us to cover and maintain. If there are things you have always wanted to do but\n", "were not possible with `InferenceData` and are now possible with `DataTree` please try\n", "them out, give feedback on them and on desired behaviour for things that still don't work.\n", "After a couple releases the \"ArviZverse\" will stabilize much more, and it might not be\n", "possible to add support for that anymore.\n", ":::" ] }, { "cell_type": "markdown", "id": "236f1871-444a-4771-ab5b-ca95c78a80f2", "metadata": {}, "source": [ "#### What about my existing netcdf/zarr files?\n", "**They are still valid. There have been no changes on this end and we don't plan to make any.**\n", "The underlying functions handling I/O operations have changed, but the effect on your workflows\n", "should be minimal; the arguments continue to be mostly the same, and only some duplicated aliases have been removed:\n", "\n", "| Function in legacy ArviZ | New equivalent in xarray |\n", "|--------------------------|--------------------------|\n", "| arviz.from_netcdf | {func}`arviz.from_netcdf`[^1] |\n", "| arviz.from_zarr | {func}`arviz.from_zarr`[^1] |\n", "| arviz.to_netcdf | - |\n", "| arviz.to_zarr | - |\n", "| arviz.InferenceData.from_netcdf | - |\n", "| arviz.InferenceData.from_zarr | - |\n", "| arviz.InferenceData.to_netcdf | {meth}`xarray.DataTree.to_netcdf` |\n", "| arviz.InferenceData.to_zarr | {meth}`xarray.DataTree.to_zarr` |\n", "\n", "[^1]: In addition to exposing top level functions from the three arviz-xyz libraries,\n", " the main ArviZ library also includes two aliases to {func}`xarray.open_datatree`.\n", "\n", " * `from_zarr` is a `functools.partial` wrapper of `open_datatree` with `engine=\"zarr\"`\n", " already set\n", " * `from_netcdf` is exactly `open_datatree` so you can use the `engine`\n", " keyword to choose explicitly between `netcdf4`, `h5netcdf`\n", " or leave it to xarray's default behaviour and {func}`netcdf_engine_order ` setting.\n", "\n", "Here is an example where we read a file that was saved from an `InferenceData` object using `idata.to_netcdf(\"example.nc\")`." ] }, { "cell_type": "code", "execution_count": 5, "id": "d4f961f4-0997-47d6-9f89-4ab2c1b0ca50", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [ "remove-cell" ] }, "outputs": [], "source": [ "# the example dataset centered_eight was saved as netcdf from an InferenceData object\n", "# Here we load it as DataTree and save again as `example.nc` to allow running the notebook from top to bottom\n", "# This cell is removed from the rendered docs to keep the story clear though\n", "# If reading old netcdf files as DataTree failed this cell would fail, so the only way for the notebook to run\n", "# is for the statement right before this code cell to be true.\n", "az.load_arviz_data(\"centered_eight\").to_netcdf(\"example.nc\", engine=\"h5netcdf\")" ] }, { "cell_type": "code", "execution_count": 6, "id": "64abc25b-2111-4c18-837c-41a8dac2c9b1", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataTree>\n",
       "Group: /\n",
       "β”œβ”€β”€ Group: /posterior\n",
       "β”‚       Dimensions:  (chain: 4, draw: 500, school: 8)\n",
       "β”‚       Coordinates: (3)\n",
       "β”‚       Data variables:\n",
       "β”‚           mu       (chain, draw) float64 16kB ...\n",
       "β”‚           theta    (chain, draw, school) float64 128kB ...\n",
       "β”‚           tau      (chain, draw) float64 16kB ...\n",
       "β”‚       Attributes: (6)\n",
       "β”œβ”€β”€ Group: /posterior_predictive\n",
       "β”‚       Dimensions:  (chain: 4, draw: 500, school: 8)\n",
       "β”‚       Coordinates: (3)\n",
       "β”‚       Data variables:\n",
       "β”‚           obs      (chain, draw, school) float64 128kB ...\n",
       "β”‚       Attributes: (4)\n",
       "β”œβ”€β”€ Group: /log_likelihood\n",
       "β”‚       Dimensions:  (chain: 4, draw: 500, school: 8)\n",
       "β”‚       Coordinates: (3)\n",
       "β”‚       Data variables:\n",
       "β”‚           obs      (chain, draw, school) float64 128kB ...\n",
       "β”‚       Attributes: (4)\n",
       "...\n",
       "β”œβ”€β”€ Group: /prior_predictive\n",
       "β”‚       Dimensions:  (chain: 1, draw: 500, school: 8)\n",
       "β”‚       Coordinates: (3)\n",
       "β”‚       Data variables:\n",
       "β”‚           obs      (chain, draw, school) float64 32kB ...\n",
       "β”‚       Attributes: (4)\n",
       "β”œβ”€β”€ Group: /observed_data\n",
       "β”‚       Dimensions:  (school: 8)\n",
       "β”‚       Coordinates: (1)\n",
       "β”‚       Data variables:\n",
       "β”‚           obs      (school) float64 64B ...\n",
       "β”‚       Attributes: (4)\n",
       "└── Group: /constant_data\n",
       "        Dimensions:  (school: 8)\n",
       "        Coordinates: (1)\n",
       "        Data variables:\n",
       "            sigma    (school) float64 64B ...\n",
       "        Attributes: (4)
" ], "text/plain": [ "\n", "Group: /\n", "β”œβ”€β”€ Group: /posterior\n", "β”‚ Dimensions: (chain: 4, draw: 500, school: 8)\n", "β”‚ Coordinates: (3)\n", "β”‚ Data variables:\n", "β”‚ mu (chain, draw) float64 16kB ...\n", "β”‚ theta (chain, draw, school) float64 128kB ...\n", "β”‚ tau (chain, draw) float64 16kB ...\n", "β”‚ Attributes: (6)\n", "β”œβ”€β”€ Group: /posterior_predictive\n", "β”‚ Dimensions: (chain: 4, draw: 500, school: 8)\n", "β”‚ Coordinates: (3)\n", "β”‚ Data variables:\n", "β”‚ obs (chain, draw, school) float64 128kB ...\n", "β”‚ Attributes: (4)\n", "β”œβ”€β”€ Group: /log_likelihood\n", "β”‚ Dimensions: (chain: 4, draw: 500, school: 8)\n", "β”‚ Coordinates: (3)\n", "β”‚ Data variables:\n", "β”‚ obs (chain, draw, school) float64 128kB ...\n", "β”‚ Attributes: (4)\n", "...\n", "β”œβ”€β”€ Group: /prior_predictive\n", "β”‚ Dimensions: (chain: 1, draw: 500, school: 8)\n", "β”‚ Coordinates: (3)\n", "β”‚ Data variables:\n", "β”‚ obs (chain, draw, school) float64 32kB ...\n", "β”‚ Attributes: (4)\n", "β”œβ”€β”€ Group: /observed_data\n", "β”‚ Dimensions: (school: 8)\n", "β”‚ Coordinates: (1)\n", "β”‚ Data variables:\n", "β”‚ obs (school) float64 64B ...\n", "β”‚ Attributes: (4)\n", "└── Group: /constant_data\n", " Dimensions: (school: 8)\n", " Coordinates: (1)\n", " Data variables:\n", " sigma (school) float64 64B ...\n", " Attributes: (4)" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dt = az.from_netcdf(\"example.nc\")\n", "dt" ] }, { "cell_type": "markdown", "id": "708795ba-6d1c-41a2-bf87-ae92fe15076c", "metadata": {}, "source": [ "#### Other key differences\n", "Because `DataTree` is an xarray object intended for a broader audience; its methods differ from those of `InferenceData`.\n", "\n", "This section goes over the main differences to help migrate code that used `InferenceData` to now use `DataTree`.\n", "\n", "`DataTree` supports an arbitrary level of nesting (as opposed to the exactly 1 level of nesting in\n", "`InferenceData`). To stay consistent, accessing a group always returns a `DataTree`,\n", "even when the group is a leaf (that is, it contains no further subgroups).\n", "\n", "This means that `dt[\"posterior\"]` will now return a `DataTree`.\n", "In many cases this is irrelevant, but there will be some cases where you'll want the\n", "group as a `Dataset` instead. You can achieve this with either `dt[\"posterior\"].dataset` if you only need a view,\n", "or `dt[\"posterior\"].to_dataset()` to get a new copy if you want a mutable Dataset.\n", "\n", "There are no changes at the variable/`DataArray` level. Thus, `dt[\"posterior\"][\"theta\"]` is still\n", "a `DataArray`, accessing its variables is one of the cases where having either `DataTree`\n", "or `Dataset` is irrelevant." ] }, { "cell_type": "markdown", "id": "59d18eb9-17a3-48b1-8982-1cd334d76f8c", "metadata": {}, "source": [ "##### `InferenceData.extend`\n", "\n", "Another extremely common method of `InferenceData` was `.extend`. In this case, the same behaviour can be replicated with {meth}`xarray.DataTree.update` which behaves like the method of the same name in `dict` objects. These are the two equivalences:\n", "\n", "```python\n", "idata.extend(idata_new)\n", "idata_new.update(idata)\n", "# or\n", "idata.extend(idata_new, how=\"right\")\n", "idata.update(idata_new)\n", "```\n", "\n", "The default behaviour in `.extend` was to do a \"left-like merge\". That is, if both `idata` and `idata_new` have an `observed_data` group, `.extend` preserved the one in `idata`\n", "and ignored that group in `idata_new`. Using `.update` with the switched order we get the same behaviour as any repeated groups in `idata` will overwrite the ones in `idata_new`.\n", "For cases that explicitly set `how=\"right\"` then `.update` should use the same order as `.extend` did.\n" ] }, { "cell_type": "markdown", "id": "525db088-1047-4700-a312-717f27ceb470", "metadata": {}, "source": [ "##### `InferenceData.map`\n", "The `.map` method is very similar to {meth}`xarray.DataTree.map_over_datasets`. The main difference is the lack of `groups`, `filter_groups` and `inplace` arguments.\n", "In order to achieve this we need to combine `.map_over_datasets` with either {meth}`~xarray.DataTree.filter` or {meth}`~xarray.DataTree.match`.\n", "\n", "For example, applying a function to only the posterior_predictive and prior_predictive group which used to be\n", "\n", "```python\n", "idata.map(lambda ds: ds + 3, groups=\"_predictive\", filter_groups=\"like\")\n", "```\n", "\n", "can now be _partially_ achieved with (we'll see the the full equivalence later on):" ] }, { "cell_type": "code", "execution_count": 7, "id": "143bfb73-4cc0-49af-91bd-14ac940a2434", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataTree>\n",
       "Group: /\n",
       "β”œβ”€β”€ Group: /posterior_predictive\n",
       "β”‚       Dimensions:  (chain: 4, draw: 500, school: 8)\n",
       "β”‚       Coordinates: (3)\n",
       "β”‚       Data variables:\n",
       "β”‚           obs      (chain, draw, school) float64 128kB 41.88 -11.98 ... 30.05 23.99\n",
       "β”‚       Attributes: (4)\n",
       "└── Group: /prior_predictive\n",
       "        Dimensions:  (chain: 1, draw: 500, school: 8)\n",
       "        Coordinates: (3)\n",
       "        Data variables:\n",
       "            obs      (chain, draw, school) float64 32kB 25.03 29.95 ... 61.23 42.78\n",
       "        Attributes: (4)
" ], "text/plain": [ "\n", "Group: /\n", "β”œβ”€β”€ Group: /posterior_predictive\n", "β”‚ Dimensions: (chain: 4, draw: 500, school: 8)\n", "β”‚ Coordinates: (3)\n", "β”‚ Data variables:\n", "β”‚ obs (chain, draw, school) float64 128kB 41.88 -11.98 ... 30.05 23.99\n", "β”‚ Attributes: (4)\n", "└── Group: /prior_predictive\n", " Dimensions: (chain: 1, draw: 500, school: 8)\n", " Coordinates: (3)\n", " Data variables:\n", " obs (chain, draw, school) float64 32kB 25.03 29.95 ... 61.23 42.78\n", " Attributes: (4)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dt.match(\"*_predictive\").map_over_datasets(lambda ds: ds + 3)" ] }, { "cell_type": "markdown", "id": "0e1baed1-5bd9-40c0-9d27-0cfae9a2a2ae", "metadata": {}, "source": [ "If we instead want to apply it also to the observed_data group, it is no longer as easy to use glob-like patterns. We can use filter instead to check against a list, which is similar to using a list/tuple as the `groups` argument:" ] }, { "cell_type": "code", "execution_count": 8, "id": "0da8110d-c05a-4e04-8daa-ebee2aef9dd8", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataTree>\n",
       "Group: /\n",
       "β”œβ”€β”€ Group: /posterior_predictive\n",
       "β”‚       Dimensions:  (chain: 4, draw: 500, school: 8)\n",
       "β”‚       Coordinates: (3)\n",
       "β”‚       Data variables:\n",
       "β”‚           obs      (chain, draw, school) float64 128kB 41.88 -11.98 ... 30.05 23.99\n",
       "β”‚       Attributes: (4)\n",
       "β”œβ”€β”€ Group: /prior_predictive\n",
       "β”‚       Dimensions:  (chain: 1, draw: 500, school: 8)\n",
       "β”‚       Coordinates: (3)\n",
       "β”‚       Data variables:\n",
       "β”‚           obs      (chain, draw, school) float64 32kB 25.03 29.95 ... 61.23 42.78\n",
       "β”‚       Attributes: (4)\n",
       "└── Group: /observed_data\n",
       "        Dimensions:  (school: 8)\n",
       "        Coordinates: (1)\n",
       "        Data variables:\n",
       "            obs      (school) float64 64B 31.0 11.0 0.0 10.0 2.0 4.0 21.0 15.0\n",
       "        Attributes: (4)
" ], "text/plain": [ "\n", "Group: /\n", "β”œβ”€β”€ Group: /posterior_predictive\n", "β”‚ Dimensions: (chain: 4, draw: 500, school: 8)\n", "β”‚ Coordinates: (3)\n", "β”‚ Data variables:\n", "β”‚ obs (chain, draw, school) float64 128kB 41.88 -11.98 ... 30.05 23.99\n", "β”‚ Attributes: (4)\n", "β”œβ”€β”€ Group: /prior_predictive\n", "β”‚ Dimensions: (chain: 1, draw: 500, school: 8)\n", "β”‚ Coordinates: (3)\n", "β”‚ Data variables:\n", "β”‚ obs (chain, draw, school) float64 32kB 25.03 29.95 ... 61.23 42.78\n", "β”‚ Attributes: (4)\n", "└── Group: /observed_data\n", " Dimensions: (school: 8)\n", " Coordinates: (1)\n", " Data variables:\n", " obs (school) float64 64B 31.0 11.0 0.0 10.0 2.0 4.0 21.0 15.0\n", " Attributes: (4)" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dt.filter(\n", " lambda node: node.name in (\"posterior_predictive\", \"prior_predictive\", \"observed_data\")\n", ").map_over_datasets(lambda ds: ds + 3)" ] }, { "cell_type": "markdown", "id": "71f57589-ebb9-48a0-bf90-6f1677a6f4c7", "metadata": {}, "source": [ "In both cases we have created a whole new `DataTree` with only the groups we have filtered and applied functions to.\n", "This is often not what we want when working with `DataTree` objects that follow the InferenceData schema.\n", "The default behaviour of `.map` (or any `InferenceData` method that took a `groups` argument) was to act on the selected groups,\n", "leave the rest untouched and return _all_ groups in the output. We can achieve this and fully reproduce `.map` using also `.update`." ] }, { "cell_type": "code", "execution_count": 9, "id": "50567832-bd9f-4544-9b61-34fee1a24c3c", "metadata": {}, "outputs": [], "source": [ "shifted_dt = dt.copy()\n", "shifted_dt.update(dt.match(\"*_predictive\").map_over_datasets(lambda ds: ds + 3))" ] }, { "cell_type": "code", "execution_count": 10, "id": "adf36a86-a4f2-4188-a920-16138003e825", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataTree>\n",
       "Group: /\n",
       "β”œβ”€β”€ Group: /posterior\n",
       "β”‚       Dimensions:  (chain: 4, draw: 500, school: 8)\n",
       "β”‚       Coordinates: (3)\n",
       "β”‚       Data variables:\n",
       "β”‚           mu       (chain, draw) float64 16kB ...\n",
       "β”‚           theta    (chain, draw, school) float64 128kB ...\n",
       "β”‚           tau      (chain, draw) float64 16kB ...\n",
       "β”‚       Attributes: (6)\n",
       "β”œβ”€β”€ Group: /posterior_predictive\n",
       "β”‚       Dimensions:  (chain: 4, draw: 500, school: 8)\n",
       "β”‚       Coordinates: (3)\n",
       "β”‚       Data variables:\n",
       "β”‚           obs      (chain, draw, school) float64 128kB 41.88 -11.98 ... 30.05 23.99\n",
       "β”‚       Attributes: (4)\n",
       "β”œβ”€β”€ Group: /log_likelihood\n",
       "β”‚       Dimensions:  (chain: 4, draw: 500, school: 8)\n",
       "β”‚       Coordinates: (3)\n",
       "β”‚       Data variables:\n",
       "β”‚           obs      (chain, draw, school) float64 128kB ...\n",
       "β”‚       Attributes: (4)\n",
       "...\n",
       "β”œβ”€β”€ Group: /prior_predictive\n",
       "β”‚       Dimensions:  (chain: 1, draw: 500, school: 8)\n",
       "β”‚       Coordinates: (3)\n",
       "β”‚       Data variables:\n",
       "β”‚           obs      (chain, draw, school) float64 32kB 25.03 29.95 ... 61.23 42.78\n",
       "β”‚       Attributes: (4)\n",
       "β”œβ”€β”€ Group: /observed_data\n",
       "β”‚       Dimensions:  (school: 8)\n",
       "β”‚       Coordinates: (1)\n",
       "β”‚       Data variables:\n",
       "β”‚           obs      (school) float64 64B ...\n",
       "β”‚       Attributes: (4)\n",
       "└── Group: /constant_data\n",
       "        Dimensions:  (school: 8)\n",
       "        Coordinates: (1)\n",
       "        Data variables:\n",
       "            sigma    (school) float64 64B ...\n",
       "        Attributes: (4)
" ], "text/plain": [ "\n", "Group: /\n", "β”œβ”€β”€ Group: /posterior\n", "β”‚ Dimensions: (chain: 4, draw: 500, school: 8)\n", "β”‚ Coordinates: (3)\n", "β”‚ Data variables:\n", "β”‚ mu (chain, draw) float64 16kB ...\n", "β”‚ theta (chain, draw, school) float64 128kB ...\n", "β”‚ tau (chain, draw) float64 16kB ...\n", "β”‚ Attributes: (6)\n", "β”œβ”€β”€ Group: /posterior_predictive\n", "β”‚ Dimensions: (chain: 4, draw: 500, school: 8)\n", "β”‚ Coordinates: (3)\n", "β”‚ Data variables:\n", "β”‚ obs (chain, draw, school) float64 128kB 41.88 -11.98 ... 30.05 23.99\n", "β”‚ Attributes: (4)\n", "β”œβ”€β”€ Group: /log_likelihood\n", "β”‚ Dimensions: (chain: 4, draw: 500, school: 8)\n", "β”‚ Coordinates: (3)\n", "β”‚ Data variables:\n", "β”‚ obs (chain, draw, school) float64 128kB ...\n", "β”‚ Attributes: (4)\n", "...\n", "β”œβ”€β”€ Group: /prior_predictive\n", "β”‚ Dimensions: (chain: 1, draw: 500, school: 8)\n", "β”‚ Coordinates: (3)\n", "β”‚ Data variables:\n", "β”‚ obs (chain, draw, school) float64 32kB 25.03 29.95 ... 61.23 42.78\n", "β”‚ Attributes: (4)\n", "β”œβ”€β”€ Group: /observed_data\n", "β”‚ Dimensions: (school: 8)\n", "β”‚ Coordinates: (1)\n", "β”‚ Data variables:\n", "β”‚ obs (school) float64 64B ...\n", "β”‚ Attributes: (4)\n", "└── Group: /constant_data\n", " Dimensions: (school: 8)\n", " Coordinates: (1)\n", " Data variables:\n", " sigma (school) float64 64B ...\n", " Attributes: (4)" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "shifted_dt" ] }, { "cell_type": "markdown", "id": "fb55d868-d73b-4230-8e37-75f6168e57de", "metadata": {}, "source": [ "In order to replicate the `inplace=True` behaviour you can skip the `.copy` part.\n", "\n", ":::{tip}\n", "Other methods like `.sel` are already present in `DataTree` and generally serve as drop-in replacements.\n", "But there is also the difference of `groups`, `filter_groups` and `inplace`.\n", "The patterns shown here for `.map_over_datasets` can be used with any method we want to apply to a subset of groups.\n", ":::" ] }, { "cell_type": "markdown", "id": "87c27c8f-6712-43c3-99fe-4016c41f3976", "metadata": {}, "source": [ "##### `InferenceData.groups`\n", "`DataTree` continues to have a `.groups` attribute, but due to its support for arbitrary nesting, the groups are returned as unix directory paths:" ] }, { "cell_type": "code", "execution_count": 11, "id": "abe6d584-03b5-4150-ad95-5e78a36126a0", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "('/',\n", " '/posterior',\n", " '/posterior_predictive',\n", " '/log_likelihood',\n", " '/sample_stats',\n", " '/prior',\n", " '/prior_predictive',\n", " '/observed_data',\n", " '/constant_data')" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dt.groups" ] }, { "cell_type": "markdown", "id": "3e9c639a-20dc-4704-93e6-ebf0ef0d3341", "metadata": {}, "source": [ "To check against `.groups` we'd need do something like `f\"/{group}\" in dt.groups` which might be annoying (but necessary if we want to test for groups nested more than one level).\n", "In our case, we usually restrict ourselves to a single level of nesting in which case it can be more convenient to check things against `.children`" ] }, { "cell_type": "code", "execution_count": 12, "id": "037b8ac8-f5c9-4853-b080-2d244a2e4421", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\"posterior\" in dt.children" ] }, { "cell_type": "markdown", "id": "87c4abab-694b-4e21-b478-0f27d11310c7", "metadata": {}, "source": [ "The `.children` attribute is a dict-like view of the nodes at the immediately lower level in the hierarchy. When checking for presence of groups this doesn't matter as we have seen, but to get a list of groups like the old `InferenceData.groups` you need to convert it explicitly:" ] }, { "cell_type": "code", "execution_count": 13, "id": "24430f50-e617-497d-a05f-0d68a716b050", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['posterior',\n", " 'posterior_predictive',\n", " 'log_likelihood',\n", " 'sample_stats',\n", " 'prior',\n", " 'prior_predictive',\n", " 'observed_data',\n", " 'constant_data']" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "list(dt.children)" ] }, { "cell_type": "markdown", "id": "eb0c6f1f", "metadata": {}, "source": [ "### Enhanced converter flexibility\n", "Were you constantly needing to add an extra axis to your data because it didn't have any `chain` dimension? No more!" ] }, { "cell_type": "code", "execution_count": 14, "id": "a4defb20-059e-4f1e-b848-41251b176d04", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "rng = np.random.default_rng()\n", "data = rng.normal(size=1000)" ] }, { "cell_type": "code", "execution_count": 15, "id": "32a32f5d-c811-4277-b254-53b924ce61dc", "metadata": {}, "outputs": [], "source": [ "# arviz_legacy.from_dict({\"posterior\": {\"mu\": data}}) would fail\n", "# unless you did data[None, :] to add the chain dimension\n", "az.rcParams[\"data.sample_dims\"] = \"sample\"" ] }, { "cell_type": "code", "execution_count": 16, "id": "2bee6e26-0601-4cb2-8f3a-7e17d849a47d", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataTree>\n",
       "Group: /\n",
       "└── Group: /posterior\n",
       "        Dimensions:  (sample: 1000)\n",
       "        Coordinates: (1)\n",
       "        Data variables:\n",
       "            mu       (sample) float64 8kB 0.4879 -0.4405 0.4089 ... 1.147 -0.3469 0.4506\n",
       "        Attributes: (4)
" ], "text/plain": [ "\n", "Group: /\n", "└── Group: /posterior\n", " Dimensions: (sample: 1000)\n", " Coordinates: (1)\n", " Data variables:\n", " mu (sample) float64 8kB 0.4879 -0.4405 0.4089 ... 1.147 -0.3469 0.4506\n", " Attributes: (4)" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dt = az.from_dict({\"posterior\": {\"mu\": data}})\n", "dt" ] }, { "cell_type": "code", "execution_count": 17, "id": "f5816596-a974-4fbb-aee8-88efaf7a84c7", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgMAAAEFCAYAAAB+auTXAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjcsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvTLEjVAAAAAlwSFlzAAAPYQAAD2EBqD+naQAALy9JREFUeJzt3QlYVNX7B/Av+7DvIIsILgiIqLiUprlmmmlqWZap/crKSivb/KVptthi/rNNrX5mWWlpuZZlWrm1uYKoCCqKAi7s+zow/+cclsA0F2Dunbnfz/PMM5cR8HAG7n3vOe95j4XBYDCAiIiINMtS6QYQERGRshgMEBERaRyDASIiIo1jMEBERKRxDAaIiIg0jsEAERGRxjEYICIi0jgGA0RERBrHYICIiEjjGAwQERFpHIMBIiIijWMwQEREpHEMBojM0Jw5c2BhYYG4uDiMGTMGrq6u8PDwwFNPPQW9Xo/ExEQMGTIEzs7OCA4Oxrx58+q+9rPPPpNfm5yc3OB7btu2Tb4unonIvDAYIDJjd955Jzp16oTVq1fjwQcfxIIFCzBt2jSMHDkSw4YNw9q1azFgwABMnz4da9asUbq5RKQQa6X+YyJqfg899JAcDRAGDRqEzZs344MPPpAX/lGjRsnX+/Xrh++//x7Lly/H6NGj+bYQaRBHBojM2K233trg4/DwcDnUP3To0LrXrK2t0bZtW5w6dUqBFhKRGjAYIDJjIk+gPltbWzg4OECn0/3j9dLSUiO3jojUgsEAETVQGyiUlZU1eD0zM5M9RWSmGAwQUQNidYEgViLUt2HDBvYUkZliAiERNdC9e3e0b98ezzzzjFyG6O7uLlcd/Pbbb+wpIjPFkQEiasDKygrfffcdwsLCMHnyZEyYMAF2dnZyFQIRmScLg8FgULoRREREpByODBAREWkcgwEiIiKNYzBARESkcQwGiIiINI7BABERkcYxGCAiItI4BgNEREQax2CAiIhI4xgMEBERaRyDASIiIo1jMEBERKRxDAaIiIg0jsEAERGRxjEYICIi0jhrpRtARE2vssqAnOJy+WxjZQk7a0s42vHPnYgujmcHIjNwPr8UW+LP48+kLBw6k4eU7GJUGRp+jrPOGoHuDgj2dEAHfxd0CHBFpL8rvJ3tlGo2EamEhcFguOCUQUSmQPzp/pGUhU9+O4mtiem42F+ylaWFHB34N36uOnQMcEWnlm6ICnRFVIAbXB1smq/hRKQ6DAaITNCRs/l4dWM8fj+eVfdalyA3DAzzQZcgd7T1cYKnoy2srSxRVWVASUUlzuaVICW7BMfTC+XowaG0PJzILLpoENHK0wHtfZ3lcytPR7T0cJDfz108HGxgb2MFCwsL4/7QRNRsGAwQmZCKyip88OtxfLD1uLzjt7WyxN09WuK+G0IQ4uV41d+vqEwvg4K41DwcSM3FwbQ8nMoqvuzX2VhZwMnOGk46azjb2dQ8W8upCHmss6mZjnBFO18n2FlbXeNPTETGwGCAyITyAiZ/uQ8xp3Plx0M6tMDMYeHyrr0p5RaXy6DgREYRkrOKcDqrGKk5JcguLpf/VlF5dTOLImC5vo2nbO+Izv4yiCAidWEwQGQCDqTkYtLne5FRUAYXnTXmjuqI4Z38FclTKCqvRH5JBQrL9CgorUBBqV4eF5aKj/UoKNPLfz+WXoDDZ/KRW1xR9/WOtlYY2yMIj/VvCw9HW6O3n4gujsEAkcqJFQKTlu2RF2Exj//xhK5yHt8UiOAhKaMQW+LT8c2+FDnaIIgphacGh2Jiz2BYWjL3gEhpDAaIVOyXI+fxyPL9KNdXoVcbT3w8oZvJDrOLwGD70QzM25SI+LP58rWerT2x4K7OaOGqU7p5RJrGYIBIpcRywQeX7YW+yoBB4T744J5o6GxMPxFPrG5Yvvs0Xtt4RK5y8HWxw5IJ3dEx0FXpphFpFoMBIhXadyob45bsQmlFFW6N8pN3z6KSoDk5mVmEhz7fi2PphdDZWOKTid1xQ1svpZtFpEkMBohUJuFcPu788E/kl+rRr703/jehm9kFArXySyvw2PL92HksU5ZMFgFB73YMCIiMzTzPMEQmKj2/FP/5dI8MBLq2csficV3NNhAQXHQ2WDKxmyyWVKavwqTP98iVE0RkXOZ7liEyMaUVlXjoi304m1eK1t6OWDqxO+xtTT9H4HJEQaJF90ajb6i3nBZ5YNkeubcCERkPgwEilWTa/3d1HGJTcuFqbyOHy7W0P4AICBaOi0a4nwsyC8sxadlelJRXKt0sIs1gMECkAkt2nsS62DOwtrTA4nHR11Ra2NSJJZOf3tcdXk52SDxfgJnrDsogiYiaH4MBIhWsHHhjU4I8nj08Ar00nFEv6g28f3cXiDpEa/an4Zu9qUo3iUgTGAwQKSinqBxTV8TITYdEeeHx17fS/PvRs40nnh7cXvbDy9/HIzWH+QNEzY3BAJGCxXee/uYAzuSVymmB10ZFclvgGpP7tkG3Vu5yz4Pnvo2TfUVEzYfBAJFC/rfzBH5NSIettSUW3hMtt/2lalaWFnhrTCdZjOiPpCx8uesUu4aoGTEYIFIoT2DeT4nyeM7wDojwd+H7cAExWvL80HB5/PoPCVxuSNSMGAwQKZAnMKUmT2BEJ3/c3aMl34NLEDkU14V4yD0MXvounv1E1EwYDBApkCcgCwuJPIHRHZkn8C/E9savjoyUSy5/PnJe7uJIRE2PwQCREX1ckycg6vCLIjumuh2xMbXzdcYDvUPk8ZzvDstKjUTUtBgMEBnJ3uRsvFWbJzCig6y2R1fm8YHt0MJFh5TsEizalsRuI2piDAaIjCBb1BP4qjpP4LbO/hjbnXkCV8PRzhqzbo2Qxx9tT8LZvJJmeqeItInBAJEx8gRWxdblCcwdxTyBa3FLxxboHuwudzf8v81Hm/x9ItIyBgNEzeyjHSewNTGDeQKNZGFhgRm3VC81XL0/FfFn8pvi7SEiBgNEzWtPcjbmb67OE3iJeQKN1iXIHbdG+UHsX/T6j0ca/w2JSOLIAFEzySosq9t3YGRnf9zFPIEm8dzNYbCxssDOY5nYfjSjab4pkcYxGCBqBiIAeHJlLM7ll6K1N/MEmlKQpwMm9AyWx69tPCL7mogah8EAUTN475dj8s7V3sYKH97bVWbDU9OZOqAtXHTWSDxfIPMHiKhxGAwQNTExdP3er8fk8dxRkQj1dWYfNzE3B1tMGdBWHr+z5SgLERE1EoMBoiZ0JrcET34dIxPc7rkuCKOjA9m/zURMFfi56uQW0F/8yV0NiRqDwQBREynXV+GxFfuRU1yByAAXzK4pkkPNQ2djhWmDQuXxB1uPI6+kgl1NdI0YDBA1EbHULeZ0rpzLXjyuq7xYUfMaHR2Atj5OMhAQlQmJ6NowGCBqAutj0/Dp78ny+P/u7IyWHg7sVyOwtrLEsze3l8dLfz+J8/ml7Heia8BggKiRYk7n4Nlv4+TxI/3a4KYIX/apEQ2O8EV0kBtKK6rw7i/ViZtEdHUYDBA1MmHwoS/2yXyBQeE+eGZw9V0qGbdM8fQhYfJ45Z4UnMgoZPcTXSUGA0TXqLhcj0nL9iKjoAxhLZzxztgusLK0YH8q4LrWnujf3lsWIOImRkRXj8EA0TXuRPjUygOIP5sPT0dbLJnYDU4sLKSo54aEwcIC2HjwLOJSc5VtDJGJYTBAdA3e3nIUmw6fg62VJT4a3xWB7kwYVFq4nwtGdQ6Qx29uSlC6OUQmhcEA0TWsHBDr2oXXR3dEt2AP9qFKTLspVAZovx/Pws5j3MSI6EoxGCC6xpUDk/u2we1dWWFQTcSSznHXB9WNDojpHCK6PAYDRFexcuDBz2tXDvjiuZr17aQuU/q3lfkbh9LyZf4AEV0egwGiq1g5kFlYu3KgMyy5ckCVPJ3s8GCf1vJ4/uZEVFRWKd0kItVjMEB0GWKoedrKWLlywMuJKwdMwaQ+IfK9OpVVjK93n1a6OUSqx2CA6DL+b0sifjp8nisHTIijnTWmDmgnj9/95TiKyvRKN4lI1RgMEP2LdTFpWLi1egOcN27viK6tuHLAVNzdIwhBHg5yamfpbyeVbg6RqjEYILqE/adz8Nzqv/ccGB3NlQOmxNbaEk8Prt7i+KMdJ5BdVK50k4hUi8EA0UWkiT0HalYOiI2HnuWeAyZpeJQ/IvxcUFimx8Ka2hBE9E8MBoguIOaXa1cOiKp279zFlQOmSqz4eG5I9RLQz/9M5iZGRJfAYIDoIisHjtRbOSCS0ch09Q31lo+KSgNe+i4eBgMLERFdiMEAUT1iXfrm+NqVA90Q4GbP/jGDLY5fHB4BGysLbD+agZ+PpCvdJCLVYTBAVG/lwKJt1SsH3rxDrBxwZ9+YidbeTnWFiF767jBKKyqVbhKRqjAYIAJwICW3wcqBUV24csDcTBnQFn6uOqTmlODD7dVBHxFVYzBAmnc+vxQPfbG3Zs8BH64cMFMOttZ4YViEPF68LQkp2cVKN4lINRgMkKaJ4eKHvtiH8/llCPV1wgKuHDBrt3RsgV5tPFGmr8LMdYeYTEhUg8EAaZbIKn9+zUE5ReDmYIP/TegGZ52N0s2iZk4mfHVkJOysLbHjaAa+3ZfK/iZiMEBa9vGOE1gbkwYrSwssuicarTwdlW4SGSmZcNpN1ZUJX/k+Hun5pex30jyODJAmbU1MxxubEuSxWHbWq62X0k0iI5rUOwQdA1yRX6rHC5wuIGIwQNojEsee+CoGovaM2Mxm/PWtlG4SGZm1lSXm3REFa0sLWVdi48GzfA9I0zgyQJpLGJz85T55R9i5pRteGtFBziOT9ohS04/2byuPZ68/jPQCTheQdjEYIE15cf1hHD6TDw9HWywaFy13tiPtmtK/LcJaOMsdDZ/9Jk6WoybSIp4JSTNW7jmNlXtTIAYC3hvbBf4sNax5Ihh87+4ucnWBKFX82R/Jmu8T0iYGA6QJh9LyMGv9YXn89E2h6N2OCYNULdTXGTOHhcvjN35MkJtUEWkNgwEye3nFFXhk+T5ZYXBgmA8e7Vc9T0xUSySRit+N8soqPP5VDPcuIM1hMEBmX1jo6W9ikZJdgpYe9nj7zs5yj3ui+kQS6Zt3RMHLyQ7H0gvlVsdEWsJggMzap78nyy1rxdzw4nFd4erACoN0cSIQWHBXJ5lT8tXu01jN6oSkIQwGyKzzBMQcsPDCsHBEBrgq3SRSuT7tvPHEwHbyeOa6g0g4x/wB0gYGA2SWisr0cu5XzAHfFOHLwkJ0xR4f0A59Q71RWlGFR77cj/zSCvYemT0GA2SW5mw4jBOZRWjhosO826NYWIiumMgpeeeuzghws8fJzCI8900cdzcks8dggMzO+tg0fLMvFSJP8J2xneHuaKt0k8jEiN+ZheOiYWNlgU2Hz2HJzpNKN4moWTEYILNyOqsYM9ceksdTBrTD9a09lW4SmShRrnr2rRHyWGxq9deJLKWbRNRsGAyQ2aiorMLUr2NQWKZH92B3PD6A9QSoce69vhVGdQlAZZUBU1bsx7k87l9A5onBAJmN9385hgMpuXDRWeOdsV3kznREja0/8NqojnL/gszCcjy2Yr8sXkVkbni2JLMQczoHC7clyeO5ozrK5C+ipmBva4UP7+0KZ5019p3KwWs/HGHHktlhMEAmr7hcj6dWHZBDubd19sfwTv5KN4nMTLCXIxbc2Vkei82M1sWkKd0koibFYIBM3us/JMglYGIZ4csjIpVuDpmpQRG+mFqTh/LfNXHc0IjMCoMBMmli29kv/jolj+eP6cRyw9SsnhwUij7tvGoKEu1DXgkLEpF5YDBAJiu3uBzPfnNAHt/XK5jbElOzs7K0wHtju8iclOSsYjy9KhZVVQb2PJk8BgNksl5YdwjpBWVo7e2I6UPClG4Oaagg0eJ7o+XmV2ITrMXbqxNXiUwZgwEySRsOnMH3cWflnZpI7BIZ30TGEhXohldu6yCP529OxI6jGex8MmkMBsjkZBSUYfb6miqD/duiU0s3pZtEGnRX9yCM7d4SBgPw5MpYnM9nQSIyXQwGyKQYDAbMWncIucUViPBzwRRWGSQFzRnRQf4eZheVY9rKWLm8lcgUMRggk7Lx4Fm5cYy1pQXeGhMFG1YZJAXpbKzw/j1d4GBrhT+SsvAh8wfIRDEYIJORVSimBw7L40f7t0UHf1elm0SENt5OeGlEdf7A21uOyiqFRKaGwQCZjNkbDsvhWFEnXuQKEKnFHV0DMaKTv5wmePyrGNYfIJPDYIBMwo8Hz2JjzeoBUVxILOsiUtOGRnNHRSLIwwFpuSWYs6F6BIvIVPCMSqonRgNm1aweeKRvG0QGcHqA1MdZZ4N3xnaGpQWwNiYNmw6dVbpJRFeMwQCpnrjLEtvHhvo6YepATg+QekUHuWNy3zbyeMbaQ3IZLJEpYDBAqrb58DlZYEjcbb11RyfYWbO4EKnbE4PaybwWMaI1Y+1BuRyWSO0YDJBq5ZdWyJLDwsN927C4EJkEEbAuuKszbKwssCX+PL7dl6p0k4gui8EAqdabPybIvQdCvBzxxMB2SjeH6IqF+7nIHQ6Fl7+LZ3VCUj0GA6RKe5KzsXzXaXn82qiOsrgLkSl5+MbW6BToioIyfV35bCK1YjBAqlOmr8Tzaw7K47u6tUTPNp5KN4noqllbWeKN26NktcyfDp/n6gJSNQYDpDqLtyXheHohvJxs8fwt3JqYTHu6oHZ1waz1h1mMiFSLwQCpyvH0AizaWr0//IvDO8DNwVbpJhE1ithMq7W3o1xm+MaPR9ibpEoMBkg1qqoMcnqgvLIK/dt749YoP6WbRNRoIt/ljdFR8vir3Sn4MymLvUqqw2CAVOPrPSnYk5wjd4B7ZWSkLPFKZA56hHhg3HVB8ljUHiitqFS6SUQNMBggVUjPL8XrNUOoTw9uj0B3B6WbRNSkpg8Ng6+LHU5mFmHh1uPsXVIVBgOkCi9uOIyCUr1cinVfr2Clm0PU5Fx0NnVbHX+0/YQMCojUgsEAqaLk8I+HzskdCV8fHSWficzRzR1aoG+ot8yLEbUHWKqY1ILBACmqqExft93rg31aI8Lfhe8ImS2RByNGB8QW3DuPZeKHg+eUbhKRxGCAFPXeL8dwJq8Uge72LDlMmhDs5Si34hZe+T4ehWV6pZtExGCAlJN4rgCf/HZSHou7JXtblhwmbXikXxsEeTjgXH4p3v35qNLNIWIwQMoQc6Wz1h2CvsqAwRG+GBjuy7eCNFV7oDaZcOnvyUg4l690k0jjOE1AilizPw27k7Nhb2OFF2tOikRa0j/MBzd38EVlVXVgzGRCUhKDATK63OJyvPZDdU2BJwa1Q4CbPd8F0qTZwzvIgFgU21q9P03p5pCGMRggo3vrp0RkFZWjnY8T7r8hhO8AaZYIhKcObCuPX//hCDcyIsUwGCCjik3JxYrdp+WxKDksllgRadmk3q3RxttRBshvb05UujmkUTwTk9GIudEX1h2EwQCM7hKA61t7svdJ80RA/PJtkbIfvvjrFA6l5Wm+T8j4GAyQ0SzfJU50+XDRWeP5W8LZ80Q1bmjrJXfprDIAs9Yfkjt4EhkTgwEyivSCUry1qXoI9NkhYfB2tmPPE9XzwrAIONpaIeZ0Lr7dl8q+IaNiMEBG8drGIygo0yMq0BX39KjeypWI/tbCVYcnB4XK4zc2JchVN0TGwmCAmt0fSZlYF3sGFhbAqyMjuRER0SXcd0OwXGWTXVQuV90QGQuDAWpW5foqWVBFGH99K0QFurHHiS7BxurvZEKx6iYuNZd9RUbBYICa1ZLfTiApowheTrZ4enB79jbRZfRs44mRnf3lqhsRSDOZkIyBwQA1m9ScYrkroTBzWDhc7W3Y20RXYMYt4XCys8aB1Dx8vSeFfUbNjsEANZs5G+JRWlGF61t7YGTnAPY00RXycdFh2k3VyYTzfkqQOQREzYnBADWLn+PP4+cj52FtaYFXbouEhcgeJKIrNrFnK4S1cEZucQXe+imBPUfNisEANbmS8krM+e6wPJ7UpzXa+Tqzl4muknW9ZEIxVRBzOod9SM2GwQA1uYVbjyM1pwT+rjo8XrMJCxFdvR4hHhgdHVCdTLj+kCzpTdQcGAxQk0rKKMRHO5Lk8YsjOsDB1po9TNQIzw8Nh7POWpbyrt3ki6ipMRigJmMwGDB7/SFUVBowIMwHgyN82btEjSRKdz9Tsyz3rU0JyCwsY59Sk2MwQE3mu7iz+P14FuysLTFneAcmDRI1kXHXBSHCzwX5pXq88n08+5WaHIMBahL5pRV1J6nH+rdFkKcDe5aoCZMJXx/dEZYWwPrYM9iakM6+pSbFYICaxIItR5FRUIYQL0c8dGNr9ipRE+vU0g333xAij2euPYjCMj37mJoMgwFqtMNn8rDsj2R5/NKIDtDZWLFXiZrBU4ND0dLDHmfyxJbgrD1ATYfBADWKqJsu66cbgGFRfrgx1Js9StRMxOqc10dFyePP/zqFfaey2dfUJBgMUKOs2puC/adz4WhrhVnDItibRM2sdzsv3NE1UNYemL76IMr0lexzajQGA3TN0gtK8doPR+SxqKPewlXH3iQygheGhcudQI+nF2Lhr8fZ59RoDAbomr20IV4udeoY4Ir7egWzJ4mMxM3BFi+NqC5VvHBbEuJSc9n31CgMBuiaNyLaePAsrCwt5JInsfSJiIznlo4tZJ6OKFE8bWUsSis4XUDXjmdwumoFpRWyTrowqU8IIgNc2YtERiZ2An31tkj4ONshKaMI8zYl8j2ga8ZggK7a/J8ScTavFEEeDnhyYPWe60RkfO6OtnjzjurVBUt/P4k/kjL5NtA1YTBAV2XfqRy5pEl4bVRH2NuypgCRkvq398E91wXJ42dWHUBeSQXfELpqDAboioklTM+viZNLmm6PDpRLnIhIeTNvCUcrTwdZjKj6b5RbHdPVYTBAV2zBlmM4er5QLmkSS5uISB0c7azx3tgusLGywA8Hz2H5Lm51TFeHwQBdEVHp7OMdSfJ47qiOcq6SiNS1d8H0IWHy+OXv42WZcKIrxWCALqu4XI+nVx2QJYdHRwfg5g4t2GtEKvRA7xAMDPNBub4KU1fEcDMjumIMBuiy3vwxAclZxfBz1eHF4R3YY0QqXm44f0wn+bd6IrMIM9YcZP4AXREGA/SvfjuWiWV/Vq8eePP2KLja27DHiFRMTOG9d3cXWRBsw4EzWLLzpNJNIhPAYIAuKaOgDE+ujJXH914fxB0JiUxE92APzKpJ8n39xyPYcTRD6SaRyjEYoEtuTfzUqlhkFpYh1NcJM2/hjoREpmRir2CM6Rooc32mrNiP5MwipZtEKsZggC5q8fYk7DyWCZ2NJRbeE83iQkSmWK54VCS6BLnJDcUe/HyvLCVOdDEMBugf9iRn4+0tR+Xxy7dFop2vM3uJyATZWVvhw3u7yv0LjqUX4tHl++VKA6ILMRigf+QJPP5VjNwJbVSXADnMSESmy9dFhyUTu8HB1kqO9k1fzQqF9E8MBqhBueHJX+6TmxC19nbEKyMj5VAjEZm2qEA3LBwXLVcYrI1Jw7yfuMMhNcRggCRRy3z2usNyIyJnnTWWTOgGJztr9g6RGW1o9MbojvJ48bYkfPo7lxzS3xgMkLT092Ss3JsCSwvgg3ui0drbiT1DZGbGdGuJZwZXbzv+0nfxWME9DKgGgwGShUle3Rgve+L5oeHoG+rNXiEyU4/1b4tJvUPk8Yy1B7FqT4rSTSIVYDCgcaLC4NOrYuW2xBN7tsKkPtUnCSIyTyIPaOawcNzXK1h+PH1NHL7dl6p0s0hhDAY0bP/pHDz8xV5UVBowLMoPs4d3YMIgkQaIgODF4RGY0LOVvBF49tsD+Go3tz3WMguDyBwjTdYSuG/pbhSVV6JXG098+p/uck0yEWmHOP3PWn8IX/5VHQiIfAIxjcBVRNrDYECD/jqRhfs/24Pi8kr0bO2JT+4Ta5C5coBIqwHB/M2JWLg1SX4spg9m3xoBS5FNTJrBYEBjvjtwBk9/c0BWIevTzgsfj+/GUsNEJJcaihUGgpg2nH9HJ54bNITBgIai/0XbkvBWTbGRmyJ88f7dXaCz4dQAEVVbH5uGp1cdgL7KgMgAF3w0vhsC3OzZPRrAYEADxOYkM9cekksIhQd6h2DGLeGyGhk1vy1btuD7779Hbm4uAgICMGHCBISFhf3r1xw5cgRffPEF0tLS4ObmhuHDh2PQoEF1/56amopvvvkGJ0+eRGZmJsaPH4+hQ4f+43uI/1d8jvi/p02bhu7duzfbz0nmM40o9jDILiqHl5MtFt/bVW6JTOaNqwnM3MHUPNz6/m8yEBAX/5dv64BZt0YwEDCSP//8E59//jlGjhyJ1157TQYBb775pryAX0p6ejrmzZsnP1d8jfjaZcuWYffu3XWfU1ZWBh8fH4wdO1YGCxcjPqdVq1a47777muVnI/N0fWtPbJhyA8L9XJBZWI57/vcXPvntpBxdJPPFrDEzVVpRiUVbj8utiMXSQTHU997dXdC1lbvSTdOUH374Af369UP//v3lx2JUIC4uDj///LO8kF/ML7/8Ak9PT/m5ghhNOHHihLzL79Gjh3ytTZs28iF8/fXXF/0+nTt3lo+r8e2332Lfvn24+eabsXr1ahQWFqJ37974z3/+g40bN8qfR1wUhgwZIoOUWsXFxVi+fLn82oqKCoSEhMjRChGMCOfPn8eXX36JY8eOySBF/Ex33XUXOnasLo8rPP744xgwYID83F27dsHR0VH+HwMHDryqn4EaL9DdAasf6Ylnv43DxrizeOX7eOw8loH5YzrBy8mOXWyGODJgpoWEhr67E+/9elwGAjd38MUPj/dhIGBker1eDtFHRUU1eF1cAI8erd4i+mLEBbP+RVIQ30N8L/E9m5u4GMfGxmL69OmYMmUKtm/fLkcqsrOzMWvWLBnErFq1SrZTEMGB+Pe8vDw899xzePXVV2UwMHfuXBlMCKWlpTIwmTFjhhztED/P/Pnz/zFCIoKN1q1by8+56aabsHTpUjlVQsYnVhh9cHcXvHJbB9haW2JbYgaGvLMT249m8O0wQwwGzGxKYPwnu3DvJ7twMrNI7mG+aFy03M/c1cFG6eZpTkFBAaqqquDq6trgdfGxuHBeipjfv9jXVFZWyu/Z3MTF/eGHH0ZgYCC6du2KiIgInD17Vt7p+/v7y5EOPz8/mZMgxMfHIyUlBU888YS8kIt/GzdunLyzF3f4ghghEHf4QUFB8t/vvPNOOc0hRhLqEwGDCAJatGgh8yScnZ3r/h8yPlFvYHzPYDltEOrrhMzCMkxculsmGeYUlfMtMSOcJjBx4sT954ksLNl5Er8mpMvXbKwsMO66VnhqcChcdAwCTNGFRV9q52uNUQzGy8sL9vb2DQIRS0tL+bhYQCOmMMSd/0MPPdTg+5SXl8v8B0H8+5o1axATE4OcnBwZ2Ih/z8rKavA1LVu2rDsWP6vIh8jPz2+2n5WuTFgLF2yY0htv/JiAZX8mY/X+VGxLTMeLIzpgeJQfixSZAQYDJiq3uFwmBX69OwXxZ6tPluI6MbJzAJ66KRQtPRyUbqLmibtacQG9cBRAfHzhnX994gIoRgfqExdEKysrODk1/26S1tYNTwvioiz+7wtfqw1QxLO7uzteeOGFf3wvB4fq38MVK1bIXAkxYuDr6wtbW1u8++67/5j2uNj/LUZXSHliGfIccfHv5I//ro7DsfRCPP5VDL7adVrudRAZcOnfaVI/BgMmJK+kAr8fz5QJPVviz6O8svokqbOxxJiuLXF/7xCEeDkq3Uyqd2ETc+cHDx5ssKTv0KFDcvj9Utq1a4f9+/c3eE1cSMX3uvBiqQaiXSJ4EQGDt/fFd7xMTEzEjTfeWNcPYqQgIyMD4eHhRm4tNZZIQt74eB8s3paEhduOy5HJ4R/8htujA/HM4PZo4apjJ5sg9Z1ZqI644zp8Jl8m7Ighuf2nc1FZ9ffyngg/F9zRNRCjugTA3dGWPadCt9xyCxYtWiTn0sVF/tdff5VJc/Uz5MVqAJGc9+ijj8qPxb9t3rxZ1hkQ2fUiUW/btm2YOnVq3deIO2pRa6D2WHx9cnIydDqdnG+vveCeO3eu7mvExVd8jhhdEFMBTSUyMlL+bG+//bZMLhR5BWIqQCQhduvWTf7sYjRgz549iI6Olnf7okYCl6qZLpFQ+MSgdhgdHSALmYlRSrHzoahwenePIDzctzX8XFmsyJQwGFCZvOIK7DwuLv4ZMgjIKChr8O9tfZzQv703RnYJQAd/DsupXc+ePWVGvZgvF3fPIilPZNzXv4MWr9efOxeJdeJzRDAgChaJIfiJEyfWLSsUxMVWZObXEsv+xEPcaYuM/9q5fJHZX0ss7RPEHfrkyZOb7GcUF3fRXrHC4OOPP5ZTGmKqQ9RJqJ0OEcmHH330EebMmSOnT0RyYElJSZO1gZQhpiPFkuX7bgjG3I1HsO9UDj77IxnLd53CHV1b4sE+IWjt3fxTW9R4rECosKqq6rt/cee/7WgGYk7noN7NPxxsrdCrjRf6tfdG31Bv5gIQkSqJkZ7fj2fhvV+PYffJ7LrXxR4o917fCgPDfGBtxQVsasVgQKHkvx3HMmUAsONoplyuU59YwtOvvY+8+HcLdufWwkRkUnadyMLHO07g18R01BYu9HWxw4hO/hjRKUDue8BtktWFwYCR7v4PncmTQ/8iAIhNyW1w9+9oa4Ub2oq7fx/0be/NjUGIyCykZBdj+a7TWLnnNHKKK+peb+3liJs6+KJ/ex+ZkGjDEQPFMRhoJmKuX5Tv3HksEzuOZiDrggId7X2dq4f+23ujWysPmZBDRGSOyvSV8mZIJBr+HH8eZfq/l4s621mjZxtPuRmSGAkVuVA8Hxofg4Em3AtAJM/sOJYhh/6P1Kz9r+VkZ43e8u7fGzeGesOf24ISkQYVlullgbRt4nE0Q+6OWJ+dtSXC/FwQ3sIZYeLh54J2Pk7wcLTl1EIzYjDQiKH/o+kFMmFGjACIbT9LKxoWRxHzYje2q774cyiMiOif59G4tDz8mZSFfaey5Q1V/emE+sR0qli9IB/u4tle3lSJTdjEs7uDDYOFRmAwcIX0lVWy0p/Ikv3rRDb2JGfLIkD1ib0A+siLv5ccBfDk7l5ERFe1IuFEZhESzhYg4Vw+jtQ8p+ZcfhmqGFEQgYGfmw7+rtUBgr84Fq/Jj3Vy8yVSYTAQf0a82flyfki8keK59tjJzgau9jZwc7CRZTCNqaS8EkkZhbJ9IvHvYFqebOeFd/5i2Z+44xd3/31CvWQeADNkiYiafho2LbcEp7OLkZpdLJ9TsktwNq8Eabml/1iRdSli9MDvH4GCrm50QdzQaXX5o6LBwLs/H8OCny+9lWstESC42f8dHLja28pn8ZqovFf7ulvN6/a2VrC1qg4qRJaqpaWFvLMX5Xsr9AaUV1bKoaiswjKZ2JdVWI4zuSVyp79TWcU4l1960Xa46KzRI8Sj5uGJDv4uzIIlIlJBguK5vFIZMJzNLZXn8zN5Nc81j6Lyyst+H0sLoIWLDn410w+B7vZyWiKoZmpCjDqY68oHRYOBNftTsS72DMoqKuWFulxf/RCZpiLJRAzD1y+/a0wiwBDlfjsGusqLvtiEI8TTUQYWROZAbACUkJAgKyDWVgysvzMhkbkQl7n8Ur0cSRCBgRhNOFsbKNQEDefySqG/zPVGnP7FyILIV6jOW3CQIwteznbwdrKDt7OdTHQ0xYBB1TkDomm1QUFucQXyxXPNcW5JuSzdm1NcXvNxRd3HJRWVqKgJLuq/t2JrX/Em1Y40iDdNzOt7OtrCx0WHEC8HBHs6ygdr/ZM52717Nz7//HO5p0EtDw8PTJgwoUHZYyKtqKwyyOmG2tGF1JxipIhHdol8FnkL4ppypdMR4voiVpE56azhaFv9LD4WeQviWmRlWX09Es/WNcedWrqhc0s3KEHVwUBTENMDlQYDbOR+7LyrJxKBwDvvvHPJjnjyyScZEBBdZOVDRmGZLKRUFyRkF+N8QRkyC8rkv4llko0ZzX5iYDtMuykUSjD71EqRDGL2P6QKiRizrOzKknrIuFMDy5Yt+9fPESMGYidCThmog52dHROTVcDS0gK+Ljr56BbsccmAQYxOi8Agp6gCRWV6FJXrUVCql8dipLu4vFLepIopCX2lofq5qvrj9i2coRSzHxkgZYjtc++//352P1EjLV26VG5NTdScTC/LgYiIiJoURwaoWXCaQJ3E6oF58+Zd9vOee+45ubqAlMdpAjIGTqdTsxDFlzi0qT5RUVFy1UD9VQQX8vT0lJ/HnAEi7eA0AZGGiAu8WD74b8aPH89AgEhjOE1ApEEXqzMgRgREIMA6A0Taw2CASKNYgZCIajEYICIi0jjmDBAREWmc9ZUuEysoKGj+1hAREVGTc3Z2/tdKllcUDIhAwNXVtSnbRUREREaSl5cHFxeXxuUMqGVkIDY2Fn379sX27dvRuXNnpZujKuwb9gt/Z/j3xPMMz8HNOjIgvsG/RRTG4uTkVPeshvaoCfuG/cLfGf498TzDc/C1YgIhERGRxplUMODn54cXX3xRPhP7hr8z/HviuYbnYLXwM/HrE+sMEBERaZxJjQwQERFR02MwQEREpHEMBoiIiDSOwQAREZHGmWwwMGLECAQFBUGn08nsTbH16pkzZ6B1ycnJeOCBBxASEgJ7e3u0adNGZriWl5cr3TRVmDt3Lnr16gUHBwe4ublBqxYtWiR/R8TfT9euXbFz506lm6QKO3bswPDhw+Hv7y/rq6xbt07pJqnC66+/ju7du8vCNT4+Phg5ciQSExOVbpYqLF68GFFRUbL2jXj07NkTP/74I0yNyQYD/fv3x6pVq+Qv5OrVq5GUlIQ77rgDWpeQkCC3pv3oo49w+PBhLFiwAB9++CFmzJihdNNUQQRFY8aMwSOPPAKtWrlyJZ588knMnDkTMTEx6NOnD4YOHYrTp09D64qKitCpUyd88MEHSjdFVUTV18ceewx//fUXtmzZAr1ej8GDB8v+0rrAwEC88cYb2Lt3r3wMGDAAt912mzz/mhSDmVi/fr3BwsLCUF5ernRTVGfevHmGkJAQpZuhKp9++qnB1dXVoEU9evQwTJ48ucFrYWFhhv/+97+KtUmNxOlx7dq1SjdDldLT02X/bN++XemmqJK7u7thyZIlBlNisiMD9WVnZ2P58uVy+NfGxkbp5qhygwoPDw+lm0EqGRnZt2+fvKurT3z8xx9/KNYuMr1zisDzSkOVlZX4+uuv5YiJmC4wJSYdDEyfPh2Ojo7w9PSUQ5zr169XukmqI6ZP3n//fUyePFnpppAKZGZmyhOWr69vg9fFx+fOnVOsXWQ6xKDJU089hd69eyMyMlLp5qjCwYMH5f4wdnZ28ly7du1aREREwJSoKhiYM2eOTNr5t4eYk6n17LPPyjnPzZs3w8rKChMmTJC/qOboavtGEAmVQ4YMkXPkkyZNgrm6lr7Rugt3LxN/N/+2oxlRrSlTpiAuLg5fffUVO6VG+/bt5c6xIqdC5CNNnDgR8fHxMCVXtGuhMX/Jxo4d+6+fExwcXHfs5eUlH6GhoQgPD0fLli3lm2FqwzPN0TciEBBJlqIvPv74Y5izq+0bLRN/LyJwvnAUID09/R+jBUQXmjp1KjZs2CBXXYjEOapma2uLtm3byuNu3bphz549ePfdd2Uit6lQVTBQe3G/FrUjAmVlZTBHV9M3aWlpMhAQS8Y+/fRTWFqqagBIVb83Wjxpid8LkRE+atSoutfFxyIDmuhS51cRCIjh723btsllqfTv/WVq1yJVBQNXavfu3fIh5qzc3d1x4sQJzJ49W66pN8dRgashRgT69esnazDMnz8fGRkZdf/WokULaJ3ILREJp+JZzJ2LoT1BRPVizk8LxHyvqMsh7mBqR45EfzCvBCgsLMTx48fr+urkyZPyd0Qkyom/Ka0SywpXrFgh87JErYHakSVXV1dZz0TLZsyYIZfmipHpgoICmUAoAqZNmzbBpBhMUFxcnKF///4GDw8Pg52dnSE4OFgulUpNTTVonVgyJ97Wiz3IYJg4ceJF+2br1q2a6p6FCxcaWrVqZbC1tTVER0dziVgN8Xtwsd8P8XujZZc6p4jzjdbdf//9dX9L3t7ehoEDBxo2b95sMDXcwpiIiEjjzHsymYiIiC6LwQAREZHGMRggIiLSOAYDREREGsdggIiISOMYDBAREWkcgwEiIiKNYzBARESkcQwGiIiINI7BABERkcYxGCAiItI4BgNERETQtv8HW8mjX0dwjKoAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# arviz-stats and arviz-plots also take it into account\n", "az.plot_dist(dt);" ] }, { "cell_type": "markdown", "id": "488e6ecd-1269-4d98-8ae5-1a5e65531d32", "metadata": {}, "source": [ ":::{note}\n", "It is also possible to modify `sample_dims` through arguments to the different functions.\n", ":::\n", "\n", "### New data wrangling features\n", "We have also added multiple functions to help with common data wrangling tasks,\n", "mostly from and to `xarray.Dataset`. For example, you can convert a dataset\n", "to a wide format dataframe with unique combinations of `sample_dims` as its rows,\n", "with {func}`~arviz_base.dataset_to_dataframe`:" ] }, { "cell_type": "code", "execution_count": 18, "id": "e59bc6d4", "metadata": {}, "outputs": [ { "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", " \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", " \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", "
mutheta[Choate]theta[Deerfield]theta[Phillips Andover]theta[Phillips Exeter]theta[Hotchkiss]theta[Lawrenceville]theta[St. Paul's]theta[Mt. Hermon]tau
(0, 0)1.7157232.3173911.4501742.0855502.2270763.0715072.7129723.0837641.4604480.877494
(0, 1)1.9034810.8891700.7429493.1258692.7795242.8347051.5589392.4875031.9843790.802714
(0, 2)1.9034810.8891700.7429493.1258692.7795242.8347051.5589392.4875031.9843790.802714
(0, 3)1.9034810.8891700.7429493.1258692.7795242.8347051.5589392.4875031.9843790.802714
(0, 4)2.0174971.1091200.8188932.7506201.9286701.9831621.0296203.6627442.1675740.767934
.................................
(3, 495)7.75062511.4775895.5783279.3215315.8120955.4370993.0961429.7314097.9483213.020477
(3, 496)6.9223682.7107638.6461363.8078447.5436696.7888816.5950364.0030425.2750162.704639
(3, 497)5.40883611.4063904.4469379.2107756.3310744.1507784.8123029.6932574.9146562.236486
(3, 498)7.7214407.08613912.3118896.58430110.28609310.05016711.8599387.9522689.7544682.989656
(3, 499)10.23715710.46439013.71430610.26166615.18009810.91603015.07090014.92321014.0231293.051559
\n", "

2000 rows Γ— 10 columns

\n", "
" ], "text/plain": [ " mu theta[Choate] theta[Deerfield] theta[Phillips Andover] \\\n", "(0, 0) 1.715723 2.317391 1.450174 2.085550 \n", "(0, 1) 1.903481 0.889170 0.742949 3.125869 \n", "(0, 2) 1.903481 0.889170 0.742949 3.125869 \n", "(0, 3) 1.903481 0.889170 0.742949 3.125869 \n", "(0, 4) 2.017497 1.109120 0.818893 2.750620 \n", "... ... ... ... ... \n", "(3, 495) 7.750625 11.477589 5.578327 9.321531 \n", "(3, 496) 6.922368 2.710763 8.646136 3.807844 \n", "(3, 497) 5.408836 11.406390 4.446937 9.210775 \n", "(3, 498) 7.721440 7.086139 12.311889 6.584301 \n", "(3, 499) 10.237157 10.464390 13.714306 10.261666 \n", "\n", " theta[Phillips Exeter] theta[Hotchkiss] theta[Lawrenceville] \\\n", "(0, 0) 2.227076 3.071507 2.712972 \n", "(0, 1) 2.779524 2.834705 1.558939 \n", "(0, 2) 2.779524 2.834705 1.558939 \n", "(0, 3) 2.779524 2.834705 1.558939 \n", "(0, 4) 1.928670 1.983162 1.029620 \n", "... ... ... ... \n", "(3, 495) 5.812095 5.437099 3.096142 \n", "(3, 496) 7.543669 6.788881 6.595036 \n", "(3, 497) 6.331074 4.150778 4.812302 \n", "(3, 498) 10.286093 10.050167 11.859938 \n", "(3, 499) 15.180098 10.916030 15.070900 \n", "\n", " theta[St. Paul's] theta[Mt. Hermon] tau \n", "(0, 0) 3.083764 1.460448 0.877494 \n", "(0, 1) 2.487503 1.984379 0.802714 \n", "(0, 2) 2.487503 1.984379 0.802714 \n", "(0, 3) 2.487503 1.984379 0.802714 \n", "(0, 4) 3.662744 2.167574 0.767934 \n", "... ... ... ... \n", "(3, 495) 9.731409 7.948321 3.020477 \n", "(3, 496) 4.003042 5.275016 2.704639 \n", "(3, 497) 9.693257 4.914656 2.236486 \n", "(3, 498) 7.952268 9.754468 2.989656 \n", "(3, 499) 14.923210 14.023129 3.051559 \n", "\n", "[2000 rows x 10 columns]" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# back to default behaviour\n", "az.rcParams[\"data.sample_dims\"] = [\"chain\", \"draw\"]\n", "dt = az.load_arviz_data(\"centered_eight\")\n", "az.dataset_to_dataframe(dt.posterior.dataset)" ] }, { "cell_type": "markdown", "id": "d116a72b-a46b-4cac-959b-0b669ce7012f", "metadata": {}, "source": [ "Note it is also aware of ArviZ naming conventions in addition to using\n", "the `sample_dims` `rcParam`. It can be further customized through a `labeller` argument.\n", "\n", ":::{tip}\n", "If you want to convert to a long format dataframe, you should use\n", "{meth}`xarray.Dataset.to_dataframe` instead.\n", ":::\n", "\n", "## `arviz-stats`\n", "Stats and diagnostics related functionality have also had some changes,\n", "and it should also be noted that out of the 3 new modular libraries it is\n", "currently the one lagging behind a bit more. At the same time,\n", "it does already have several new features that won't be added to legacy ArviZ at any point,\n", "check out its {doc}`arviz_stats:api/index` page for the complete and up to date list\n", "of available functions.\n", "\n", "### Model comparison\n", "For a long time we have been recommending using PSIS-LOO-CV (`loo`) over WAIC.\n", "PSIS-LOO-CV is more robust, has better theoretical properties, and offers diagnostics\n", "to assess the reliability of the estimates. For these reasons, we have decided to remove WAIC\n", "from `arviz-stats`, and instead focus exclusively on PSIS-LOO-CV for model comparison.\n", "We now we offer many new features related to PSIS-LOO-CV. Including:\n", "- Compute weighted expectations, including mean, variance, quantiles, etc. See {func}`~arviz_stats.loo_expectations`.\n", "- Compute predictive metrics such as RMSE, MAE, etc. See {func}`~arviz_stats.loo_metrics`.\n", "- Compute LOO-R2, see {func}`~arviz_stats.loo_r2`.\n", "- Compute CRPS/SCRPS, see {func}`~arviz_stats.loo_score`.\n", "- Compute PSIS-LOO-CV for approximate posteriors. See {func}`~arviz_stats.loo_approximate_posterior`.\n", "\n", "\n", "For a complete list check {doc}`arviz_stats:api/index` and in particular {doc}`arviz_stats:api/index#model-comparison`\n", "\n", "\n", "### `dim` and `sample_dims`\n", "Similarly to the rest of the libraries, most functions take an argument to indicate\n", "which dimensions should be reduced (or considered core dims) in the different computations.\n", "Given `arviz-stats` is the one with behaviour and API closest to xarray itself,\n", "this argument can either be `dim` or `sample_dims` as a way to keep the APIs of ArviZ\n", "and xarray similar.\n", "\n", "Let's see the differences in action. `ess` uses `sample_dims`. This means we can do:" ] }, { "cell_type": "code", "execution_count": 19, "id": "b8417aac", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataTree 'posterior'>\n",
       "Group: /posterior\n",
       "    Dimensions:  (school: 8)\n",
       "    Coordinates: (1)\n",
       "    Data variables:\n",
       "        mu       float64 8B 2.115e+03\n",
       "        theta_t  (school) float64 64B 2.25e+03 2.638e+03 ... 1.981e+03 2.42e+03\n",
       "        tau      float64 8B 833.8\n",
       "        theta    (school) float64 64B 2.196e+03 2.322e+03 ... 1.431e+03 2.188e+03
" ], "text/plain": [ "\n", "Group: /posterior\n", " Dimensions: (school: 8)\n", " Coordinates: (1)\n", " Data variables:\n", " mu float64 8B 2.115e+03\n", " theta_t (school) float64 64B 2.25e+03 2.638e+03 ... 1.981e+03 2.42e+03\n", " tau float64 8B 833.8\n", " theta (school) float64 64B 2.196e+03 2.322e+03 ... 1.431e+03 2.188e+03" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dt = az.load_arviz_data(\"non_centered_eight\")\n", "az.ess(dt, sample_dims=[\"chain\", \"draw\"])" ] }, { "cell_type": "markdown", "id": "7324dc47", "metadata": {}, "source": [ "but we can't do:" ] }, { "cell_type": "code", "execution_count": 20, "id": "d1985a11", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Traceback (most recent call last):\n", " File \"/tmp/ipykernel_22572/2159531800.py\", line 2, in \n", " az.ess(dt, sample_dims=[\"school\", \"draw\"])\n", " File \"/home/oriol/Documents/repos_oss/arviz-stats/src/arviz_stats/sampling_diagnostics.py\", line 141, in ess\n", " return data.azstats.ess(\n", " ^^^^^^^^^^^^^^^^^\n", " File \"/home/oriol/Documents/repos_oss/arviz-stats/src/arviz_stats/accessors.py\", line 96, in ess\n", " return self._apply(\n", " ^^^^^^^^^^^^\n", " File \"/home/oriol/Documents/repos_oss/arviz-stats/src/arviz_stats/accessors.py\", line 444, in _apply\n", " group_i: apply_function_to_dataset(\n", " ^^^^^^^^^^^^^^^^^^^^^^^^^^\n", " File \"/home/oriol/Documents/repos_oss/arviz-stats/src/arviz_stats/accessors.py\", line 56, in apply_function_to_dataset\n", " result = func(da, **subset_kwargs)\n", " ^^^^^^^^^^^^^^^^^^^^^^^^^\n", " File \"/home/oriol/Documents/repos_oss/arviz-stats/src/arviz_stats/base/dataarray.py\", line 77, in ess\n", " return apply_ufunc(\n", " ^^^^^^^^^^^^\n", " File \"/home/oriol/bin/miniforge3/envs/general/lib/python3.12/site-packages/xarray/computation/apply_ufunc.py\", line 1267, in apply_ufunc\n", " return apply_dataarray_vfunc(\n", " ^^^^^^^^^^^^^^^^^^^^^^\n", " File \"/home/oriol/bin/miniforge3/envs/general/lib/python3.12/site-packages/xarray/computation/apply_ufunc.py\", line 310, in apply_dataarray_vfunc\n", " result_var = func(*data_vars)\n", " ^^^^^^^^^^^^^^^^\n", " File \"/home/oriol/bin/miniforge3/envs/general/lib/python3.12/site-packages/xarray/computation/apply_ufunc.py\", line 730, in apply_variable_ufunc\n", " broadcast_compat_data(arg, broadcast_dims, core_dims)\n", " File \"/home/oriol/bin/miniforge3/envs/general/lib/python3.12/site-packages/xarray/computation/apply_ufunc.py\", line 675, in broadcast_compat_data\n", " order = tuple(old_dims.index(d) for d in reordered_dims)\n", " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", " File \"/home/oriol/bin/miniforge3/envs/general/lib/python3.12/site-packages/xarray/computation/apply_ufunc.py\", line 675, in \n", " order = tuple(old_dims.index(d) for d in reordered_dims)\n", " ^^^^^^^^^^^^^^^^^\n", "ValueError: tuple.index(x): x not in tuple\n" ] } ], "source": [ "try:\n", " az.ess(dt, sample_dims=[\"school\", \"draw\"])\n", "except Exception as err:\n", " import traceback\n", " traceback.print_exception(err)" ] }, { "cell_type": "markdown", "id": "632daeae", "metadata": {}, "source": [ "This limitation doesn't come from the fact that interpreting the \"school\" dimension as \"chain\"\n", "makes no sense but from the fact that when using `ess` on multiple variables (aka on a Dataset)\n", "all dimensions in `sample_dims` must be present in all variables.\n", "Consequently, the following cell is technically valid even if it still makes no sense conceptually:" ] }, { "cell_type": "code", "execution_count": 21, "id": "8eef0abd", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataTree 'posterior'>\n",
       "Group: /posterior\n",
       "    Dimensions:  (chain: 4)\n",
       "    Coordinates: (1)\n",
       "    Data variables:\n",
       "        theta    (chain) float64 32B 1.26e+03 3.788e+03 2.048e+03 357.3\n",
       "        theta_t  (chain) float64 32B 1.72e+03 595.5 711.2 873.5
" ], "text/plain": [ "\n", "Group: /posterior\n", " Dimensions: (chain: 4)\n", " Coordinates: (1)\n", " Data variables:\n", " theta (chain) float64 32B 1.26e+03 3.788e+03 2.048e+03 357.3\n", " theta_t (chain) float64 32B 1.72e+03 595.5 711.2 873.5" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "az.ess(dt, var_names=[\"theta\", \"theta_t\"], sample_dims=[\"school\", \"draw\"])" ] }, { "cell_type": "markdown", "id": "bdca7fec", "metadata": {}, "source": [ "When we restrict the target variables to only \"theta\" and \"theta_t\" we make it so\n", "all variables have both \"school\" and \"draw\" dimension.\n", "\n", "Whenever a computation requires all input variables to share the same set of dimensions, it uses`sample_dims`.\n", "On ArviZ's side this includes `ess`, `rhat` or `mcse`. Xarray only has an example of this: {meth}`~xarray.Dataset.to_stacked_array`.\n", "\n", "On the other hand, `hdi` uses `dim`. This means that both examples we attempted for `ess` and `sample_dims` will work without caveats:" ] }, { "cell_type": "code", "execution_count": 22, "id": "9095c5e7", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataTree 'posterior'>\n",
       "Group: /posterior\n",
       "    Dimensions:   (ci_bound: 2, school: 8)\n",
       "    Coordinates: (2)\n",
       "    Data variables:\n",
       "        mu        (ci_bound) float64 16B -0.418 9.684\n",
       "        theta_t   (school, ci_bound) float64 128B -1.166 2.063 ... -1.499 1.626\n",
       "        tau       (ci_bound) float64 16B 0.00136 7.453\n",
       "        theta     (school, ci_bound) float64 128B -1.611 14.14 -2.92 ... -2.91 12.36
" ], "text/plain": [ "\n", "Group: /posterior\n", " Dimensions: (ci_bound: 2, school: 8)\n", " Coordinates: (2)\n", " Data variables:\n", " mu (ci_bound) float64 16B -0.418 9.684\n", " theta_t (school, ci_bound) float64 128B -1.166 2.063 ... -1.499 1.626\n", " tau (ci_bound) float64 16B 0.00136 7.453\n", " theta (school, ci_bound) float64 128B -1.611 14.14 -2.92 ... -2.91 12.36" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dt.azstats.hdi(dim=[\"chain\", \"draw\"])" ] }, { "cell_type": "markdown", "id": "b59f7a66", "metadata": {}, "source": [ "here we have reduced both \"chain\" and \"draw\" dimensions like we did in `ess`.\n", "The only difference is `hdi` also adds a \"ci_bound\" dimension, so instead\n", "of ending up with scalars and variables with a \"school\" dimension only,\n", "we end up with variables that have either \"ci_bound\" or (\"ci_bound\", \"school\") dimensionality.\n", "\n", "Let's continue with the other example:" ] }, { "cell_type": "code", "execution_count": 23, "id": "1e8cf6ad", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataTree 'posterior'>\n",
       "Group: /posterior\n",
       "    Dimensions:   (chain: 4, ci_bound: 2)\n",
       "    Coordinates: (2)\n",
       "    Data variables:\n",
       "        mu        (chain, ci_bound) float64 64B -0.5564 9.508 ... -0.918 8.548\n",
       "        theta_t   (chain, ci_bound) float64 64B -1.561 1.58 -1.506 ... -1.485 1.63\n",
       "        tau       (chain, ci_bound) float64 64B 0.04483 7.851 ... 0.006411 7.781\n",
       "        theta     (chain, ci_bound) float64 64B -2.993 12.83 -2.522 ... -3.421 12.13
" ], "text/plain": [ "\n", "Group: /posterior\n", " Dimensions: (chain: 4, ci_bound: 2)\n", " Coordinates: (2)\n", " Data variables:\n", " mu (chain, ci_bound) float64 64B -0.5564 9.508 ... -0.918 8.548\n", " theta_t (chain, ci_bound) float64 64B -1.561 1.58 -1.506 ... -1.485 1.63\n", " tau (chain, ci_bound) float64 64B 0.04483 7.851 ... 0.006411 7.781\n", " theta (chain, ci_bound) float64 64B -2.993 12.83 -2.522 ... -3.421 12.13" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dt.azstats.hdi(dim=[\"school\", \"draw\"])" ] }, { "cell_type": "markdown", "id": "4082a639", "metadata": {}, "source": [ "We are now reducing the subset of `dim` present in each variable. That means\n", "that `mu` and `tau` only have the \"draw\" dimension reduced, whereas `theta` and `theta_t`\n", "have both \"draw\" and \"school\" reduced. Consequently, all variables end up with \n", "(\"chain\", \"ci_bound\") dimensions.\n", "\n", "Computations that can operate over different subsets of the given dimensions use `dim`.\n", "On ArviZ's side this includes functions like `hdi`, `eti` or `kde`. Most xarray functions fall in this category too, some examples are {meth}`~xarray.Dataset.mean`, {meth}`~xarray.Dataset.quantile`, {meth}`~xarray.Dataset.std` or {meth}`~xarray.Dataset.cumsum`." ] }, { "cell_type": "markdown", "id": "29a96aab", "metadata": {}, "source": [ "### Accessors on xarray objects\n", "\n", "We are also taking advantage of the fact that xarray allows third party libraries to register\n", "accessors on its object. This means that _after importing `arviz_stats`_ (or a library that imports\n", "it like `arviz.preview`) DataArrays, Datasets and DataTrees get a new attribute, `azstats`.\n", "This attribute is called accessor and exposes ArviZ functions that act on the object from which\n", "the accessor is used.\n", "\n", "We plan to have most functions available as both top level functions and accessors to help\n", "with discoverability of ArviZ functions. But not all functions can be implemented as\n", "accessors to all objects. Mainly, functions that need multiple groups can be available\n", "on the DataTree accessor, but not on Dataset or DataArray ones. Moreover, at the time of\n", "writing, some functions are only available as one of the two options but should be extended soon.\n", "\n", "We have already used the `azstats` accessor to compute the HDI, now we can check that\n", "we get the same result when using `ess` through the accessor than what we got when using\n", "the top level function:" ] }, { "cell_type": "code", "execution_count": 24, "id": "bb6e5b59", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataTree 'posterior'>\n",
       "Group: /posterior\n",
       "    Dimensions:  (school: 8)\n",
       "    Coordinates: (1)\n",
       "    Data variables:\n",
       "        mu       float64 8B 2.115e+03\n",
       "        theta_t  (school) float64 64B 2.25e+03 2.638e+03 ... 1.981e+03 2.42e+03\n",
       "        tau      float64 8B 833.8\n",
       "        theta    (school) float64 64B 2.196e+03 2.322e+03 ... 1.431e+03 2.188e+03
" ], "text/plain": [ "\n", "Group: /posterior\n", " Dimensions: (school: 8)\n", " Coordinates: (1)\n", " Data variables:\n", " mu float64 8B 2.115e+03\n", " theta_t (school) float64 64B 2.25e+03 2.638e+03 ... 1.981e+03 2.42e+03\n", " tau float64 8B 833.8\n", " theta (school) float64 64B 2.196e+03 2.322e+03 ... 1.431e+03 2.188e+03" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dt.azstats.ess()" ] }, { "cell_type": "markdown", "id": "a6328b1f", "metadata": {}, "source": [ "### Computational backends\n", "\n", "We have also modified a bit how computations accelerated by optional dependencies are handled.\n", "There are no longer dedicated \"flag classes\" like we had for Numba and Dask. Instead,\n", "low level stats functions are implemented in classes so we can subclass and reimplement only\n", "bottleneck computations (with the rest of the computations being inherited from the base class).\n", "\n", "The default computational backend is controlled by `rcParams[\"stats.module\"]` which can be\n", "\"base\", \"numba\" or a user defined custom computational module[^2]. \n", "\n", "[^2]: User defined modules are valid when doing `rcParams[\"stats.module\"] = module` but can't\n", " can't be set as the default through the `arvizrc` configuration file." ] }, { "cell_type": "code", "execution_count": 25, "id": "04dfa78d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "165 ms Β± 6.68 ms per loop (mean Β± std. dev. of 7 runs, 10 loops each)\n" ] } ], "source": [ "dt = az.load_arviz_data(\"radon\")\n", "az.rcParams[\"stats.module\"] = \"base\"\n", "%timeit dt.azstats.histogram(dim=\"draw\")" ] }, { "cell_type": "code", "execution_count": 26, "id": "1c4ae822", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "92.7 ms Β± 4.04 ms per loop (mean Β± std. dev. of 7 runs, 1 loop each)\n" ] } ], "source": [ "az.rcParams[\"stats.module\"] = \"numba\"\n", "%timeit dt.azstats.histogram(dim=\"draw\")" ] }, { "cell_type": "code", "execution_count": 27, "id": "860cbf1d", "metadata": {}, "outputs": [], "source": [ "az.rcParams[\"stats.module\"] = \"base\"" ] }, { "cell_type": "markdown", "id": "8360d49d", "metadata": {}, "source": [ "The histogram method is one of the re-implemented ones, mostly so it scales better to larger data.\n", "However, it should be noted that we haven't really done much profiling nor in-depth optimization\n", "efforts. Please open issues if you notice performance regressions or open issues/PRs to \n", "discuss and implement faster versions of the bottleneck methods.\n", "\n", "### Array interface\n", "It is also possible to install `arviz-stats` without xarray or `arviz-base` in which case,\n", "only a subset of the functionality is available, and through an array only API.\n", "This API has little to no defaults or assumptions baked into it, leaving all the choices\n", "to the user who has to be explicit in every call.\n", "\n", "Due to the dependencies\n", "needed to install this minimal version of `arviz-stats` being only NumPy and SciPy\n", "we hope it will be particularly useful to other developers.\n", "PPL developers can for example use `arviz-stats` for MCMC diagnostics without having to add\n", "xarray or pandas as dependencies of their library. This will ensure they are using\n", "tested and up to date versions of the diagnostics without having to implement or maintain\n", "them as part of the PPL itself.\n", "\n", "The array interface is covered in detail at the {ref}`arviz_stats:array_interface` page." ] }, { "cell_type": "markdown", "id": "13df89cf", "metadata": {}, "source": [ "## `arviz-plots`\n", "\n", "Out of the 3 libraries, `arviz-plots` is the one with the most changes at all levels,\n", "breaking changes, new features more layers to explore.\n", "\n", "### More and better supported backends!\n", "One of they key efforts of the refactor has been simplifying the way we interface\n", "with the different plotting backends supported.\n", "arviz-plots has more backends: matplotlib, bokeh and plotly are all supported now,\n", "with (mostly) feature parity among them. All while having less backend related code!\n", "\n", "This also means that `az.style` is no longer an alias to `matplotlib.style` but its own\n", "module with similar (reduced API) that sets the style for all compatible and installed\n", "backends (unless a backend is requested explicitly):" ] }, { "cell_type": "code", "execution_count": 28, "id": "0d1da7bd", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAACXcAAAIvCAYAAAA1Nnq8AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjcsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvTLEjVAAAAAlwSFlzAAAewgAAHsIBbtB1PgAAjUlJREFUeJzs3QmYZGV5N+6nepnunu6ZYRm2YQcBFWUdQTQElaAxKNsYNaJR8VMhrhElmD9EIyRBMBiXRI0R1IifS0Ak8BnFDWPEZVBEcA8g4LANA7N09/T0Uv/rrbHHrp6enl6qTp06dd/X1ddMV3fXOXWq3uqup37neUrlcrkcAAAAAAAAAAAA5Epbo3cAAAAAAAAAAACArQl3AQAAAAAAAAAA5JBwFwAAAAAAAAAAQA4JdwEAAAAAAAAAAOSQcBcAAAAAAAAAAEAOCXcBAAAAAAAAAADkkHAXAAAAAAAAAABADgl3AQAAAAAAAAAA5JBwFwAAAAAAAAAAQA4JdwEAAAAAAAAAAOSQcBcAAAAAAAAAAEAOCXcBAAAAAAAAAADkkHAXAAAAAAAAAABADgl3AQAAAAAAAAAA5JBwFwAAAAAAAAAAQA4JdwEAAAAAAAAAAOSQcBcAAAAAAAAAAEAOCXcBAAAAAAAAAADkkHAXAAAAAAAAAABADgl3AQAAAAAAAAAA5FBHo3cAAAAAAAAAqPa9730vvv/972/zsJx++umx1157OWwAAAUn3AUAAAAAAAA5k4JdH/zgB7f59WOOOUa4CwCgBRjLCAAAAAAAAAAAkEPCXQAAAAAAAAAAADkk3AUAAAAAAAAAAJBDwl0AAAAAAAAAAAA5JNwFAAAAAAAAAACQQx2N3gEAgLz77W9/G7fffnvcf//9sWnTpthtt93iyCOPjH322We7P7tu3bpYuXJl/OY3v6n87A477BB77bVXLF++PLq6ujLZfwAAAACYbOPGjXHPPffEgw8+GA899FBs2LAhhoaGYmRkJHp7eysfqZZ1yCGHVOpZpVLJQQQAaIBSuVwuN2LDAACN8L3vfS/+/M//fJtfP/300+OSSy6p/D+Fsj7wgQ9UfmaqP5mOPvroOO+88+KII46YMhD2/ve/P2644YYYHh7e6usp2JW29YY3vCGWLl067T7fd999ceKJJ85on7cl3Y4PfvCD2/z6Jz/5yTj22GOnvQ4AAAAA6ueaa66Jt7/97TW7vsn1np///Ofxne98J2699dbK/++9994YGxub0XX19fXF05/+9DjjjDPi+OOPj/b29prU4l7/+tdX6mPTOf/88+MLX/jCNr/+ta99rRI+AwAoKmMZAQAmSUGu9773vfGyl70svvvd704Z7EpuueWWeOlLXxpf/OIXqy7/8pe/HM9//vPj2muvnTLYlaSzID/zmc/EaaedVimmAQAAAEA9pZMD3/3ud1dqV6nL/EyDXUnq6pV+7rWvfW386Z/+afziF7+o674CAPB7wl0AAJNceuml8eEPf3hGBa4U3krdu77yla9UPr/uuuvizW9+c/T398/ouD788MNx1llnxZo1a9wPAAAAAOTeHXfcES94wQsqXe8BAKg/4S4AgAm++c1vxhVXXDHrY3LRRRfFzTffHH/91389q7Mek0ceeaRy1iQAAAAANINNmzbF6173unjwwQcbvSsAAIUn3AUAMMGjjz46p+Px0EMPxate9aptjmHcnhtuuEH3LgAAAACaxmOPPRYf/ehHG70bAACF19HoHQAAyKOFCxfGOeecE8961rNi0aJFcfvtt8ff/d3fxW9/+9tt/szo6OiW/z/xiU+s/Pyhhx5aCXx96Utfig984ANV3zNR+p6vfvWr8cIXvrAutwcAAACAfDvwwAPjzDPP3PL5bbfdFj/5yU+2+f1/9Ed/FLvttts2vz7V10qlUjzhCU+IJz/5yfH4xz8+9txzz9h9990rtbDu7u7K9wwODsbDDz8cP//5z+O//uu/4vvf//42t/G5z30u3vzmN0dfX98sbikAALMh3AUAMEkqZH3iE5+Iww47rKoYtvPOO8eLXvSi7R6v5cuXx5VXXhkLFizYclkKem3cuDE+/OEPb/PnUrFOuAsAAACgNR1++OGVj3HpRMHpwl1//ud/Hscee+yMr//Vr351XHbZZbHLLrts93v32WefOProoyths8svvzw+8pGPTPl9Q0ND8aMf/SiOP/74Ge8HAACzYywjAMAkr3jFK6qCXeOOOOKI2GmnnaY9Xu3t7XHxxRdXBbvGnXHGGdP+7F133eW+AAAAAKAunv70p88o2DXZ6aefPu3Xb7nllnnsFQAA26NzFwDAJNN159p///1jzZo12/z6McccU/meqey7776VrmCpg9dU1q1b574AAAAAoO4eeeSR+OY3v1npDJZO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ao/63Oc+t3LmFuRNHtfXhz/84S3/f97znldJt993332zOmNl8n7tvPPOW6XkoRXX1/h+pbOxxk0MlGxPV1dX5UXJY489Vvk8BbvWrVsXO+ywQ032DZp9fX35y1+u+vw1r3nNjH4uBbxe8pKXxPvf//4tl6WxjYcddlhN9guandpGaz2fur8pijyur+moZ9FM8ri+1LMoijyur/H9Us+i2eV1falnQe2pbeQ83JVG2qQ7aTw1u3r16hgcHJzxm8mT37g+4IADarJf+++/f/zkJz+p/D+Nh0vbmel112ufoAhrayp33nlnvOpVr6rq2JBGXV122WUz7ooCrb6+Jga1rr322srHbJ155plVn6eOKH/0R380732DZl9fyYEHHhjf//73t3w+09D/tr5/tmO/oajrq7+/P377299WrZUjjzxyxj9/7LHHVn1+++23z3ufoEjUNlrn+TRxf1MEeV1fU1HPotnkcX2pZ1EUeVxfiXoWRZDH9aWeBfWzv5xOfscyJo973OO2/D91MphNQf7HP/7xNq9rPg466KCqz2cz3qNe+wRFWFuTrVq1Ks4666yqtqjLly+PD37wg9HZ2VmXbUKrrC9oVs3wt+HEQPJMTP5+XbtolLytr/FuyRPXxsQxptuTukzOpzU/FJ3aRus8nybub4oij+trMvUsmlUzrC9oVnlcX+pZFEXe1pd6FtTPQXI6+Q53Pe1pT6v6fOXKlTNuozjxLO+U4lu2bFlN9um4446b0z6lM00m/kLp7e2Nww8/vCb7BEVYWxOlkaevfOUrq1qoppnvH/nIR6K7u7vm24NWWl/QzPK4vv7wD/+w6vP//d//nfHPpn1KZ5NNDK/MtvMXFHV9pddLE01cKzMx+fsXLlw4732CIlHbaJ3n08T9TVHkcX1NpJ5FM8v7+oJmlsf1pZ5FUeRtfalnQf0cJ6eT73DXs571rKrP//M//3NGP3fddddNez3zccIJJ0RHx++nWX7lK1+pahG8LV/96ldjYGCgarScN+9olDyurYkdTNIoxrvvvruqRfC//du/RV9fX823B0VfX1//+tfjF7/4xaw+jjnmmKrr+NrXvlb1dSMZaZS8ra9k7733joMPPrhqBEsqDszEd77znarPjzrqqJrtFzT7+kp/900MZKW/EVMnjJn62c9+Nm0nL2h1ahut83yauL8pijyur3HqWTS7vK0v9SyKJG/rK1HPoijytr7Us6B+TpDTyXe465BDDql6syx1Qrjpppum/ZmNGzfGZz7zmarLnve859V0fm8KZo1bu3ZtXH311dP+TLlcjk984hNVlz3/+c+v2T5BEdbW+DZe+9rXVr0Zt9dee8WVV15ZmZsNzSCv6wuKIK/r69RTT61q//2pT31quz8zOjq61felFyfQKHlcX2kk90TXXHPNjH928vcKT0I1tY3Wej51f1MUeVxf49tQz6LZ5XV9QRHkdX2pZ1EEeVxf6llQH0vkdPId7kpe//rXV31+0UUXVQJV2/KP//iPVW0UU3eRJz7xidMW/dMT//jHy172su3u0+te97qqz9/73vdWbXOyFOyaOLc37c+JJ5643e1AK62t4eHheMMb3hC33HLLlst23XXX+PjHPx677bbbDG8V5EPe1hcUSR7X15lnnhm77LLLls/T766Jv8+m8sEPfjB+/vOfV3UVOu2007a7LWil9fXsZz+76vOPfvSjcdttt233dqTXXxPb8JdKJa+/KDy1jXzJ2/NpopZFUeRtfalnUSR5W19QJHlcX+pZFEXe1pd6FsyM2kYBw13pCfDII4/c8vm9994bL33pSytjoSa3vk5P1p/85Ce3XNbV1RVvfvOba75PT37yk+Pkk0/e8vm6deviJS95yVZzfNO4xg996ENxySWXVL2x8La3va3yLzRS3tbW+eefH9/61re2fN7d3R0XX3xxZa3cd999M/5I6xEaLW/rC4okj+urp6cnzj333Ko3eF796lfH5z//+UqHronS76m0X//yL/9Sdflb3/rWyu8+aKS8ra8UeNxnn32qzqx8+ctfHldddVXltdZkDz/8cPzt3/5t/P3f/33V5X/8x39cKb5Bo830Ncyjjz465felx3gtqW20zvNp4v6mKPK2vtSzKJK8rS8okjyuL/UsiiJv60s9iyJRy8qXjsi5FOx43/veFy94wQvioYceqlz2y1/+stIu9NBDD63MhX7ssccqZ3D39/dX/WwKhhx00EF12a/05P+rX/2qsi/JAw88UEm5p9aP+++/fwwMDMTtt99eKcpO9KY3vSme9rSn1WWfoJnX1vXXX1/1eXrz7jWvec2cEvqpAxg0Ut7WFxRJXtfX6aefXhkrPD6KO237ggsuqJwJdvjhh0dfX19lf2+99dbYtGlT1c+++MUvjjPOOKMu+wXNvL46Ozvjn/7pnyoFufT6Kkn/vutd74r3vOc9laBC6pqXApWp0JC64U0OVO63337xN3/zNzXdL5irmXbwvvTSSysfkx1zzDHx7//+7zW9A9Q2WuP5dJz7myLI2/pSz6JI8ra+oEjyur7UsyiCvK0v9SyKRC0rX3If7krSSLaPfexj8cY3vjHuuuuuymXlcrkSnkofk6WUbTpr6pRTTqnbPvX29sa//uu/VtK86U26cemXxXjga6K2trZ47WtfG+ecc07d9gmKsLagKKwvaL31lbbR0dERV155ZYyNjVUuS0H/b37zm9v8mfS3YQr/Q17kbX2lItwVV1xR6Y43sWV+Cnl973vfm/Znjz766EoIbKeddqrLvkERqG20zvNp4v6mKPK4vqAorC9ovfWlnkUR5G19qWdB/fS2cE4n92MZx6WOWF/4whcqI2523nnnbSZhn/nMZ1ZG4KQxifW2xx57VEaCpDca9txzz22mhZ/61KdWWjxqS0we5XFtQVFYX9Ba6yu9SDjvvPMqf/c9/elPj/b29im/LwXATjjhhPiP//iPyt+HxnWTN3lbX6m1/nXXXVcZbz9xTOO2pG557373u+NTn/pULFu2rK77BkWgttE6z6eJ+5uiyOP6gqKwvqC11pd6FkWRt/WlngX1s0eL5nRK5RRbbTIjIyPxwx/+sDJ6Y/Xq1ZV03u677155kmzUWdnpMP74xz+O3/zmN5WWj93d3ZWUcBoVkh5c0AzyuLagKKwvaL319fDDD1f+Pkx/G65bty6WLFlS2a/ly5fHokWLGrZf0Ozra9WqVZWzLtMa27BhQ+WF+uLFiytBrvT6a8cdd2zIfkERqG201vOp+5uiyOP6gqKwvqD11pd6FkWQx/WlngX1UW6hnE5ThrsAAAAAAAAAAACKrmnGMgIAAAAAAAAAALQS4S4AAAAAAAAAAIAcEu4CAAAAAAAAAADIIeEuAAAAAAAAAACAHBLuAgAAAAAAAAAAyCHhLgAAAAAAAAAAgBwS7gIAAAAAAAAAAMgh4S4AAAAAAAAAAIAcEu4CAAAAAAAAAADIIeEuAAAAAAAAAACAHBLuAgAAAAAAAAAAyCHhLgAAAAAAAAAAgBwS7gIAAAAAAAAAAMgh4S4AAAAAAAAAAIAcEu4CAAAAAAAAAADIIeEuAAAAAAAAAACAHBLuAgAAAAAAAAAAyCHhLgAAAAAAAAAAgBwS7gIAAAAAAAAAAMgh4S4AIJc+/vGPR6lU2vLxzW9+s9G7VAj77bfflmP6jGc8o9G7U1jp2I4f53TMAQAAgGJTy6oPtaxsqGUBQL4JdwHABHfffXdVoGguH694xSscUwAAAADqTi0LAACKT7gLAMikuPjOd77TkQYAAAAgl9SyAADIK+EuAAAAAAAAAACAHOpo9A4AQJ7tueee8e1vf3tWP9PX11e3/QEAAACAbVHLAgCA4hHuAoDpflF2dMR+++3nGDXAK17xisoHAAAAADOjltU4alkAANSLsYwAAAAAAAAAAAA5JNwFAAAAAAAAAACQQ8YyAkADDQ0Nxbe//e24995744EHHogFCxbEM57xjDjqqKO2+TO//e1v44477og777wzHnvsscplO+20U+yzzz5x3HHHxZIlS2qyb+VyOW677bb46U9/GqtXr45169ZFb29v7L333vHkJz85Dj744Mi7X/3qV3HLLbfEgw8+GIODg7F06dLK/h9//PGxcOHCmm4r3Sc/+clPKvdlGoGwxx57xB/+4R/GsmXL5nyd6f69/fbb45e//GWsWbMmNm3aFDvssEPstttuceyxx8Zee+0VzWR0dDRuvvnmuPvuu+P++++vXHbMMcfECSecsM2fefjhhyvHIN2X6Xik69hxxx0rxzU93nfZZZea7uPY2FhlH3/9619X9rGvr68ymjXt46JFiyJv0mMirdP0+HvkkUeiv78/enp6Ks8D++67bzzhCU+oPOYBAACgFtSy6kstK1/UsmpPLQsA5qgMAGxx1113ldOvx/GPfffdd15H5xvf+EbV9V155ZWVyx999NHyOeecU95hhx2qvp4+3vSmN1Vdx9jYWPmmm24qn3322eUDDjhgq++f+NHW1lY+8cQTy1//+tfnvM+rVq0qv+ENbyjvuuuu025rzz33rHzfz372s6qfP+GEE6b9uak+pjrO6VhN/J50LGdiZGSk/KEPfaj8uMc9bpvb6+7uLp9xxhlb7ft00j6O/3y6jeNuuOGG8lOe8pRtbus5z3lO+Y477pjxdtI+XXjhheWjjz66cn9Od9ye+MQnlq+44ory8PDwvG9HPdbPO97xjsrlg4OD5be//e3l3XfffavbcOqpp251PStXriyfe+655UMPPXS7j51jjjmmfM0118x7H9M6u/zyy8v7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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "az.style.use(\"arviz-vibrant\")\n", "dt = az.load_arviz_data(\"centered_eight\")\n", "az.plot_rank(dt, var_names=[\"mu\", \"tau\"], backend=\"matplotlib\");" ] }, { "cell_type": "code", "execution_count": 29, "id": "cffc0108", "metadata": {}, "outputs": [ { "data": { "text/html": [ " \n", "