@@ -727,35 +727,33 @@ def NegBinom(a, m, x):
727
727
728
728
@classmethod
729
729
def dist (cls , mu = None , alpha = None , p = None , n = None , * args , ** kwargs ):
730
- mu , alpha = cls .get_mu_alpha (mu , alpha , p , n )
731
- mu = aet .as_tensor_variable (floatX (mu ))
732
- alpha = aet .as_tensor_variable (floatX (alpha ))
733
- # mode = intX(aet.floor(mu))
734
- return super ().dist ([mu , alpha ], * args , ** kwargs )
730
+ n , p = cls .get_mu_alpha (mu , alpha , p , n )
731
+ n = aet .as_tensor_variable (floatX (n ))
732
+ p = aet .as_tensor_variable (floatX (p ))
733
+ return super ().dist ([n , p ], * args , ** kwargs )
735
734
736
735
@classmethod
737
736
def get_mu_alpha (cls , mu = None , alpha = None , p = None , n = None ):
738
- if alpha is None :
739
- if n is not None :
740
- n = aet .as_tensor_variable (intX (n ))
741
- alpha = n
737
+ if n is None :
738
+ if alpha is not None :
739
+ n = aet .as_tensor_variable (floatX (alpha ))
742
740
else :
743
741
raise ValueError ("Incompatible parametrization. Must specify either alpha or n." )
744
- elif n is not None :
742
+ elif alpha is not None :
745
743
raise ValueError ("Incompatible parametrization. Can't specify both alpha and n." )
746
744
747
- if mu is None :
748
- if p is not None :
749
- p = aet .as_tensor_variable (floatX (p ))
750
- mu = alpha * ( 1 - p ) / p
745
+ if p is None :
746
+ if mu is not None :
747
+ mu = aet .as_tensor_variable (floatX (mu ))
748
+ p = n / ( mu + n )
751
749
else :
752
750
raise ValueError ("Incompatible parametrization. Must specify either mu or p." )
753
- elif p is not None :
751
+ elif mu is not None :
754
752
raise ValueError ("Incompatible parametrization. Can't specify both mu and p." )
755
753
756
- return mu , alpha
754
+ return n , p
757
755
758
- def logp (value , mu , alpha ):
756
+ def logp (value , n , p ):
759
757
r"""
760
758
Calculate log-probability of NegativeBinomial distribution at specified value.
761
759
@@ -769,6 +767,8 @@ def logp(value, mu, alpha):
769
767
-------
770
768
TensorVariable
771
769
"""
770
+ alpha = n
771
+ mu = alpha * (1 - p ) / p
772
772
negbinom = bound (
773
773
binomln (value + alpha - 1 , value )
774
774
+ logpow (mu / (mu + alpha ), value )
@@ -779,9 +779,9 @@ def logp(value, mu, alpha):
779
779
)
780
780
781
781
# Return Poisson when alpha gets very large.
782
- return aet .switch (aet .gt (alpha , 1e10 ), Poisson .dist ( mu ). logp (value ), negbinom )
782
+ return aet .switch (aet .gt (alpha , 1e10 ), Poisson .logp (value , mu ), negbinom )
783
783
784
- def logcdf (value , mu , alpha ):
784
+ def logcdf (value , n , p ):
785
785
"""
786
786
Compute the log of the cumulative distribution function for NegativeBinomial distribution
787
787
at the specified value.
@@ -801,20 +801,14 @@ def logcdf(value, mu, alpha):
801
801
f"NegativeBinomial.logcdf expects a scalar value but received a { np .ndim (value )} -dimensional object."
802
802
)
803
803
804
- # TODO: avoid `p` recomputation if distribution was defined in terms of `p`
805
- p = alpha / (mu + alpha )
806
-
807
804
return bound (
808
- aet .log (incomplete_beta (alpha , aet .floor (value ) + 1 , p )),
805
+ aet .log (incomplete_beta (n , aet .floor (value ) + 1 , p )),
809
806
0 <= value ,
810
- 0 < alpha ,
807
+ 0 < n ,
811
808
0 <= p ,
812
809
p <= 1 ,
813
810
)
814
811
815
- def _distr_parameters_for_repr (self ):
816
- return self ._param_type
817
-
818
812
819
813
class Geometric (Discrete ):
820
814
R"""
0 commit comments