/*************************************************************************
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;
}
Example #2
0
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;

  }


}
Example #3
0
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;
}
Example #6
0
/*************************************************************************
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;
}