[SciPy-dev] nbinom.ppf

Robert Kern robert.kern@gmail....
Mon Jul 27 14:55:27 CDT 2009

On Mon, Jul 27, 2009 at 14:47, Pierre GM<pgmdevlist@gmail.com> wrote:
> All,
> I'm puzzled by this result:
>  >>> from scipy.stats.distributions import nbinom
>  >>>  nbinom(.3,.15).ppf(nbinom(.3,.15).cdf(np.arange(20)))
> array([  1.,   2.,   2.,   3.,   5.,   5.,   6.,   8.,   9.,  10.,  11.,
>         12.,  13.,  14.,  15.,  16.,  17.,  18.,  19.,  20.])
> I would have naturally expected np.arange(20).

Floating point shenanigans. The CDF and PPF of discrete distributions
are step functions. Round-tripping involves evaluating the PPF around
the step. Naturally, floating point errors are going to nudge you to
the left or right of that step.

> Using np.round instead of np.ceil in nbinom_gen._ppf seems to solve
> the issue.
> Is there any reason not to do it ?

ceil() is correct; round() is not. round() would be okay if the only
inputs are expected to be outputs of the CDF, but one frequently needs
the PPF to take all values in [0,1], like for example doing random
number generation via inversion.

Robert Kern

"I have come to believe that the whole world is an enigma, a harmless
enigma that is made terrible by our own mad attempt to interpret it as
though it had an underlying truth."
  -- Umberto Eco

More information about the Scipy-dev mailing list