File: confidence_interval2.py

package info (click to toggle)
lmfit-py 0.9.11%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 2,908 kB
  • sloc: python: 10,121; makefile: 114; sh: 55
file content (83 lines) | stat: -rw-r--r-- 2,236 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#!/usr/bin/env python

import numpy as np
from scipy.interpolate import interp1d

from lmfit import Minimizer, Parameters, conf_interval, conf_interval2d

try:
    import matplotlib.pyplot as plt
    HASPYLAB = True
except ImportError:
    HASPYLAB = False

np.random.seed(1)

p_true = Parameters()
p_true.add('amp', value=14.0)
p_true.add('decay', value=0.010)
p_true.add('amp2', value=-10.0)
p_true.add('decay2', value=0.050)


def residual(pars, x, data=None):
    model = pars['amp'] * np.exp(-x*pars['decay'])
    model += pars['amp2'] * np.exp(-x*pars['decay2'])
    if data is None:
        return model
    return model - data


n = 200
xmin = 0.
xmax = 250.0
noise = np.random.normal(scale=0.7215, size=n)
x = np.linspace(xmin, xmax, n)
data = residual(p_true, x) + noise

fit_params = Parameters()
fit_params.add('amp', value=14.0)
fit_params.add('decay', value=0.010)
fit_params.add('amp2', value=-10.0)
fit_params.add('decay2', value=0.050)

mini = Minimizer(residual, fit_params,
                 fcn_args=(x,), fcn_kws={'data': data})

out = mini.leastsq()

ci, trace = conf_interval(mini, out, trace=True)

names = list(out.params.keys())

if HASPYLAB:
    plt.rcParams['font.size'] = 8
    plt.plot(x, data)
    plt.figure()
    cm = plt.cm.coolwarm
    for i in range(4):
        for j in range(4):
            plt.subplot(4, 4, 16-j*4-i)
            if i != j:
                x, y, m = conf_interval2d(mini, out, names[i], names[j], 20, 20)
                plt.contourf(x, y, m, np.linspace(0, 1, 10), cmap=cm)
                plt.xlabel(names[i])
                plt.ylabel(names[j])

                x = trace[names[i]][names[i]]
                y = trace[names[i]][names[j]]
                pr = trace[names[i]]['prob']
                s = np.argsort(x)
                plt.scatter(x[s], y[s], c=pr[s], s=30, lw=1, cmap=cm)
            else:
                x = trace[names[i]][names[i]]
                y = trace[names[i]]['prob']

                t, s = np.unique(x, True)
                f = interp1d(t, y[s], 'slinear')
                xn = np.linspace(x.min(), x.max(), 50)
                plt.plot(xn, f(xn), 'g', lw=1)
                plt.xlabel(names[i])
                plt.ylabel('prob')

    plt.show()