Statistical utility functions#
gammapy.stats
holds statistical estimators, fit statistics and algorithms
commonly used in gamma-ray astronomy.
It is mostly concerned with the evaluation of one or several observations that count events in a given region and time window, i.e. with Poisson-distributed counts measurements.
Notations#
For statistical analysis we use the following variable names following mostly the
notation in [LiMa1983]. For the MapDataset
attributes we chose more verbose
equivalents:
Variable |
Dataset attribute name |
Definition |
---|---|---|
|
|
Observed counts |
|
|
Observed counts in the off region |
|
|
Estimated background counts, defined as |
|
|
Estimated signal counts defined as |
|
|
Predicted counts |
|
|
Predicted counts in the off region |
|
|
Predicted background counts in the on region |
|
|
Predicted signal counts |
|
|
Relative background exposure |
|
|
Relative background exposure in the off region |
|
|
Background efficiency ratio |
The on measurement, assumed to contain signal and background counts,
The off measurement is assumed to contain only background counts, with an acceptance to background
Therefore,
The expectation or predicted values
Counts and fit statistics#
Gamma-ray measurements are counts,
Estimation of number of signal events or of quantities in physical models is done through
Poisson likelihood functions, the fit statistics. In gammapy, they are all log-likelihood
functions normalized like chi-squares, i.e. if
When the expected number of background events, Cash
(see Cash : Poisson data with background model). When the number of background events is unknown, one has to
use a background estimate WStat
(see WStat : Poisson data with background measurement).
These statistic functions are at the heart of the model fitting approach in gammapy. They are used to estimate the best fit values of model parameters and their associated confidence intervals.
They are used also to estimate the excess counts significance, i.e. the probability that
a given number of measured events
Estimating TS#
A classical approach to modeling and fitting relies on hypothesis testing. One wants to estimate whether
an hypothesis
The maximum log-likelihood ratio test provides a way to estimate the p-value of the data following
The Wilks theorem shows that under some hypothesis,
With the definition the fit statistics
from scipy.stats import chi2, norm
def sigma_to_ts(sigma, df=1):
"""Convert sigma to delta ts"""
p_value = 2 * norm.sf(sigma)
return chi2.isf(p_value, df=df)
def ts_to_sigma(ts, df=1):
"""Convert delta ts to sigma"""
p_value = chi2.sf(ts, df=df)
return norm.isf(0.5 * p_value)
In particular, with only one degree of freedom (e.g. flux amplitude), one
can estimate the statistical significance in terms of number of
In case the excess is negative, which can happen if the background is overestimated the following convention is used:
Counts statistics classes#
To estimate the excess counts significance and errors, gammapy uses two classes for Poisson counts with
and without known background: CashCountsStatistic
and WStatCountsStatistic
We show below how to use them.
Cash counts statistic#
Excess and Significance#
Assume one measured
from gammapy.stats import CashCountsStatistic
stat = CashCountsStatistic(n_on=13, mu_bkg=5.5)
print(f"Excess : {stat.n_sig:.2f}")
print(f"Error : {stat.error:.2f}")
print(f"TS : {stat.ts:.2f}")
print(f"sqrt(TS): {stat.sqrt_ts:.2f}")
print(f"p-value : {stat.p_value:.4f}")
Excess : 7.50
Error : 3.61
TS : 7.37
sqrt(TS): 2.71
p-value : 0.0033
The error is the symmetric error obtained from the covariance of the statistic function, here sqrt_ts
is the square root of the
To see how the

Excess errors#
You can also compute the confidence interval for the true excess based on the statistic value:
If you are interested in 68% (1
from gammapy.stats import CashCountsStatistic
count_statistic = CashCountsStatistic(n_on=13, mu_bkg=5.5)
excess = count_statistic.n_sig
errn = count_statistic.compute_errn(1.)
errp = count_statistic.compute_errp(1.)
print(f"68% confidence range: {excess - errn:.3f} < mu < {excess + errp:.3f}")
68% confidence range: 4.220 < mu < 11.446
errn_2sigma = count_statistic.compute_errn(2.)
errp_2sigma = count_statistic.compute_errp(2.)
print(f"95% confidence range: {excess - errn_2sigma:.3f} < mu < {excess + errp_2sigma:.3f}")
95% confidence range: 1.556 < mu < 16.102
The 68% confidence interval (1
On the following plot, we show how the 1

WStat counts statistic#
Excess and Significance#
To measure the significance of an excess, one can directly use the TS of the measurement with and without the excess. Taking the square root of the result yields the so-called Li & Ma significance [LiMa1983] (see equation 17).
As an example, assume you measured
Here’s how you compute the statistical significance of your detection:
from gammapy.stats import WStatCountsStatistic
stat = WStatCountsStatistic(n_on=13, n_off=11, alpha=1./2)
print(f"Excess : {stat.n_sig:.2f}")
print(f"sqrt(TS): {stat.sqrt_ts:.2f}")
Excess : 7.50
sqrt(TS): 2.09

Excess errors#
You can also compute the confidence interval for the true excess based on the statistic value:
If you are interested in 68% (1
from gammapy.stats import WStatCountsStatistic
count_statistic = WStatCountsStatistic(n_on=13, n_off=11, alpha=1./2)
excess = count_statistic.n_sig
errn = count_statistic.compute_errn(1.)
errp = count_statistic.compute_errp(1.)
print(f"68% confidence range: {excess - errn:.3f} < mu < {excess + errp:.3f}")
68% confidence range: 3.750 < mu < 11.736
errn_2sigma = count_statistic.compute_errn(2.)
errp_2sigma = count_statistic.compute_errp(2.)
print(f"95% confidence range: {excess - errn_2sigma:.3f} < mu < {excess + errp_2sigma:.3f}")
95% confidence range: 0.311 < mu < 16.580
As above, the 68% confidence interval (1
On the following plot, we show how the 1

These are references describing the available methods: [LiMa1983], [Cash1979], [Stewart2009], [Rolke2005], [Feldman1998], [Cousins2007].