Source code for spey.hypothesis_testing.toy_calculator

from typing import List, Text, Tuple

import numpy as np

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

__all__ = ["compute_toy_confidence_level"]


def __dir__():
    return __all__


[docs] def compute_toy_confidence_level( signal_like_test_statistic: List[float], background_like_test_statistic: List[float], test_statistic: float, test_stat: str = "qtilde", ) -> Tuple[List[float], List[float]]: r""" Compute confidence limits i.e. :math:`CL_{s+b}`, :math:`CL_b` and :math:`CL_s` Args: signal_like_test_statistic (``List[float]``): signal like test statistic values background_like_test_statistic (``List[float]``): background like test statistic values test_statistic (``float``): value for parameter of interest 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. """ sig_plus_bkg_distribution = EmpricTestStatisticsDistribution( np.array(signal_like_test_statistic, dtype=np.float64) ) bkg_only_distribution = EmpricTestStatisticsDistribution( np.array(background_like_test_statistic, dtype=np.float64) ) CLsb_obs, CLb_obs, CLs_obs = pvalues( 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)