[R] extracting AIC scores from lmer and other objects

Ben Bolker bolker at ufl.edu
Tue Feb 5 21:14:55 CET 2008


Jarrett Byrnes <jebyrnes <at> ucdavis.edu> writes:

> 
> I have a slight conundrum.  I'm attempting to write a scrip that will  
> take a number of objects (lm, glm, and lmer) and return AIC scores  
> and weights.  I've run into 3 problems, and was wondering if anyone  
> had any pointers.
> 
> 1) is there any convenient way to extract the name of the objects?   
> Simply, if I have a vector of objects c(my.lm, my.lmer) and I want to  
> get a character vector c("my.lm", "my.lmer"), how would one do this?   
> I see this as far simpler than jumping into the ugly details of each  
> object type and extracting coefficient lists and such - not to  
> mention tidier.

  Hmm.  Can you be a little more specific?

 If I do e.g. 

> a = 1
> b = 2
> c = 3
> z <- c(a,b,c)

  then z is [1 2 3] and there's no longer any way
to recover the names of the objects.  

  On the other hand,

> f <- function(...) {
+   print(deparse(substitute(...)))
+ }
> f(c(a,b,c))
[1] "c(a, b, c)"

  and you could then use some combination of strsplit() or gsub()
to get the pieces you wanted.

  I generally find it easier to work with named lists of model
objects:  
  L <- list(simplemodel=lm1,complexmodel=lm2)

and then names(L) gets you what you want.
> 
> 2) I'm repeatedly getting the error
> 
> Error in UseMethod("logLik") : no applicable method for "logLik"
> 
> 	in a variety of different contexts.  The first is if I have to get  
> an AIC for an lmer object.  AIC(my.lmer) give me the error above.   
> However, I can circumvent this with a very silly solution -
> 
> myAIC<-function(object) {a<-logLik(object)
> 	return(-2*a[1] +2*attr(a, 'df'))}
> 
> I use this, and I do not get an error.
> 

  This may (?) be related to the NEWS item for R 2.6.2 RC:

 o	The AIC() S4 generic in package stats4 no longer disables
	dispatch of S3 methods for AIC().

> 3) I do, however, get the above error if I have a vector of model  
> objects.  So, again, if I have something like model.list<-c(my.lm,  
> my.lmer) or even just c(my.lm, my.lm2) and then call the following on  
> the vector of models
> 
> aiclist<-vector
> for(index in 1:length(model.list)){
> 			aiclist<-c(aiclist, myAIC(model.list[index]))
> 	}
> 
> it again yields the Error in UseMethod("logLik").  Given that this is  
> true either for lm, glm, or lmer objects, I'm guessing there's a more  
> general issue here that I'm missing.  Any pointers?
> 
> Thanks!
> 
> -Jarrett
> 

  By the way: I would be careful using AIC to do model selection
on lmer objects.  In particular, the ugly "degrees of freedom"
issue rears its ugly head here -- see Burnham and White 2002

Burnham, K. P., and G. C. White. 2002. Evaluation of some random effects
methodology applicable to bird ringing data. Journal of Applied Statistics 29,
no. 1:245-264.

  cheers
    Ben Bolker



More information about the R-help mailing list