hepstats.hypotests.core.discovery — hepstats 0.2.1 documentation

# Source code for hepstats.hypotests.core.discovery

    from scipy.stats import norm

    from .basetest import BaseTest

    class Discovery(BaseTest):
        """Class for discovery test.

            Args:
                * **calculator** (`sktats.hypotests.BaseCalculator`): calculator to use for computing the pvalues
                * **poinull** (`POI`): parameter of interest for the null hypothesis

            Example with `zfit`:
                >>> import zfit
                >>> from zfit.loss import ExtendedUnbinnedNLL
                >>> from zfit.minimize import Minuit

                >>> bounds = (0.1, 3.0)
                >>> zfit.Space('x', limits=bounds)

                >>> bkg = np.random.exponential(0.5, 300)
                >>> peak = np.random.normal(1.2, 0.1, 25)
                >>> data = np.concatenate((bkg, peak))
                >>> data = data[(data > bounds[0]) & (data < bounds[1])]
                >>> N = data.size
                >>> data = zfit.data.Data.from_numpy(obs=obs, array=data)

                >>> lambda_ = zfit.Parameter("lambda", -2.0, -4.0, -1.0)
                >>> Nsig = zfit.Parameter("Ns", 20., -20., N)
                >>> Nbkg = zfit.Parameter("Nbkg", N, 0., N*1.1)
                >>> signal = Nsig * zfit.pdf.Gauss(obs=obs, mu=1.2, sigma=0.1)
                >>> background = Nbkg * zfit.pdf.Exponential(obs=obs, lambda_=lambda_)
                >>> loss = ExtendedUnbinnedNLL(model=signal + background, data=data)

                >>> from hepstats.hypotests.calculators import AsymptoticCalculator
                >>> from hepstats.hypotests import Discovery
                >>> from hepstats.hypotests.parameters import POI

                >>> calculator = AsymptoticCalculator(loss, Minuit())
                >>> poinull = POI(Nsig, 0)
                >>> discovery_test = Discovery(calculator, poinull)
                >>> discovery_test.result()
                p_value for the Null hypothesis = 0.0007571045424956679
                Significance (in units of sigma) = 3.1719464825102244
        """

        def __init__(self, calculator, poinull):

            super(Discovery, self).__init__(calculator, poinull)

        def result(self, printlevel=1):
            """
            Returns the result of the discovery hypothesis test.

                Args:
                    * **printlevel** (int, default=1): if > 0 print the result

                Returns:
                    Tuple(float, float): pnull, significance
            """
            pnull, _ = self.calculator.pvalue(self.poinull, onesideddiscovery=True)
            pnull = pnull[0]

            significance = norm.ppf(1.0 - pnull)

            if printlevel > 0:
                print("\np_value for the Null hypothesis = {0}".format(pnull))
                print("Significance (in units of sigma) = {0}".format(significance))

            return pnull, significance