Opened 7 years ago

Closed 7 years ago

#11557 closed Bugs (fixed)

cdf error with non-central chi-squared with ncp = 0

Reported by: Mark Abney <maabney@…> Owned by: John Maddock
Milestone: Boost 1.60.0 Component: math
Version: Boost 1.59.0 Severity: Problem
Keywords: Cc:

Description

The complement of the cdf of the non-central chi-squared distribution with non-centrality parameter = 0 should return the same value as the standard (i.e. central) chi-squared distribution. For ncp very small, this happens, but when ncp = 0 it returns the negative of the (non-complement) cdf. Example code:

#include <iostream>
#include <boost/math/distributions.hpp>

using std::cout;
using std::cin;
using std::endl;

using boost::math::chi_squared;

int main(int argc, char *argv[])
{
    double df = 4, quantile = 12;
    cout << "df = " << df << endl;
    cout << "quantile = " << quantile << endl;

    chi_squared chi(df);
    cout << "chi.df = " << chi.degrees_of_freedom() << endl;
    cout << "P(X <= " << quantile << ") = " << cdf(chi, quantile) << endl;
    cout << "P(X > " << quantile << ") = " << cdf(complement(chi, quantile)) << endl;

    double ncp1 = 1e-300;
    double ncp2 = 0;

    boost::math::non_central_chi_squared nchi1(df, ncp1);
    boost::math::non_central_chi_squared nchi2(df, ncp2);
    cout << "nchi1.df = " << nchi1.degrees_of_freedom()
         << "; nchi1.ncp = " << nchi1.non_centrality() << endl;
    cout << "P(X <= " << quantile << ") = " << cdf(nchi1, quantile) << endl;
    cout << "P(X > " << quantile << ") = " << cdf(complement(nchi1, quantile)) << endl;
    cout << "nchi2.df = " << nchi2.degrees_of_freedom()
         << "; nchi2.ncp = " << nchi2.non_centrality() << endl;
    cout << "P(X <= " << quantile << ") = " << cdf(nchi2, quantile) << endl;
    cout << "P(X > " << quantile << ") = " << cdf(complement(nchi2, quantile)) << endl;
    
    return 0;
}

Note the output lines P(X > 12), which should all be equal. In the first two cases this is correct, but in the last one P(X > 12) = - P(X <= 12), which is necessarily wrong.

Change History (4)

comment:1 by Mark Abney <maabney@…>, 7 years ago

Component: Nonemath
Owner: set to John Maddock

comment:2 by Mark Abney <maabney@…>, 7 years ago

Version: Boost 1.57.0Boost 1.59.0

comment:3 by John Maddock, 7 years ago

Will investigate, thanks for the report.

comment:4 by John Maddock, 7 years ago

Milestone: To Be DeterminedBoost 1.60.0
Resolution: fixed
Status: newclosed
Note: See TracTickets for help on using tickets.