'Returns the value of the deviance function.
Parameters
endog : array-like
Endogenous response variable
mu : array-like
Fitted mean response variable
iweights : array-like
1d array of weights. The default is 1.
scale : float, optional
An optional scale argument. The default is 1.
Returns
deviance : float
Deviance function as defined below
Notes
.. math:
D = 2 * Y_i * \log(Y_i / \mu_i) - (2 / \alpha) *
(1 + \alpha * Y_i) * \ln(1 + \alpha * Y_i) / (1 + \alpha * \mu_i)'

def deviance(self, endog, mu, iweights=1.0, scale=1.0):

    endog_mu = self._clean((endog / mu))
    tmp = self._clean(((1 + (self.alpha * endog)) / (1 + (self.alpha * mu))))
    return (np.sum((iweights * (((2 * endog) * np.log(endog_mu)) - (((2 / self.alpha) * (1 + (self.alpha * endog))) * np.log(tmp))))) / scale)
