Source code for gammapy.stats.utils

# Licensed under a 3-clause BSD style license - see LICENSE.rst

import numpy as np
from scipy.stats import ncx2


__all__ = ["sigma_to_ts", "ts_to_sigma"]


[docs] def sigma_to_ts(n_sigma, df=1, n_sigma_asimov=0): """Convert number of sigma to delta ts. Assumes that the TS follows a chi2 distribution according to Wilks theorem [1]. This is valid only if: - the two hypotheses tested can be defined in the same parameters space - the true value is not at the boundary of this parameters space. Parameters ---------- n_sigma : float Significance in number of sigma. df : int, optional Number of degree of freedom. Default is 1. n_sigma_asimov : float, optional Significance in number of sigma in the Asimov dataset (in which counts are equal to the predicted counts). In that case the function applies the Wald test described in [2] and [3], where the TS of H1 under the H0 assumption is assumed to follow a non-central chi2 distribution. Should only be used for sensitivity computations. Default is 0. Returns ------- ts : float Test statistic value. References ---------- .. [1] Wilks theorem: https://en.wikipedia.org/wiki/Wilks%27_theorem .. [2] Wald (1943): https://www.pp.rhul.ac.uk/~cowan/stat/wald1943.pdf .. [3] Cowan et al. (2011), European Physical Journal C, 71, 1554. doi:10.1140/epjc/s10052-011-1554-0. """ ts_asimov = n_sigma_asimov**2 p_value = ncx2.sf(n_sigma**2, df=1, nc=ts_asimov) return ncx2.isf(p_value, df=df, nc=ts_asimov)
[docs] def ts_to_sigma(ts, df=1, ts_asimov=0): """Convert delta ts to number of sigma. Assumes that the TS follows a chi2 distribution according to Wilks theorem [1]. This is valid only if: - the two hypotheses tested can be defined in the same parameters space - the true value is not at the boundary of this parameters space. Parameters ---------- ts : float Test statistic value. df : int, optional Number of degree of freedom. Default is 1. ts_asimov : float, optional TS value in the Asimov dataset (in which counts equal to the predicted counts). In that case the function applies the Wald test described in [2] and [3], and the TS is assumed to follow a non-central chi2 distribution. Should only be used for sensitivity computations. Default is 0. Returns ------- n_sigma : float Significance in number of sigma. References ---------- .. [1] Wilks theorem: https://en.wikipedia.org/wiki/Wilks%27_theorem .. [2] Wald (1943): https://www.pp.rhul.ac.uk/~cowan/stat/wald1943.pdf .. [3] Cowan et al. (2011), European Physical Journal C, 71, 1554. doi:10.1140/epjc/s10052-011-1554-0. """ p_value = ncx2.sf(ts, df=df, nc=ts_asimov) return np.sqrt(ncx2.isf(p_value, df=1, nc=ts_asimov))