|
18 | 18 | nodes in PyMC.
|
19 | 19 | """
|
20 | 20 | import numpy as np
|
| 21 | +import theano |
21 | 22 | import theano.tensor as tt
|
22 | 23 | from scipy import stats
|
23 | 24 | from scipy.special import expit
|
@@ -3268,13 +3269,21 @@ def logp(self, value):
|
3268 | 3269 | sigma = self.sigma
|
3269 | 3270 | nu = self.nu
|
3270 | 3271 |
|
3271 |
| - # This condition suggested by exGAUS.R from gamlss |
3272 |
| - lp = tt.switch(tt.gt(nu, 0.05 * sigma), |
3273 |
| - - tt.log(nu) + (mu - value) / nu + 0.5 * (sigma / nu)**2 |
3274 |
| - + logpow(std_cdf((value - mu) / sigma - sigma / nu), 1.), |
3275 |
| - - tt.log(sigma * tt.sqrt(2 * np.pi)) |
3276 |
| - - 0.5 * ((value - mu) / sigma)**2) |
3277 |
| - return bound(lp, sigma > 0., nu > 0.) |
| 3272 | + standardized_val = (value - mu) / sigma |
| 3273 | + cdf_val = std_cdf(standardized_val - sigma / nu) |
| 3274 | + cdf_val_safe = tt.switch(tt.eq(cdf_val, 0), np.finfo(theano.config.floatX).eps, cdf_val) |
| 3275 | + |
| 3276 | + # This condition is suggested by exGAUS.R from gamlss |
| 3277 | + lp = tt.switch( |
| 3278 | + tt.gt(nu, 0.05 * sigma), |
| 3279 | + -tt.log(nu) |
| 3280 | + + (mu - value) / nu |
| 3281 | + + 0.5 * (sigma / nu) ** 2 |
| 3282 | + + logpow(cdf_val_safe, 1.0), |
| 3283 | + -tt.log(sigma * tt.sqrt(2 * np.pi)) - 0.5 * standardized_val ** 2, |
| 3284 | + ) |
| 3285 | + |
| 3286 | + return bound(lp, sigma > 0.0, nu > 0.0) |
3278 | 3287 |
|
3279 | 3288 | def _repr_latex_(self, name=None, dist=None):
|
3280 | 3289 | if dist is None:
|
|
0 commit comments