Skip to content

Commit 8b65c66

Browse files
committed
suggested changes added
1 parent a6cc0ba commit 8b65c66

File tree

3 files changed

+40
-32
lines changed

3 files changed

+40
-32
lines changed

pymc3/distributions/continuous.py

Lines changed: 35 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1668,44 +1668,53 @@ class AsymmetricLaplace(Continuous):
16681668
16691669
The pdf of this distribution is
16701670
1671-
..math::
1671+
.. math::
16721672
{f(x|\\b,\kappa) =
16731673
\left({\frac{\\b}{\kappa + 1/\kappa}}\right)\,e^{-(x)\\b\,s\kappa ^{s}}}
1674-
where s = sgn(x)
1674+
1675+
where
1676+
1677+
.. math::
1678+
1679+
s = sgn(x)
1680+
1681+
======== ========================
1682+
Support :math:`x \in \mathbb{R}`
1683+
Mean :math:`\mu-\frac{\\\kappa-1/\kappa}b`
1684+
Variance :math:`\frac{1+\kappa^{4}}{b^2\kappa^2 }`
1685+
======== ========================
16751686
16761687
Parameters
16771688
----------
1678-
b:
1689+
b: float
16791690
Scale parameter (b > 0)
1680-
kappa:
1691+
kappa: float
16811692
Symmetry parameter (kappa > 0)
1693+
mu: float
1694+
Location parameter
16821695
1683-
See also: https://en.wikipedia.org/wiki/Asymmetric_Laplace_distribution
1696+
See Also:
1697+
--------
1698+
`Reference <https://en.wikipedia.org/wiki/Asymmetric_Laplace_distribution>`_
16841699
"""
16851700

1686-
def __init__(self, b, kappa, testval=0.0, *args, **kwargs):
1687-
self.b = tt.as_tensor_variable(b)
1688-
self.kappa = tt.as_tensor_variable(kappa)
1701+
def __init__(self, b, kappa, mu=0, *args, **kwargs):
1702+
self.b = tt.as_tensor_variable(floatX(b))
1703+
self.kappa = tt.as_tensor_variable(floatX(kappa))
1704+
self.mu = mu = tt.as_tensor_variable(floatX(mu))
16891705

1690-
super().__init__(*args, **kwargs, testval=testval)
1706+
self.mean = self.mu - (self.kappa - 1 / self.kappa) / b
1707+
self.variance = (1 + self.kappa ** 4) / (self.kappa ** 2 * self.b ** 2)
16911708

1692-
def _random(self, b, kappa, size=None):
1693-
if size is not None:
1694-
u = np.random.uniform(size=size)
1695-
x = -np.log((1 - u) * (1 + kappa ** 2)) / (kappa * b) * (
1696-
u > ((kappa ** 2) / (1 + kappa ** 2))
1697-
) + kappa * np.log(u * (1 + kappa ** 2) / (kappa ** 2)) / b * (
1698-
u < ((kappa ** 2) / (1 + kappa ** 2))
1699-
)
1700-
return x
1701-
1702-
u = np.random.uniform()
1703-
if u > (kappa ** 2) / (1 + kappa ** 2):
1704-
x = -np.log((1 - u) * (1 + kappa ** 2)) / (kappa * b)
1705-
else:
1706-
x = kappa * np.log(u * (1 + kappa ** 2) / (kappa ** 2)) / b
1709+
super().__init__(*args, **kwargs)
17071710

1708-
return x
1711+
def _random(self, b, kappa, size=None):
1712+
u = np.random.uniform(size=size)
1713+
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)
1716+
draws = non_positive_x * (u <= switch) + positive_x * (u > switch)
1717+
return draws
17091718

17101719
def random(self, point=None, size=None):
17111720
"""
@@ -1741,6 +1750,7 @@ def logp(self, value):
17411750
-------
17421751
TensorVariable
17431752
"""
1753+
value = value - self.mu
17441754
return bound(
17451755
tt.log(self.b / (self.kappa + (self.kappa ** -1)))
17461756
+ (-value * self.b * tt.sgn(value) * (self.kappa ** tt.sgn(value))),

pymc3/tests/test_distributions.py

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

222222

223-
def laplace_asymmetric_logpdf(value, kappa, b=None):
223+
def laplace_asymmetric_logpdf(value, kappa, b):
224224
kapinv = 1 / kappa
225-
lPx = value * np.where(value >= 0, -kappa, kapinv)
226-
lPx -= np.log(kappa + kapinv)
225+
lPx = value * b * np.where(value >= 0, -kappa, kapinv)
226+
lPx += np.log(b / (kappa + kapinv))
227227
return lPx
228228

229229

@@ -999,7 +999,7 @@ def test_laplace_asymmetric(self):
999999
self.pymc3_matches_scipy(
10001000
AsymmetricLaplace,
10011001
R,
1002-
{"b": Domain([0, 1, inf]), "kappa": Rplus},
1002+
{"b": Rplus, "kappa": Rplus},
10031003
laplace_asymmetric_logpdf,
10041004
)
10051005

pymc3/tests/test_distributions_random.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -642,9 +642,7 @@ def ref_rand(size, kappa, b):
642642

643643
return x
644644

645-
pymc3_random(
646-
pm.AsymmetricLaplace, {"b": Domain([0, 1, np.inf]), "kappa": Rplus}, ref_rand=ref_rand
647-
)
645+
pymc3_random(pm.AsymmetricLaplace, {"b": Rplus, "kappa": Rplus}, ref_rand=ref_rand)
648646

649647
def test_lognormal(self):
650648
def ref_rand(size, mu, tau):

0 commit comments

Comments
 (0)