Skip to content

Commit f52d411

Browse files
committed
Changed check for non-positive support to check for negative support
1 parent 954b01d commit f52d411

File tree

1 file changed

+35
-34
lines changed

1 file changed

+35
-34
lines changed

pymc3/distributions/continuous.py

Lines changed: 35 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -38,23 +38,24 @@ def __init__(self, transform=transforms.logodds, *args, **kwargs):
3838
super(UnitContinuous, self).__init__(
3939
transform=transform, *args, **kwargs)
4040

41-
def assert_nonpos_support(var, label, distname):
41+
def assert_negative_support(var, label, distname, value=1e-6):
4242
# Checks for evidence of positive support for a variable
4343
if var is None:
4444
return
4545
try:
4646
# Transformed distribution
47-
support = np.isfinite(var.transformed.distribution.dist.logp(0).tag.test_value)
47+
support = np.isfinite(var.transformed.distribution.dist
48+
.logp(value).tag.test_value)
4849
except AttributeError:
4950
try:
5051
# Untransformed distribution
51-
support = np.isfinite(var.distribution.logp(0).tag.test_value)
52+
support = np.isfinite(var.distribution.logp(value).tag.test_value)
5253
except AttributeError:
5354
# Otherwise no direct evidence of non-positive support
5455
support = False
5556

5657
if np.any(support):
57-
msg = "The variable specified for {0} has non-positive support for {1}, ".format(label, distname)
58+
msg = "The variable specified for {0} has negative support for {1}, ".format(label, distname)
5859
msg += "likely making it unsuitable for this parameter."
5960
warnings.warn(msg)
6061

@@ -226,8 +227,8 @@ def __init__(self, *args, **kwargs):
226227
self.tau, self.sd = get_tau_sd(tau=tau, sd=sd)
227228
self.variance = 1. / self.tau
228229

229-
assert_nonpos_support(sd, 'sd', 'Normal')
230-
assert_nonpos_support(tau, 'tau', 'Normal')
230+
assert_negative_support_support(sd, 'sd', 'Normal')
231+
assert_negative_support_support(tau, 'tau', 'Normal')
231232

232233
super(Normal, self).__init__(**kwargs)
233234

@@ -276,8 +277,8 @@ def __init__(self, sd=None, tau=None, *args, **kwargs):
276277
self.mean = tt.sqrt(2 / (np.pi * self.tau))
277278
self.variance = (1. - 2 / np.pi) / self.tau
278279

279-
assert_nonpos_support(tau, 'tau', 'HalfNormal')
280-
assert_nonpos_support(sd, 'sd', 'HalfNormal')
280+
assert_negative_support_support(tau, 'tau', 'HalfNormal')
281+
assert_negative_support_support(sd, 'sd', 'HalfNormal')
281282

282283
def random(self, point=None, size=None, repeat=None):
283284
sd = draw_values([self.sd], point=point)
@@ -358,9 +359,9 @@ def __init__(self, mu=None, lam=None, phi=None, alpha=0., *args, **kwargs):
358359
- 1.5 * self.mu / self.lam) + alpha
359360
self.variance = (self.mu**3) / self.lam
360361

361-
assert_nonpos_support(phi, 'phi', 'Wald')
362-
assert_nonpos_support(mu, 'mu', 'Wald')
363-
assert_nonpos_support(lam, 'lam', 'Wald')
362+
assert_negative_support_support(phi, 'phi', 'Wald')
363+
assert_negative_support_support(mu, 'mu', 'Wald')
364+
assert_negative_support_support(lam, 'lam', 'Wald')
364365

365366
def get_mu_lam_phi(self, mu, lam, phi):
366367
if mu is None:
@@ -464,8 +465,8 @@ def __init__(self, alpha=None, beta=None, mu=None, sd=None,
464465
self.variance = alpha * beta / (
465466
(alpha + beta)**2 * (alpha + beta + 1))
466467

467-
assert_nonpos_support(alpha, 'alpha', 'Beta')
468-
assert_nonpos_support(beta, 'beta', 'Beta')
468+
assert_negative_support_support(alpha, 'alpha', 'Beta')
469+
assert_negative_support_support(beta, 'beta', 'Beta')
469470

470471
def get_alpha_beta(self, alpha=None, beta=None, mu=None, sd=None):
471472
if (alpha is not None) and (beta is not None):
@@ -526,7 +527,7 @@ def __init__(self, lam, *args, **kwargs):
526527

527528
self.variance = lam**-2
528529

529-
assert_nonpos_support(lam, 'lam', 'Exponential')
530+
assert_negative_support_support(lam, 'lam', 'Exponential')
530531

531532
def random(self, point=None, size=None, repeat=None):
532533
lam = draw_values([self.lam], point=point)
@@ -569,7 +570,7 @@ def __init__(self, mu, b, *args, **kwargs):
569570

570571
self.variance = 2 * b**2
571572

572-
assert_nonpos_support(b, 'b', 'Laplace')
573+
assert_negative_support_support(b, 'b', 'Laplace')
573574

574575
def random(self, point=None, size=None, repeat=None):
575576
mu, b = draw_values([self.mu, self.b], point=point)
@@ -624,8 +625,8 @@ def __init__(self, mu=0, sd=None, tau=None, *args, **kwargs):
624625
self.mode = tt.exp(mu - 1. / self.tau)
625626
self.variance = (tt.exp(1. / self.tau) - 1) * tt.exp(2 * mu + 1. / self.tau)
626627

627-
assert_nonpos_support(tau, 'tau', 'Lognormal')
628-
assert_nonpos_support(sd, 'sd', 'Lognormal')
628+
assert_negative_support_support(tau, 'tau', 'Lognormal')
629+
assert_negative_support_support(sd, 'sd', 'Lognormal')
629630

630631
def _random(self, mu, tau, size=None):
631632
samples = np.random.normal(size=size)
@@ -685,8 +686,8 @@ def __init__(self, nu, mu=0, lam=None, sd=None, *args, **kwargs):
685686
(1 / self.lam) * (nu / (nu - 2)),
686687
np.inf)
687688

688-
assert_nonpos_support(lam, 'lam (sd)', 'StudentT')
689-
assert_nonpos_support(nu, 'nu', 'StudentT')
689+
assert_negative_support_support(lam, 'lam (sd)', 'StudentT')
690+
assert_negative_support_support(nu, 'nu', 'StudentT')
690691

691692
def random(self, point=None, size=None, repeat=None):
692693
nu, mu, lam = draw_values([self.nu, self.mu, self.lam],
@@ -746,8 +747,8 @@ def __init__(self, alpha, m, *args, **kwargs):
746747
(alpha * m**2) / ((alpha - 2.) * (alpha - 1.)**2),
747748
np.inf)
748749

749-
assert_nonpos_support(alpha, 'alpha', 'Pareto')
750-
assert_nonpos_support(m, 'm', 'Pareto')
750+
assert_negative_support_support(alpha, 'alpha', 'Pareto')
751+
assert_negative_support_support(m, 'm', 'Pareto')
751752

752753

753754
def _random(self, alpha, m, size=None):
@@ -800,7 +801,7 @@ def __init__(self, alpha, beta, *args, **kwargs):
800801
self.median = self.mode = self.alpha = alpha
801802
self.beta = beta
802803

803-
assert_nonpos_support(beta, 'beta', 'Cauchy')
804+
assert_negative_support_support(beta, 'beta', 'Cauchy')
804805

805806
def _random(self, alpha, beta, size=None):
806807
u = np.random.uniform(size=size)
@@ -848,7 +849,7 @@ def __init__(self, beta, *args, **kwargs):
848849
self.median = beta
849850
self.beta = beta
850851

851-
assert_nonpos_support(beta, 'beta', 'HalfCauchy')
852+
assert_negative_support_support(beta, 'beta', 'HalfCauchy')
852853

853854
def _random(self, beta, size=None):
854855
u = np.random.uniform(size=size)
@@ -916,8 +917,8 @@ def __init__(self, alpha=None, beta=None, mu=None, sd=None,
916917
self.mode = tt.maximum((alpha - 1) / beta, 0)
917918
self.variance = alpha / beta**2
918919

919-
assert_nonpos_support(alpha, 'alpha', 'Gamma')
920-
assert_nonpos_support(beta, 'beta', 'Gamma')
920+
assert_negative_support_support(alpha, 'alpha', 'Gamma')
921+
assert_negative_support_support(beta, 'beta', 'Gamma')
921922

922923
def get_alpha_beta(self, alpha=None, beta=None, mu=None, sd=None):
923924
if (alpha is not None) and (beta is not None):
@@ -985,8 +986,8 @@ def __init__(self, alpha, beta=1, *args, **kwargs):
985986
self.variance = tt.switch(tt.gt(alpha, 2),
986987
(beta**2) / (alpha * (alpha - 1.)**2),
987988
np.inf)
988-
assert_nonpos_support(alpha, 'alpha', 'InverseGamma')
989-
assert_nonpos_support(beta, 'beta', 'InverseGamma')
989+
assert_negative_support_support(alpha, 'alpha', 'InverseGamma')
990+
assert_negative_support_support(beta, 'beta', 'InverseGamma')
990991

991992
def _calculate_mean(self):
992993
m = self.beta / (self.alpha - 1.)
@@ -1070,8 +1071,8 @@ def __init__(self, alpha, beta, *args, **kwargs):
10701071
self.variance = (beta**2) * \
10711072
tt.exp(gammaln(1 + 2. / alpha - self.mean**2))
10721073

1073-
assert_nonpos_support(alpha, 'alpha', 'Weibull')
1074-
assert_nonpos_support(beta, 'beta', 'Weibull')
1074+
assert_negative_support_support(alpha, 'alpha', 'Weibull')
1075+
assert_negative_support_support(beta, 'beta', 'Weibull')
10751076

10761077
def random(self, point=None, size=None, repeat=None):
10771078
alpha, beta = draw_values([self.alpha, self.beta],
@@ -1259,8 +1260,8 @@ def __init__(self, mu, sigma, nu, *args, **kwargs):
12591260
self.mean = mu + nu
12601261
self.variance = (sigma**2) + (nu**2)
12611262

1262-
assert_nonpos_support(sigma, 'sigma', 'ExGaussian')
1263-
assert_nonpos_support(nu, 'nu', 'ExGaussian')
1263+
assert_negative_support_support(sigma, 'sigma', 'ExGaussian')
1264+
assert_negative_support_support(nu, 'nu', 'ExGaussian')
12641265

12651266
def random(self, point=None, size=None, repeat=None):
12661267
mu, sigma, nu = draw_values([self.mu, self.sigma, self.nu],
@@ -1320,7 +1321,7 @@ def __init__(self, mu=0.0, kappa=None, transform='circular',
13201321
if transform == 'circular':
13211322
self.transform = transforms.Circular()
13221323

1323-
assert_nonpos_support(kappa, 'kappa', 'VonMises')
1324+
assert_negative_support_support(kappa, 'kappa', 'VonMises')
13241325

13251326
def random(self, point=None, size=None, repeat=None):
13261327
mu, kappa = draw_values([self.mu, self.kappa],
@@ -1377,8 +1378,8 @@ def __init__(self, mu=0.0, sd=None, tau=None, alpha=1, *args, **kwargs):
13771378
self.mean = mu + self.sd * (2 / np.pi)**0.5 * alpha / (1 + alpha**2)**0.5
13781379
self.variance = self.sd**2 * (1 - (2 * alpha**2) / ((1 + alpha**2) * np.pi))
13791380

1380-
assert_nonpos_support(tau, 'tau', 'SkewNormal')
1381-
assert_nonpos_support(sd, 'sd', 'SkewNormal')
1381+
assert_negative_support_support(tau, 'tau', 'SkewNormal')
1382+
assert_negative_support_support(sd, 'sd', 'SkewNormal')
13821383

13831384
def random(self, point=None, size=None, repeat=None):
13841385
mu, tau, sd, alpha = draw_values(

0 commit comments

Comments
 (0)