[SciPy-user] Strange discontinuity in noncentral chisquare

josef.pktd at gmail.com josef.pktd at gmail.com
Thu May 28 14:53:31 EDT 2009


On Thu, May 28, 2009 at 1:56 PM, Neal Becker <ndbecker2 at gmail.com> wrote:
> def pmiss2 (x, esnodB, N):
>    esno = 10**(0.1 * esnodB) * N
>    var = 1/esno
>    _lambda = 1/(0.5*var)
>
>    return ncx2.cdf (x, 2, _lambda)
>
> x = np.arange (0, 50, 0.1)
> p1 = [pmiss2 (e, 3.5, 24) for e in x]
>
> What's with this strange discontinuity?
> print p1:
> ...
> 3.475382846574262e-21,
>  4.2226227741362447e-21,
>  5.1248671653198949e-21,
>  6.2130949241675783e-21,
>  7.5242411687161146e-21,
>  9.1022970542215721e-21,
>  5.8787514615651664e-09,
>  6.2565279721932619e-09,
>  6.656924144742753e-09,
>  7.0811937641411923e-09,
>  7.5306544171300622e-09,
>  8.0066904400027596e-09,
>  8.5107559880675483e-09,
>  9.044378231221098e-09,
>  9.6091606801490766e-09,
> ...
>

This must be a bug in scipy.special.chndtr

class ncx2_gen(rv_continuous):

    def _cdf(self, x, df, nc):
        return special.chndtr(x,df,nc)

here is the isolated example

>>> ncx2.cdf (np.arange (20, 25, 0.2), 2, 1.07458615e+02)
array([  8.53614872e-23,   1.31445107e-22,   2.01359832e-22,
         3.06896021e-22,   4.65417198e-22,   7.02373115e-22,
         1.05489191e-21,   1.57689175e-21,   2.34632278e-21,
         3.47538283e-21,   5.12486714e-21,   7.52424113e-21,
         5.87875088e-09,   6.65692349e-09,   7.53065368e-09,
         8.51075516e-09,   9.60915975e-09,   1.08390218e-08,
         1.22148313e-08,   1.37525362e-08,   1.54696748e-08,
         1.73854823e-08,   1.95211903e-08,   2.18999761e-08,
         2.45472869e-08])

this uses numerical integration of the pdf, which is slow but doesn't
have the discontinuity

>>> ncx2.veccdf(np.arange (20, 25, 0.2), 2, 1.07458615e+02)
array([  1.21805117e-09,   1.39734318e-09,   1.60114784e-09,
         1.83255976e-09,   2.09503169e-09,   2.39241204e-09,
         2.72898607e-09,   3.10952087e-09,   3.53931444e-09,
         4.02424929e-09,   4.57085090e-09,   5.18635130e-09,
         5.87875834e-09,   6.65693102e-09,   7.53066129e-09,
         8.51076283e-09,   9.60916749e-09,   1.08390296e-08,
         1.22148392e-08,   1.37525442e-08,   1.54696828e-08,
         1.73855268e-08,   1.95212353e-08,   2.19000216e-08,
         2.45473328e-08])


Thanks for reporting, the test suite is not so fine tuned to catch these cases.

The quick fix would be to replace the call to special with the
numerical integration, but this will make the cdf much slower ( for
the cases where it is correct). I did this for some other
distributions.
But for the use as the distribution of a test statistic the jump is
irrelevant, if you reject a hypotheses with 1e-9 or 1e-21 doesn't
really make a difference.



Josef



More information about the SciPy-User mailing list