How can I define my own fit statistic in Sherpa?
The load_user_stat function provides an interface for adding user-defined statistic functions in Sherpa. It accommodates user-defined functions for a statistic and statistical errors, in addition to defining a list of model parameters and hyperparameters for prior distributions (if prior desired).
For example, a simple user-defined statistic in Python Sherpa would look like this:
load_user_stat(statname, calc_stat_func, calc_err_func=None, priors={})
sherpa> def my_stat_func(data, model, staterror, syserror=None, weight=None, bkg=None):
# A simple function to replicate χ2
fvec = ((data - model) / staterror)**2
stat = fvec.sum()
return (stat, fvec)
sherpa> def my_staterr_func(data):
# A simple staterror function
return numpy.sqrt(data)
sherpa> load_user_stat("mystat", my_stat_func, my_staterr_func)
sherpa> set_stat(mystat)
And a more complex user-defined statistic, with prior distributions, would look like this:
sherpa> def my_stat_func(data, model, staterror=None, syserror=None, weight=None, bkg=None):
...
return (stat, fvec)
sherpa> load_user_stat("mystat", my_stat_func, priors=dict(mugamma=0.017, ..., gamma=abs1.nh, ... ))
sherpa> set_stat(mystat)
In these examples, 'stat' is a scalar statistic value and 'fvec' is an array of the statistic contributions of each bin. This method caters to both types of optimization methods in Sherpa: levmar expects the statistic contribution per bin, whereas simplex and moncar expect a single scalar statistic value.