Source code for spint.dispersion

"""
Various functions to test hypotheses regarding the dispersion of the variance of
a variable.

"""

__author__ = "Taylor Oshan tayoshan@gmail.com"

from spglm.glm import GLM
from spglm.family import Poisson
import numpy as np
import scipy.stats as stats
from types import FunctionType


[docs]def phi_disp(model): """ Test the hypothesis that var[y] = mu (equidispersion) against the alternative hypothesis (quasi-Poisson) that var[y] = phi * mu where mu is the expected value of y and phi is an estimated overdispersion coefficient which is equivalent to 1+alpha in the alternative alpha dispersion test. phi > 0: overdispersion phi = 1: equidispersion phi < 0: underdispersion Parameters ---------- model : Model results class function can only be called on a sucessfully fitted model which has a valid response variable, y, and a valid predicted response variable, yhat. alt_var : function specifies an alternative varaince as a function of mu. Function must take a single scalar as input and return a single scalar as output Returns ------- array : [alpha coefficient, tvalue of alpha, pvalue of alpha] """ try: y = model.y.reshape((-1, 1)) yhat = model.yhat.reshape((-1, 1)) ytest = (((y - yhat)**2 - y) / yhat).reshape((-1, 1)) except BaseException: raise AttributeError( "Check that fitted model has valid 'y' and 'yhat' attributes") phi = 1 + np.mean(ytest) zval = np.sqrt(len(ytest)) * np.mean(ytest) / np.std(ytest, ddof=1) pval = stats.norm.sf(zval) return np.array([phi, zval, pval])
[docs]def alpha_disp(model, alt_var=lambda x: x): """ Test the hypothesis that var[y] = mu (equidispersion) against the alternative hypothesis that var[y] = mu + alpha * alt_var(mu) where mu is the expected value of y, alpha is an estimated coefficient, and alt_var() specifies an alternative variance as a function of mu. alt_var=lambda x:x corresponds to an alternative hypothesis of a negative binomimal model with a linear variance function and alt_var=lambda x:x**2 correspinds to an alternative hypothesis of a negative binomial model with a quadratic varaince function. alpha > 0: overdispersion alpha = 1: equidispersion alpha < 0: underdispersion Parameters ---------- model : Model results class function can only be called on a sucessfully fitted model which has a valid response variable, y, and a valid predicted response variable, yhat. alt_var : function specifies an alternative varaince as a function of mu. Function must take a single scalar as input and return a single scalar as output Returns ------- array : [alpha coefficient, tvalue of alpha, pvalue of alpha] """ try: y = model.y.reshape((-1, 1)) yhat = model.yhat.reshape((-1, 1)) ytest = (((y - yhat)**2 - y) / yhat).reshape((-1, 1)) except BaseException: raise AttributeError( "Make sure model passed has been estimated and has a valid 'y' and 'yhat' attribute") if isinstance(alt_var, FunctionType): X = (alt_var(yhat) / yhat).reshape((-1, 1)) test_results = GLM(ytest, X, constant=False).fit() alpha = test_results.params[0] zval = test_results.tvalues[0] pval = stats.norm.sf(zval) else: raise TypeError( "The alternative variance function, 'alt_var', must be a valid function'") return np.array([alpha, zval, pval])