[R] loglikelihood and lmer

Douglas Bates bates at stat.wisc.edu
Sat Apr 1 22:20:02 CEST 2006


On 3/31/06, Marco Geraci <marcodoc75 at yahoo.com> wrote:
> Dear R users,
> I am estimating Poisson mixed models using glmmPQL
> (MASS) and lmer (lme4). We know that glmmPQL do not
> provide the correct loglikelihood for such models (it
> gives the loglike of a 'pseudo' or working linear
> mixed model). I would like to know how the loglike is
> calculated by lmer.

Good point.  The person who wrote the documentation (i.e. I) should
have mentioned that.

With lmer, one can fit a generalized linear mixed model using PQL or
by optimizing the Laplacian approximation to the deviance directly. 
Even when you use PQL, which is the default method, the Laplace
approximation is evaluated at the converged parameter estimates.  This
is the value of the loglikelihood that is reported.

I am reconsidering having PQL as the default method for fitting
generalized linear mixed models with lmer. I would appreciate it if
you and others who do fit such models could tell me if it is
noticeably slower or less reliable to do direct optimization of the
Laplace approximaiton.  That is, if you use the combination of
optional arguments method = "Laplace" and control = list(usePQL =
FALSE) does the fit take substantially longer?

On your example I get

> system.time(fit1.lmer <- lmer(z ~ X-1 + (1|id), family=poisson))
[1] 0.48 0.01 0.54 0.00 0.00
> system.time(fit2.lmer <- lmer(z ~ X-1 + (1|id), family=poisson, method = "Laplace", control = list(usePQL = FALSE)))
[1] 0.61 0.00 0.62 0.00 0.00
> fit1.lmer
Generalized linear mixed model fit using PQL
Formula: z ~ X - 1 + (1 | id)
 Family: poisson(log link)
      AIC      BIC    logLik deviance
 922.2406 934.8844 -458.1203 916.2406
Random effects:
 Groups Name        Variance Std.Dev.
 id     (Intercept) 0.82446  0.908
number of obs: 500, groups: id, 100

Estimated scale (compare to 1)  1.021129

Fixed effects:
   Estimate Std. Error z value  Pr(>|z|)
X1 1.003639   0.098373  10.202 < 2.2e-16 ***
X2 2.075037   0.052099  39.829 < 2.2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Correlation of Fixed Effects:
   X1
X2 -0.337
> fit2.lmer
Generalized linear mixed model fit using Laplace
Formula: z ~ X - 1 + (1 | id)
 Family: poisson(log link)
     AIC      BIC   logLik deviance
 921.958 934.6019 -457.979  915.958
Random effects:
 Groups Name        Variance Std.Dev.
 id     (Intercept) 0.8895   0.94313
number of obs: 500, groups: id, 100

Estimated scale (compare to 1)  0.04472136

Fixed effects:
   Estimate Std. Error z value  Pr(>|z|)
X1 0.985721   0.101645   9.698 < 2.2e-16 ***
X2 2.075060   0.052114  39.818 < 2.2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Correlation of Fixed Effects:
   X1
X2 -0.326

The only unexpected part of that output is the estimated scale which
is wrong (well, it is never calculated in this case and consequently
should not be displayed).

> A minor question is: why do glmmPQL and lmer give
> different degrees-of-freedom for the same estimated
> model? Does glmmPQL consider the scale parameter 'phi'
> as a degree of freedom?

I believe that is the reason.  The class of an object fit by glmmPQL is
> class(fm1)
[1] "glmmPQL" "lme"

and the only method I could find for the "glmmPQL" class is
> methods(class = "glmmPQL")
[1] predict.glmmPQL*

   Non-visible functions are asterisked

Generic functions other than predict will choose the method for the
lme class of linear mixed effects models (or, if there isn't an lme
method, the default method).  The lme methods defined in the nlme
package are appropriate for linear mixed effects models (which is what
Jose and I wrote them for) and typically are not appropriate for a
generalized linear mixed model.

> A toy example
>
> set.seed(100)
> m <- 5
> n <- 100
> N <- n*m
> X <- cbind(1,runif(N))
> Z <- kronecker(diag(n),rep(1,m))
> z <- rpois(N, exp(X%*%matrix(c(1,2)) +
> Z%*%matrix(rnorm(n))))
> id <- rep(1:n,each=m)
> fit.glmm <- glmmPQL(z ~ X-1, random = ~1|id,
> family="poisson",verbose=F)
> fit.lmer <- lmer(z ~ X-1 + (1|id),
> family="poisson",verbose=F)
>
> > logLik(fit.glmm)
> 'log Lik.' -386.4373 (df=4)
> > logLik(fit.lmer)
> 'log Lik.' -458.1203 (df=3)
>
> Thanks,
> Marco
>
>
>
> > sessionInfo()
> R version 2.2.1, 2005-12-20, i386-pc-mingw32
>
> attached base packages:
> [1] "methods"   "stats"     "graphics"  "grDevices"
> "utils"
> [6] "datasets"  "base"
>
> other attached packages:
>    mvtnorm    SemiPar    cluster       lme4    lattice
>     Matrix
>    "0.7-2"    "1.0-1"   "1.10.4"  "0.995-2"  "0.12-11"
>  "0.995-5"
>       nlme       MASS
> "3.1-68.1"   "7.2-24"
> >
>
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
>




More information about the R-help mailing list