Sampling: First example

This example shows you how to perform Bayesian inference on a time series, using Adaptive Covariance MCMC.

It follows on from Optimisation: First example

Like in the optimisation example, we start by importing pints:


In [1]:
import pints

Next, we create a model class.

Instead of using a real model, in this example we use the "Logistic" toy model included in pints:


In [2]:
import pints.toy as toy
model = toy.LogisticModel()

In order to generate some test data, we choose an arbitrary set of "true" parameters:


In [3]:
true_parameters = [0.015, 500]

And a number of time points at which to sample:


In [4]:
import numpy as np
times = np.linspace(0, 1000, 400)

Using these parameters and time points, we can now generate some toy data:


In [5]:
org_values = model.simulate(true_parameters, times)

And make it more realistic by adding gaussian noise:


In [6]:
noise = 25
values = org_values + np.random.normal(0, noise, org_values.shape)

We can use matplotlib (or any other plotting package) to look at the data we've created:


In [7]:
import matplotlib.pyplot as plt

plt.figure(figsize=(12,4.5))
plt.xlabel('Time')
plt.ylabel('Values')
plt.plot(times, values, label='Noisy data')
plt.plot(times, org_values, lw=2, label='Noise-free data')
plt.legend()
plt.show()


<Figure size 1200x450 with 1 Axes>

Now we have enough data (a model, a list of times, and a list of data) to formulate a problem:


In [8]:
problem = pints.SingleOutputProblem(model, times, values)

We now have some toy data, and a model that can be used for forward simulations. To make it into a probabilistic problem, we need to add a noise model. One way to do this is using the GaussianLogLikelihood function, which assumes independently distributed Gaussian noise over the data, and can calculate log-likelihoods:


In [9]:
log_likelihood = pints.GaussianLogLikelihood(problem)

This noise has mean zero, and an unknown standard deviation. How can we find out the standard deviation? By inferring it along with the other parameters. This means we have added one parameter to our problem!


In [10]:
print('Original problem dimension: ' + str(problem.n_parameters()))


Original problem dimension: 2

In [11]:
print('New dimension: ' + str(log_likelihood.n_parameters()))


New dimension: 3

(This means we also have to update our vector of true parameters)


In [12]:
true_parameters += [noise]
print(true_parameters)


[0.015, 500, 25]

This log_likelihood represents the conditional probability $p(y|\theta)$, given a set of parameters $\theta$ and a series of $y=$ values, it can calculate the probability of finding those values if the real parameters are $\theta$.

We can use this in a Bayesian inference scheme to find the quantity we're interested in:

$p(\theta|y) = \frac{p(\theta)p(y|\theta)}{p(y)} \propto p(\theta)p(y|\theta)$

To solve this, we now define a prior, indicating our initial ideas about what the parameters should be. Just as we're using a log-likelihood (the natural logarithm of a likelihood), we'll define this using a log-prior. This simplifies the above equation to:

$\log p(\theta|y) \propto \log p(\theta) + \log p(y|\theta)$

In this example we'll assume we don't know too much about the prior except lower and upper bounds for each variable: We assume the first model parameter is somewhere on the interval $[0.01, 0.02]$, the second model parameter on $[400, 600]$, and the standard deviation of the noise is somewhere on $[1, 100]$.


In [13]:
log_prior = pints.UniformLogPrior(
    [0.01, 400, 1],
    [0.02, 600, 100]
    )

With this prior, we can now define the numerator of Bayes' rule -- the unnormalised log posterior, $\log \left[ p(y|\theta) p(\theta) \right]$:


In [14]:
# Create a posterior log-likelihood (log(likelihood * prior))
log_posterior = pints.LogPosterior(log_likelihood, log_prior)

Finally we create a list of guesses to use as initial positions. We'll run three MCMC chains so we create three initial positions:


In [15]:
xs = [
    np.array(true_parameters) * 0.9,
    np.array(true_parameters) * 1.05,
    np.array(true_parameters) * 1.15,
]

And this gives us everything we need to run an MCMC routine:


In [16]:
chains = pints.mcmc_sample(log_posterior, 3, xs)


Using Adaptive covariance MCMC
Generating 3 chains.
Running in sequential mode.
Iter. Eval. Accept.   Accept.   Accept.   Time m:s
0     3      0         0         0          0:00.0
1     6      0         0         0          0:00.0
2     9      0         0         0          0:00.0
3     12     0         0         0          0:00.0
20    63     0.0952    0.0476    0.0952     0:00.0
40    123    0.122     0.0244    0.0976     0:00.0
60    183    0.082     0.0164    0.0656     0:00.1
80    243    0.0741    0.0123    0.0494     0:00.1
100   303    0.0693    0.0099    0.0396     0:00.1
120   363    0.0579    0.00826   0.0413     0:00.1
140   423    0.0496    0.00709   0.0426     0:00.1
160   483    0.0435    0.0124    0.0435     0:00.1
180   543    0.0387    0.0166    0.0387     0:00.1
Initial phase completed.
200   603    0.0348    0.0149    0.0348     0:00.1
220   663    0.0498    0.0271    0.0407     0:00.1
240   723    0.083     0.0705    0.083      0:00.2
260   783    0.0996    0.119     0.103      0:00.2
280   843    0.117     0.153     0.135      0:00.2
300   903    0.143     0.153     0.159      0:00.2
320   963    0.165109  0.152648  0.162      0:00.2
340   1023   0.173     0.164     0.170088   0:00.2
360   1083   0.172     0.163     0.166205   0:00.2
380   1143   0.171     0.165     0.160105   0:00.3
400   1203   0.172     0.167     0.157      0:00.3
420   1263   0.185     0.178     0.154      0:00.3
440   1323   0.19      0.177     0.159      0:00.3
460   1383   0.2       0.175705  0.167      0:00.3
480   1443   0.2       0.183     0.183      0:00.3
500   1503   0.21      0.19      0.19       0:00.3
520   1563   0.211     0.186     0.202      0:00.3
540   1623   0.209     0.19      0.213      0:00.4
560   1683   0.203     0.193     0.21       0:00.4
580   1743   0.201     0.196     0.208      0:00.4
600   1803   0.198     0.2       0.21       0:00.4
620   1863   0.198     0.2       0.206      0:00.4
640   1923   0.198     0.199688  0.204      0:00.4
660   1983   0.198     0.2       0.198      0:00.4
680   2043   0.20558   0.201     0.201      0:00.4
700   2103   0.207     0.203     0.205      0:00.5
720   2163   0.204     0.204     0.209      0:00.5
740   2223   0.205     0.202     0.209      0:00.5
760   2283   0.204     0.201     0.21       0:00.5
780   2343   0.207     0.202     0.214      0:00.5
800   2403   0.212     0.203     0.21598    0:00.5
820   2463   0.212     0.203     0.217      0:00.5
840   2523   0.212     0.2       0.219      0:00.6
860   2583   0.213705  0.204     0.225      0:00.6
880   2643   0.213     0.209     0.222      0:00.6
900   2703   0.216     0.212     0.223      0:00.6
920   2763   0.219     0.212     0.224      0:00.6
940   2823   0.221     0.211     0.228      0:00.6
960   2883   0.222     0.212     0.229      0:00.6
980   2943   0.225     0.214     0.231      0:00.6
1000  3003   0.226     0.217     0.232      0:00.7
1020  3063   0.227     0.219     0.234      0:00.7
1040  3123   0.226     0.216     0.233      0:00.7
1060  3183   0.222     0.214     0.233      0:00.7
1080  3243   0.228     0.215     0.235      0:00.7
1100  3303   0.225     0.213     0.236149   0:00.7
1120  3363   0.227     0.216     0.235504   0:00.7
1140  3423   0.226     0.217     0.236      0:00.8
1160  3483   0.227     0.216     0.235      0:00.8
1180  3543   0.229     0.216     0.237      0:00.8
1200  3603   0.23      0.214     0.237      0:00.8
1220  3663   0.231     0.215     0.233      0:00.8
1240  3723   0.229     0.214     0.234      0:00.8
1260  3783   0.23      0.213     0.235      0:00.8
1280  3843   0.23      0.21      0.237      0:00.8
1300  3903   0.232     0.209     0.239      0:00.9
1320  3963   0.234     0.212     0.239      0:00.9
1340  4023   0.237     0.213     0.235645   0:00.9
1360  4083   0.235     0.212     0.234      0:00.9
1380  4143   0.234     0.213     0.236      0:00.9
1400  4203   0.235546  0.215     0.237      0:00.9
1420  4263   0.238     0.214     0.236      0:00.9
1440  4323   0.237     0.212     0.237      0:01.0
1460  4383   0.235     0.213     0.234      0:01.0
1480  4443   0.234     0.213     0.234      0:01.0
1500  4503   0.233     0.212525  0.233      0:01.0
1520  4563   0.231     0.214     0.233      0:01.0
1540  4623   0.231     0.212     0.234      0:01.0
1560  4683   0.231     0.214     0.234      0:01.0
1580  4743   0.228969  0.217     0.234      0:01.0
1600  4803   0.228     0.217     0.234      0:01.1
1620  4863   0.23      0.216533  0.234      0:01.1
1640  4923   0.232     0.216     0.233      0:01.1
1660  4983   0.231186  0.214     0.232      0:01.1
1680  5043   0.233     0.213     0.234      0:01.1
1700  5103   0.232     0.212     0.232      0:01.1
1720  5163   0.233     0.212086  0.231842   0:01.1
1740  5223   0.233     0.211     0.231      0:01.1
1760  5283   0.231     0.212     0.231      0:01.2
1780  5343   0.231     0.212     0.231      0:01.2
1800  5403   0.231     0.211     0.229317   0:01.2
1820  5463   0.23      0.211     0.23       0:01.2
1840  5523   0.23      0.210755  0.231      0:01.2
1860  5583   0.232     0.21      0.231      0:01.2
1880  5643   0.231     0.209     0.23       0:01.2
1900  5703   0.231     0.209     0.232      0:01.2
1920  5763   0.233     0.21      0.232      0:01.3
1940  5823   0.233     0.212     0.233      0:01.3
1960  5883   0.233     0.213     0.235      0:01.3
1980  5943   0.232206  0.212     0.235      0:01.3
2000  6003   0.231     0.211     0.234      0:01.3
2020  6063   0.232     0.212766  0.234      0:01.3
2040  6123   0.232     0.213     0.233709   0:01.3
2060  6183   0.232     0.213     0.235      0:01.4
2080  6243   0.231     0.212     0.236      0:01.4
2100  6303   0.23      0.215     0.236554   0:01.4
2120  6363   0.23      0.21405   0.239      0:01.4
2140  6423   0.23      0.217     0.239      0:01.4
2160  6483   0.23      0.217     0.237      0:01.4
2180  6543   0.229     0.216     0.237      0:01.4
2200  6603   0.231     0.216     0.238      0:01.4
2220  6663   0.23      0.216     0.239      0:01.5
2240  6723   0.231     0.216     0.239      0:01.5
2260  6783   0.230429  0.217     0.239      0:01.5
2280  6843   0.23      0.217     0.238      0:01.5
2300  6903   0.2299    0.217     0.237      0:01.5
2320  6963   0.229     0.215     0.239      0:01.5
2340  7023   0.23      0.216     0.24       0:01.5
2360  7083   0.23      0.216     0.24       0:01.5
2380  7143   0.23      0.216     0.239      0:01.6
2400  7203   0.229     0.216     0.239      0:01.6
2420  7263   0.228005  0.216     0.239      0:01.6
2440  7323   0.228     0.215     0.24       0:01.6
2460  7383   0.228     0.216     0.239      0:01.6
2480  7443   0.228     0.215     0.238      0:01.6
2500  7503   0.229     0.214     0.238      0:01.6
2520  7563   0.229     0.215     0.237      0:01.7
2540  7623   0.229     0.214     0.239      0:01.7
2560  7683   0.229     0.215     0.239      0:01.7
2580  7743   0.228     0.215     0.239      0:01.7
2600  7803   0.229     0.216     0.239      0:01.7
2620  7863   0.229     0.215     0.239      0:01.7
2640  7923   0.229     0.215     0.238      0:01.7
2660  7983   0.23      0.215     0.239      0:01.8
2680  8043   0.230511  0.216     0.241      0:01.8
2700  8103   0.23      0.215846  0.24       0:01.8
2720  8163   0.23043   0.216     0.24       0:01.8
2740  8223   0.231     0.216     0.239      0:01.8
2760  8283   0.231     0.217     0.238      0:01.8
2780  8343   0.231931  0.216     0.239      0:01.8
2800  8403   0.231     0.217     0.24       0:01.9
2820  8463   0.23      0.219     0.24       0:01.9
2840  8523   0.231     0.218585  0.24       0:01.9
2860  8583   0.231     0.219     0.241      0:01.9
2880  8643   0.232     0.219     0.241      0:01.9
2900  8703   0.231     0.219     0.24       0:01.9
2920  8763   0.231     0.219103  0.239      0:01.9
2940  8823   0.23      0.219     0.238      0:01.9
2960  8883   0.23      0.219     0.238433   0:02.0
2980  8943   0.23      0.22      0.238      0:02.0
3000  9003   0.23      0.221     0.238      0:02.0
3020  9063   0.23      0.221     0.237      0:02.0
3040  9123   0.231     0.22      0.236      0:02.0
3060  9183   0.23      0.22      0.236      0:02.0
3080  9243   0.23      0.221     0.236      0:02.0
3100  9303   0.231     0.222     0.236      0:02.0
3120  9363   0.231     0.222     0.236      0:02.1
3140  9423   0.231455  0.222     0.236      0:02.1
3160  9483   0.231     0.223     0.237      0:02.1
3180  9543   0.230745  0.222     0.237      0:02.1
3200  9603   0.231     0.223     0.236      0:02.1
3220  9663   0.232     0.222     0.236      0:02.1
3240  9723   0.231     0.222     0.237      0:02.1
3260  9783   0.231     0.223     0.237      0:02.2
3280  9843   0.23      0.223     0.237      0:02.2
3300  9903   0.23      0.223     0.237      0:02.2
3320  9963   0.23      0.223     0.237      0:02.2
3340  10023  0.229572  0.222     0.237      0:02.2
3360  10083  0.23      0.221     0.237      0:02.2
3380  10143  0.231     0.222     0.237      0:02.2
3400  10203  0.231     0.221     0.238      0:02.3
3420  10263  0.23      0.220988  0.237      0:02.3
3440  10323  0.23      0.221     0.236      0:02.3
3460  10383  0.231     0.222     0.23577    0:02.3
3480  10443  0.232     0.223     0.236      0:02.3
3500  10503  0.232     0.223     0.235      0:02.3
3520  10563  0.232     0.222096  0.235      0:02.3
3540  10623  0.232     0.221     0.234      0:02.3
3560  10683  0.232     0.22      0.234      0:02.4
3580  10743  0.232     0.222     0.235      0:02.4
3600  10803  0.232     0.222     0.234657   0:02.4
3620  10863  0.232     0.222     0.236      0:02.4
3640  10923  0.232     0.223565  0.237      0:02.4
3660  10983  0.232     0.223     0.237      0:02.4
3680  11043  0.233     0.224     0.237      0:02.4
3700  11103  0.233     0.223     0.237      0:02.4
3720  11163  0.233     0.223     0.236      0:02.5
3740  11223  0.234     0.222935  0.236      0:02.5
3760  11283  0.234     0.224     0.237      0:02.5
3780  11343  0.234     0.223     0.236      0:02.5
3800  11403  0.235     0.224     0.236      0:02.5
3820  11463  0.235017  0.224     0.236      0:02.5
3840  11523  0.236     0.225     0.235095   0:02.5
3860  11583  0.236     0.225     0.235      0:02.6
3880  11643  0.236     0.225     0.234      0:02.6
3900  11703  0.236     0.224     0.235      0:02.6
3920  11763  0.237     0.223     0.235      0:02.6
3940  11823  0.236     0.223     0.234712   0:02.6
3960  11883  0.236304  0.222     0.235      0:02.6
3980  11943  0.236     0.223     0.235      0:02.6
4000  12003  0.235941  0.223     0.234      0:02.6
4020  12063  0.236     0.223     0.234      0:02.6
4040  12123  0.237     0.223     0.233853   0:02.7
4060  12183  0.236     0.223     0.234      0:02.7
4080  12243  0.236     0.222     0.234      0:02.7
4100  12303  0.23604   0.222     0.234      0:02.7
4120  12363  0.235     0.222     0.233      0:02.7
4140  12423  0.235     0.221     0.234      0:02.7
4160  12483  0.235     0.222     0.235      0:02.7
4180  12543  0.234     0.222     0.235      0:02.8
4200  12603  0.234468  0.222     0.235      0:02.8
4220  12663  0.235     0.221     0.235      0:02.8
4240  12723  0.235     0.221     0.234      0:02.8
4260  12783  0.236     0.222     0.234      0:02.8
4280  12843  0.236     0.221     0.234      0:02.8
4300  12903  0.235     0.221     0.235      0:02.8
4320  12963  0.235     0.222     0.235      0:02.9
4340  13023  0.235     0.223     0.235      0:02.9
4360  13083  0.234     0.224     0.235      0:02.9
4380  13143  0.234     0.223     0.235      0:02.9
4400  13203  0.234     0.223     0.234      0:02.9
4420  13263  0.233     0.223     0.234      0:02.9
4440  13323  0.233     0.224     0.236      0:02.9
4460  13383  0.232     0.224     0.236      0:02.9
4480  13443  0.232     0.223     0.237      0:03.0
4500  13503  0.232     0.223     0.236      0:03.0
4520  13563  0.232     0.222     0.236      0:03.0
4540  13623  0.233     0.222     0.236      0:03.0
4560  13683  0.233     0.222     0.235      0:03.0
4580  13743  0.232     0.222     0.236      0:03.0
4600  13803  0.232     0.222343  0.236253   0:03.0
4620  13863  0.233     0.222     0.236      0:03.0
4640  13923  0.232     0.222     0.236      0:03.1
4660  13983  0.233     0.222     0.237      0:03.1
4680  14043  0.232     0.222     0.236      0:03.1
4700  14103  0.232     0.222     0.23612    0:03.1
4720  14163  0.233     0.222     0.236      0:03.1
4740  14223  0.232     0.222316  0.236      0:03.1
4760  14283  0.233     0.222     0.236      0:03.1
4780  14343  0.233     0.223     0.236      0:03.1
4800  14403  0.232     0.223     0.236      0:03.2
4820  14463  0.232     0.223     0.235      0:03.2
4840  14523  0.232     0.223     0.235282   0:03.2
4860  14583  0.231     0.223     0.236      0:03.2
4880  14643  0.231     0.223     0.236      0:03.2
4900  14703  0.232     0.223     0.236      0:03.2
4920  14763  0.231     0.222719  0.236      0:03.2
4940  14823  0.232     0.223     0.236      0:03.2
4960  14883  0.231405  0.222     0.235      0:03.3
4980  14943  0.231     0.223     0.234      0:03.3
5000  15003  0.231     0.223     0.234      0:03.3
5020  15063  0.231428  0.222     0.233      0:03.3
5040  15123  0.232     0.221     0.233      0:03.3
5060  15183  0.231     0.220905  0.234      0:03.3
5080  15243  0.232     0.222     0.233025   0:03.3
5100  15303  0.232     0.222     0.233      0:03.4
5120  15363  0.232     0.221     0.233      0:03.4
5140  15423  0.232056  0.221     0.233      0:03.4
5160  15483  0.233     0.221     0.233      0:03.4
5180  15543  0.233     0.221     0.233      0:03.4
5200  15603  0.233     0.221     0.234      0:03.4
5220  15663  0.233     0.221222  0.235      0:03.4
5240  15723  0.233     0.221     0.235      0:03.4
5260  15783  0.233     0.221     0.236      0:03.5
5280  15843  0.233     0.222     0.235      0:03.5
5300  15903  0.233     0.223     0.236      0:03.5
5320  15963  0.233     0.222     0.236      0:03.5
5340  16023  0.233     0.222     0.236      0:03.5
5360  16083  0.234     0.22216   0.236523   0:03.5
5380  16143  0.233     0.222     0.237      0:03.5
5400  16203  0.233105  0.223292  0.236      0:03.6
5420  16263  0.233     0.223     0.236      0:03.6
5440  16323  0.234     0.224     0.235      0:03.6
5460  16383  0.234     0.224     0.236      0:03.6
5480  16443  0.234     0.224     0.236      0:03.6
5500  16503  0.234321  0.223     0.236      0:03.6
5520  16563  0.234     0.223148  0.236      0:03.6
5540  16623  0.234     0.224     0.235      0:03.7
5560  16683  0.234     0.225     0.235      0:03.7
5580  16743  0.234     0.225     0.235      0:03.7
5600  16803  0.234     0.225     0.234      0:03.7
5620  16863  0.234122  0.225     0.234      0:03.7
5640  16923  0.234     0.225     0.234      0:03.7
5660  16983  0.234     0.224342  0.235      0:03.7
5680  17043  0.233     0.225     0.235      0:03.7
5700  17103  0.233     0.224     0.235      0:03.8
5720  17163  0.232302  0.224     0.234924   0:03.8
5740  17223  0.233     0.224     0.235      0:03.8
5760  17283  0.233     0.224     0.235      0:03.8
5780  17343  0.233     0.223     0.235      0:03.8
5800  17403  0.233408  0.224     0.235      0:03.8
5820  17463  0.234     0.224     0.234      0:03.8
5840  17523  0.235     0.224     0.234      0:03.9
5860  17583  0.234431  0.224     0.234      0:03.9
5880  17643  0.234     0.225     0.233      0:03.9
5900  17703  0.234     0.225     0.234      0:03.9
5920  17763  0.234     0.224     0.234      0:03.9
5940  17823  0.233     0.225     0.234      0:03.9
5960  17883  0.234     0.22513   0.234      0:03.9
5980  17943  0.233573  0.226     0.234409   0:03.9
6000  18003  0.234     0.225     0.234      0:04.0
6020  18063  0.234     0.225     0.234      0:04.0
6040  18123  0.234     0.225     0.234      0:04.0
6060  18183  0.234     0.225     0.234      0:04.0
6080  18243  0.234     0.225     0.234      0:04.0
6100  18303  0.233     0.225209  0.234      0:04.0
6120  18363  0.233     0.226     0.234      0:04.0
6140  18423  0.234     0.226     0.234      0:04.0
6160  18483  0.234     0.226     0.233566   0:04.1
6180  18543  0.234     0.226     0.233      0:04.1
6200  18603  0.234     0.227     0.234      0:04.1
6220  18663  0.234     0.226     0.233      0:04.1
6240  18723  0.234     0.226     0.232655   0:04.1
6260  18783  0.234     0.226162  0.233      0:04.1
6280  18843  0.234     0.226     0.233      0:04.1
6300  18903  0.235     0.226472  0.233      0:04.1
6320  18963  0.235     0.226     0.233      0:04.2
6340  19023  0.234     0.226     0.233      0:04.2
6360  19083  0.234     0.226     0.232825   0:04.2
6380  19143  0.234     0.226     0.233349   0:04.2
6400  19203  0.234     0.227     0.233      0:04.2
6420  19263  0.234     0.226756  0.233      0:04.2
6440  19323  0.233     0.226     0.233      0:04.2
6460  19383  0.233     0.227     0.232317   0:04.2
6480  19443  0.233     0.227     0.233      0:04.3
6500  19503  0.233     0.226     0.233      0:04.3
6520  19563  0.233     0.226     0.233      0:04.3
6540  19623  0.232839  0.226     0.233      0:04.3
6560  19683  0.233     0.226     0.232      0:04.3
6580  19743  0.233     0.226     0.232      0:04.3
6600  19803  0.232692  0.226     0.232      0:04.3
6620  19863  0.233     0.226     0.232      0:04.4
6640  19923  0.233     0.227     0.232      0:04.4
6660  19983  0.233     0.227     0.232      0:04.4
6680  20043  0.232     0.227     0.231      0:04.4
6700  20103  0.233     0.226     0.232      0:04.4
6720  20163  0.233     0.226     0.232      0:04.4
6740  20223  0.233     0.226     0.232      0:04.4
6760  20283  0.232     0.226     0.231      0:04.4
6780  20343  0.232     0.225     0.232      0:04.5
6800  20403  0.232     0.225261  0.232      0:04.5
6820  20463  0.232     0.225     0.232      0:04.5
6840  20523  0.232     0.225     0.232      0:04.5
6860  20583  0.231     0.225     0.232      0:04.5
6880  20643  0.232     0.225     0.231943   0:04.5
6900  20703  0.231     0.225     0.233      0:04.5
6920  20763  0.231325  0.224     0.232      0:04.6
6940  20823  0.231     0.223887  0.232      0:04.6
6960  20883  0.231     0.224     0.232      0:04.6
6980  20943  0.231     0.224     0.233      0:04.6
7000  21003  0.230967  0.224     0.233      0:04.6
7020  21063  0.231     0.224327  0.232588   0:04.6
7040  21123  0.231     0.224     0.232      0:04.6
7060  21183  0.231     0.225     0.232      0:04.7
7080  21243  0.231     0.225     0.231182   0:04.7
7100  21303  0.231     0.225     0.232      0:04.7
7120  21363  0.231     0.226     0.232      0:04.7
7140  21423  0.231     0.226     0.232      0:04.7
7160  21483  0.231     0.226     0.231      0:04.7
7180  21543  0.23      0.226     0.232      0:04.7
7200  21603  0.231     0.225     0.232      0:04.7
7220  21663  0.231     0.225     0.233      0:04.8
7240  21723  0.231     0.225107  0.233      0:04.8
7260  21783  0.231     0.225     0.233      0:04.8
7280  21843  0.231     0.225     0.233      0:04.8
7300  21903  0.231     0.225     0.233      0:04.8
7320  21963  0.231     0.225     0.233      0:04.8
7340  22023  0.231     0.225     0.233      0:04.8
7360  22083  0.231     0.225     0.233      0:04.9
7380  22143  0.231134  0.225     0.233      0:04.9
7400  22203  0.231     0.225     0.233      0:04.9
7420  22263  0.23      0.225     0.233      0:04.9
7440  22323  0.23      0.225     0.233      0:04.9
7460  22383  0.231     0.225     0.233      0:04.9
7480  22443  0.231     0.225     0.233      0:04.9
7500  22503  0.231     0.22517   0.233      0:04.9
7520  22563  0.231     0.225     0.233      0:05.0
7540  22623  0.232     0.224506  0.233      0:05.0
7560  22683  0.231     0.224     0.233      0:05.0
7580  22743  0.231     0.224     0.234      0:05.0
7600  22803  0.231     0.225     0.233      0:05.0
7620  22863  0.231     0.225     0.233      0:05.0
7640  22923  0.232     0.225     0.233      0:05.0
7660  22983  0.232     0.225     0.233      0:05.1
7680  23043  0.232001  0.226     0.234      0:05.1
7700  23103  0.232     0.226     0.233      0:05.1
7720  23163  0.232     0.225     0.234037   0:05.1
7740  23223  0.232     0.226     0.234      0:05.1
7760  23283  0.232     0.225     0.234      0:05.1
7780  23343  0.232     0.226     0.234      0:05.1
7800  23403  0.232     0.225     0.234      0:05.1
7820  23463  0.232     0.226     0.233      0:05.2
7840  23523  0.232     0.226     0.233      0:05.2
7860  23583  0.232     0.226     0.233      0:05.2
7880  23643  0.232     0.226     0.233      0:05.2
7900  23703  0.232     0.226     0.233      0:05.2
7920  23763  0.233     0.226     0.233      0:05.2
7940  23823  0.233     0.226     0.233      0:05.2
7960  23883  0.232     0.226     0.233      0:05.2
7980  23943  0.232     0.225     0.232427   0:05.3
8000  24003  0.232     0.226     0.232221   0:05.3
8020  24063  0.23239   0.226     0.232      0:05.3
8040  24123  0.232     0.226     0.232      0:05.3
8060  24183  0.232     0.226     0.231      0:05.3
8080  24243  0.232     0.226     0.231902   0:05.3
8100  24303  0.232     0.226     0.232      0:05.3
8120  24363  0.232     0.225588  0.232      0:05.4
8140  24423  0.232     0.225     0.232      0:05.4
8160  24483  0.231     0.22534   0.231      0:05.4
8180  24543  0.232     0.226     0.232      0:05.4
8200  24603  0.232     0.225     0.232      0:05.4
8220  24663  0.232     0.225     0.232      0:05.4
8240  24723  0.233     0.226     0.231768   0:05.4
8260  24783  0.233     0.226     0.232      0:05.5
8280  24843  0.233     0.226     0.232      0:05.5
8300  24903  0.233     0.226     0.232      0:05.5
8320  24963  0.233     0.226     0.232      0:05.5
8340  25023  0.232586  0.226     0.232      0:05.5
8360  25083  0.232     0.227     0.232      0:05.5
8380  25143  0.232     0.227     0.232      0:05.5
8400  25203  0.232     0.227     0.232      0:05.5
8420  25263  0.232514  0.227     0.232      0:05.6
8440  25323  0.232     0.227     0.231      0:05.6
8460  25383  0.232     0.227     0.231      0:05.6
8480  25443  0.231     0.227     0.230869   0:05.6
8500  25503  0.232     0.227     0.231      0:05.6
8520  25563  0.232     0.227     0.231      0:05.6
8540  25623  0.231     0.227     0.23       0:05.6
8560  25683  0.231     0.227     0.23       0:05.7
8580  25743  0.231     0.227     0.23       0:05.7
8600  25803  0.231     0.227     0.23       0:05.7
8620  25863  0.231     0.227     0.23       0:05.7
8640  25923  0.231     0.227     0.23       0:05.7
8660  25983  0.231     0.227     0.229      0:05.7
8680  26043  0.231     0.227278  0.229      0:05.7
8700  26103  0.231     0.227     0.229      0:05.7
8720  26163  0.232     0.227     0.229      0:05.8
8740  26223  0.232     0.228     0.229      0:05.8
8760  26283  0.231     0.227     0.229      0:05.8
8780  26343  0.232     0.228     0.229      0:05.8
8800  26403  0.231451  0.227     0.229      0:05.8
8820  26463  0.2324    0.227     0.229      0:05.8
8840  26523  0.232666  0.227463  0.229      0:05.8
8860  26583  0.232     0.228     0.228      0:05.9
8880  26643  0.233     0.228     0.228      0:05.9
8900  26703  0.232     0.228     0.229      0:05.9
8920  26763  0.232     0.227     0.229      0:05.9
8940  26823  0.233     0.227     0.229169   0:05.9
8960  26883  0.233     0.227     0.229      0:05.9
8980  26943  0.233     0.227     0.229      0:05.9
9000  27003  0.234     0.228     0.229      0:05.9
9020  27063  0.233     0.228     0.229      0:06.0
9040  27123  0.23316   0.228     0.22951    0:06.0
9060  27183  0.233     0.228     0.229      0:06.0
9080  27243  0.233     0.227     0.229      0:06.0
9100  27303  0.233     0.227     0.229      0:06.0
9120  27363  0.234     0.227     0.229      0:06.0
9140  27423  0.234     0.227765  0.229406   0:06.0
9160  27483  0.233599  0.228     0.229      0:06.1
9180  27543  0.234     0.227     0.22906    0:06.1
9200  27603  0.234     0.227     0.229      0:06.1
9220  27663  0.234     0.227     0.229      0:06.1
9240  27723  0.234     0.227     0.23       0:06.1
9260  27783  0.2341    0.227     0.229      0:06.1
9280  27843  0.234     0.227     0.229      0:06.1
9300  27903  0.234     0.228     0.229      0:06.1
9320  27963  0.234     0.227     0.229      0:06.2
9340  28023  0.234     0.228     0.229      0:06.2
9360  28083  0.234     0.228     0.229      0:06.2
9380  28143  0.234     0.228     0.229      0:06.2
9400  28203  0.234     0.228     0.229      0:06.2
9420  28263  0.234     0.228     0.228      0:06.2
9440  28323  0.234     0.228     0.229      0:06.2
9460  28383  0.234     0.228     0.229      0:06.3
9480  28443  0.234258  0.228     0.229      0:06.3
9500  28503  0.234     0.228     0.229      0:06.3
9520  28563  0.235     0.228     0.229      0:06.3
9540  28623  0.235     0.228     0.23       0:06.3
9560  28683  0.235     0.227     0.23       0:06.3
9580  28743  0.235     0.227     0.23       0:06.3
9600  28803  0.235     0.227     0.23       0:06.3
9620  28863  0.235     0.227     0.231      0:06.4
9640  28923  0.235349  0.227     0.230474   0:06.4
9660  28983  0.235     0.227     0.23       0:06.4
9680  29043  0.235203  0.227     0.23       0:06.4
9700  29103  0.235     0.227     0.231      0:06.4
9720  29163  0.235     0.227     0.231      0:06.4
9740  29223  0.235     0.227     0.231      0:06.4
9760  29283  0.235     0.227     0.231      0:06.5
9780  29343  0.235     0.227     0.231      0:06.5
9800  29403  0.235     0.227     0.231      0:06.5
9820  29463  0.235     0.228     0.231      0:06.5
9840  29523  0.235     0.228     0.231      0:06.5
9860  29583  0.235     0.228     0.231      0:06.5
9880  29643  0.235     0.228     0.231      0:06.5
9900  29703  0.235     0.228     0.231      0:06.5
9920  29763  0.235     0.228     0.231      0:06.6
9940  29823  0.235     0.229     0.231      0:06.6
9960  29883  0.235117  0.228     0.232      0:06.6
9980  29943  0.235     0.229     0.232      0:06.6
10000 30000  0.2346    0.2284    0.2316     0:06.6
Halting: Maximum number of iterations (10000) reached.

Using Pints' diagnostic plots to inspect the results

We can take a further look at the obtained results using Pints's diagnostic plots.

First, we use the trace method to see if the three chains converged to the same solution.


In [17]:
import pints.plot
pints.plot.trace(chains)
plt.show()


Based on this plot, it looks like the three chains become very similar after about 1000 iterations. To be safe, we throw away the first 2000 samples and continue our analysis with the first chain.


In [18]:
chain = chains[0]
chain = chain[2000:]

We can also look for autocorrelation in the chains, using the autocorrelation() method. If everything went well, the samples in the chain should be relatively independent, so the autocorrelation should get quite low when the lag on the x-axis increases.


In [19]:
pints.plot.autocorrelation(chain)
plt.show()


Now we can inspect the inferred distribution by plotting histograms:


In [20]:
fig, axes = pints.plot.histogram([chain], ref_parameters=true_parameters)

# Show where the sample standard deviation of the generated noise is:
noise_sample_std = np.std(values - org_values)
axes[-1].axvline(noise_sample_std, color='orange', label='Sample standard deviation of noise')
axes[-1].legend()

fig.set_size_inches(14, 9)
plt.show()


Here we've analysed each parameter in isolation, but we can also look at correlations between parameters we found using the pairwise() plot.

To speed things up, we'll first apply some thinning to the chain:


In [21]:
chain = chain[::10]

In [22]:
pints.plot.pairwise(chain, kde=True, ref_parameters=true_parameters)
plt.show()


/home/chonlei/anaconda3/envs/matplotlib_build/lib/python3.7/site-packages/matplotlib/axes/_axes.py:6521: MatplotlibDeprecationWarning: 
The 'normed' kwarg was deprecated in Matplotlib 2.1 and will be removed in 3.1. Use 'density' instead.
  alternative="'density'", removal="3.1")
/home/chonlei/anaconda3/envs/matplotlib_build/lib/python3.7/site-packages/matplotlib/axes/_axes.py:6521: MatplotlibDeprecationWarning: 
The 'normed' kwarg was deprecated in Matplotlib 2.1 and will be removed in 3.1. Use 'density' instead.
  alternative="'density'", removal="3.1")
/home/chonlei/anaconda3/envs/matplotlib_build/lib/python3.7/site-packages/matplotlib/axes/_axes.py:6521: MatplotlibDeprecationWarning: 
The 'normed' kwarg was deprecated in Matplotlib 2.1 and will be removed in 3.1. Use 'density' instead.
  alternative="'density'", removal="3.1")

As these plots show, we came pretty close to the original "true" values (represented by the blue line). But not exactly... Worse, the method seems to suggest a normal distribution but around the wrong point. To find out what's going on, we can plot the log-posterior function near the true parameters:


In [23]:
# Plot log-posterior function
fig, axes = pints.plot.function(log_posterior, true_parameters)

# Add a line showing the sample standard deviation of the generated noise
axes[-1].axvline(noise_sample_std, color='orange', label='Sample standard deviation of noise')
axes[-1].legend()

# Customise the figure size
fig.set_size_inches(14, 9)
plt.show()


As this plot (created entirely without MCMC!) shows, the MCMC method did well, but our estimate of the true parameters has become biased by the stochastic noise! You can test this by increasing the number of sample points, which increases the size of the noise sample, and reduces the bias.

Finally, we can look at the bit that really matters: The model predictions made from models with the parameters we found (a posterior predictive check). Thes can be plotted using the series() method.


In [24]:
fig, axes = pints.plot.series(chain, problem)

# Customise the plot, and add the original, noise-free data
fig.set_size_inches(12,4.5)
plt.plot(times, org_values, c='orange', label='Noise-free data')
plt.legend()
plt.show()