| description | Python code | Details | 
|---|---|---|
| cum. distribution function | pbinom(x, n, p) | $P(X \le x);f(x)= \binom{n}{x}p^xq^{n-x)}$ | 
| critical value | onesidedcritbinom(n,p,alpha) | $ P(X\le xrit) \le \alpha$ | 
| critical values | twosidedcritbinom(n,p,alpha) | $ P(xcrit1\le X\le xcrit2) \le \alpha$ | 
| exact test of proportion | exactproptest(p0, x, n, alpha, side = 0) | test using binomial pdf | 
| approx test of prop. | normproptest(p0, x, n, alpha, side = 0) | test using normal approximation. | 
| comparison of two prop. | twosampleproptest(x1,n1, x2,n2,alpha,side) | two sample test of prop. | 
| test cases | Walpole(),Walpole_normaltests() | Test cases from "Intro. to statistics,3e" book. | 
"""
file:      testofproportions.py
author: ernesto p. adorio
             UP Clarkfield
             Pampanga
version 0.0.1 april, 3, 2010
"""
from math import  *
from rstats import  *
import scipy.stats as stat
def ztest(samplestat, se, alpha =0.05, side=0):
    """
    Normal test of a sample statistic.
    Arguments:
     teststat- teststatistic
     se -    standard error of sample statistic
     alpha - significance level
     side  - -1 left-sided test
             0  double sided test
             +1 right-sided test
    """
    Ztest = samplestat/se
    print "Ztest=",  Ztest
    if side ==0:
       pvalue = pnorm(Ztest)
       if Ztest > 0.0:
           pvalue = 1.0 -pvalue
       pvalue *= 2.0
       zcrit1 = qnorm(alpha/2) 
       zcrit2 = qnorm(1-alpha/2.0)
       return pvalue, Ztest, (zcrit1,zcrit2)
    elif side == -1:
       pvalue = pnorm(Ztest)
       zcrit = qnorm(alpha)
       return pvalue, Ztest, zcrit
    else:
       pvalue = 1- pnorm(Ztest)
       zcrit  = qnorm(1.0-alpha) 
       return pvalue, Ztest, zcrit
       
def pbinom(x,  n,  p):
    """
    Computest the cumulative probability density function
    of the binomial distribution up :  P(X <= x)
    """
    #print "input to pbinom:",  x,  n,  p
    q = 1.0 - p
    pdf = cdf = q ** n
    f = p/q
    for i in range (1,  x+1):
        pdf *= ((n -i + 1.0)/i * f)
        cdf += pdf
    return cdf
    
def onesidedcritbinom(n,  p,  alpha):
    """
    Determines critical value xcrit such that P(X <= xcrit) < alpha
    """  
    q = 1.0 - p
    pdf = cdf = q ** n
    f = p/q
    xcrit = None
    for i in range (1,  x+1):
        if xcrit is None and cdf >= alpha:
            xcrit = i - 1
        pdf *= ((n -i + 1.0)/i * f)
        cdf += pdf
    return xcrit
    
def twosidedcritbinom(n,  p,  alpha):
    """
    Determines value xrit1, xrit2 such that P(X < xcrit1) = alpha/2 andP(X>xcrit2) = alpha/2
    """    
    if  not (0 <= alpha <= 1.0):
        return None
    q = 1.0 - p
    pdf = cdf = q ** n
    f = p/q
    xcrit1 = None
    xcrit2 = None
    alpha1 = alpha/2.0
    alpha2 = 1.0- alpha1
    for i in range (1,  n+1):
        if xcrit1 is None and cdf > alpha1:
            print cdf,  alpha1
            xcrit1 = i - 1
        if xcrit2 is None and cdf > alpha2:
            xcrit2 = i-1
            break
        pdf *= ((n -i + 1.0)/i * f)
        cdf += pdf
    return (xcrit1,  xcrit2)
    
  
  
def exactproptest(p0, x, n, alpha, side = 0):
    """
    p0- assumed population proportion
     x  - number of success of desired characteristic in sample
    n  - sample size
    Returns pvalue, teststatistic, critical value
    """
    p = float(x) / n    
    if side == 0:
         pvalue = pbinom(x,  n,  p0)
         if pvalue > 0.5:
             pvalue = 1 - pvalue
         return pvalue,  x,  twosidedcritbinom(n, p0,   alpha)
    elif side == -1:
        pvalue = pbinom(x,  n,  p0)
        return pvalue,   x,  onesidedcritbinom(n,  p0,  alpha)         
    elif side == 1:
        pvalue = 1-0,  pbinom(x,  n,  1.0-p0)
        return pvalue,  x,  onesidedcritbinom(n,  p0,  alpha)      
   
def normproptest(p0,  x, n, alpha,  side = 0):
     print "inputargs:",  p0,  x,  n,  alpha,  side
     samplestat = x - n * p0
     se = sqrt(n * p0 * (1-p0)) 
     print "normproptest:", samplestat, "se=", samplestat,  se
     return ztest(samplestat,  se,  alpha,  side) 
 
 
def twosampleproptest(x1,  n1,   x2,  n2,  alpha,  side):
    p1hat = float(x1)/n1
    p2hat = float(x2)/n2
    phat = float(x1 +x2)/(n1+n2)
    print "p1hat, p2hat",  p1hat,  p2hat
    samplestat =  p1hat - p2hat
    se = sqrt(phat*(1.0-phat) * (1.0/n1 + 1.0/n2))
    return ztest(samplestat,  se,  alpha,  side)
    
def Walpole_tests():
    print "Example 10, p.326"
    p0  = 0.7
    alpha = 0.10
    side = 0
    x = 8
    n = 15
    return exactproptest(p0,  x,  n,  alpha,  side)
def Walpole_normaltests():
    print "Example 11, p.329"
    p0  = 0.6
    alpha = 0.05
    side = 1
    x = 70
    n = 100
    print normproptest(p0,  x,  n,  alpha,  side)
    print 
    print "Example12,  p. 330"
    x1,  n1 = 120,  200
    x2,  n2 = 240,  500
    alpha = 0.025
    side = 1
    print twosampleproptest(x1,  n1,  x2,  n2,  alpha,  side)
if __name__ == "__main__":
    print 'testing pbinom'
    print Walpole_tests()
    print Walpole_normaltests()
 When Python(via the Eric Python IDE) runs the script file above, it outputs the following:
Python 2.6.4 (r264:75706, Dec 7 2009, 18:43:55) [GCC 4.4.1] on toto-laptop, Standard >>> testing pbinom Example 10, p.326 0.0500125400538 0.05 (0.13114257338312119, 8, (7, 13)) Example 11, p.329 inputargs: 0.6 70 100 0.05 1 normproptest: 10.0 se= 10.0 4.89897948557 Ztest= 2.04124145232 (0.020613416668581852, 2.0412414523193152, 1.6448536269514722) Example12, p. 330 p1hat, p2hat 0.6 0.48 Ztest= 2.86972021592 (0.0020541757121497195, 2.8697202159177571, 1.959963984540054) None
We will explain further in the days ahead how to test proportions as we are at the moment focusing on writing the codes.
This comment has been removed by the author.
ReplyDelete