Exemplo n.º 1
0
    def _starting_variance_components(self, kind='equal'):
        """
        Starting variance components in optimization.
        Valid values:
        'minque0': Starting values are those from MINQUE with all weights
            set equal to 0 except for the residual variance, which is set
            to 1. This is the default method used by SAS's PROC MIXED.
        'minque1': Starting values are those from MINQUE with all weights
            set equal to 1
        'ols': Starting values are all 0 except residual, which is 
            var(y - X*Beta)
        'EM': the starting values are the variance components after
            100 iterations of expectation-maximization REML (started from all
            equal values).
        'equal': Chooses all variance components (including residual)
            to be equal.
        """

        if kind.lower() == 'minque0':
            return minque(self, value=0, return_after=1, return_vcs=True)

        if kind.lower() == 'minque1':
            return minque(self, value=1, return_after=1, return_vcs=True)

        if kind.lower() == 'minquemean':
            zero = minque(self, value=0, return_after=1, return_vcs=True)
            one = minque(self, value=1, return_after=1, return_vcs=True)
            return (zero + one) / 2.0

        if kind.lower() == 'ols':
            vcs_start = np.zeros(len(self.random_effects))
            vcs_start[-1] = self._variance_after_fixefs()
            return vcs_start

        if kind.lower() == 'equal':
            v = self._variance_after_fixefs()
            n = len(self.random_effects)
            vcs_start = [v/float(n)] * n
            return vcs_start

        if kind.lower() == 'em':
            starts = self._starting_variance_components('equal')
            vcs_start = expectation_maximization(self,
                                                 starts=starts,
                                                 return_after=100)
            return vcs_start.parameters
        else:
            raise ValueError('Unknown method: {}'.format(kind))
Exemplo n.º 2
0
    def maximize(self, method="Average Information", restricted=False,
                 starts=None, verbose=False):
        """
        Finds the optimal values for variance components of the model by
        restricted maximum likelihood estimation.
        """

        if (isinstance(self.mle, MLEResult) and
                self.maximized.method == method):
            return
        self.fit_model()

        if starts is None:
            starts = self._starting_variance_components()

        likefunc = REML if restricted else ML
        llik = likefunc(self, info=method)
        llik.set_parameters(starts)

        if method.lower().startswith('minque'):
            mle = minque(self, value=0, verbose=verbose, starts=starts)

        elif method.lower() in {'em', 'emreml', 'expectation-maximization'}:
            mle = expectation_maximization(self, llik, verbose=verbose)

        elif method.lower() == 'grid':
            mle = grid_search(self, llik, nevals=20, oob=False)

        else:
            mle = newtonlike_maximization(self, llik, verbose=verbose)

        self.mle = mle
        self.set_variance_components(mle.parameters)
        self.fit_model()

        # Get the full loglikelihood at the REML maximimum so we
        # can use it later
        self.mle.full_loglikelihood = full_loglikelihood(self.y, self.V,
                                                         self.X, self.beta)