Fitting theory to data
At the moment, only the standard least-squares fitting is implemented, and it uses the iminuit Python interface for the Minuit2 C++ library.
Gepard user creates a MinuitFitter
object, where first argument
is a dataset (collection of DataPoint
objects), and second
argument is a Theory
object. Then fit()
method of this
MinuitFitter
objects starts the fit (by calling migrad
optimizer of Minuit). Before this, user should release some
parameters of the Theory
because all parameters are
by default fixed at the moment of the creation of Theory
object.
So, the minimal example of fitting is:
>>> import gepard as g
>>> pts = g.dset[36] # 12 H1 DVCS measurements
>>> class FitTest(g.gpd.PWNormGPD, g.cff.MellinBarnesCFF, g.dvcs.BMK):
... pass
>>> th = FitTest()
>>> f = g.MinuitFitter(pts, th)
>>> f.release_parameters('ns', 'ms2', 'secs')
>>> f.fit()
Final values of chi-square and of parameters are available as
>>> f.minuit.fval
8.411
>>> f.print_parameters()
ns = 1.46 +- 0.45
ms2 = 0.93 +- 0.07
secs = -0.32 +- 0.01
After successful fit of theory object th
, user can access parameter uncertainties as
th.parameters_errors
dictionary, and full covariance matrix (inverse of the
chi-square Hessian matrix) as th.covariance
dictionary. Correlation matrix is
also available as th.correlation
.
Covariance matrix is then internally used to propagate parameter uncertainties to prediction of observables, like this:
>>> th.predict(pts[0], uncertainty=True)
(13.25, 1.62)
where parameter-dependent form factors (such as CFFs) can also be “predicted”, i. e., calculated together with their uncertainty:
>>> pt = g.DataPoint(xB=0.01, t=-0.2, Q2=10)
>>> th.predict(pt, observable='ImH', uncertainty=True)
(273.2, 25.8)
Note
These uncertainties are “naive”. They ignore unknown part of uncertainty due to the rigidity of the model. It is likely that true uncertainty is always significantly larger.
Fitting using f.fit()
is simple but limited. For better control over fitting procedure
and determination of parameter uncertainties, user should use many functionalities
of the iminuit
package, and call directly its functions like f.minuit.migrad
,
f.minuit.minos
etc.
For details one should consult documentation
of this package.
It is important to keep in mind that although parameter values are automatically kept in sync between
iminuit
and Gepard
, parameter uncertainties and covariances are not. So, in
order to correctly use uncertainties in Gepard
, one should
first syncronize covariances using special function f.covsync
. For example, simple
fitting with f.fit()
is equivalent to first doing f.minuit.migrad()
and then
f.covsync()
.