# Model fitting

Here, we will look at an example of fitting a model to an example dataset.

First, we will import the necessary packages:

```
import pymc as pm
import pylater
import pylater.data
```

We will use the 50% condition from participant ‘a’ in the example data provided in `pylater`

:

```
dataset = pylater.data.cw1995["b_p50"]
```

We can then build the model, using the default priors, via:

```
model = pylater.build_default_model(datasets=[dataset])
```

We can then fit the model by using the `sample`

function from PyMC:

```
with model:
idata = pm.sample(chains=4)
```

We can then use the posterior summary methods from PyMC to evaluate the posteriors:

```
pm.stats.summary(data=idata)
```

mean | sd | hdi_3% | hdi_97% | mcse_mean | mcse_sd | ess_bulk | ess_tail | r_hat | |
---|---|---|---|---|---|---|---|---|---|

k[b_p50] | 5.063 | 0.107 | 4.860 | 5.264 | 0.003 | 0.002 | 1418.0 | 1455.0 | 1.0 |

mu[b_p50] | 4.842 | 0.029 | 4.786 | 4.894 | 0.000 | 0.000 | 3506.0 | 3051.0 | 1.0 |

sigma[b_p50] | 0.957 | 0.020 | 0.919 | 0.996 | 0.001 | 0.000 | 1359.0 | 1299.0 | 1.0 |

sigma_e[b_p50] | 3.256 | 0.132 | 2.998 | 3.495 | 0.003 | 0.002 | 1749.0 | 1784.0 | 1.0 |

sigma_e_mod[b_p50] | 3.405 | 0.171 | 3.096 | 3.738 | 0.005 | 0.003 | 1357.0 | 1153.0 | 1.0 |

We can futher evaluate the model fit by examining the distribution of draws from the fitted model - the posterior predictive distribution (better described as the posterior *retrodictive* distribution; see “Towards a principled Bayesian workflow” by Michael Betancourt):

First, we need to use PyMC to sample the posterior predictives:

```
with model:
idata = pm.sample_posterior_predictive(trace=idata, extend_inferencedata=True)
```

We can then use the `plot_predictive`

method of a `ReciprobitPlot`

instance to visualise the posterior predictives:

```
plot = pylater.ReciprobitPlot()
plot.plot_predictive(idata=idata, predictive_type="posterior");
```

In the above, we can see the 95% credible interval and median of the distribution of posterior predictive samples.

This becomes particularly useful when compared against the ECDF of the observed data:

```
plot = pylater.ReciprobitPlot()
plot.plot_predictive(idata=idata, predictive_type="posterior");
plot.plot_data(data=dataset);
```

We can see a reasonably good correspondence between the observations and the draws from the fitted model.

```
Last updated: Wed May 15 2024
Python implementation: CPython
Python version : 3.10.14
IPython version : 8.24.0
matplotlib: 3.8.4
pylater: 0.1
pymc : 5.15.0
```