Search code examples
pythonpython-2.7mathematical-packages

python error using PaCal statistical package


I recently started exploring Python and have encountred a problem with a package named PaCal

Everything looks to be working fine except that I keep having this error anytime I want to print out some data (like in print A.mean() ) the error line is :

Traceback (most recent call last):
  File "C:\Users\rmobenta\Desktop\tt.py", line 12, in <module>
    print A.interval(0.95)
  File "C:\Python27\lib\site-packages\pacal\distr.py", line 229, in interval
    return self.quantile(p_lim), self.quantile(1.0 - p_lim)
  File "C:\Python27\lib\site-packages\pacal\distr.py", line 215, in quantile
    return self.get_piecewise_cdf().inverse(y)
  File "C:\Python27\lib\site-packages\pacal\segments.py", line 1721, in inverse
    x = findinv(segi.f,  a = segi.a, b = segi.b, c = y, rtol = params.segments.cumint.reltol, maxiter = params.segments.cumint.maxiter) # TODO PInd, MInf
  File "C:\Python27\lib\site-packages\pacal\utils.py", line 384, in findinv
    return brentq(lambda x : fun(x) - c, a, b, **kwargs)
  File "C:\Python27\lib\site-packages\scipy\optimize\zeros.py", line 414, in brentq
    raise ValueError("rtol too small (%g < %g)" % (rtol, _rtol))
ValueError: rtol too small (1e-16 < 4.44089e-16)

I am using a two-line script that I got for a demo (given by the author of this package) and have no idea how to tackle this issue.

Here is the script:

from pacal import *
Y = UniformDistr(1, 2)
X = UniformDistr(3, 4)
A = atan(Y / X)
A.plot()

print A.mean()
print A.interval(0.95)

Solution

  • The problem comes from PaCal that defines in l.141 of params.py: segments.vumint.reltol = 1e-16.

    This is the value passed as rtol in segments.py to the SciPy function brentq().

    Finally it is compared to numpy.finfo(float).eps * 2 (l.413 and l.10 of scipy/optimize/zeros.py) and is unfortunately lesser.

    So it could be a problem of PaCal implementation, not related to your code.

    Note that the value you provided to interval() corresponds to the default value (l.222 of distr.py).

    I think you should contact the PaCal developers to get more informations and probably open an issue.