File: confidence_interval2.py

package info (click to toggle)
lmfit-py 0.8.0%2Bdfsg.1-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 1,776 kB
  • ctags: 1,203
  • sloc: python: 7,041; makefile: 102; sh: 43
file content (90 lines) | stat: -rw-r--r-- 2,284 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
84
85
86
87
88
89
90
#!/usr/bin/env python

from lmfit import Parameters, Minimizer, conf_interval, conf_interval2d, minimize
import numpy as np
from scipy.interpolate import interp1d

try:
    import pylab
    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):
    amp = pars['amp'].value
    decay = pars['decay'].value
    amp2 = pars['amp2'].value
    decay2 = pars['decay2'].value


    model = amp*np.exp(-x*decay)+amp2*np.exp(-x*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)

out = minimize(residual, fit_params, args=(x,), kws={'data':data})
out.leastsq()
ci, trace = conf_interval(out, trace=True)


names=fit_params.keys()

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

                x=trace[names[i]][names[i]]            
                y=trace[names[i]][names[j]]
                pr=trace[names[i]]['prob']
                s=np.argsort(x)
                pylab.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)
                pylab.plot(xn,f(xn),'g',lw=1)
                pylab.xlabel(names[i])
                pylab.ylabel('prob')

    pylab.show()