mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-10-30 20:40:28 -04:00 
			
		
		
		
	
		
			
	
	
		
			274 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			274 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|  | [section:nc_chi_squared_dist Noncentral Chi-Squared Distribution] | ||
|  | 
 | ||
|  | ``#include <boost/math/distributions/non_central_chi_squared.hpp>`` | ||
|  | 
 | ||
|  |    namespace boost{ namespace math{ | ||
|  | 
 | ||
|  |    template <class RealType = double, | ||
|  |              class ``__Policy``   = ``__policy_class`` > | ||
|  |    class non_central_chi_squared_distribution; | ||
|  | 
 | ||
|  |    typedef non_central_chi_squared_distribution<> non_central_chi_squared; | ||
|  | 
 | ||
|  |    template <class RealType, class ``__Policy``> | ||
|  |    class non_central_chi_squared_distribution | ||
|  |    { | ||
|  |    public: | ||
|  |       typedef RealType  value_type; | ||
|  |       typedef Policy    policy_type; | ||
|  | 
 | ||
|  |       // Constructor: | ||
|  |       non_central_chi_squared_distribution(RealType v, RealType lambda); | ||
|  | 
 | ||
|  |       // Accessor to degrees of freedom parameter v: | ||
|  |       RealType degrees_of_freedom()const; | ||
|  | 
 | ||
|  |       // Accessor to non centrality parameter lambda: | ||
|  |       RealType non_centrality()const; | ||
|  | 
 | ||
|  |       // Parameter finders: | ||
|  |       static RealType find_degrees_of_freedom(RealType lambda, RealType x, RealType p); | ||
|  |       template <class A, class B, class C> | ||
|  |       static RealType find_degrees_of_freedom(const complemented3_type<A,B,C>& c); | ||
|  | 
 | ||
|  |       static RealType find_non_centrality(RealType v, RealType x, RealType p); | ||
|  |       template <class A, class B, class C> | ||
|  |       static RealType find_non_centrality(const complemented3_type<A,B,C>& c); | ||
|  |    }; | ||
|  | 
 | ||
|  |    }} // namespaces | ||
|  | 
 | ||
|  | The noncentral chi-squared distribution is a generalization of the | ||
|  | __chi_squared_distrib. If X[sub i] are [nu] independent, normally | ||
|  | distributed random variables with means [mu][sub i] and variances | ||
|  | [sigma][sub i][super 2], then the random variable | ||
|  | 
 | ||
|  | [equation nc_chi_squ_ref1] | ||
|  | 
 | ||
|  | is distributed according to the noncentral chi-squared distribution. | ||
|  | 
 | ||
|  | The noncentral chi-squared distribution has two parameters: | ||
|  | [nu] which specifies the number of degrees of freedom | ||
|  | (i.e. the number of X[sub i]), and [lambda] which is related to the | ||
|  | mean of the random variables X[sub i] by: | ||
|  | 
 | ||
|  | [equation nc_chi_squ_ref2] | ||
|  | 
 | ||
|  | (Note that some references define [lambda] as one half of the above sum). | ||
|  | 
 | ||
|  | This leads to a PDF of: | ||
|  | 
 | ||
|  | [equation nc_chi_squ_ref3] | ||
|  | 
 | ||
|  | where ['f(x;k)] is the central chi-squared distribution PDF, and | ||
|  | ['I[sub v](x)] is a modified Bessel function of the first kind. | ||
|  | 
 | ||
|  | The following graph illustrates how the distribution changes | ||
|  | for different values of [lambda]: | ||
|  | 
 | ||
|  | [graph nccs_pdf] | ||
|  | 
 | ||
|  | [h4 Member Functions] | ||
|  | 
 | ||
|  |       non_central_chi_squared_distribution(RealType v, RealType lambda); | ||
|  | 
 | ||
|  | Constructs a Chi-Squared distribution with /v/ degrees of freedom | ||
|  | and non-centrality parameter /lambda/. | ||
|  | 
 | ||
|  | Requires v > 0 and lambda >= 0, otherwise calls __domain_error. | ||
|  | 
 | ||
|  |       RealType degrees_of_freedom()const; | ||
|  | 
 | ||
|  | Returns the parameter /v/ from which this object was constructed. | ||
|  | 
 | ||
|  |       RealType non_centrality()const; | ||
|  | 
 | ||
|  | Returns the parameter /lambda/ from which this object was constructed. | ||
|  | 
 | ||
|  | 
 | ||
|  |    static RealType find_degrees_of_freedom(RealType lambda, RealType x, RealType p); | ||
|  | 
 | ||
|  | This function returns the number of degrees of freedom /v/ such that: | ||
|  | `cdf(non_central_chi_squared<RealType, Policy>(v, lambda), x) == p` | ||
|  | 
 | ||
|  |    template <class A, class B, class C> | ||
|  |    static RealType find_degrees_of_freedom(const complemented3_type<A,B,C>& c); | ||
|  | 
 | ||
|  | When called with argument `boost::math::complement(lambda, x, q)` | ||
|  | this function returns the number of degrees of freedom /v/ such that: | ||
|  | 
 | ||
|  | `cdf(complement(non_central_chi_squared<RealType, Policy>(v, lambda), x)) == q`. | ||
|  | 
 | ||
|  |    static RealType find_non_centrality(RealType v, RealType x, RealType p); | ||
|  | 
 | ||
|  | This function returns the non centrality parameter /lambda/ such that: | ||
|  | 
 | ||
|  | `cdf(non_central_chi_squared<RealType, Policy>(v, lambda), x) == p` | ||
|  | 
 | ||
|  |    template <class A, class B, class C> | ||
|  |    static RealType find_non_centrality(const complemented3_type<A,B,C>& c); | ||
|  | 
 | ||
|  | When called with argument `boost::math::complement(v, x, q)` | ||
|  | this function returns the non centrality parameter /lambda/ such that: | ||
|  | 
 | ||
|  | `cdf(complement(non_central_chi_squared<RealType, Policy>(v, lambda), x)) == q`. | ||
|  | 
 | ||
|  | [h4 Non-member Accessors] | ||
|  | 
 | ||
|  | All the [link math_toolkit.dist_ref.nmp usual non-member accessor functions] | ||
|  | that are generic to all distributions are supported: __usual_accessors. | ||
|  | 
 | ||
|  | The domain of the random variable is \[0, +[infin]\]. | ||
|  | 
 | ||
|  | [h4 Examples] | ||
|  | 
 | ||
|  | There is a | ||
|  | [link math_toolkit.stat_tut.weg.nccs_eg worked example] | ||
|  | for the noncentral chi-squared distribution. | ||
|  | 
 | ||
|  | [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. | ||
|  | The failures in the comparison to the [@http://www.r-project.org/ R Math library], | ||
|  | seem to be mostly in the corner cases when the probablity would be very small. | ||
|  | Unless otherwise specified any floating-point type that is narrower | ||
|  | than the one shown will have __zero_error. | ||
|  | 
 | ||
|  | [table_non_central_chi_squared_CDF] | ||
|  | 
 | ||
|  | [table_non_central_chi_squared_CDF_complement] | ||
|  | 
 | ||
|  | Error rates for the quantile | ||
|  | functions are broadly similar.  Special mention should go to | ||
|  | the `mode` function: there is no closed form for this function, | ||
|  | so it is evaluated numerically by finding the maxima of the PDF: | ||
|  | in principal this can not produce an accuracy greater than the | ||
|  | square root of the machine epsilon. | ||
|  | 
 | ||
|  | [h4 Tests] | ||
|  | 
 | ||
|  | There are two sets of test data used to verify this implementation: | ||
|  | firstly we can compare with published data, for example with | ||
|  | Table 6 of "Self-Validating Computations of Probabilities for | ||
|  | Selected Central and Noncentral Univariate Probability Functions", | ||
|  | Morgan C. Wang and William J. Kennedy, | ||
|  | Journal of the American Statistical Association, | ||
|  | Vol. 89, No. 427. (Sep., 1994), pp. 878-887. | ||
|  | 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: for this we can use the | ||
|  | relation due to Temme (see "Asymptotic and Numerical Aspects of the | ||
|  | Noncentral Chi-Square Distribution", N. M. Temme, Computers Math. Applic. | ||
|  | Vol 25, No. 5, 55-63, 1993) that: | ||
|  | 
 | ||
|  | F([nu],[lambda];[nu]+[lambda]) [asymp] 0.5 | ||
|  | 
 | ||
|  | and so compute the CDF when the random variable is less than | ||
|  | [nu]+[lambda], and its complement when the random variable is | ||
|  | greater than [nu]+[lambda].  If necessary the computed result | ||
|  | is then subtracted from 1 to give the desired result (the CDF or its | ||
|  | complement). | ||
|  | 
 | ||
|  | For small values of the non centrality parameter, the CDF is computed | ||
|  | using the method of Ding (see "Algorithm AS 275: Computing the Non-Central | ||
|  | #2 Distribution Function", Cherng G. Ding, Applied Statistics, Vol. 41, | ||
|  | No. 2. (1992), pp. 478-482).  This uses the following series representation: | ||
|  | 
 | ||
|  | [equation nc_chi_squ_ref4] | ||
|  | 
 | ||
|  | which requires just one call to __gamma_p_derivative with the subsequent | ||
|  | terms being computed by recursion as shown above. | ||
|  | 
 | ||
|  | For larger values of the non-centrality parameter, Ding's method can take | ||
|  | an unreasonable number of terms before convergence is achieved.  Furthermore, | ||
|  | the largest term is not the first term, so in extreme cases the first term may | ||
|  | be zero, leading to a zero result, even though the true value may be non-zero. | ||
|  | 
 | ||
|  | Therefore, when the non-centrality parameter is greater than 200, the method due | ||
|  | to Krishnamoorthy (see "Computing discrete mixtures of continuous distributions: | ||
|  | noncentral chisquare, noncentral t and the distribution of the | ||
|  | square of the sample multiple correlation coefficient", | ||
|  | Denise Benton and K. Krishnamoorthy, Computational Statistics & | ||
|  | Data Analysis, 43, (2003), 249-267) is used. | ||
|  | 
 | ||
|  | This method uses the well known sum: | ||
|  | 
 | ||
|  | [equation nc_chi_squ_ref5] | ||
|  | 
 | ||
|  | Where P[sub a](x) is the incomplete gamma function. | ||
|  | 
 | ||
|  | The method starts at the [lambda]th term, which is where the Poisson weighting | ||
|  | function achieves its maximum value, although this is not necessarily | ||
|  | the largest overall term.  Subsequent terms are calculated via the normal | ||
|  | recurrence relations for the incomplete gamma function, and iteration proceeds | ||
|  | both forwards and backwards until sufficient precision has been achieved.  It | ||
|  | should be noted that recurrence in the forwards direction of P[sub a](x) is | ||
|  | numerically unstable.  However, since we always start /after/ the largest | ||
|  | term in the series, numeric instability is introduced more slowly than the | ||
|  | series converges. | ||
|  | 
 | ||
|  | Computation of the complement of the CDF uses an extension of Krishnamoorthy's | ||
|  | method, given that: | ||
|  | 
 | ||
|  | [equation nc_chi_squ_ref6] | ||
|  | 
 | ||
|  | we can again start at the [lambda]'th term and proceed in both directions from | ||
|  | there until the required precision is achieved.  This time it is backwards | ||
|  | recursion on the incomplete gamma function Q[sub a](x) which is unstable. | ||
|  | However, as long as we start well /before/ the largest term, this is not an | ||
|  | issue in practice. | ||
|  | 
 | ||
|  | The PDF is computed directly using the relation: | ||
|  | 
 | ||
|  | [equation nc_chi_squ_ref3] | ||
|  | 
 | ||
|  | Where ['f(x; v)] is the PDF of the central __chi_squared_distrib and | ||
|  | ['I[sub v](x)] is a modified Bessel function, see __cyl_bessel_i. | ||
|  | For small values of the | ||
|  | non-centrality parameter the relation in terms of __cyl_bessel_i | ||
|  | is used.  However, this method fails for large values of the | ||
|  | non-centrality parameter, so in that case the infinite sum is | ||
|  | evaluated using the method of Benton and Krishnamoorthy, and | ||
|  | the usual recurrence relations for successive terms. | ||
|  | 
 | ||
|  | The quantile functions are computed by numeric inversion of the CDF. | ||
|  | An improve starting quess is from | ||
|  | Thomas Luu, | ||
|  | [@http://discovery.ucl.ac.uk/1482128/, Fast and accurate parallel computation of quantile functions for random number generation, Doctorial Thesis, 2016]. | ||
|  | 
 | ||
|  | There is no [@http://en.wikipedia.org/wiki/Closed_form closed form] | ||
|  | for the mode of the noncentral chi-squared | ||
|  | distribution: it is computed numerically by finding the maximum | ||
|  | of the PDF.  Likewise, the median is computed numerically via | ||
|  | the quantile. | ||
|  | 
 | ||
|  | The remaining non-member functions use the following formulas: | ||
|  | 
 | ||
|  | [equation nc_chi_squ_ref7] | ||
|  | 
 | ||
|  | Some analytic properties of noncentral distributions | ||
|  | (particularly unimodality, and monotonicity of their modes) | ||
|  | are surveyed and summarized by: | ||
|  | 
 | ||
|  | Andrea van Aubel & Wolfgang Gawronski, Applied Mathematics and Computation, 141 (2003) 3-12. | ||
|  | 
 | ||
|  | [endsect] [/section:nc_chi_squared_dist] | ||
|  | 
 | ||
|  | [/ nc_chi_squared.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). | ||
|  | ] | ||
|  | 
 |