Jarrett Byrnes
2008-Feb-04 23:34 UTC
[R] extracting AIC scores from lmer and other objects
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. 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. 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 ---------------------------------------- Jarrett Byrnes Population Biology Graduate Group, UC Davis Bodega Marine Lab 707-875-1969 http://www-eve.ucdavis.edu/stachowicz/byrnes.shtml [[alternative HTML version deleted]]
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