| 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