1
2
3
4
5
6
7
8
9 """Fixer for rdist in scipy
10 """
11
12 __docformat__ = 'restructuredtext'
13
14 from mvpa.base import externals, warning, cfg
15
16 if __debug__:
17 from mvpa.base import debug
18
19 if externals.exists('scipy', raiseException=True):
20 import scipy
21 import scipy.stats
22 import scipy.stats as stats
23
24 if not externals.exists('good scipy.stats.rdist'):
25 if __debug__:
26 debug("EXT", "Fixing up scipy.stats.rdist")
27
28
29 import numpy as N
30
31 from scipy.stats.distributions import rv_continuous
32 from scipy import special
33 import scipy.integrate
34
35
36
37
39 - def _pdf(self, x, c):
40 return N.power((1.0-x*x),c/2.0-1) / special.beta(0.5,c/2.0)
42
43 return 0.5 + x/special.beta(0.5,c/2.0)* \
44 special.hyp2f1(0.5,1.0-c/2.0,1.5,x*x)
46 return (1-(n % 2))*special.beta((n+1.0)/2,c/2.0)
47
48
49
50 rdist = rdist_gen(a=-1.0, b=1.0, name="rdist", longname="An R-distributed",
51 shapes="c", extradoc="""
52
53 R-distribution
54
55 rdist.pdf(x,c) = (1-x**2)**(c/2-1) / B(1/2, c/2)
56 for -1 <= x <= 1, c > 0.
57 """
58 )
59
60 if rdist.veccdf.nin == 1:
61 if __debug__:
62 debug("EXT", "Fixing up veccdf.nin to make 2 for rdist")
63 rdist.veccdf.nin = 2
64
65 scipy.stats.distributions.rdist_gen = scipy.stats.rdist_gen = rdist_gen
66 scipy.stats.distributions.rdist = scipy.stats.rdist = rdist
67
68 try:
69 externals.exists('good scipy.stats.rdist', force=True,
70 raiseException=True)
71 except RuntimeError:
72 warning("scipy.stats.rdist was not fixed with a monkey-patch. "
73 "It remains broken")
74
75 cfg.set('externals', 'have good scipy.stats.rdist', 'no')
76
77
78 if not externals.exists('good scipy.stats.rv_discrete.ppf'):
79
80
81 arr = N.asarray
82 from scipy.stats.distributions import valarray, argsreduce
83 from numpy import shape, place, any
84
85 - def ppf7(self,q,*args,**kwds):
86 """
87 Percent point function (inverse of cdf) at q of the given RV
88
89 Parameters
90 ----------
91 q : array-like
92 lower tail probability
93 arg1, arg2, arg3,... : array-like
94 The shape parameter(s) for the distribution (see docstring of the
95 instance object for more information)
96 loc : array-like, optional
97 location parameter (default=0)
98
99 Returns
100 -------
101 k : array-like
102 quantile corresponding to the lower tail probability, q.
103
104 """
105 loc = kwds.get('loc')
106 args, loc = self._rv_discrete__fix_loc(args, loc)
107 q,loc = map(arr,(q,loc))
108 args = tuple(map(arr,args))
109 cond0 = self._argcheck(*args) & (loc == loc)
110 cond1 = (q > 0) & (q < 1)
111 cond2 = (q==1) & cond0
112 cond = cond0 & cond1
113 output = valarray(shape(cond),value=self.badvalue,typecode='d')
114
115 place(output,(q==0)*(cond==cond), self.a-1)
116 place(output,cond2,self.b)
117 if any(cond):
118 goodargs = argsreduce(cond, *((q,)+args+(loc,)))
119 loc, goodargs = goodargs[-1], goodargs[:-1]
120 place(output,cond,self._ppf(*goodargs) + loc)
121
122 if output.ndim == 0:
123 return output[()]
124 return output
125
126 scipy.stats.distributions.rv_discrete.ppf = ppf7
127 try:
128 externals.exists('good scipy.stats.rv_discrete.ppf', force=True,
129 raiseException=True)
130 except RuntimeError:
131 warning("rv_discrete.ppf was not fixed with a monkey-patch. "
132 "It remains broken")
133 cfg.set('externals', 'have good scipy.stats.rv_discrete.ppf', 'no')
134