Source code for spey.hypothesis_testing.asymptotic_calculator

"""Tools for computing confidence level and pvalues at the asymptotic limit"""

from typing import List, Tuple

from .distributions import AsymptoticTestStatisticsDistribution
from .utils import expected_pvalues, pvalues

__all__ = ["compute_asymptotic_confidence_level"]


def __dir__():
    return __all__


[docs] def compute_asymptotic_confidence_level( sqrt_qmuA: float, delta_test_statistic: float, test_stat: str = "qtilde" ) -> Tuple[List[float], List[float]]: r""" Compute p values i.e. :math:`p_{s+b}`, :math:`p_b` and :math:`p_s` .. math:: p_{s+b}&=& \int_{-\infty}^{-\sqrt{q_{\mu,A}} - \Delta q_\mu} \mathcal{N}(x| 0, 1) dx \\ p_{b}&=& \int_{-\infty}^{-\Delta q_\mu} \mathcal{N}(x| 0, 1) dx \\ p_{s} &=& p_{s+b}/ p_{b} where :math:`q_\mu` stands for the test statistic and A stands for Assimov. .. math:: \Delta q_\mu = \begin{cases} \sqrt{q_{\mu}} - \sqrt{q_{\mu,A}}, & \text{if}\ \sqrt{q_{\mu}} \leq \sqrt{q_{\mu,A}} \\ \frac{\sqrt{q_{\mu}} - \sqrt{q_{\mu,A}}}{2\ \sqrt{q_{\mu,A}}}, & \text{otherwise} \end{cases} Note that the CDF has a cutoff at :math:`-\sqrt{q_{\mu,A}}`, hence if :math:`p_{s\ {\rm or}\ s+b} < -\sqrt{q_{\mu,A}}` p-value will not be computed. .. seealso:: eq. 66 of :xref:`1007.1727` Args: sqrt_qmuA (``float``): test statistic for Asimov data :math:`\sqrt{q_{\mu,A}}`. delta_test_statistic (``float``): :math:`\Delta q_\mu` test_stat (``Text``, default ``"qtilde"``): test statistics. * ``'qtilde'``: (default) performs the calculation using the alternative test statistic, :math:`\tilde{q}_{\mu}`, see eq. (62) of :xref:`1007.1727` (:func:`~spey.hypothesis_testing.test_statistics.qmu_tilde`). .. warning:: Note that this assumes that :math:`\hat\mu\geq0`, hence :obj:`allow_negative_signal` assumed to be ``False``. If this function has been executed by user, :obj:`spey` assumes that this is taken care of throughout the external code consistently. Whilst computing p-values or upper limit on :math:`\mu` through :obj:`spey` this is taken care of automatically in the backend. * ``'q'``: performs the calculation using the test statistic :math:`q_{\mu}`, see eq. (54) of :xref:`1007.1727` (:func:`~spey.hypothesis_testing.test_statistics.qmu`). * ``'q0'``: performs the calculation using the discovery test statistic, see eq. (47) of :xref:`1007.1727` :math:`q_{0}` (:func:`~spey.hypothesis_testing.test_statistics.q0`). Returns: ``Tuple[List[float], List[float]]``: returns p-values and expected p-values. .. seealso:: :func:`~spey.hypothesis_testing.test_statistics.compute_teststatistics`, :func:`~spey.hypothesis_testing.utils.pvalues`, :func:`~spey.hypothesis_testing.utils.expected_pvalues` """ # use normal distribution for the cutoff -> default # to use clipped normal change cutoff to -sqrt_qmuA this may give more stable results # for cases that \hat\mu > \mu : see eq 14, 16 :xref:`1007.1727` sig_plus_bkg_distribution = AsymptoticTestStatisticsDistribution(-sqrt_qmuA) bkg_only_distribution = AsymptoticTestStatisticsDistribution(0.0) CLsb_obs, CLb_obs, CLs_obs = pvalues( delta_test_statistic, sig_plus_bkg_distribution, bkg_only_distribution ) CLsb_exp, CLb_exp, CLs_exp = expected_pvalues( sig_plus_bkg_distribution, bkg_only_distribution ) return ([CLsb_obs], CLsb_exp) if test_stat == "q0" else ([CLs_obs], CLs_exp)