[SciPy-user] Pb with scipy.stats
Youngsu Park
youngsu999 at gmail.com
Mon Nov 19 00:10:34 EST 2007
Hi,
In the scipy/stats directory, there is distribution.py file.
Several distribution is defined in it.
The betaprime is a instance of betaprime_gen that inherit rv_continuous.
The ppf method is not defined In betaprime_gen class.
## Beta Prime
class betaprime_gen(rv_continuous):
def _rvs(self, a, b):
u1 = gamma.rvs(a,size=self._size)
u2 = gamma.rvs(b,size=self._size)
return (u1 / u2)
def _pdf(self, x, a, b):
return 1.0/special.beta(a,b)*x**(a-1.0)/(1+x)**(a+b)
def _cdf(self, x, a, b):
x = where(x==1.0, 1.0-1e-6,x)
return pow(x,a)*special.hyp2f1(a+b,a,1+a,-x)/a/special.beta(a,b)
def _munp(self, n, a, b):
if (n == 1.0):
return where(b > 1, a/(b-1.0), inf)
elif (n == 2.0):
return where(b > 2, a*(a+1.0)/((b-2.0)*(b-1.0)), inf)
elif (n == 3.0):
return where(b > 3, a*(a+1.0)*(a+2.0)/((b-3.0)*(b-2.0)*(b-1.0)),
inf)
elif (n == 4.0):
return where(b > 4,
a*(a+1.0)*(a+2.0)*(a+3.0)/((b-4.0)*(b-3.0) \
*(b-2.0)*(b-1.0)), inf)
else:
raise NotImplementedError
betaprime = betaprime_gen(a=0.0, b=500.0, name='betaprime', shapes='a,b',
extradoc="""~~~""")
so it uses the rv_continuous class's method.
def ppf(self,q,*args,**kwds):
"""Percent point function (inverse of cdf) at q of the given RV.
*args
=====
The shape parameter(s) for the distribution (see docstring of the
instance object for more information)
**kwds
======
loc - location parameter (default=0)
scale - scale parameter (default=1)
"""
loc,scale=map(kwds.get,['loc','scale'])
args, loc, scale = self.__fix_loc_scale(args, loc, scale)
q,loc,scale = map(arr,(q,loc,scale))
args = tuple(map(arr,args))
cond0 = self._argcheck(*args) & (scale > 0) & (loc==loc)
cond1 = (q > 0) & (q < 1)
cond2 = (q==1) & cond0
cond = cond0 & cond1
output = valarray(shape(cond),value=self.a*scale + loc)
place(output,(1-cond0)+(1-cond1)*(q!=0.0), self.badvalue)
place(output,cond2,self.b*scale + loc)
goodargs = argsreduce(cond, *((q,)+args+(scale,loc)))
scale, loc, goodargs = goodargs[-2], goodargs[-1], goodargs[:-2]
place(output,cond,self._ppf(*goodargs)*scale + loc)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
return output
....
sgf = vectorize
self.vecfunc = sgf(self._ppf_single_call,otypes='d')
...
def _ppf(self, q, *args):
return self.vecfunc(q,*args)
~~~~~~~~~~~~~~~~~~~~
... def _ppf_single_call(self, q, *args):
return scipy.optimize.brentq(self._ppf_to_solve, self.xa,
self.xb, args=(q,)+args, xtol=self.xtol)
I'm not sure but I think that the problem comes from the vectorization
of defalut _ppf_single_call funstion.
But I don'k know how to fix it.
Is there someone to fix it?
More information about the SciPy-User
mailing list