Source code for statsmodels.emplike.elanova

"""
This script contains empirical likelihood ANOVA.

Currently the script only contains one feature that allows the user to compare
means of multiple groups

General References
------------------

Owen, A. B. (2001). Empirical Likelihood. Chapman and Hall.
"""

from statsmodels.compat.python import range
import numpy as np
from .descriptive import _OptFuncts
from scipy import optimize
from scipy.stats import chi2


class _ANOVAOpt(_OptFuncts):
    """

    Class containing functions that are optimized over when
    conducting ANOVA

    """
    def _opt_common_mu(self, mu):
        """
        Optimizes the likelihood under the null hypothesis that all groups have
        mean mu

        Parameters
        ----------
        mu : float
            The common mean

        Returns
        -------
        llr : float
            -2 times the llr ratio, which is the test statistic
        """
        nobs = self.nobs
        endog = self.endog
        num_groups = self.num_groups
        endog_asarray = np.zeros((nobs, num_groups))
        obs_num = 0
        for arr_num in range(len(endog)):
            new_obs_num = obs_num + len(endog[arr_num])
            endog_asarray[obs_num: new_obs_num, arr_num] = endog[arr_num] - \
              mu
            obs_num = new_obs_num
        est_vect = endog_asarray
        wts = np.ones(est_vect.shape[0]) * (1. / (est_vect.shape[0]))
        eta_star = self._modif_newton(np.zeros(num_groups), est_vect, wts)
        denom = 1. + np.dot(eta_star, est_vect.T)
        self.new_weights = 1. / nobs * 1. / denom
        llr = np.sum(np.log(nobs * self.new_weights))
        return -2 * llr


[docs]class ANOVA(_ANOVAOpt): """ A class for ANOVA and comparing means. Parameters ---------- endog : list of arrays endog should be a list containing 1 dimensional arrays. Each array is the data collected from a certain group. """
[docs] def __init__(self, endog): self.endog = endog self.num_groups = len(self.endog) self.nobs = 0 for i in self.endog: self.nobs = self.nobs + len(i)
[docs] def compute_ANOVA(self, mu=None, mu_start=0, return_weights=0): """ Returns -2 log likelihood, the pvalue and the maximum likelihood estimate for a common mean. Parameters ---------- mu : float If a mu is specified, ANOVA is conducted with mu as the common mean. Otherwise, the common mean is the maximum empirical likelihood estimate of the common mean. Default is None. mu_start : float Starting value for commean mean if specific mu is not specified. Default = 0 return_weights : bool if TRUE, returns the weights on observations that maximize the likelihood. Default is FALSE Returns ------- res: tuple The log-likelihood, p-value and estimate for the common mean. """ if mu is not None: llr = self._opt_common_mu(mu) pval = 1 - chi2.cdf(llr, self.num_groups - 1) if return_weights: return llr, pval, mu, self.new_weights else: return llr, pval, mu else: res = optimize.fmin_powell(self._opt_common_mu, mu_start, full_output=1, disp=False) llr = res[1] mu_common = float(res[0]) pval = 1 - chi2.cdf(llr, self.num_groups - 1) if return_weights: return llr, pval, mu_common, self.new_weights else: return llr, pval, mu_common