Top

flavio.statistics.functions module

Auxiliary functions for statistics.

"""Auxiliary functions for statistics."""

import scipy.stats
from functools import lru_cache
from math import sqrt

@lru_cache(maxsize=10)
def confidence_level(nsigma):
    r"""Return the confidence level corresponding to a number of sigmas,
    i.e. the probability contained in the normal distribution between $-n\sigma$
    and $+n\sigma$.

    Example: `confidence_level(1)` returns approximately 0.68."""
    return (scipy.stats.norm.cdf(nsigma)-0.5)*2

def delta_chi2(nsigma, dof):
    r"""Compute the $\Delta\chi^2$ for `dof` degrees of freedom corresponding
    to `nsigma` Gaussian standard deviations.

    Example: For `dof=2` and `nsigma=1`, the result is roughly 2.3."""
    if dof == 1:
        # that's trivial
        return nsigma**2
    chi2_ndof = scipy.stats.chi2(dof)
    cl_nsigma = confidence_level(nsigma)
    return chi2_ndof.ppf(cl_nsigma)

def pull(delta_chi2, dof):
    r"""Compute the pull in Gaussian standard deviations corresponding to
    a $\Delta\chi^2$ with `dof` degrees of freedom.

    Example: For `dof=2` and `delta_chi2=2.3`, the result is roughly 1.0.

    This function is the inverse of the function `delta_chi2()`"""
    if dof == 1:
        # that's trivial
        return sqrt(abs(delta_chi2))
    chi2_ndof = scipy.stats.chi2(dof)
    cl_delta_chi2 = chi2_ndof.cdf(delta_chi2)
    return scipy.stats.norm.ppf(0.5+cl_delta_chi2/2)

def pvalue(chi2, dof):
    r"""Compute the $p$-value corresponding to a $\chi^2$ with `dof` degrees
    of freedom."""
    return 1 - scipy.stats.chi2.cdf(chi2, dof)

Module variables

var confidence_level

Functions

def delta_chi2(

nsigma, dof)

Compute the $\Delta\chi^2$ for dof degrees of freedom corresponding to nsigma Gaussian standard deviations.

Example: For dof=2 and nsigma=1, the result is roughly 2.3.

def delta_chi2(nsigma, dof):
    r"""Compute the $\Delta\chi^2$ for `dof` degrees of freedom corresponding
    to `nsigma` Gaussian standard deviations.

    Example: For `dof=2` and `nsigma=1`, the result is roughly 2.3."""
    if dof == 1:
        # that's trivial
        return nsigma**2
    chi2_ndof = scipy.stats.chi2(dof)
    cl_nsigma = confidence_level(nsigma)
    return chi2_ndof.ppf(cl_nsigma)

def pull(

delta_chi2, dof)

Compute the pull in Gaussian standard deviations corresponding to a $\Delta\chi^2$ with dof degrees of freedom.

Example: For dof=2 and delta_chi2=2.3, the result is roughly 1.0.

This function is the inverse of the function delta_chi2()

def pull(delta_chi2, dof):
    r"""Compute the pull in Gaussian standard deviations corresponding to
    a $\Delta\chi^2$ with `dof` degrees of freedom.

    Example: For `dof=2` and `delta_chi2=2.3`, the result is roughly 1.0.

    This function is the inverse of the function `delta_chi2()`"""
    if dof == 1:
        # that's trivial
        return sqrt(abs(delta_chi2))
    chi2_ndof = scipy.stats.chi2(dof)
    cl_delta_chi2 = chi2_ndof.cdf(delta_chi2)
    return scipy.stats.norm.ppf(0.5+cl_delta_chi2/2)

def pvalue(

chi2, dof)

Compute the $p$-value corresponding to a $\chi^2$ with dof degrees of freedom.

def pvalue(chi2, dof):
    r"""Compute the $p$-value corresponding to a $\chi^2$ with `dof` degrees
    of freedom."""
    return 1 - scipy.stats.chi2.cdf(chi2, dof)