|
|
last edited 11 years ago by Mark Clements |
1 2 3 4 5 6 7 8 9 10 11 | ||
Editor: Mark Clements
Time: 2009/04/26 19:23:06 GMT-7 |
||
Note: Use anonymous functions in Spad; other minor edits. |
changed: -To summarise, all six languages (Spad, Boot, Reduce, Maxima, Common Lisp and Sage) provide arbitrary length integers and fractions, ensuring that the hypergeometric distribution was straightforward to implement. The Lisp and R implementations were very similar, which is not surprising, given that the two languages are closely related. In contrast, nested functions in Spad seemed clumsy, with the requirement to use the #1 and #2 argument references, although this has changed recently in Fricas; I did, however, appreciate Spad's lexical scoping and facility to fall back to a symbolic analysis. An Aldor implementation may be cleaner than the Spad implementation. Boot's implementation was initially difficult, as I was unclear how to pass values to the nested functions with using function argument (which was not possible for the univariate root finder :-(). The use of the "$" prefix on derived variables seemed clumsy. Finally, my version of Fricas:Boot defaulted to single precision floats, which caused problems with precision. Type specification in OpenAxiom:Boot and more recent versions of Fricas would negate the need for explicit coercion to double-floats. For Reduce, the lack of nested procedures in the algebraic mode made progress slow; importantly, the switch to symbolic mode made the implementation quite straightforward, with reasonably good debugging. The Maxima and Sage versions were particularly short, given that they already provide a root solver. - -This begs the question: when would one use any of these languages for mixed numerical/symbolic analysis? In my opinion, Boot is the least likely to be used, although it does play closely and well with Common Lisp (a la Reduce and Maxima). One could code for numerical analysis in Boot and Common Lisp - however Boot's lack of lexical scoping may be a detraction. For an R user, Spad's type system seemed both fussy and extremely elegant; I found that debugging could be slow. Importantly, Lisp and Boot *are* able to evaluate Spad functions. Axiom, Reduce, Maxima and Sage provide polished environments worthy of further consideration. To summarise, all six languages (Spad, Boot, Reduce, Maxima, Common Lisp and Sage) provide arbitrary length integers and fractions, ensuring that the hypergeometric distribution was straightforward to implement. The Lisp and R implementations were very similar, which is not surprising, given that the two languages are closely related. Nested functions in Spad required the use of #1 and #2 argument references, although this has changed recently in Fricas; I appreciated Spad's lexical scoping and facility to fall back to a symbolic analysis. An Aldor implementation would be similar to the Spad implementation. Boot's implementation was initially difficult, as I was unclear how to pass values to the nested functions with using function argument (which was not possible for the univariate root finder :-(). The use of the "$" prefix on derived variables seemed clumsy. Finally, my version of Fricas:Boot defaulted to single precision floats, which caused problems with precision. Type specification in OpenAxiom:Boot and more recent versions of Fricas would negate the need for explicit coercion to double-floats. For Reduce, the lack of nested procedures in the algebraic mode made progress slow; importantly, the switch to symbolic mode made the implementation quite straightforward, with reasonably good debugging. The Maxima and Sage versions were particularly short, given that they already provide a root solver. This begs the question: when would one use any of these languages for mixed numerical/symbolic analysis? In my opinion, Boot is the least likely to be used, although it does play closely and well with Common Lisp (a la Maxima). One could code for numerical analysis in Boot and Common Lisp - however Boot's lack of lexical scoping may be a detraction. For an R user, Spad's type system seemed both fussy and extremely elegant; I found that debugging could be slow. Importantly, Lisp and Boot *are* able to evaluate Spad functions, potentially allowing the use of Lisp functions such as those translated from Fortran using f2cl (see also [SandboxMLE] for another example of numerical code in Spad). Axiom, Reduce, Maxima and Sage provide polished environments worthy of further consideration. changed: - f:(R->R) := mnhyper(#1) - x::R - ridder(f,0,1) ridder(mnhyper(#1) - x::R,0,1) changed: - f:(R->R) := mnhyper(1/#1) - x::R - 1/ridder(f,doubleEps,1.0::R) 1/ridder(mnhyper(1/#1) - x::R,doubleEps,1.0::R) changed: - f:(R->R) := pnhyper(x,#1,false) - alpha - ridder(f, 0.0::R, 1.0::R) ridder(pnhyper(x,#1,false) - alpha, 0.0::R, 1.0::R) changed: - f:(R->R) := pnhyper(x,1/#1,false) - alpha - 1/ridder(f, doubleEps, 1.0::R) 1/ridder(pnhyper(x,1/#1,false) - alpha, doubleEps, 1.0::R) changed: - f:(R->R) := pnhyper(x,#1,true) - alpha - ridder(f, 0,1) ridder(pnhyper(x,#1,true) - alpha, 0,1) changed: - f:(R->R) := pnhyper(x,1/#1,true) - alpha - 1/ridder(f, doubleEps,1.0::R) 1/ridder(pnhyper(x,1/#1,true) - alpha, doubleEps,1.0::R)
How useful are the different CAS languages for implementing numerical routines? Prompted by a comparison of R and C for implementing Fisher's exact test for 2x2 tables (http://fluff.info/blog/arch/00000172.htm), I thought that it would be interesting to implement this particular test in Spad, Boot, Reduce, Maxima, Common Lisp and Sage (see below). Each set of code was required to implement a univariate root finder and the hypergeometric distribution to calculate the p-value under different alternatives, together with the 95% confidence interval and the conditional maximum likelihood estimator for the odds ratio. The reference implementation is R, where the code and output would be:\begin{verbatim} > fisher.test(matrix(c(10,10,10,20),nrow=2))
Fisher's Exact Test for Count Data
data: matrix(c(10, 10, 10, 20), nrow = 2) p-value = 0.2575 alternative hypothesis: true odds ratio is not equal to 1 95 percent confidence interval: 0.5383996 7.4363242 sample estimates: odds ratio 1.971640 \end{verbatim}
As a caveat: I have little experience with these programs. Any changes or improvements to the programs would be welcomed.
To summarise, all six languages (Spad, Boot, Reduce, Maxima, Common Lisp and Sage) provide arbitrary length integers and fractions, ensuring that the hypergeometric distribution was straightforward to implement. The Lisp and R implementations were very similar, which is not surprising, given that the two languages are closely related. Nested functions in Spad required the use of #1 and #2 argument references, although this has changed recently in Fricas; I appreciated Spad's lexical scoping and facility to fall back to a symbolic analysis. An Aldor implementation would be similar to the Spad implementation. Boot's implementation was initially difficult, as I was unclear how to pass values to the nested functions with using function argument (which was not possible for the univariate root finder :-(). The use of the "$" prefix on derived variables seemed clumsy. Finally, my version of Fricas:Boot defaulted to single precision floats, which caused problems with precision. Type specification in OpenAxiom:Boot and more recent versions of Fricas would negate the need for explicit coercion to double-floats. For Reduce, the lack of nested procedures in the algebraic mode made progress slow; importantly, the switch to symbolic mode made the implementation quite straightforward, with reasonably good debugging. The Maxima and Sage versions were particularly short, given that they already provide a root solver.
This begs the question: when would one use any of these languages for mixed numerical/symbolic analysis? In my opinion, Boot is the least likely to be used, although it does play closely and well with Common Lisp (a la Maxima). One could code for numerical analysis in Boot and Common Lisp - however Boot's lack of lexical scoping may be a detraction. For an R user, Spad's type system seemed both fussy and extremely elegant; I found that debugging could be slow. Importantly, Lisp and Boot are able to evaluate Spad functions, potentially allowing the use of Lisp functions such as those translated from Fortran using f2cl (see also [SandboxMLE] for another example of numerical code in Spad). Axiom, Reduce, Maxima and Sage provide polished environments worthy of further consideration.
First, the Spad implementation:
spad)abbrev package TESTP TestPackage R ==> Float I ==> Integer fisherRec ==> Record(PValue:R,CI:List R, Estimate:R) TestPackage: with ridder: (R->R, R, R) -> R msign: (R, R) -> R choose:(I, I)->Fraction I --chooseNew:(Integer, Integer)->Fraction Integer dhyper:(I, I, I, I)->Fraction Integer phyper:(I, I, I, I, Boolean)->Fraction Integer fisherTest:(I, I, I, I, String, R, Boolean, R)-> fisherRec testTolerance:(R, R, R)->Boolean test1: () -> Boolean test2: () -> Boolean test3: () -> Boolean test4: () -> Boolean test5: () -> Boolean test6: () -> Boolean test7: () -> Boolean test8: () -> Boolean test9: () -> Boolean test10: () -> Boolean alltests: () -> List Boolean == add import TrigonometricFunctionCategory -- for test1() --import OrderedCompletion(Float) for plusInfinity()$OrderedCompletion(Float) ridder(func, x1, x2) == eps:= 1.0e-16::R maxit:= 30::Integer --verbose:= false fl:R := func x1 fh:R := func x2 xl:R := x1 xh:R := x2 ans:R := -1.11e30::R xnew:R := 0.0e0::R iterNum:= 0::Integer if fl=0.0::R then return x1 else if fh=0.0::R then return x2 else if (fl*fh) > 0.0::R then error "Initial points are not either side of zero." --if (fl*fh) < 0.0 then else repeat xm:= 0.5::R *(xl+xh) fm:= func xm ss:= sqrt((fm*fm) - (fl*fh)) if ss =0.0::R then return ans xnew:= xm + (((xm - xl) * (if (fl>fh) then 1.0::R else -1.0::R) * fm) / ss) if abs(xnew-ans) <= eps then return ans ans:= xnew fnew:= func ans if fnew=0.0::R then return ans if msign(fm, fnew) ~= fm then xl:= xm fl:= fm xh:= ans fh:= fnew else if msign(fl, fnew) ~= fl then xh:= ans fh:= fnew else if msign(fh, fnew) ~= fh then xl:= ans fl:= fnew iterNum:=iterNum+1::Integer if iterNum >=maxit then error "Maximum iterations exceeded" --if verbose then FORMAT(true, "~, 8f ~, 8f ~, 8f ~, 8f~%", xl, xh, fl, fh)$Lisp if abs(xh-xl) <= eps then return ans msign(x, y) == (abs x) * (if y>0.0::R then 1.0::R else if y<0.0::R then -1.0::R else 0.0::R) choose(n, x) == total:Fraction Integer := 1/1 for denom in 1..x repeat total:=total*((n-denom+1)/(denom))::Fraction Integer return total --chooseNew(n, x) == product((n-i+1)::Fraction Integer/i::Fraction Integer, i=1..x) dhyper(x, m, n, k) == choose(m, x) * choose(n, k - x) / choose(m + n, k) phyper(x, m, n, k, lowerTail) == i:PositiveInteger --total:Fraction Integer:=0/1 if lowerTail then reduce("+", [dhyper(i, m, n, k) for i in 1..x]) else reduce("+", [dhyper(i, m, n, k) for i in (x+1)..k]) fisherTest(a, b, c, d, alternative, OR, confInt, confLevel) == m:I := a+c -- first column n:I := b+d -- second column k:I := a+b -- first row x00:I := a lo:I := max(0, k-n) hi:I := min(k, m) support:List I := [i for i in lo..hi] logdc:List R:= [log(dhyper(i, m, n, k)::R) for i in support] doubleEps:R := 1.0e-50::R plusInfinity:R := 1.0e6::R -- arbitrary dnhyper:(R->List R) := ncp:R := #1 d:List R := [logdc(i)+log(ncp)*support(i)::R for i in 1..#logdc] maxd:R := reduce(max, d) d2:List R :=[exp(di-maxd) for di in d] sumd2:R := reduce("+", d2) [d2i/sumd2 for d2i in d2] mnhyper:(R->R) := ncp:R := #1 if ncp=0.0::R then lo::R --else if ncp=%plusInfinity then hi::R else d:List R := dnhyper(ncp) reduce("+", [support(i)::R*d(i) for i in 1..#d]) pnhyper:((Integer, R, Boolean)->R) := q:I := #1 ncp:R := #2 upperTail:Boolean := #3 if ncp=1.0 then if upperTail then phyper(q-1, m, n, k, false)::R else phyper(q, m, n, k, true)::R else if ncp=0.0 then if upperTail then if q<=lo then 1.0::R else 0.0::R else if q>=lo then 1.0::R else 0.0::R -- else if ncp=%plusInfinity then -- if upperTail then -- if q<=hi then 1.0::R else 0.0::R -- else if q>= hi then 1.0::R else 0.0::R else d:List R := dnhyper(ncp) if upperTail then reduce("+", [d(i) for i in 1..#d | support(i)>=q]) else reduce("+", [d(i) for i in 1..#d | support(i)<=q]) mle:(I->R) := x:I := #1 if x=lo then 0.0::R else if x=hi then plusInfinity else mu:R := mnhyper(1.0::R) if mu>x::R then ridder(mnhyper(#1) - x::R, 0, 1) else if mu<x::R then 1/ridder(mnhyper(1/#1) - x::R, doubleEps, 1.0::R) else 1.0::R ncpU:(I, R)->R := x:I := #1 alpha:R := #2 if x=hi then plusInfinity else p:R := pnhyper(x, 1.0::R, false) if p<alpha then ridder(pnhyper(x, #1, false) - alpha, 0.0::R, 1.0::R) else if p>alpha then 1/ridder(pnhyper(x, 1/#1, false) - alpha, doubleEps, 1.0::R) else 1.0::R ncpL:(Integer, R)->R := x:I := #1 alpha:R := #2 if x=lo then 0.0::R else p:R := pnhyper(x, 1, true) if p>alpha then ridder(pnhyper(x, #1, true) - alpha, 0, 1) else if p<alpha then 1/ridder(pnhyper(x, 1/#1, true) - alpha, doubleEps, 1.0::R) else 1.0::R pValue:R := if alternative="less" then pnhyper(x00, OR, false) else if alternative="greater" then pnhyper(x00, OR, true) else if alternative="two-sided" then relErr:= 1+1.0e-7::R dn:= dnhyper(OR) dstar:= dn(x00-lo+1)*relErr reduce("+", [di for di in dn | di<dstar]) else -1.0::R cInterval:List R := if confInt then if alternative="less" then [0.0::R, ncpU(x00, 1.0::R-confLevel)] else if alternative="greater" then [ncpL(x00, 1.0::R-confLevel), plusInfinity] else if alternative="two-sided" then alpha:=(1-confLevel)/2 [ncpL(x00, alpha), ncpU(x00, alpha)] else [-1.0::R, -1.0::R] --else [] estimate:= mle(x00) [pValue, cInterval, estimate] testTolerance(x, y, atol) == if abs(x-y) <= atol then true else false test1() == testTolerance(2*ridder(cos, 0.0::R, 2.0::R), pi()$Pi::R, 1.0e-18) test2() == testTolerance(choose(100, 5)::R, 75287520::R, 0) test3() == testTolerance(dhyper(5, 10, 7, 8)::R, 0.3628137::R, 1.0e-7) test4() == testTolerance(log(dhyper(5, 10, 7, 8)::R), -1.013866::R, 1.0e-7) test5() == testTolerance(phyper(5, 10, 7, 8, true)::R, 0.7821884::R, 1.0e-7) test6() == testTolerance(phyper(5, 10, 7, 8, false)::R, 0.2178116::R, 1.0e-7) test7() == testTolerance(fisherTest(10, 10, 10, 20, "two-sided", 1.0, true, 0.95).PValue, 0.2575, 1.0e-3) test8() == testTolerance(fisherTest(10, 10, 10, 20, "two-sided", 1.0, true, 0.95).CI.1, 0.5383996, 1.0e-6) test9() == testTolerance(fisherTest(10, 10, 10, 20, "two-sided", 1.0, true, 0.95).CI.2, 7.4363242, 1.0e-4) test10() == testTolerance(fisherTest(10, 10, 10, 20, "two-sided", 1.0, true, 0.95).Estimate, 1.971640, 1.0e-4) alltests() == [test1(), test2(), test3(), test4(), test5(), test6(), test7(), test8(), test9(), test10()] spadCompiling FriCAS source code from file /var/zope2/var/LatexWiki/2045700826673834242-25px001.spad using old system compiler. TESTP abbreviates package TestPackage ------------------------------------------------------------------------ initializing NRLIB TESTP for TestPackage compiling into NRLIB TESTP importing TrigonometricFunctionCategory compiling exported ridder : (Float -> Float,Float, Float) -> Float Time: 0.19 SEC.
compiling exported msign : (Float,Float) -> Float Time: 0.37 SEC.
compiling exported choose : (Integer,Integer) -> Fraction Integer Time: 0.02 SEC.
compiling exported dhyper : (Integer,Integer, Integer, Integer) -> Fraction Integer Time: 0 SEC.
compiling exported phyper : (Integer,Integer, Integer, Integer, Boolean) -> Fraction Integer Time: 0.08 SEC.
compiling exported fisherTest : (Integer,Integer, Integer, Integer, String, Float, Boolean, Float) -> Record(PValue: Float, CI: List Float, Estimate: Float) Time: 0.22 SEC.
compiling exported testTolerance : (Float,Float, Float) -> Boolean Time: 0.01 SEC.
compiling exported test1 : () -> Boolean Time: 0.08 SEC.
compiling exported test2 : () -> Boolean Time: 0.01 SEC.
compiling exported test3 : () -> Boolean Time: 0 SEC.
compiling exported test4 : () -> Boolean Time: 0 SEC.
compiling exported test5 : () -> Boolean Time: 0 SEC.
compiling exported test6 : () -> Boolean Time: 0 SEC.
compiling exported test7 : () -> Boolean Time: 0 SEC.
compiling exported test8 : () -> Boolean Time: 0.01 SEC.
compiling exported test9 : () -> Boolean Time: 0.01 SEC.
compiling exported test10 : () -> Boolean Time: 0 SEC.
compiling exported alltests : () -> List Boolean Time: 0.01 SEC.
(time taken in buildFunctor: 0)
;;; *** |TestPackage| REDEFINED
;;; *** |TestPackage| REDEFINED Time: 0.01 SEC.
Warnings: [1] ridder: xh has no value [2] ridder: xl has no value [3] fisherTest: The conditional modes (List (Float)) and (Integer) conflict
Cumulative Statistics for Constructor TestPackage Time: 1.02 seconds
finalizing NRLIB TESTP Processing TestPackage for Browser database: --->-->TestPackage((ridder (R (Mapping R R) R R))): Not documented!!!! --->-->TestPackage((msign (R R R))): Not documented!!!! --->-->TestPackage((choose ((Fraction I) I I))): Not documented!!!! --->-->TestPackage((dhyper ((Fraction (Integer)) I I I I))): Not documented!!!! --->-->TestPackage((phyper ((Fraction (Integer)) I I I I (Boolean)))): Not documented!!!! --->-->TestPackage((fisherTest (fisherRec I I I I (String) R (Boolean) R))): Not documented!!!! --->-->TestPackage((testTolerance ((Boolean) R R R))): Not documented!!!! --->-->TestPackage((test1 ((Boolean)))): Not documented!!!! --->-->TestPackage((test2 ((Boolean)))): Not documented!!!! --->-->TestPackage((test3 ((Boolean)))): Not documented!!!! --->-->TestPackage((test4 ((Boolean)))): Not documented!!!! --->-->TestPackage((test5 ((Boolean)))): Not documented!!!! --->-->TestPackage((test6 ((Boolean)))): Not documented!!!! --->-->TestPackage((test7 ((Boolean)))): Not documented!!!! --->-->TestPackage((test8 ((Boolean)))): Not documented!!!! --->-->TestPackage((test9 ((Boolean)))): Not documented!!!! --->-->TestPackage((test10 ((Boolean)))): Not documented!!!! --->-->TestPackage((alltests ((List (Boolean))))): Not documented!!!! --->-->TestPackage(constructor): Not documented!!!! --->-->TestPackage(): Missing Description ; compiling file "/var/zope2/var/LatexWiki/TESTP.NRLIB/TESTP.lsp" (written 16 MAY 2011 06:14:27 PM):
; /var/zope2/var/LatexWiki/TESTP.NRLIB/TESTP.fasl written ; compilation finished in 0:00:01.914 ------------------------------------------------------------------------ TestPackage is now explicitly exposed in frame initial TestPackage will be automatically loaded when needed from /var/zope2/var/LatexWiki/TESTP.NRLIB/TESTP
>> System error: The bounding indices 163 and 162 are bad for a sequence of length 162. See also: The ANSI Standard,Glossary entry for "bounding index designator" The ANSI Standard, writeup for Issue SUBSEQ-OUT-OF-BOUNDS:IS-AN-ERROR Using this code in Axiom:
axiom-- test code is correct alltests()\begin{equation*} \label{eq1}\left[ \mbox{\rm true} , \: \mbox{\rm true} , \: \mbox{\rm true} , \: \mbox{\rm true} , \: \mbox{\rm true} , \: \mbox{\rm true} , \: \mbox{\rm true} , \: \mbox{\rm true} , \: \mbox{\rm true} , \: \mbox{\rm true} \right]?\end{equation*}Type: List(Boolean)axiom-- show the example fisherTest(10,\begin{equation*} \label{eq2}\begin{array}{@{}l} \displaystyle \left[{\hbox{\axiomType{PValue?}\ } ={0.25754924281098285122}}, \: \right. \ \ \displaystyle \left.{CI ={\left[{0.53839938167817271306}, \:{7.436340838743 9872468}\right]}}, \: \right. \ \ \displaystyle \left.{\hbox{\axiomType{Estimate}\ } ={1.9716269432603396417}}\right] \end{array} \end{equation*}10, 10, 20, "two-sided", 1.0, true, 0.95) Second, the Boot translation was more fiddly - but, then again, I had never used Boot before.
bootdoubleFloat(x) == COERCE(x,'DOUBLE_-FLOAT) DF(x) == COERCE(x, 'DOUBLE_-FLOAT) ridder(func, x1, x2) == --x2:=DF(x2) eps:= DF(1.0e-16) maxit:= 30 fl := DF(FUNCALL(func, x1)) fh := DF(FUNCALL(func, x2)) xl := x1 xh := x2 ans := DF(-1.11e20) xnew := 0.0e0 iterNum:= 0 if fl=0.0 then return x1 else if fh=0.0 then return x2 else if (fl*fh) > 0.0 then error "Initial points are not either side of zero." --if (fl*fh) < 0.0 then else repeat xm:= 0.5 *(xl+xh) fm:= FUNCALL(func, xm) ss:= SQRT((fm*fm) - (fl*fh)) if ss =0.0 then return ans xnew:= xm + (((xm - xl) * (if (fl>fh) then 1.0 else -1.0) * fm) / ss) if ABS(xnew-ans) <= eps then return ans ans:= xnew fnew:= DF(FUNCALL(func, ans)) if fnew=0.0 then return ans if msign(fm, fnew) ^= fm then xl:= xm fl:= fm xh:= ans fh:= fnew else if msign(fl, fnew) ^= fl then xh:= ans fh:= fnew else if msign(fh, fnew) ^= fh then xl:= ans fl:= fnew iterNum:=iterNum+1 if iterNum >=maxit then error "Maximum iterations exceeded" --if verbose then FORMAT(true, "~, 8f ~, 8f ~, 8f ~, 8f~%", xl, xh, fl, fh)$Lisp if ABS(xh-xl) <= eps then return ans msign(x, y) == (ABS x) * (if y>0.0 then 1.0 else if y<0.0 then -1.0 else 0.0) choose(n, x) == total := 1 for denom in 1..x repeat total:=total*(n-denom+1)/denom return total --chooseNew(n, x) == product((n-i+1)::Fraction Integer/i::Fraction Integer, i=1..x) dhyper(x, m, n, k) == DF(choose(m, x) * choose(n, k - x)) / choose(m + n, k) -- reduce(func, list) == -- value := list.0 -- for i in 1..(#list-1) repeat -- value:=FUNCALL(func, value, list.i)) -- value phyper(x, m, n, k, lowerTail) == --total:Fraction Integer:=0/1 if lowerTail then +/[dhyper(i, m, n, k) for i in 1..x] else +/[dhyper(i, m, n, k) for i in (x+1)..k] dnhyper(ncp, logdc, support) == d := [DF(logdc.i+LOG(ncp)*support.i) for i in 0..(#logdc-1)] maxd := APPLY(FUNCTION(MAX), d) d2 :=[EXP(di-maxd) for di in d] sumd2 := +/d2 [d2i/sumd2 for d2i in d2] testTolerance(x, y, atol) == if ABS(x-y) <= atol then true else false test1() == testTolerance(2*ridder('COS, 0.0, 2.0), 3.1415926535897932385, 1.0e-7) test2() == testTolerance(choose(100, 5), 75287520, 0) test3() == testTolerance(dhyper(5, 10, 7, 8), 0.3628137, 1.0e-7) test4() == testTolerance(LOG(dhyper(5, 10, 7, 8)), -1.013866, 1.0e-7) test5() == testTolerance(phyper(5, 10, 7, 8, true), 0.7821884, 1.0e-7) test6() == testTolerance(phyper(5, 10, 7, 8, false), 0.2178116, 1.0e-7) fisherTest(a, b, c, d, alternative, OR, confInt, confLevel) == main where main() == $m := a+c -- first column $n := b+d -- second column $k := a+b -- first row $x00 := a $lo := MAX(0, $k-$n) $hi := MIN($k, $m) $support := [i for i in $lo..$hi] $logdc := [LOG(dhyper(i, $m, $n, $k)) for i in $support] $doubleEps := 1.0e-10 $plusInfinity := 1.0e10 pvalue := if alternative='"less" then pnhyper($x00, OR, false) else if alternative='"greater" then pnhyper($x00, OR, true) else if alternative='"two-sided" then relErr:= 1+1.0e-7 d:= dnhyper(OR, $logdc, $support) dstar:= ELT(d, $x00-$lo)*relErr +/[di for di in d | di<dstar] else -1.0 -- no match estimate := if $x00=$lo then 0 -- else if $x00=hi then return($plusInfinity) else mu:= mnhyper(1) if mu>$x00 then ridder(FUNCTION(f1), 0, 1) else if mu<$x00 then 1/ridder(FUNCTION(f2), $doubleEps, 1) else 1 interval := if confInt then $alpha := 1 - confLevel if alternative='"less" then [0, ncpU($x00)] else if alternative='"greater" then [ncpL($x00), $plusInfinity] else if alternative='"two-sided" then $alpha :=(1-confLevel)/2.0 [ncpL($x00), ncpU($x00)] else [-1, -1] else [-2, -2] [pvalue, interval, estimate] pnhyper (q, ncp, upperTail) == if ncp=1 then if upperTail then phyper(q-1, $m, $n, $k, false) else phyper(q, $m, $n, $k, true) else if ncp=0 then if upperTail then if q<=$lo then 1 else 0 else if q>=$lo then 1 else 0 -- else if ncp=$plusInfinity then -- if upperTail then -- if q<=hi then return(1) else return(0) -- else if q>= hi then return(1) else return(0) else d:= dnhyper(ncp, $logdc, $support) if upperTail then +/[d.i for i in 0..(#d-1) | $support.i>=q] else +/[d.i for i in 0..(#d-1) | $support.i<=q] mnhyper(ncp) == if ncp=0.0 then $lo --if ncp=$plusInfinity then return(hi::R) else d := dnhyper(ncp, $logdc, $support) +/[si*di for di in d for si in $support] f1(u) == mnhyper(u) - $x00 f2(u) == mnhyper(1/u) - $x00 ncpU x == --if x=$hi then $plusInfinity p:= pnhyper(x, 1.0, false) if p<$alpha then ridder(FUNCTION(fu1), 0.0, 1.0) else if p>$alpha then 1/ridder(FUNCTION(fu2), $doubleEps, 1) else 1 fu1 u == pnhyper($x00, u, false) - $alpha fu2 u == pnhyper($x00, 1/u, false) - $alpha ncpL x == if x=$lo then 0 else p:= pnhyper(x, 1, true) if p>$alpha then ridder(FUNCTION(fl1), 0, 1) else if p<$alpha then 1/ridder(FUNCTION(fl2), $doubleEps, 1) else 1 fl1 u == pnhyper($x00, u, true) - $alpha fl2 u == pnhyper($x00, 1/u, true) - $alpha test7() == fisherTest(10, 10, 10, 20, '"two-sided", 1, true, 0.95) alltests() == [test1(), test2(), test3(), test4(), test5(), test6()] bootValue = T ; compiling file "/var/zope2/var/LatexWiki/1874789261577970310-25px003.clisp" (written 16 MAY 2011 06:14:30 PM):
; /var/zope2/var/LatexWiki/1874789261577970310-25px003.fasl written ; compilation finished in 0:00:00.390 Value = TUsing the Boot code from Axiom:
axiomalltests()$Lisp
>> System error: The function BOOT::^= is undefined.Third, for Reduce (which was also my first Reduce program):
symbolic; | reduce |
symbolic procedure msign(x, y); (abs x) * (if y>0.0 then 1.0 else if y<0.0 then -1.0 else 0.0); | reduce |
%% Numerical root finding using Ridders method %% (Exit criteria hacked: how can one return from a repeat .. until statement?) symbolic procedure ridders(func, x1, x2); begin scalar eps, maxit, fl, fh, xl, xh, ans, xnew, iterNum, fnew; eps:= 1.0e-12; maxit:= 100; fl := funcall(func, x1); fh := funcall(func, x2); xl := x1; xh := x2; ans := -1.0e30; xnew := 0.0e0; iterNum := 0; if (fl*fh) > 0.0 then rederr "Initial points are not either side of zero."; if fl=0.0 then x1 else if fh=0.0 then x2 %if (fl*fh) < 0.0 then else repeat begin scalar xm, fm, ss; xm:= 0.5*(xl+xh); fm:= funcall(func, xm); ss:= sqrt((fm*fm) - (fl*fh)); %if ss =0.0 then return ans; xnew:= xm + (((xm - xl) * (if (fl>fh) then 1.0 else -1.0) * fm) / ss); %if abs(xnew-ans) <= eps then return ans; ans:= xnew; fnew:= funcall(func, ans); %write(fnew); %if fnew=0.0 then return ans; if msign(fm,fnew) neq fm then begin; xl:= xm; fl:= fm; xh:= ans; fh:= fnew; end else if msign(fl, fnew) neq fl then begin; xh:= ans; fh:= fnew; end else if msign(fh, fnew) neq fh then begin; xl:= ans; fl:= fnew; end; iterNum:=iterNum+1; if iterNum >=maxit then rederr "Maximum iterations exceeded"; %if verbose then write xl, xh, fl, fh; end until abs(fnew)<eps or abs(xh-xl) <= eps; return ans end; | reduce |
symbolic procedure choose(n, x); begin scalar total, denom; total := 1.0; for denom:=1:x do << total:=total/denom*(n-denom+1) >>; return total end; | reduce |
symbolic procedure dhyper(x, m, n, k); choose(m, x) * choose(n, k - x) / choose(m + n, k); | reduce |
symbolic procedure testTolerance(x, y, atol); if abs(x-y) <= atol then t else nil; | reduce |
symbolic procedure test1(); testTolerance(2*ridders(function(cos),0,2), cdr reval(algebraic pi),1e-8); | reduce |
testSet1(); | reduce |
%% symbolic procedure fisherTest(a,b,c,d,alternative,oddsratio,confLevel); begin scalar m, n, k, x00, lo, hi, doubleEps, dnhyper,mnhyper,pnhyper,mle,ncpu,ncpl, support,d2,logdc,alpha, pvalue,cinterval; m := a+c; % first column n := b+d; % second column k := a+b; % first row x00 := a; lo := max(0, k-n); hi := min(k, m); support := for i:=lo:hi collect i; logdc := for each i in support collect log(dhyper(i, m, n, k)); doubleEps := 1.0e-10; dnhyper := function(lambda ncp; begin scalar maxd, sumd2, d, d2; d := for i:=1:length(logdc) collect nth(logdc,i)+log(ncp)*nth(support,i); maxd := apply(function(max),d); d2 :=for each di in d collect exp(di-maxd); sumd2 := for each i in d2 sum i; return for each d2i in d2 collect d2i/sumd2 end); mnhyper := function(lambda ncp; begin scalar d, value; value := if ncp=0.0 then lo %else if ncp equal 'plusInfinity then hi else begin; d := funcall(dnhyper,ncp); return for i:=1:length(d) sum nth(support,i)*nth(d,i) end; return value end); pnhyper := function(lambda(q,ncp,upperTail); if ncp=1.0 then (if upperTail then phyper(q-1, m, n, k, nil) else phyper(q, m, n, k, t)) else if ncp=0.0 then (if upperTail then (if q<=lo then 1.0 else 0.0) else (if q>=lo then 1.0 else 0.0)) else if ncp equal 'plusInfinity then (if upperTail then (if q<=hi then 1.0 else 0.0) else (if q>= hi then 1.0 else 0.0)) else begin scalar d, value; d := funcall(dnhyper,ncp); value := if upperTail then for i:=1:length(d) sum (if nth(support,i)>=q then nth(d,i) else 0) else for i:=1:length(d) sum (if nth(support,i)<=q then nth(d,i) else 0); return value end); ncpL := function(lambda alpha; if x00=lo then 0 else begin scalar p,value,f1,f2; f1 := function(lambda y; funcall(pnhyper,x00,y,t) - alpha); f2 := function(lambda y; funcall(pnhyper,x00,1/y,t) - alpha); p := funcall(pnhyper,x00, 1.0, t); value := if p>alpha then ridders(f1, doubleEps, 1) % zero bound caused problems else if p<alpha then 1/ridders(f2, doubleEps, 1) else 1; return value; end); ncpU := function(lambda alpha; if x00=hi then 'plusInfinity else begin scalar p,value,f1,f2; f1 := function(lambda y; funcall(pnhyper,x00,y,nil) - alpha); f2 := function(lambda y; funcall(pnhyper,x00,1/y,nil) - alpha); p := funcall(pnhyper,x00, 1.0, nil); value := if p<alpha then ridders(f1, 0, 1) else if p>alpha then 1/ridders(f2, doubleEps, 1) else 1; return value; end); pvalue := if alternative equal 'less then funcall(pnhyper,x00,oddsratio,nil) else if alternative equal 'greater then funcall(pnhyper,x00,oddsratio,t) else if alternative equal 'twosided then begin scalar relerr,dstar,dn; relErr:= 1+1.0e-7; dn:= funcall(dnhyper,oddsratio); dstar:= nth(dn,x00-lo+1)*relErr; return for each di in dn sum (if di<dstar then di else 0) end else -1; cInterval := if alternative equal 'less then {0.0, funcall(ncpU,1-confLevel)} else if alternative equal 'greater then {funcall(ncpL,1-confLevel), 'plusInfinity} else if alternative equal 'twosided then {funcall(ncpL,(1-confLevel)/2), funcall(ncpU,(1-confLevel)/2)} else {-1,-1}; % no match mle := if x00=lo then 0.0 else if x00=hi then 'plusInfinity else begin scalar mu, value, f1, f2; f1 := function(lambda y; funcall(mnhyper,y) - x00); f2 := function(lambda y; funcall(mnhyper,1/y) - x00); mu := funcall(mnhyper,1.0); value := if mu>x00 then ridders(f1,0,1) else if mu<x00 then 1/ridders(f2,doubleEps,1.0) else 1.0; return value; end; return {pvalue,cinterval,mle}; end; | reduce |
fishertest(10,10,10,20,'twosided,1,0.95); | reduce |
symbolic procedure testSet2; begin scalar fit1; fit1 := fishertest(10,10,10,20,'twosided,1,0.95); return {testTolerance(first(fit1), 0.2575, 1.0e-3), testTolerance(caadr(fit1),0.5383996, 1.0e-6), testTolerance(cadadr(fit1),7.4363242, 1.0e-4), testTolerance(third(fit1),1.971640, 1.0e-4)} end; | reduce |
testSet2(); | reduce |
Fourth, the Maxima implementation was fairly brief:
\begin{maxima}
load(distrib);
\end{maxima}
\begin{maxima}
numer:true;
\end{maxima}
\begin{maxima}
display2d:false$
fishertest(a,b,c,d,alternative,oddsratio,confLevel) :=
block([m, n, k, x00, lo, hi, doubleEps,
dnhyper,mnhyper,pnhyper,mle,ncpu,ncpl,
support,d2,logdc,alpha,
pvalue,cinterval],
m : a+c,
n : b+d,
k : a+b,
x00 : a,
lo : max(0, k-n),
hi : min(k, m),
support : makelist(i,i,lo,hi),
logdc : create_list(log(pdf_hypergeometric(i, m, n, k)),i,support),
doubleEps : 1.0e-10,
dnhyper : lambda([ncp]?,
block([maxd, sumd2, d, d2]?,
d : makelist(logdc[i]?+log(ncp)*support[i]?,i,1,length(logdc)),
maxd : apply(max,d),
d2 : create_list(exp(di-maxd),di, d),
sumd2 : lsum(i,i,d2),
create_list(d2i/sumd2,d2i,d2))),
mnhyper : lambda([ncp]?,
block([d, value]?,
if equal(ncp,0) then lo
else if equal(ncp, inf) then hi
else block([],
d : dnhyper(ncp),
sum(support[i]?*d[i]?,i,1,length(d))))),
pnhyper : lambda([q,ncp,upperTail]?,
if equal(ncp,1) then
(if upperTail then 1-cdf_hypergeometric(q-1, m, n, k)
else cdf_hypergeometric(q, m, n, k))
else if equal(ncp,0) then
(if upperTail then
(if q<=lo then 1 else 0)
else (if q>=lo then 1 else 0))
else if equal(ncp,inf) then
(if upperTail then
(if q<=hi then 1 else 0)
else (if q>= hi then 1 else 0))
else
block([d]?,
d : dnhyper(ncp),
if upperTail then
sum(if support[i]?>=q then d[i]? else 0,i,1,length(d))
else sum(if support[i]?<=q then d[i] else 0,i,1,length(d)))),
ncpL : lambda([alpha],
if equal(x00,lo) then 0
else block([p],
p : pnhyper(x00, 1, true),
if p>alpha then
find_root(lambda([y]?, pnhyper(x00,y,true) - alpha), 0, 1)
else if p Fifth, the implementation in Common Lisp was a more direct translation of the R code:;; from cl-statistics.lisp
(defun safe-exp (x)
"Eliminates floating point underflow for the exponential function.
Instead,
(defun choose (n x)
(loop
for denom from 1 to x
and numerator from n downto (- n (1- x))
and total = 1 then (* total (/ numerator denom))
finally (return total)))
(defun dhyper (x m n k &key (log nil))
(let ((val
(/ (* (choose m x) (choose n (- k x))) (choose (+ m n) k))))
(if log
(log (coerce val 'double-float))
val)))
(defun phyper (x m n k &key (lower-tail t))
(if lower-tail
(loop for i from 1 to x summing (dhyper i m n k))
(loop for i from (1+ x) to k summing (dhyper i m n k))))
(defun fisher-test (x &key (alternative 'two-sided) (or 1.0d0)
(conf-int t)
(conf-level 0.95d0) (uniroot #'ridder))
"Fisher's exact test for a 2x2 integer array.
This is a hand translation of R's fisher.test()
making use of CL's large integers for the hypergeometric distribution"
(let* ((m (loop for i upto 1 summing (aref x i 0)))
(n (loop for i upto 1 summing (aref x i 1)))
(k (loop for i upto 1 summing (aref x 0 i)))
(x00 (aref x 0 0)) ; cf replacing x by (aref x 0 0)
(lo (max 0 (- k n)))
(hi (min k m))
(support (loop for i from lo to hi collect i))
(log-dc (loop for i in support
collect (dhyper i m n k :log t)))
(double-eps 1.0d-50))
(labels
((dnhyper (ncp)
(setf ncp (coerce ncp 'double-float))
(let* ((d (loop for i in log-dc and j in support
collect (+ i (* (log ncp) j))))
(max-d (apply #'max d))
(d2 (loop for i in d collect
(safe-exp (- i max-d)))) ;; NB: safe-exp used here
(sum-d2 (reduce #'+ d2)))
(loop for i in d2 collect (/ i sum-d2))))
(mnhyper (ncp)
(cond
((= ncp 0) lo)
((equal ncp 'infinity) hi)
(t (loop for i in support and j in (dnhyper ncp)
summing (* i j)))))
(pnhyper (q ncp &key (upper-tail nil))
(cond
((= ncp 1)
(if upper-tail
(coerce (phyper (1- x00) m n k :lower-tail nil) 'double-float)
(coerce (phyper x00 m n k) 'double-float)))
((= ncp 0)
(if upper-tail
(if (<= q lo) 1 0)
(if (>= q lo) 1 0)))
((equal ncp 'infinity)
(if upper-tail
(if (<= q hi) 1 0)
(if (>= q hi) 1 0)))
(t
(let ((d (dnhyper ncp)))
(if upper-tail
(loop for d-i in d and support-i in support
when (>= support-i q)
summing d-i)
(loop for d-i in d and support-i in support
when (<= support-i q)
summing d-i))))))
(mle (x)
(cond
((= x lo) 0)
((= x hi) 'infinity)
(t
(let ((mu (mnhyper 1)))
(cond
((> mu x)
(funcall uniroot (lambda (u) (- (mnhyper u) x))
0 1))
((< mu x)
(/ (funcall uniroot (lambda (u) (- (mnhyper (/ u)) x))
double-eps 1)))
(t 1))))))
(ncp-u (x alpha)
(and (= x hi) 'infinity)
(let ((p (pnhyper x 1)))
(cond
((< p alpha)
(funcall uniroot (lambda (u) (- (pnhyper x u) alpha))
0 1))
((> p alpha)
(/ (funcall uniroot (lambda (u) (- (pnhyper x (/ u)) alpha))
double-eps 1)))
(t 1))))
(ncp-l (x alpha)
(and (= x lo) 0)
(let ((p (pnhyper x 1 :upper-tail t)))
(cond
((> p alpha)
(funcall uniroot (lambda (u) (- (pnhyper x u :upper-tail t) alpha))
0 1))
((< p alpha)
(/ (funcall uniroot (lambda (u) (- (pnhyper x (/ u) :upper-tail t) alpha))
double-eps 1)))
(t 1)))))
(let ((p-value
(ecase alternative
(less (pnhyper x00 or))
(greater (pnhyper x00 or :upper-tail t))
(two-sided
(let* ((relErr (1+ 1.0d-7))
(d (dnhyper or))
(dstar (* (elt d (- x00 lo)) relErr)))
(loop for di in d when (< di dstar) summing di)))))
(c-interval
(if conf-int
(ecase alternative
(less (list 0 (ncp-u x00 (- 1 conf-level))))
(greater (list (ncp-l x00 (- 1 conf-level)) 'infinity))
(two-sided
(let ((alpha (/ (- 1 conf-level) 2)))
(list (ncp-l x00 alpha) (ncp-u x00 alpha)))))
nil))
(estimate (mle x00)))
(values p-value c-interval estimate)))))
;;(fisher-test #2a((10 10) (10 20)))
; compiling file "/var/zope2/var/LatexWiki/3567673564658662221-25px005.lisp" (written 16 MAY 2011 06:14:23 PM):
; /var/zope2/var/LatexWiki/3567673564658662221-25px005.fasl written
; compilation finished in 0:00:00.584
Value = T
With output:
\begin{verbatim} CL-USER> (fisher-test #2a((10 10) (10 20))) 0.2575492428109829d0 (0.5383993816781727d0 7.4363408387439875d0) 1.9716269432603386d0 \end{verbatim}
Finally, I have also included an implementation in Sage and commented out early code that would allow this to be used in Python.
\begin{sageblock} import scipy from scipy.optimize import brentq
## the following is required for use in Python/Scipy outside of Sage # from math import log, exp, cos, pi # infinity="infinity" # def binomial(n,x): # total=1 # for i in range(min(x,n-x)): # total=total*(n-i)/(i+1) # return total
def dhyper(x, m, n, k):
return 1.0 binomial(m, x) binomial(n, k - x) / binomial(m + n, k)
def phyper(x, m, n, k, lowerTail):
if lowerTail:
return sum([dhyper(i, m, n, k) for i in range(1,x+1)]?)
else:
return sum([dhyper(i, m, n, k) for i in range(x+1,k+1)]?)
def fishertest(a,b,c,d,alternative,oddsratio,confLevel):
m = a+c
n = b+d
k = a+b
x00 = a
lo = max(0, k-n)
hi = min(k, m)
support = range(lo,hi+1)
logdc = [log(dhyper(i, m, n, k)) for i in support]?
doubleEps = 1.0e-10
def dnhyper(ncp):
d = [logdc[i]?+log(ncp)*support[i]? for i in range(len(logdc))]
d2 = [exp(di-max(d)) for di in d]?
return [d2i/sum(d2) for d2i in d2]?
def mnhyper(ncp):
if ncp==0:
return lo
if ncp==infinity:
return hi
else:
d = dnhyper(ncp)
return sum([support[i]?*d[i]? for i in range(len(d))])
def pnhyper(q,ncp,upperTail):
if ncp==1:
if upperTail:
return phyper(q-1, m, n, k, False)
else:
return phyper(q, m, n, k, True)
elif ncp==0:
if upperTail:
return 1 if q<=lo else 0
else:
return 1 if q>=lo else 0
elif ncp==infinity:
if upperTail:
return 1 if q<=hi else 0
else:
return 1 if q>= hi else 0
else:
d = dnhyper(ncp)
if upperTail:
return sum([d[i]? for i in range(len(d)) if support[i]?>=q])
else:
return sum([d[i]? for i in range(1,len(d)) if support[i]?<=q])
def ncpL(alpha):
if x00==lo:
return 0
else:
p = pnhyper(x00, 1, True)
if p>alpha:
return brentq(lambda y: pnhyper(x00,y,True) - alpha, 0, 1)
elif p ## do some checks
def testTolerance(x,y,tol):
return abs(x-y)<=tol
fit=fishertest(10,10,10,20,"two-sided",1,0.95)
print [testTolerance(brentq(cos,0,2)*2,pi,0),
testTolerance(binomial(100, 5), 75287520, 0),
testTolerance(binomial(100, 95), 75287520, 0),
testTolerance(dhyper(5, 10, 7, 8), 0.3628137, 1.0e-7),
testTolerance(log(dhyper(5, 10, 7, 8)),-1.013866, 1.0e-7),
testTolerance(phyper(5, 10, 7, 8, True),0.7821884, 1.0e-7),
testTolerance(phyper(5, 10, 7, 8, False),0.2178116, 1.0e-7),
testTolerance(fit['pvalue'], 0.2575, 1.0e-3),
testTolerance(fit['cInterval'][0], 0.5383996, 1.0e-6),
testTolerance(fit['cInterval'][1], 7.4363242, 1.0e-4),
testTolerance(fit['mle'], 1.971640, 1.0e-4)]
## print some tests
print fishertest(10,10,10,20,"two-sided",1,0.95)
print fishertest(10,10,10,20,"less",1,0.95)
print fishertest(10,10,10,20,"greater",1,0.95)
\end{sageblock} This would give the following output:
[0 <= 0, True, True, True, True, True, True, 4.92428109829e-05 <= 0.00100000000000000,
True, True, True]
{'mle': 1.9716269432603342, 'pvalue': 0.257549242811,
'cInterval': [0.53839938167817269, 7.4363408387619616]}
{'mle': 1.9716269432603342, 'pvalue': 0.929480494158038,
'cInterval': [0, 6.1438085831669706]}
{'mle': 1.9716269432603342, 'pvalue': 0.188301375769915,
'cInterval': [0.64599378194777934, +Infinity]}
Error: ulimit -t 240; maxima -p /var/zope2/Products/ZWiki/plugins/mathaction/mathaction-maxima-5.9.3.lisp < /var/zope2/var/LatexWiki/8200670009897074851-25px.mbat
This is pdfTeXk, Version 3.141592-1.40.3 (Web2C 7.5.6) \write18 enabled. %&-line parsing enabled. entering extended mode (./3574856551635100996-16.0px.tex LaTeX2e <2005/12/01> Babel <v3.8h> and hyphenation patterns for english, usenglishmax, dumylang, noh yphenation, arabic, farsi, croatian, ukrainian, russian, bulgarian, czech, slov ak, danish, dutch, finnish, basque, french, german, ngerman, ibycus, greek, mon ogreek, ancientgreek, hungarian, italian, latin, mongolian, norsk, icelandic, i nterlingua, turkish, coptic, romanian, welsh, serbian, slovenian, estonian, esp eranto, uppersorbian, indonesian, polish, portuguese, spanish, catalan, galicia n, swedish, ukenglish, pinyin, loaded. (/usr/share/texmf-texlive/tex/latex/base/article.cls Document Class: article 2005/09/16 v1.4f Standard LaTeX document class (/usr/share/texmf-texlive/tex/latex/base/size12.clo)) (/usr/share/texmf-texlive/tex/latex/ucs/ucs.sty (/usr/share/texmf-texlive/tex/latex/ucs/data/uni-global.def)) (/usr/share/texmf-texlive/tex/latex/base/inputenc.sty (/usr/share/texmf-texlive/tex/latex/ucs/utf8x.def)) (/usr/share/texmf-texlive/tex/latex/bbm/bbm.sty) (/usr/share/texmf-texlive/tex/latex/jknapltx/mathrsfs.sty) (/usr/share/texmf-texlive/tex/latex/base/fontenc.sty (/usr/share/texmf-texlive/tex/latex/base/t1enc.def)) (/usr/share/texmf-texlive/tex/latex/pstricks/pstricks.sty (/usr/share/texmf-texlive/tex/generic/pstricks/pstricks.tex `PSTricks' v1.15 <2006/12/22> (tvz) (/usr/share/texmf-texlive/tex/generic/pstricks/pstricks.con)) (/usr/share/texmf/tex/latex/xcolor/xcolor.sty (/etc/texmf/tex/latex/config/color.cfg) (/usr/share/texmf-texlive/tex/latex/graphics/dvips.def) (/usr/share/texmf-texlive/tex/latex/graphics/dvipsnam.def))) (/usr/share/texmf-texlive/tex/latex/graphics/epsfig.sty (/usr/share/texmf-texlive/tex/latex/graphics/graphicx.sty (/usr/share/texmf-texlive/tex/latex/graphics/keyval.sty) (/usr/share/texmf-texlive/tex/latex/graphics/graphics.sty (/usr/share/texmf-texlive/tex/latex/graphics/trig.sty) (/etc/texmf/tex/latex/config/graphics.cfg)))) (/usr/share/texmf-texlive/tex/latex/pst-grad/pst-grad.sty (/usr/share/texmf-texlive/tex/generic/pst-grad/pst-grad.tex (/usr/share/texmf-texlive/tex/latex/xkeyval/pst-xkey.tex (/usr/share/texmf-texlive/tex/latex/xkeyval/xkeyval.sty (/usr/share/texmf-texlive/tex/latex/xkeyval/xkeyval.tex))) `pst-plot' v1.05, 2006/11/04 (tvz,dg,hv))) (/usr/share/texmf-texlive/tex/latex/pstricks/pst-plot.sty (/usr/share/texmf-texlive/tex/generic/pstricks/pst-plot.tex v97 patch 2, 1999/12/12 (/usr/share/texmf-texlive/tex/generic/multido/multido.tex v1.41, 2004/05/18 <tvz>))) (/usr/share/texmf-texlive/tex/generic/xypic/xy.sty (/usr/share/texmf-texlive/tex/generic/xypic/xy.tex Bootstrap'ing: catcodes, docmode, (/usr/share/texmf-texlive/tex/generic/xypic/xyrecat.tex) (/usr/share/texmf-texlive/tex/generic/xypic/xyidioms.tex)Xy-pic version 3.7 <1999/02/16> Copyright (c) 1991-1998 by Kristoffer H. Rose <krisrose@ens-lyon.fr> Xy-pic is free software: see the User's Guide for details.
Loading kernel: messages; fonts; allocations: state, direction, utility macros; pictures: \xy, positions, objects, decorations; kernel objects: directionals, circles, text; options; algorithms: directions, edges, connections; Xy-pic loaded) (/usr/share/texmf-texlive/tex/generic/xypic/xyall.tex Xy-pic option: All features v.3.3 (/usr/share/texmf-texlive/tex/generic/xypic/xycurve.tex Xy-pic option: Curve and Spline extension v.3.7 curve, circles, loaded) (/usr/share/texmf-texlive/tex/generic/xypic/xyframe.tex Xy-pic option: Frame and Bracket extension v.3.7 loaded) (/usr/share/texmf-texlive/tex/generic/xypic/xycmtip.tex Xy-pic option: Computer Modern tip extension v.3.3 (/usr/share/texmf-texlive/tex/generic/xypic/xytips.tex Xy-pic option: More Tips extension v.3.3 loaded) loaded) (/usr/share/texmf-texlive/tex/generic/xypic/xyline.tex Xy-pic option: Line styles extension v.3.6 loaded) (/usr/share/texmf-texlive/tex/generic/xypic/xyrotate.tex Xy-pic option: Rotate and Scale extension v.3.3 loaded) (/usr/share/texmf-texlive/tex/generic/xypic/xycolor.tex Xy-pic option: Colour extension v.3.3 loaded) (/usr/share/texmf-texlive/tex/generic/xypic/xymatrix.tex Xy-pic option: Matrix feature v.3.4 loaded) (/usr/share/texmf-texlive/tex/generic/xypic/xyarrow.tex Xy-pic option: Arrow and Path feature v.3.5 path, \ar, loaded) (/usr/share/texmf-texlive/tex/generic/xypic/xygraph.tex Xy-pic option: Graph feature v.3.7 loaded) loaded) (/usr/share/texmf-texlive/tex/generic/xypic/xyknot.tex Xy-pic option: Knots and Links feature v.3.4 knots and links, loaded)) (/usr/share/texmf-texlive/tex/generic/xypic/xyarc.tex Xy-pic option: Circle, Ellipse, Arc feature v.3.4 circles, ellipses, elliptical arcs, loaded) (/usr/share/texmf-texlive/tex/latex/geometry/geometry.sty (/usr/share/texmf-texlive/tex/xelatex/xetexconfig/geometry.cfg)
Package geometry Warning: `lmargin' and `rmargin' result in NEGATIVE (-108.405p t). `width' should be shortened in length.
) (/usr/share/texmf-texlive/tex/latex/amsmath/amsmath.sty For additional information on amsmath, use the `?
option. (/usr/share/texmf-texlive/tex/latex/amsmath/amstext.sty (/usr/share/texmf-texlive/tex/latex/amsmath/amsgen.sty)) (/usr/share/texmf-texlive/tex/latex/amsmath/amsbsy.sty) (/usr/share/texmf-texlive/tex/latex/amsmath/amsopn.sty)) (/usr/share/texmf-texlive/tex/latex/amsfonts/amsfonts.sty) (/usr/share/texmf-texlive/tex/latex/amsfonts/amssymb.sty) (/usr/share/texmf-texlive/tex/latex/amscls/amsthm.sty) (/usr/share/texmf-texlive/tex/latex/setspace/setspace.sty Package: `setspace
6.7 <2000/12/01> ) (/usr/share/texmf-texlive/tex/latex/tools/verbatim.sty) (/usr/share/texmf/tex/latex/graphviz/graphviz.sty (/usr/share/texmf-texlive/tex/latex/psfrag/psfrag.sty)) (/usr/share/texmf/tex/latex/sagetex.sty Writing sage input file 3574856551635100996-16.0px.sage (./3574856551635100996-16.0px.sout)) (/usr/share/texmf-texlive/tex/latex/gnuplottex/gnuplottex.sty (/usr/share/texmf-texlive/tex/latex/base/latexsym.sty) (/usr/share/texmf-texlive/tex/latex/moreverb/moreverb.sty) (/usr/share/texmf-texlive/tex/latex/base/ifthen.sty)) (./3574856551635100996-16.0px.aux) (/usr/share/texmf-texlive/tex/latex/ucs/ucsencs.def) (/usr/share/texmf-texlive/tex/latex/base/t1cmtt.fd)LaTeX Warning: Characters dropped after `\end{verbatim}' on input line 135.
(/usr/share/texmf-texlive/tex/latex/jknapltx/ursfs.fd) (/usr/share/texmf-texlive/tex/latex/amsfonts/umsa.fd) (/usr/share/texmf-texlive/tex/latex/amsfonts/umsb.fd) (/usr/share/texmf-texlive/tex/latex/base/ulasy.fd) [1] [2]
LaTeX Error: Environment maxima undefined.
See the LaTeX manual or LaTeX Companion for explanation. Type H <return> for immediate help. ...
l.152 \begin{maxima}
LaTeX Error: \begin{document} ended by \end{maxima}.
See the LaTeX manual or LaTeX Companion for explanation. Type H <return> for immediate help. ...
l.154 \end{maxima} \newpage [3]
LaTeX Error: Environment maxima undefined.
See the LaTeX manual or LaTeX Companion for explanation. Type H <return> for immediate help. ...
l.155 \begin{maxima}
LaTeX Error: \begin{document} ended by \end{maxima}.
See the LaTeX manual or LaTeX Companion for explanation. Type H <return> for immediate help. ...
l.157 \end{maxima} \newpage [4]
LaTeX Error: Environment maxima undefined.
See the LaTeX manual or LaTeX Companion for explanation. Type H <return> for immediate help. ...
l.158 \begin{maxima}
LaTeX Error: \begin{document} ended by \end{maxima}.
See the LaTeX manual or LaTeX Companion for explanation. Type H <return> for immediate help. ...
l.255 \end{maxima} \newpage Missing $ inserted. <inserted text> $ l.255 \end{maxima} \newpage
Overfull \hbox (321.19646pt too wide) in paragraph at lines 159--255 []\T1/cmr/m/n/12 display2d:false$\OML/cmm/m/it/12 fishertest\OT1/cmr/m/n/12 (\O ML/cmm/m/it/12 a; b; c; d; alternative; oddsratio; confLevel\OT1/cmr/m/n/12 ) : = \OML/cmm/m/it/12 block\OT1/cmr/m/n/12 ([\OML/cmm/m/it/12 m; n; k; x\OT1/cmr/m /n/12 00\OML/cmm/m/it/12 ; lo; hi; doubleEps; dnhyper; mnhyper; pnhyper; mle; n cpu; ncpl; support; d\OT1/cmr/m/n/12 2\OML/cmm/m/it/12 ; logdc; alpha; pvalue; cinterval\OT1/cmr/m/n/12 ]\OML/cmm/m/it/12 ; m \OT1/cmr/m/n/12 :
Overfull \hbox (137.83548pt too wide) in paragraph at lines 159--255 \OML/cmm/m/it/12 a \OT1/cmr/m/n/12 + \OML/cmm/m/it/12 c; n \OT1/cmr/m/n/12 : \O ML/cmm/m/it/12 b \OT1/cmr/m/n/12 + \OML/cmm/m/it/12 d; k \OT1/cmr/m/n/12 : \OML /cmm/m/it/12 a \OT1/cmr/m/n/12 + \OML/cmm/m/it/12 b; x\OT1/cmr/m/n/12 00 : \OML /cmm/m/it/12 a; lo \OT1/cmr/m/n/12 : \OML/cmm/m/it/12 max\OT1/cmr/m/n/12 (0\OML /cmm/m/it/12 ; k \OMS/cmsy/m/n/12 ^^@ \OML/cmm/m/it/12 n\OT1/cmr/m/n/12 )\OML/c mm/m/it/12 ; hi \OT1/cmr/m/n/12 : \OML/cmm/m/it/12 min\OT1/cmr/m/n/12 (\OML/cmm /m/it/12 k; m\OT1/cmr/m/n/12 )\OML/cmm/m/it/12 ; support \OT1/cmr/m/n/12 : \OML /cmm/m/it/12 makelist\OT1/cmr/m/n/12 (\OML/cmm/m/it/12 i; i; lo; hi\OT1/cmr/m/n /12 )\OML/cmm/m/it/12 ; logdc \OT1/cmr/m/n/12 : \OML/cmm/m/it/12 create[]ist\OT 1/cmr/m/n/12 (\OML/cmm/m/it/12 log\OT1/cmr/m/n/12 (\OML/cmm/m/it/12 pdf[]yperge ometric\OT1/cmr/m/n/12 (\OML/cmm/m/it/12 i; m; n; k\OT1/cmr/m/n/12 ))\OML/cmm/m /it/12 ; i; support\OT1/cmr/m/n/12 )\OML/cmm/m/it/12 ; doubleEps \OT1/cmr/m/n/1 2 :
Overfull \hbox (39.36833pt too wide) in paragraph at lines 159--255 \OT1/cmr/m/n/12 1\OML/cmm/m/it/12 :\OT1/cmr/m/n/12 0\OML/cmm/m/it/12 e \OMS/cms y/m/n/12 ^^@ \OT1/cmr/m/n/12 10\OML/cmm/m/it/12 ; dnhyper \OT1/cmr/m/n/12 : \OM L/cmm/m/it/12 lambda\OT1/cmr/m/n/12 ([\OML/cmm/m/it/12 ncp\OT1/cmr/m/n/12 ]\OML /cmm/m/it/12 ; block\OT1/cmr/m/n/12 ([\OML/cmm/m/it/12 maxd; sumd\OT1/cmr/m/n/1 2 2\OML/cmm/m/it/12 ; d; d\OT1/cmr/m/n/12 2]\OML/cmm/m/it/12 ; d \OT1/cmr/m/n/1 2 : \OML/cmm/m/it/12 makelist\OT1/cmr/m/n/12 (\OML/cmm/m/it/12 logdc\OT1/cmr/m/ n/12 [\OML/cmm/m/it/12 i\OT1/cmr/m/n/12 ] + \OML/cmm/m/it/12 log\OT1/cmr/m/n/12 (\OML/cmm/m/it/12 ncp\OT1/cmr/m/n/12 ) \OMS/cmsy/m/n/12 ^^C \OML/cmm/m/it/12 s upport\OT1/cmr/m/n/12 [\OML/cmm/m/it/12 i\OT1/cmr/m/n/12 ]\OML/cmm/m/it/12 ; i; \OT1/cmr/m/n/12 1\OML/cmm/m/it/12 ; length\OT1/cmr/m/n/12 (\OML/cmm/m/it/12 lo gdc\OT1/cmr/m/n/12 ))\OML/cmm/m/it/12 ; maxd \OT1/cmr/m/n/12 : \OML/cmm/m/it/12 apply\OT1/cmr/m/n/12 (\OML/cmm/m/it/12 max; d\OT1/cmr/m/n/12 )\OML/cmm/m/it/12 ; d\OT1/cmr/m/n/12 2 :
Overfull \hbox (265.6928pt too wide) in paragraph at lines 159--255 \OML/cmm/m/it/12 create[]ist\OT1/cmr/m/n/12 (\OML/cmm/m/it/12 exp\OT1/cmr/m/n/1 2 (\OML/cmm/m/it/12 di \OMS/cmsy/m/n/12 ^^@ \OML/cmm/m/it/12 maxd\OT1/cmr/m/n/1 2 )\OML/cmm/m/it/12 ; di; d\OT1/cmr/m/n/12 )\OML/cmm/m/it/12 ; sumd\OT1/cmr/m/n /12 2 : \OML/cmm/m/it/12 lsum\OT1/cmr/m/n/12 (\OML/cmm/m/it/12 i; i; d\OT1/cmr/ m/n/12 2)\OML/cmm/m/it/12 ; create[]ist\OT1/cmr/m/n/12 (\OML/cmm/m/it/12 d\OT1/ cmr/m/n/12 2\OML/cmm/m/it/12 i=sumd\OT1/cmr/m/n/12 2\OML/cmm/m/it/12 ; d\OT1/cm r/m/n/12 2\OML/cmm/m/it/12 i; d\OT1/cmr/m/n/12 2)))\OML/cmm/m/it/12 ; mnhyper \ OT1/cmr/m/n/12 : \OML/cmm/m/it/12 lambda\OT1/cmr/m/n/12 ([\OML/cmm/m/it/12 ncp\ OT1/cmr/m/n/12 ]\OML/cmm/m/it/12 ; block\OT1/cmr/m/n/12 ([\OML/cmm/m/it/12 d; v alue\OT1/cmr/m/n/12 ]\OML/cmm/m/it/12 ; ifequal\OT1/cmr/m/n/12 (\OML/cmm/m/it/1 2 ncp; \OT1/cmr/m/n/12 0)\OML/cmm/m/it/12 thenloelseifequal\OT1/cmr/m/n/12 (\OM L/cmm/m/it/12 ncp; inf\OT1/cmr/m/n/12 )\OML/cmm/m/it/12 thenhielseblock\OT1/cmr /m/n/12 ([]\OML/cmm/m/it/12 ; d \OT1/cmr/m/n/12 :
Overfull \hbox (64.61157pt too wide) in paragraph at lines 159--255 \OML/cmm/m/it/12 dnhyper\OT1/cmr/m/n/12 (\OML/cmm/m/it/12 ncp\OT1/cmr/m/n/12 )\ OML/cmm/m/it/12 ; sum\OT1/cmr/m/n/12 (\OML/cmm/m/it/12 support\OT1/cmr/m/n/12 [ \OML/cmm/m/it/12 i\OT1/cmr/m/n/12 ] \OMS/cmsy/m/n/12 ^^C \OML/cmm/m/it/12 d\OT1 /cmr/m/n/12 [\OML/cmm/m/it/12 i\OT1/cmr/m/n/12 ]\OML/cmm/m/it/12 ; i; \OT1/cmr/ m/n/12 1\OML/cmm/m/it/12 ; length\OT1/cmr/m/n/12 (\OML/cmm/m/it/12 d\OT1/cmr/m/ n/12 )))))\OML/cmm/m/it/12 ; pnhyper \OT1/cmr/m/n/12 : \OML/cmm/m/it/12 lambda\ OT1/cmr/m/n/12 ([\OML/cmm/m/it/12 q; ncp; upperTail\OT1/cmr/m/n/12 ]\OML/cmm/m/ it/12 ; ifequal\OT1/cmr/m/n/12 (\OML/cmm/m/it/12 ncp; \OT1/cmr/m/n/12 1)\OML/cm m/m/it/12 then\OT1/cmr/m/n/12 (\OML/cmm/m/it/12 ifupperTailthen\OT1/cmr/m/n/12 1 \OMS/cmsy/m/n/12 ^^@ \OML/cmm/m/it/12 cdf[]ypergeometric\OT1/cmr/m/n/12 (\OML /cmm/m/it/12 q \OMS/cmsy/m/n/12 ^^@
Overfull \hbox (236.55396pt too wide) in paragraph at lines 159--255 \OT1/cmr/m/n/12 1\OML/cmm/m/it/12 ; m; n; k\OT1/cmr/m/n/12 )\OML/cmm/m/it/12 el secdf[]ypergeometric\OT1/cmr/m/n/12 (\OML/cmm/m/it/12 q; m; n; k\OT1/cmr/m/n/12 ))\OML/cmm/m/it/12 elseifequal\OT1/cmr/m/n/12 (\OML/cmm/m/it/12 ncp; \OT1/cmr/ m/n/12 0)\OML/cmm/m/it/12 then\OT1/cmr/m/n/12 (\OML/cmm/m/it/12 ifupperTailthen \OT1/cmr/m/n/12 (\OML/cmm/m/it/12 ifq <\OT1/cmr/m/n/12 = \OML/cmm/m/it/12 lothe n\OT1/cmr/m/n/12 1\OML/cmm/m/it/12 else\OT1/cmr/m/n/12 0)\OML/cmm/m/it/12 else\ OT1/cmr/m/n/12 (\OML/cmm/m/it/12 ifq >\OT1/cmr/m/n/12 = \OML/cmm/m/it/12 lothen \OT1/cmr/m/n/12 1\OML/cmm/m/it/12 else\OT1/cmr/m/n/12 0))\OML/cmm/m/it/12 elsei fequal\OT1/cmr/m/n/12 (\OML/cmm/m/it/12 ncp; inf\OT1/cmr/m/n/12 )\OML/cmm/m/it/ 12 then\OT1/cmr/m/n/12 (\OML/cmm/m/it/12 ifupperTailthen\OT1/cmr/m/n/12 (\OML/c mm/m/it/12 ifq <\OT1/cmr/m/n/12 =
Overfull \hbox (130.16159pt too wide) in paragraph at lines 159--255 \OML/cmm/m/it/12 hithen\OT1/cmr/m/n/12 1\OML/cmm/m/it/12 else\OT1/cmr/m/n/12 0) \OML/cmm/m/it/12 else\OT1/cmr/m/n/12 (\OML/cmm/m/it/12 ifq >\OT1/cmr/m/n/12 = \ OML/cmm/m/it/12 hithen\OT1/cmr/m/n/12 1\OML/cmm/m/it/12 else\OT1/cmr/m/n/12 0)) \OML/cmm/m/it/12 elseblock\OT1/cmr/m/n/12 ([\OML/cmm/m/it/12 d\OT1/cmr/m/n/12 ] \OML/cmm/m/it/12 ; d \OT1/cmr/m/n/12 : \OML/cmm/m/it/12 dnhyper\OT1/cmr/m/n/12 (\OML/cmm/m/it/12 ncp\OT1/cmr/m/n/12 )\OML/cmm/m/it/12 ; ifupperTailthensum\OT1 /cmr/m/n/12 (\OML/cmm/m/it/12 ifsupport\OT1/cmr/m/n/12 [\OML/cmm/m/it/12 i\OT1/ cmr/m/n/12 ] \OML/cmm/m/it/12 >\OT1/cmr/m/n/12 = \OML/cmm/m/it/12 qthend\OT1/cm r/m/n/12 [\OML/cmm/m/it/12 i\OT1/cmr/m/n/12 ]\OML/cmm/m/it/12 else\OT1/cmr/m/n/ 12 0\OML/cmm/m/it/12 ; i; \OT1/cmr/m/n/12 1\OML/cmm/m/it/12 ; length\OT1/cmr/m/ n/12 (\OML/cmm/m/it/12 d\OT1/cmr/m/n/12 ))\OML/cmm/m/it/12 elsesum\OT1/cmr/m/n/ 12 (\OML/cmm/m/it/12 ifsupport\OT1/cmr/m/n/12 [\OML/cmm/m/it/12 i\OT1/cmr/m/n/1 2 ] \OML/cmm/m/it/12 <\OT1/cmr/m/n/12 =
Overfull \hbox (181.71327pt too wide) in paragraph at lines 159--255 \OML/cmm/m/it/12 qthend\OT1/cmr/m/n/12 [\OML/cmm/m/it/12 i\OT1/cmr/m/n/12 ]\OML /cmm/m/it/12 else\OT1/cmr/m/n/12 0\OML/cmm/m/it/12 ; i; \OT1/cmr/m/n/12 1\OML/c mm/m/it/12 ; length\OT1/cmr/m/n/12 (\OML/cmm/m/it/12 d\OT1/cmr/m/n/12 ))))\OML/ cmm/m/it/12 ; ncpL \OT1/cmr/m/n/12 : \OML/cmm/m/it/12 lambda\OT1/cmr/m/n/12 ([\ OML/cmm/m/it/12 alpha\OT1/cmr/m/n/12 ]\OML/cmm/m/it/12 ; ifequal\OT1/cmr/m/n/12 (\OML/cmm/m/it/12 x\OT1/cmr/m/n/12 00\OML/cmm/m/it/12 ; lo\OT1/cmr/m/n/12 )\OM L/cmm/m/it/12 then\OT1/cmr/m/n/12 0\OML/cmm/m/it/12 elseblock\OT1/cmr/m/n/12 ([ \OML/cmm/m/it/12 p\OT1/cmr/m/n/12 ]\OML/cmm/m/it/12 ; p \OT1/cmr/m/n/12 : \OML/ cmm/m/it/12 pnhyper\OT1/cmr/m/n/12 (\OML/cmm/m/it/12 x\OT1/cmr/m/n/12 00\OML/cm m/m/it/12 ; \OT1/cmr/m/n/12 1\OML/cmm/m/it/12 ; true\OT1/cmr/m/n/12 )\OML/cmm/m /it/12 ; ifp > alphathenfind[]oot\OT1/cmr/m/n/12 (\OML/cmm/m/it/12 lambda\OT1/c mr/m/n/12 ([\OML/cmm/m/it/12 y\OT1/cmr/m/n/12 ]\OML/cmm/m/it/12 ; pnhyper\OT1/c mr/m/n/12 (\OML/cmm/m/it/12 x\OT1/cmr/m/n/12 00\OML/cmm/m/it/12 ; y; true\OT1/c mr/m/n/12 ) \OMS/cmsy/m/n/12 ^^@
Overfull \hbox (3.40475pt too wide) in paragraph at lines 159--255 \OML/cmm/m/it/12 alpha\OT1/cmr/m/n/12 )\OML/cmm/m/it/12 ; \OT1/cmr/m/n/12 0\OML /cmm/m/it/12 ; \OT1/cmr/m/n/12 1)\OML/cmm/m/it/12 elseifp < alphathen\OT1/cmr/m /n/12 1\OML/cmm/m/it/12 =find[]oot\OT1/cmr/m/n/12 (\OML/cmm/m/it/12 lambda\OT1/ cmr/m/n/12 ([\OML/cmm/m/it/12 y\OT1/cmr/m/n/12 ]\OML/cmm/m/it/12 ; pnhyper\OT1/ cmr/m/n/12 (\OML/cmm/m/it/12 x\OT1/cmr/m/n/12 00\OML/cmm/m/it/12 ; \OT1/cmr/m/n /12 1\OML/cmm/m/it/12 =y; true\OT1/cmr/m/n/12 ) \OMS/cmsy/m/n/12 ^^@ \OML/cmm/m /it/12 alpha\OT1/cmr/m/n/12 )\OML/cmm/m/it/12 ; doubleEps; \OT1/cmr/m/n/12 1)\O ML/cmm/m/it/12 else\OT1/cmr/m/n/12 1))\OML/cmm/m/it/12 ; ncpU \OT1/cmr/m/n/12 : \OML/cmm/m/it/12 lambda\OT1/cmr/m/n/12 ([\OML/cmm/m/it/12 alpha\OT1/cmr/m/n/12 ]\OML/cmm/m/it/12 ; ifx\OT1/cmr/m/n/12 00 =
Overfull \hbox (274.29704pt too wide) in paragraph at lines 159--255 \OML/cmm/m/it/12 hitheninfelseblock\OT1/cmr/m/n/12 ([\OML/cmm/m/it/12 p\OT1/cmr /m/n/12 ]\OML/cmm/m/it/12 ; p \OT1/cmr/m/n/12 : \OML/cmm/m/it/12 pnhyper\OT1/cm r/m/n/12 (\OML/cmm/m/it/12 x\OT1/cmr/m/n/12 00\OML/cmm/m/it/12 ; \OT1/cmr/m/n/1 2 1\OML/cmm/m/it/12 ; false\OT1/cmr/m/n/12 )\OML/cmm/m/it/12 ; ifp < alphathenf ind[]oot\OT1/cmr/m/n/12 (\OML/cmm/m/it/12 lambda\OT1/cmr/m/n/12 ([\OML/cmm/m/it /12 y\OT1/cmr/m/n/12 ]\OML/cmm/m/it/12 ; pnhyper\OT1/cmr/m/n/12 (\OML/cmm/m/it/ 12 x\OT1/cmr/m/n/12 00\OML/cmm/m/it/12 ; y; false\OT1/cmr/m/n/12 ) \OMS/cmsy/m/ n/12 ^^@ \OML/cmm/m/it/12 alpha\OT1/cmr/m/n/12 )\OML/cmm/m/it/12 ; \OT1/cmr/m/n /12 0\OML/cmm/m/it/12 ; \OT1/cmr/m/n/12 1)\OML/cmm/m/it/12 elseifp > alphathen\ OT1/cmr/m/n/12 1\OML/cmm/m/it/12 =find[]oot\OT1/cmr/m/n/12 (\OML/cmm/m/it/12 la mbda\OT1/cmr/m/n/12 ([\OML/cmm/m/it/12 y\OT1/cmr/m/n/12 ]\OML/cmm/m/it/12 ; pnh yper\OT1/cmr/m/n/12 (\OML/cmm/m/it/12 x\OT1/cmr/m/n/12 00\OML/cmm/m/it/12 ; \OT 1/cmr/m/n/12 1\OML/cmm/m/it/12 =y; false\OT1/cmr/m/n/12 ) \OMS/cmsy/m/n/12 ^^@
Overfull \hbox (190.69191pt too wide) in paragraph at lines 159--255 \OML/cmm/m/it/12 alpha\OT1/cmr/m/n/12 )\OML/cmm/m/it/12 ; doubleEps; \OT1/cmr/m /n/12 1)\OML/cmm/m/it/12 else\OT1/cmr/m/n/12 1))\OML/cmm/m/it/12 ; pvalue \OT1/ cmr/m/n/12 : (\OML/cmm/m/it/12 ifalternative \OT1/cmr/m/n/12 =[] \OML/cmm/m/it/ 12 lessthenpnhyper\OT1/cmr/m/n/12 (\OML/cmm/m/it/12 x\OT1/cmr/m/n/12 00\OML/cmm /m/it/12 ; oddsratio; false\OT1/cmr/m/n/12 )\OML/cmm/m/it/12 elseifalternative \OT1/cmr/m/n/12 =[] \OML/cmm/m/it/12 greaterthenpnhyper\OT1/cmr/m/n/12 (\OML/cm m/m/it/12 x\OT1/cmr/m/n/12 00\OML/cmm/m/it/12 ; oddsratio; true\OT1/cmr/m/n/12 )\OML/cmm/m/it/12 elseifalternative \OT1/cmr/m/n/12 =[]
Overfull \hbox (84.44579pt too wide) in paragraph at lines 159--255 \OML/cmm/m/it/12 twosidedthenblock\OT1/cmr/m/n/12 ([\OML/cmm/m/it/12 relerr; ds tar; dn\OT1/cmr/m/n/12 ]\OML/cmm/m/it/12 ; relErr \OT1/cmr/m/n/12 : 1 + 1\OML/c mm/m/it/12 :\OT1/cmr/m/n/12 0\OML/cmm/m/it/12 e \OMS/cmsy/m/n/12 ^^@ \OT1/cmr/m /n/12 7\OML/cmm/m/it/12 ; dn \OT1/cmr/m/n/12 : \OML/cmm/m/it/12 dnhyper\OT1/cmr /m/n/12 (\OML/cmm/m/it/12 oddsratio\OT1/cmr/m/n/12 )\OML/cmm/m/it/12 ; dstar \O T1/cmr/m/n/12 : \OML/cmm/m/it/12 dn\OT1/cmr/m/n/12 [\OML/cmm/m/it/12 x\OT1/cmr/ m/n/12 00 \OMS/cmsy/m/n/12 ^^@ \OML/cmm/m/it/12 lo \OT1/cmr/m/n/12 + 1] \OMS/cm sy/m/n/12 ^^C \OML/cmm/m/it/12 relErr; lsum\OT1/cmr/m/n/12 (\OML/cmm/m/it/12 if di < dstarthendielse\OT1/cmr/m/n/12 0\OML/cmm/m/it/12 ; di; dn\OT1/cmr/m/n/12 ) )\OML/cmm/m/it/12 else \OMS/cmsy/m/n/12 ^^@
Overfull \hbox (20.20848pt too wide) in paragraph at lines 159--255 \OT1/cmr/m/n/12 1)\OML/cmm/m/it/12 ; cInterval \OT1/cmr/m/n/12 : (\OML/cmm/m/it /12 ifalternative \OT1/cmr/m/n/12 =[] \OML/cmm/m/it/12 lessthen\OT1/cmr/m/n/12 [0\OML/cmm/m/it/12 ; ncpU\OT1/cmr/m/n/12 (1 \OMS/cmsy/m/n/12 ^^@ \OML/cmm/m/it/ 12 confLevel\OT1/cmr/m/n/12 )]\OML/cmm/m/it/12 elseifalternative \OT1/cmr/m/n/1 2 =[] \OML/cmm/m/it/12 greaterthen\OT1/cmr/m/n/12 [\OML/cmm/m/it/12 ncpL\OT1/cm r/m/n/12 (1 \OMS/cmsy/m/n/12 ^^@ \OML/cmm/m/it/12 confLevel\OT1/cmr/m/n/12 )\OM L/cmm/m/it/12 ; inf\OT1/cmr/m/n/12 ]\OML/cmm/m/it/12 elseifalternative \OT1/cmr /m/n/12 =[]
Overfull \hbox (72.89813pt too wide) in paragraph at lines 159--255 \OML/cmm/m/it/12 twosidedthen\OT1/cmr/m/n/12 [\OML/cmm/m/it/12 ncpL\OT1/cmr/m/n /12 ((1 \OMS/cmsy/m/n/12 ^^@ \OML/cmm/m/it/12 confLevel\OT1/cmr/m/n/12 )\OML/cm m/m/it/12 =\OT1/cmr/m/n/12 2)\OML/cmm/m/it/12 ; ncpU\OT1/cmr/m/n/12 ((1 \OMS/cm sy/m/n/12 ^^@ \OML/cmm/m/it/12 confLevel\OT1/cmr/m/n/12 )\OML/cmm/m/it/12 =\OT1 /cmr/m/n/12 2)]\OML/cmm/m/it/12 else\OT1/cmr/m/n/12 [\OMS/cmsy/m/n/12 ^^@\OT1/c mr/m/n/12 1\OML/cmm/m/it/12 ; \OMS/cmsy/m/n/12 ^^@\OT1/cmr/m/n/12 1])\OML/cmm/m /it/12 ; mle \OT1/cmr/m/n/12 : (\OML/cmm/m/it/12 ifequal\OT1/cmr/m/n/12 (\OML/c mm/m/it/12 x\OT1/cmr/m/n/12 00\OML/cmm/m/it/12 ; lo\OT1/cmr/m/n/12 )\OML/cmm/m/ it/12 then\OT1/cmr/m/n/12 0\OML/cmm/m/it/12 elseifequal\OT1/cmr/m/n/12 (\OML/cm m/m/it/12 x\OT1/cmr/m/n/12 00\OML/cmm/m/it/12 ; hi\OT1/cmr/m/n/12 )\OML/cmm/m/i t/12 theninfelseblock\OT1/cmr/m/n/12 ([\OML/cmm/m/it/12 mu\OT1/cmr/m/n/12 ]\OML /cmm/m/it/12 ; mu \OT1/cmr/m/n/12 : [5]
LaTeX Error: Environment maxima undefined.
See the LaTeX manual or LaTeX Companion for explanation. Type H <return> for immediate help. ...
l.256 \begin{maxima}
LaTeX Error: \begin{document} ended by \end{maxima}.
See the LaTeX manual or LaTeX Companion for explanation. Type H <return> for immediate help. ...
l.258 \end{maxima} \newpage [6]
LaTeX Error: Environment maxima undefined.
See the LaTeX manual or LaTeX Companion for explanation. Type H <return> for immediate help. ...
l.259 \begin{maxima}
LaTeX Error: \begin{document} ended by \end{maxima}.
See the LaTeX manual or LaTeX Companion for explanation. Type H <return> for immediate help. ...
l.261 \end{maxima} \newpage [7]
LaTeX Error: Environment maxima undefined.
See the LaTeX manual or LaTeX Companion for explanation. Type H <return> for immediate help. ...
l.262 \begin{maxima}
LaTeX Error: \begin{document} ended by \end{maxima}.
See the LaTeX manual or LaTeX Companion for explanation. Type H <return> for immediate help. ...
l.264 \end{maxima} \newpage [8]
LaTeX Error: Environment maxima undefined.
See the LaTeX manual or LaTeX Companion for explanation. Type H <return> for immediate help. ...
l.265 \begin{maxima}
LaTeX Error: \begin{document} ended by \end{maxima}.
See the LaTeX manual or LaTeX Companion for explanation. Type H <return> for immediate help. ...
l.269 \end{maxima} \newpage [9]
LaTeX Error: Environment maxima undefined.
See the LaTeX manual or LaTeX Companion for explanation. Type H <return> for immediate help. ...
l.270 \begin{maxima}
LaTeX Error: \begin{document} ended by \end{maxima}.
See the LaTeX manual or LaTeX Companion for explanation. Type H <return> for immediate help. ...
l.279 \end{maxima} \newpage
Overfull \hbox (10.9121pt too wide) in paragraph at lines 271--279 []\T1/cmr/m/n/12 testSet() := block([fit1], fit1 : fish-ertest(10,10,10,20,'two sided,1,0.95), [test-Tol-er-ance(fit1[1], 0.2575, 1.0e-3), test-Tol-er-ance(fit 1[2][1],0.5383996, [10]
LaTeX Error: Environment maxima undefined.
See the LaTeX manual or LaTeX Companion for explanation. Type H <return> for immediate help. ...
l.280 \begin{maxima}
LaTeX Error: \begin{document} ended by \end{maxima}.
See the LaTeX manual or LaTeX Companion for explanation. Type H <return> for immediate help. ...
l.282 \end{maxima} \newpage [11]
LaTeX Warning: Characters dropped after `\end{verbatim}' on input line 288.
[12] (./3574856551635100996-16.0px.aux) ) (see the transcript file for additional information) Output written on 3574856551635100996-16.0px.dvi (12 pages, 8808 bytes). Transcript written on 3574856551635100996-16.0px.log.