Skip to content

Commit d333141

Browse files
committed
updated
1 parent 8b65c66 commit d333141

File tree

3 files changed

+22
-20
lines changed

3 files changed

+22
-20
lines changed

pymc3/distributions/continuous.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1669,14 +1669,14 @@ class AsymmetricLaplace(Continuous):
16691669
The pdf of this distribution is
16701670
16711671
.. math::
1672-
{f(x|\\b,\kappa) =
1673-
\left({\frac{\\b}{\kappa + 1/\kappa}}\right)\,e^{-(x)\\b\,s\kappa ^{s}}}
1672+
{f(x|\\b,\kappa,\mu) =
1673+
\left({\frac{\\b}{\kappa + 1/\kappa}}\right)\,e^{-(x-\mu)\\b\,s\kappa ^{s}}}
16741674
16751675
where
16761676
16771677
.. math::
16781678
1679-
s = sgn(x)
1679+
s = sgn(x-\mu)
16801680
16811681
======== ========================
16821682
Support :math:`x \in \mathbb{R}`
@@ -1706,13 +1706,16 @@ def __init__(self, b, kappa, mu=0, *args, **kwargs):
17061706
self.mean = self.mu - (self.kappa - 1 / self.kappa) / b
17071707
self.variance = (1 + self.kappa ** 4) / (self.kappa ** 2 * self.b ** 2)
17081708

1709+
assert_negative_support(kappa, "kappa", "AsymmetricLaplace")
1710+
assert_negative_support(b, "b", "AsymmetricLaplace")
1711+
17091712
super().__init__(*args, **kwargs)
17101713

1711-
def _random(self, b, kappa, size=None):
1714+
def _random(self, b, kappa, mu, size=None):
17121715
u = np.random.uniform(size=size)
17131716
switch = kappa ** 2 / (1 + kappa ** 2)
1714-
non_positive_x = kappa * np.log(u * (1 / switch)) / b
1715-
positive_x = -np.log((1 - u) * (1 + kappa ** 2)) / (kappa * b)
1717+
non_positive_x = mu + kappa * np.log(u * (1 / switch)) / b
1718+
positive_x = mu - np.log((1 - u) * (1 + kappa ** 2)) / (kappa * b)
17161719
draws = non_positive_x * (u <= switch) + positive_x * (u > switch)
17171720
return draws
17181721

@@ -1733,8 +1736,8 @@ def random(self, point=None, size=None):
17331736
-------
17341737
array
17351738
"""
1736-
b, kappa = draw_values([self.b, self.kappa], point=point, size=size)
1737-
return generate_samples(self._random, b, kappa, dist_shape=self.shape, size=size)
1739+
b, kappa, mu = draw_values([self.b, self.kappa, self.mu], point=point, size=size)
1740+
return generate_samples(self._random, b, kappa, mu, dist_shape=self.shape, size=size)
17381741

17391742
def logp(self, value):
17401743
"""

pymc3/tests/test_distributions.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -220,8 +220,9 @@ def build_model(distfam, valuedomain, vardomains, extra_args=None):
220220
return m
221221

222222

223-
def laplace_asymmetric_logpdf(value, kappa, b):
223+
def laplace_asymmetric_logpdf(value, kappa, b, mu):
224224
kapinv = 1 / kappa
225+
value = value - mu
225226
lPx = value * b * np.where(value >= 0, -kappa, kapinv)
226227
lPx += np.log(b / (kappa + kapinv))
227228
return lPx
@@ -999,7 +1000,7 @@ def test_laplace_asymmetric(self):
9991000
self.pymc3_matches_scipy(
10001001
AsymmetricLaplace,
10011002
R,
1002-
{"b": Rplus, "kappa": Rplus},
1003+
{"b": Rplus, "kappa": Rplus, "mu": R},
10031004
laplace_asymmetric_logpdf,
10041005
)
10051006

pymc3/tests/test_distributions_random.py

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -377,7 +377,7 @@ class TestLaplace(BaseTestCases.BaseTestCase):
377377

378378
class TestAsymmetricLaplace(BaseTestCases.BaseTestCase):
379379
distribution = pm.AsymmetricLaplace
380-
params = {"kappa": 1.0, "b": 1.0}
380+
params = {"kappa": 1.0, "b": 1.0, "mu": 0.0}
381381

382382

383383
class TestLognormal(BaseTestCases.BaseTestCase):
@@ -632,17 +632,15 @@ def ref_rand(size, mu, b):
632632
pymc3_random(pm.Laplace, {"mu": R, "b": Rplus}, ref_rand=ref_rand)
633633

634634
def test_laplace_asymmetric(self):
635-
def ref_rand(size, kappa, b):
635+
def ref_rand(size, kappa, b, mu):
636636
u = np.random.uniform(size=size)
637-
x = -np.log((1 - u) * (1 + kappa ** 2)) / (kappa * b) * (
638-
u > ((kappa ** 2) / (1 + kappa ** 2))
639-
) + kappa * np.log(u * (1 + kappa ** 2) / (kappa ** 2)) / b * (
640-
u < ((kappa ** 2) / (1 + kappa ** 2))
641-
)
642-
643-
return x
637+
switch = kappa ** 2 / (1 + kappa ** 2)
638+
non_positive_x = mu + kappa * np.log(u * (1 / switch)) / b
639+
positive_x = mu - np.log((1 - u) * (1 + kappa ** 2)) / (kappa * b)
640+
draws = non_positive_x * (u <= switch) + positive_x * (u > switch)
641+
return draws
644642

645-
pymc3_random(pm.AsymmetricLaplace, {"b": Rplus, "kappa": Rplus}, ref_rand=ref_rand)
643+
pymc3_random(pm.AsymmetricLaplace, {"b": Rplus, "kappa": Rplus, "mu": R}, ref_rand=ref_rand)
646644

647645
def test_lognormal(self):
648646
def ref_rand(size, mu, tau):

0 commit comments

Comments
 (0)