R 2.3.0, all packages up to date Linux, SuSE 10.0 Hi I want to calculate AIC or BIC from several results from mle calculation. I found the AIC function, but it does not seem to work with objects of class mle - If I execute the following: ml1 <- mle(...) AIC(ml1) I get the following error messale: Error in logLik(object) : no applicable method for "logLik" Therefore I am using the following to calculate the AIC: #AICmle calculate AIC from mle object AICmle <- function( m, k=2) { lL <- logLik(m) edf <- attr(lL, "df") LL <- lL[1] - 2 * LL + k * edf } 1) Why is AIC not working with objects of class mle - am I doing something wrong, is it a bug or by design? 2) Just for confirmation - is my calculation of AIC correct? Thanks Rainer
>>>>> "Rainer" == Rainer M KRug <RMK at krugs.de> >>>>> on Mon, 05 Jun 2006 10:22:02 +0200 writes:Rainer> R 2.3.0, all packages up to date Rainer> Linux, SuSE 10.0 Rainer> Hi Rainer> I want to calculate AIC or BIC from several results from mle calculation. Rainer> I found the AIC function, but it does not seem to work with objects of Rainer> class mle - Rainer> If I execute the following: Rainer> ml1 <- mle(...) Rainer> AIC(ml1) Rainer> I get the following error messale: Rainer> Error in logLik(object) : no applicable method for "logLik" which is really not helpful as error message, since it is *wrong*: There is a logLik(.) method for "mle" objects, and it even works. There's some embarassing bug here, since if you quickly look at the 'stats4' package source, it's very clear that it was designed to have AIC(), BIC(), logLik() all working, but only the last one does. Rainer> Therefore I am using the following to calculate the AIC: Rainer> #AICmle calculate AIC from mle object Rainer> AICmle <- function( m, k=2) Rainer> { Rainer> lL <- logLik(m) Rainer> edf <- attr(lL, "df") Rainer> LL <- lL[1] Rainer> - 2 * LL + k * edf Rainer> } Rainer> 1) Why is AIC not working with objects of class mle - am I doing Rainer> something wrong, is it a bug or by design? a bug. Rainer> 2) Just for confirmation - is my calculation of AIC correct? it looks so, but I didn't check. Martin
You are mixing S3 and S4 classes and generics here. AIC(logLik(ml1)) will work. This a namespace issue: stats4 contains a version of logLik, but the default method for AIC is from stats, and so dispatches on stats::logLik and not stats4::logLik. There is something fundamentally unsatisfactory about converting S3 generics to S4 generics where namespaces are involved. I have put a workaround in R-devel. On Mon, 5 Jun 2006, Rainer M KRug wrote:> R 2.3.0, all packages up to date > Linux, SuSE 10.0 > > Hi > > I want to calculate AIC or BIC from several results from mle calculation. > > I found the AIC function, but it does not seem to work with objects of > class mle - > If I execute the following: > ml1 <- mle(...) > AIC(ml1) > > I get the following error messale: > Error in logLik(object) : no applicable method for "logLik" > > Therefore I am using the following to calculate the AIC: > > #AICmle calculate AIC from mle object > AICmle <- function( m, k=2) > { > lL <- logLik(m) > edf <- attr(lL, "df") > LL <- lL[1] > - 2 * LL + k * edf > } > > 1) Why is AIC not working with objects of class mle - am I doing > something wrong, is it a bug or by design? > > 2) Just for confirmation - is my calculation of AIC correct?Not quite. The correct function is> stats:::AIC.logLikfunction (object, ..., k = 2) -2 * c(object) + k * attr(object, "df") <environment: namespace:stats> -- Brian D. Ripley, ripley at stats.ox.ac.uk Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ University of Oxford, Tel: +44 1865 272861 (self) 1 South Parks Road, +44 1865 272866 (PA) Oxford OX1 3TG, UK Fax: +44 1865 272595