/************************************************************************* Binomial distribution Returns the sum of the terms 0 through k of the Binomial probability density: k -- ( n ) j n-j > ( ) p (1-p) -- ( j ) j=0 The terms are not summed directly; instead the incomplete beta integral is employed, according to the formula y = bdtr( k, n, p ) = incbet( n-k, k+1, 1-p ). The arguments must be positive, with p ranging from 0 to 1. ACCURACY: Tested at random points (a,b,p), with p between 0 and 1. a,b Relative error: arithmetic domain # trials peak rms For p between 0.001 and 1: IEEE 0,100 100000 4.3e-15 2.6e-16 Cephes Math Library Release 2.8: June, 2000 Copyright 1984, 1987, 1995, 2000 by Stephen L. Moshier *************************************************************************/ double binomialdistribution(int k, int n, double p) { double result; double dk; double dn; ap::ap_error::make_assertion(ap::fp_greater_eq(p,0)&&ap::fp_less_eq(p,1), "Domain error in BinomialDistribution"); ap::ap_error::make_assertion(k>=-1&&k<=n, "Domain error in BinomialDistribution"); if( k==-1 ) { result = 0; return result; } if( k==n ) { result = 1; return result; } dn = n-k; if( k==0 ) { dk = pow(1.0-p, dn); } else { dk = k+1; dk = incompletebeta(dn, dk, 1.0-p); } result = dk; return result; }
void MyEff(double n, double N, double& eff, double& errp, double& errn) { TF1* gaus = new TF1("gaus","TMath::Gaus(x,0,1,1)"); double lowerB = gaus->Integral(-1,0); double upperB = 1- lowerB; eff = n/N; if(n > N) { errp = errn = -999; return; } double a = n+1; double b = N-n+1; double integralPeak = incompletebeta(a, b, eff); if(integralPeak >= lowerB && integralPeak <= upperB) { double xmin = inverseBeta(integralPeak - lowerB, a, b); double xmax = inverseBeta(integralPeak + lowerB, a, b); errp = xmax-eff; errn = eff-xmin; return; } else if(integralPeak < lowerB) { double xmax = inverseBeta(2*lowerB, a, b); errp = xmax-eff; errn = eff; return; } else if(integralPeak > upperB) { double xmin = inverseBeta(1-2*lowerB, a, b); errp = 1-eff; errn = eff-xmin; return; } else{ cout << "There is a bug !!!" << endl; errp = errn = -999; return; } }
double inverseBeta(double p, double alpha, double beta, double A, double B) { double x = 0; double a = 0; double b = 1; A=0; B=1; double precision = DBL_EPSILON; // converge until there is 6 decimal places precision while ((b - a) > precision) { x = (a + b) / 2; if (incompletebeta(alpha, beta, x) > p) { b = x; } else { a = x; } } if ((B > 0) && (A > 0)) { x = x * (B - A) + A; } return x; }
/************************************************************************* Complemented binomial distribution Returns the sum of the terms k+1 through n of the Binomial probability density: n -- ( n ) j n-j > ( ) p (1-p) -- ( j ) j=k+1 The terms are not summed directly; instead the incomplete beta integral is employed, according to the formula y = bdtrc( k, n, p ) = incbet( k+1, n-k, p ). The arguments must be positive, with p ranging from 0 to 1. ACCURACY: Tested at random points (a,b,p). a,b Relative error: arithmetic domain # trials peak rms For p between 0.001 and 1: IEEE 0,100 100000 6.7e-15 8.2e-16 For p between 0 and .001: IEEE 0,100 100000 1.5e-13 2.7e-15 Cephes Math Library Release 2.8: June, 2000 Copyright 1984, 1987, 1995, 2000 by Stephen L. Moshier *************************************************************************/ double binomialcdistribution(int k, int n, double p) { double result; double dk; double dn; ap::ap_error::make_assertion(p>=0&&p<=1, "Domain error in BinomialDistributionC"); ap::ap_error::make_assertion(k>=-1&&k<=n, "Domain error in BinomialDistributionC"); if( k==-1 ) { result = 1; return result; } if( k==n ) { result = 0; return result; } dn = n-k; if( k==0 ) { if( p<0.01 ) { dk = -expm1(dn*log1p(-p)); } else { dk = 1.0-pow(1.0-p, dn); } } else { dk = k+1; dk = incompletebeta(dk, dn, p); } result = dk; return result; }
/************************************************************************* Inverse binomial distribution Finds the event probability p such that the sum of the terms 0 through k of the Binomial probability density is equal to the given cumulative probability y. This is accomplished using the inverse beta integral function and the relation 1 - p = incbi( n-k, k+1, y ). ACCURACY: Tested at random points (a,b,p). a,b Relative error: arithmetic domain # trials peak rms For p between 0.001 and 1: IEEE 0,100 100000 2.3e-14 6.4e-16 IEEE 0,10000 100000 6.6e-12 1.2e-13 For p between 10^-6 and 0.001: IEEE 0,100 100000 2.0e-12 1.3e-14 IEEE 0,10000 100000 1.5e-12 3.2e-14 Cephes Math Library Release 2.8: June, 2000 Copyright 1984, 1987, 1995, 2000 by Stephen L. Moshier *************************************************************************/ double invbinomialdistribution(int k, int n, double y) { double result; double dk; double dn; double p; ap::ap_error::make_assertion(p>=0&&p<=1, "Domain error in InvBinomialDistribution"); ap::ap_error::make_assertion(k>=0&&k<n, "Domain error in InvBinomialDistribution"); dn = n-k; if( k==0 ) { if( y>0.8 ) { p = -expm1(log1p(y-1.0)/dn); } else { p = 1.0-pow(y, 1.0/dn); } } else { dk = k+1; p = incompletebeta(dn, dk, 0.5); if( p>0.5 ) { p = invincompletebeta(dk, dn, 1.0-y); } else { p = 1.0-invincompletebeta(dn, dk, y); } } result = p; return result; }
/************************************************************************* Student's t distribution Computes the integral from minus infinity to t of the Student t distribution with integer k > 0 degrees of freedom: t - | | - | 2 -(k+1)/2 | ( (k+1)/2 ) | ( x ) ---------------------- | ( 1 + --- ) dx - | ( k ) sqrt( k pi ) | ( k/2 ) | | | - -inf. Relation to incomplete beta integral: 1 - stdtr(k,t) = 0.5 * incbet( k/2, 1/2, z ) where z = k/(k + t**2). For t < -2, this is the method of computation. For higher t, a direct method is derived from integration by parts. Since the function is symmetric about t=0, the area under the right tail of the density is found by calling the function with -t instead of t. ACCURACY: Tested at random 1 <= k <= 25. The "domain" refers to t. Relative error: arithmetic domain # trials peak rms IEEE -100,-2 50000 5.9e-15 1.4e-15 IEEE -2,100 500000 2.7e-15 4.9e-17 Cephes Math Library Release 2.8: June, 2000 Copyright 1984, 1987, 1995, 2000 by Stephen L. Moshier *************************************************************************/ double studenttdistribution(int k, double t) { double result; double x; double rk; double z; double f; double tz; double p; double xsqk; int j; ap::ap_error::make_assertion(k>0); if( t==0 ) { result = 0.5; return result; } if( t<-2.0 ) { rk = k; z = rk/(rk+t*t); result = 0.5*incompletebeta(0.5*rk, 0.5, z); return result; } if( t<0 ) { x = -t; } else { x = t; } rk = k; z = 1.0+x*x/rk; if( k%2!=0 ) { xsqk = x/sqrt(rk); p = atan(xsqk); if( k>1 ) { f = 1.0; tz = 1.0; j = 3; while(j<=k-2&&tz/f>ap::machineepsilon) { tz = tz*((j-1)/(z*j)); f = f+tz; j = j+2; } p = p+f*xsqk/z; } p = p*2.0/ap::pi(); } else { f = 1.0; tz = 1.0; j = 2; while(j<=k-2&&tz/f>ap::machineepsilon) { tz = tz*((j-1)/(z*j)); f = f+tz; j = j+2; } p = f*x/sqrt(z*rk); } if( t<0 ) { p = -p; } result = 0.5+0.5*p; return result; }