Search code examples
pythonbinomial-coefficients

Binomial test in Python for very large numbers


I need to do a binomial test in Python that allows calculation for 'n' numbers of the order of 10000.

I have implemented a quick binomial_test function using scipy.misc.comb, however, it is pretty much limited around n = 1000, I guess because it reaches the biggest representable number while computing factorials or the combinatorial itself. Here is my function:

from scipy.misc import comb
def binomial_test(n, k):
    """Calculate binomial probability
    """
    p = comb(n, k) * 0.5**k * 0.5**(n-k)
    return p

How could I use a native python (or numpy, scipy...) function in order to calculate that binomial probability? If possible, I need scipy 0.7.2 compatible code.

Many thanks!


Solution

  • Edited to add this comment: please note that, as Daniel Stutzbach mentions, the "binomial test" is probably not what the original poster was asking for (though he did use this expression). He seems to be asking for the probability density function of a binomial distribution, which is not what I'm suggesting below.

    Have you tried scipy.stats.binom_test?

    rbp@apfelstrudel ~$ python
    Python 2.6.2 (r262:71600, Apr 16 2009, 09:17:39) 
    [GCC 4.0.1 (Apple Computer, Inc. build 5250)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> from scipy import stats
    >>> print stats.binom_test.__doc__
    
        Perform a test that the probability of success is p.
    
        This is an exact, two-sided test of the null hypothesis
        that the probability of success in a Bernoulli experiment
        is `p`.
    
        Parameters
        ----------
        x : integer or array_like
            the number of successes, or if x has length 2, it is the
            number of successes and the number of failures.
        n : integer
            the number of trials.  This is ignored if x gives both the
            number of successes and failures
        p : float, optional
            The hypothesized probability of success.  0 <= p <= 1. The
            default value is p = 0.5
    
        Returns
        -------
        p-value : float
            The p-value of the hypothesis test
    
        References
        ----------
        .. [1] http://en.wikipedia.org/wiki/Binomial_test
    
    
    >>> stats.binom_test(500, 10000)
    4.9406564584124654e-324
    

    Small edit to add documentation link: http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.binom_test.html#scipy.stats.binom_test

    BTW: works on scipy 0.7.2, as well as on current 0.8 dev.