[section:nc_beta_dist Noncentral Beta Distribution]

``#include <boost/math/distributions/non_central_beta.hpp>``

   namespace boost{ namespace math{ 

   template <class RealType = double, 
             class ``__Policy``   = ``__policy_class`` >
   class non_central_beta_distribution;

   typedef non_central_beta_distribution<> non_central_beta;

   template <class RealType, class ``__Policy``>
   class non_central_beta_distribution
   {
   public:
      typedef RealType  value_type;
      typedef Policy    policy_type;

      // Constructor:
      non_central_beta_distribution(RealType alpha, RealType beta, RealType lambda);

      // Accessor to shape parameters:
      RealType alpha()const;
      RealType beta()const;

      // Accessor to non-centrality parameter lambda:
      RealType non_centrality()const;
   };
   
   }} // namespaces
   
The noncentral beta distribution is a generalization of the __beta_distrib.

It is defined as the ratio 
X = [chi][sub m][super 2]([lambda]) \/ ([chi][sub m][super 2]([lambda]) 
+ [chi][sub n][super 2])
where [chi][sub m][super 2]([lambda]) is a noncentral [chi][super 2]
random variable with /m/ degrees of freedom, and [chi][sub n][super 2]
is a central [chi][super 2] random variable with /n/ degrees of freedom.

This gives a PDF that can be expressed as a Poisson mixture
of beta distribution PDFs:

[equation nc_beta_ref1]

where P(i;[lambda]\/2) is the discrete Poisson probablity at /i/, with mean 
[lambda]\/2, and I[sub x][super ']([alpha], [beta]) is the derivative of
the incomplete beta function.  This leads to the usual form of the CDF
as:

[equation nc_beta_ref2]

The following graph illustrates how the distribution changes
for different values of [lambda]:

[graph nc_beta_pdf]

[h4 Member Functions]

      non_central_beta_distribution(RealType a, RealType b, RealType lambda);
      
Constructs a noncentral beta distribution with shape parameters /a/ and /b/
and non-centrality parameter /lambda/.

Requires a > 0, b > 0 and lambda >= 0, otherwise calls __domain_error.

      RealType alpha()const;
      
Returns the parameter /a/ from which this object was constructed.

      RealType beta()const;
      
Returns the parameter /b/ from which this object was constructed.

      RealType non_centrality()const;
      
Returns the parameter /lambda/ from which this object was constructed.

[h4 Non-member Accessors]

Most of the [link math_toolkit.dist.dist_ref.nmp usual non-member accessor functions]
are supported: __cdf, __pdf, __quantile, 
__median, __mode, __hazard, __chf, __range and __support.

However, the following are not currently implemented: 
__mean, __variance, __sd, __skewness, 
   __kurtosis and __kurtosis_excess.

The domain of the random variable is \[0, 1\].

[h4 Accuracy]

The following table shows the peak errors
(in units of [@http://en.wikipedia.org/wiki/Machine_epsilon epsilon]) 
found on various platforms with various floating point types. 
No comparison to the [@http://www.r-project.org/ R-2.5.1 Math library],
or to the FORTRAN implementations of AS226 or AS310 are given since these appear
to only guarantee absolute error: this would causes our test harness
to assign an /"infinite"/ error to these libraries for some of our
test values when measuring /relative error/.
Unless otherwise specified any floating-point type that is narrower
than the one shown will have __zero_error.

[table Errors In CDF of the Noncentral Beta
[[Significand Size] [Platform and Compiler] [[alpha], [beta],[lambda] < 200]  [[alpha],[beta],[lambda] > 200]]
[[53] [Win32, Visual C++ 8] [Peak=620 Mean=22]  [Peak=8670 Mean=1040]]
[[64] [RedHat Linux IA32, gcc-4.1.1] [Peak=825 Mean=50]  [Peak=2.5x10[super 4] Mean=4000]]

[[64] [Redhat Linux IA64, gcc-3.4.4] [Peak=825 Mean=30]  [Peak=1.7x10[super 4] Mean=2500]]

[[113] [HPUX IA64, aCC A.06.06] [Peak=420 Mean=50]  [Peak=9200 Mean=1200]]
]

Error rates for the PDF, the complement of the CDF and for the quantile 
functions are broadly similar.

[h4 Tests]

There are two sets of test data used to verify this implementation:
firstly we can compare with a few sample values generated by the
[@http://www.r-project.org/ R library].
Secondly, we have tables of test data, computed with this
implementation and using interval arithmetic - this data should
be accurate to at least 50 decimal digits - and is the used for
our accuracy tests.

[h4 Implementation]

The CDF and its complement are evaluated as follows:

First we determine which of the two values (the CDF or its
complement) is likely to be the smaller, the crossover point
is taken to be the mean of the distribution: for this we use the
approximation due to: R. Chattamvelli and R. Shanmugam, 
"Algorithm AS 310: Computing the Non-Central Beta Distribution Function",
Applied Statistics, Vol. 46, No. 1. (1997), pp. 146-156.

[equation nc_beta_ref3]

Then either the CDF or its complement is computed using the
relations:

[equation nc_beta_ref4]

The summation is performed by starting at i = [lambda]/2, and then recursing
in both directions, using the usual recurrence relations for the Poisson
PDF and incomplete beta functions.  This is the "Method 2" described
by:

Denise Benton and K. Krishnamoorthy,
"Computing discrete mixtures of continuous
distributions: noncentral chisquare, noncentral t
and the distribution of the square of the sample
multiple correlation coefficient", 
Computational Statistics & Data Analysis 43 (2003) 249-267.

Specific applications of the above formulae to the noncentral
beta distribution can be found in:

Russell V. Lenth,
"Algorithm AS 226: Computing Noncentral Beta Probabilities",
Applied Statistics, Vol. 36, No. 2. (1987), pp. 241-244.

H. Frick,
"Algorithm AS R84: A Remark on Algorithm AS 226: Computing Non-Central Beta
Probabilities", Applied Statistics, Vol. 39, No. 2. (1990), pp. 311-312.

Ming Long Lam,
"Remark AS R95: A Remark on Algorithm AS 226: Computing Non-Central Beta
Probabilities", Applied Statistics, Vol. 44, No. 4. (1995), pp. 551-552.

Harry O. Posten,
"An Effective Algorithm for the Noncentral Beta Distribution Function", 
The American Statistician, Vol. 47, No. 2. (May, 1993), pp. 129-131.

R. Chattamvelli,
"A Note on the Noncentral Beta Distribution Function",
The American Statistician, Vol. 49, No. 2. (May, 1995), pp. 231-234.

Of these, the Posten reference provides the most complete overview, 
and includes the modification starting iteration at [lambda]/2.

The main difference between this implementation and the above 
references is the direct computation of the complement when most
efficient to do so, and the accumulation of the sum to -1 rather
than subtracting the result from 1 at the end: this can substantially
reduce the number of iterations required when the result is near 1.

The PDF is computed using the methodology of Benton and Krishnamoorthy
and the relation:

[equation nc_beta_ref1]

Quantiles are computed using a specially modified version of
[link math_toolkit.toolkit.internals1.roots2 bracket_and_solve_root],
starting the search for the root at the mean of the distribution.
(A Cornish-Fisher type expansion was also tried, but while this gets
quite close to the root in many cases, when it is wrong it tends to
introduce quite pathological behaviour: more investigation in this
area is probably warranted).

[endsect][/section:nc_beta_dist]

[/ nc_beta.qbk
  Copyright 2008 John Maddock and Paul A. Bristow.
  Distributed under the Boost Software License, Version 1.0.
  (See accompanying file LICENSE_1_0.txt or copy at
  http://www.boost.org/LICENSE_1_0.txt).
]

