from scipy.stats import norm
from .basetest import BaseTest
[docs]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)
[docs] 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