[R] does multinomial logistic model from multinom (nnet) has logLik?

Prof Brian Ripley ripley at stats.ox.ac.uk
Fri Feb 24 08:25:07 CET 2006


Please note, I told you that the deviance was minus twice log-likelihood 
unless summ > 0.  I had not checked the latter case, where it is not 
obvious, but I did not say it was invalid.

In fact the answer is to be found on p.203 of MASS4 (we do ask people to 
read the supporting documentation), and this is valid also for summ > 0.
I will add a comment to the help file.

On Wed, 22 Feb 2006, ronggui wrote:

> Here is a function for calculating  the measures of fit for
> multinomial logistic model (using nnet::multinom).If anything wrong ,I
> hope  experts point it out.Thank you.
>
> fitstat <- function(object) {
> #thanks Ripley, B. D. for telling how to get the LogLik and when is invalid.
> {if (!is.null(object$call$summ) && !identical(object$call$summ,0))
>   stop("when 'summ' argument is not zero,can NOT get Loglik") }
> object.base <- update(object,.~1,trace=FALSE)
> dev.base <- deviance(object.base) ; L.base <- - dev.base/2
> dev.full <- deviance(object) ; L.full <- - dev.full/2
> G2 <- dev.base - dev.full
> df <- object$edf - object.base$edf
> LR.test.p <- pchisq(G2,df,lower=F)
>
> aic <- object$AIC
>
> n<-dim(object$residuals)[1]
>
> #get the predict value to cal count R2
> pre <- predict(object,type="class")
> y <- eval.parent(object$call$data)[,as.character(object$call$formula[[2]])]
> if (!identical(length(y),length(pre))) stop("Length not matched.")
> tab <- table(y,pre)
> if (!identical(dim(tab)[1],dim(tab)[2])) stop("pred and y have diff nlevels")
> ad <- max(rowSums(tab))#max of row sum
>
> #cal R2
> ML.R2 <- 1-exp(-G2/n)
> McFadden.R2 <- 1-(L.full/L.base)
> McFadden.Adj.R2 <- 1-((L.full-mod$edf)/L.base)
> Cragg.Uhler.R2 <- ML.R2/(1-exp(2*L.base/n))
> Count.R2 <- sum(diag(tab))/sum(tab)
> Count.adj.R2 <- (sum(diag(tab))-ad)/(sum(tab)-ad)
>
> #get the result
> res<-list(LR=G2,df=df,LR.test.p =LR.test.p
> ,aic=aic,ML.R2=ML.R2,Cragg.Uhler.R2=Cragg.Uhler.R2,McFadden.R2
> =McFadden.R2 ,McFadden.Adj.R2=McFadden.Adj.R2,Count.R2=Count.R2,Count.adj.R2=Count.adj.R2)
>
> #print the result
> cat("\n",
>    paste(rep("-",21)),
>    "\n The Fitstats are : \n",
>    sprintf("G2(%d) = %f",df,G2),
>    " ,Prob ",format.pval(LR.test.p),
>    "\n",sprintf("AIC   = %f",aic),
>    sprintf(",ML.R2 = %f \n",ML.R2),
>    paste(rep("-",21)),"\n",
>    sprintf("Cragg.Uhler.R2  = %f \n",Cragg.Uhler.R2),
>    sprintf("McFadden.R2     = %f \n",McFadden.R2),
>    sprintf("McFadden.Adj.R2 = %f \n",McFadden.Adj.R2),
>    sprintf("Count.R2        = %f \n",Count.R2),
>    sprintf("Count.adj.R2    = %f \n",Count.adj.R2),
>    "\n Note:The maxinum of ML R2 is less than 1 \n",
>    paste(rep("-",21)),"\n")
> invisible(res)
> }
>
> #example
> require(nnet)
> data(mexico,package="Zelig")
> mod <- multinom(vote88 ~ pristr + othcok + othsocok,mexico)
> summary(mod,cor=F)
> fitstat(mod)
>
> #reference:
> #J. SCOTT LONG and JEREMY FREESE,REGRESSION MODELS FOR CATEGORICAL
> DEPENDENT VARIABLES USING STATA.
>
>> fitstat(mod)
>
> - - - - - - - - - - - - - - - - - - - - -
> The Fitstats are :
> G2(6) = 381.351620  ,Prob  < 2.22e-16
> AIC   = 2376.571142 ,ML.R2 = 0.244679
> - - - - - - - - - - - - - - - - - - - - -
> Cragg.Uhler.R2  = 0.282204
> McFadden.R2     = 0.139082
> McFadden.Adj.R2 = 0.133247
> Count.R2        = 0.596026
> Count.adj.R2    = 0.123003
>
> Note:The maxinum of ML R2 is less than 1
> - - - - - - - - - - - - - - - - - - - - -
>
> ÔÚ 06-2-22£¬ronggui<ronggui.huang at gmail.com> Ð´µÀ£º
>> So it's valid to get logLik (deviance/-2) when the summ argument is unused?
>>
>> Thank you.
>>
>> 2006/2/22, Prof Brian Ripley <ripley at stats.ox.ac.uk>:
>>> On Wed, 22 Feb 2006, ronggui wrote:
>>>
>>>> I want to get the logLik to calculate McFadden.R2 ,ML.R2 and
>>>> Cragg.Uhler.R2, but the value from multinom does not have logLik.So my
>>>> quetion is : is logLik meaningful to multinomial logistic model from
>>>> multinom?If it does, how can I get it?
>>>
>>> From the help page:
>>>
>>> Value:
>>>
>>>       A 'nnet' object with additional components:
>>>
>>> deviance: the residual deviance.
>>>
>>> So it has a residual deviance.  That is -2 log Lik in many cases (but not
>>> if the argument 'summ' is used)
>>>
>>>> Thank you!
>>>>
>>>> ps: I konw  VGAM has function to get the multinomial logistic model
>>>> with  logLik,  but I prefer use the function from "official" R
>>>> packages .
>>>>
>>>> --
>>>> ronggui
>>>> Deparment of Sociology
>>>> Fudan University
>>>
>>> --
>>> 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
>>>
>>
>>
>> --
>> »ÆÈÙ¹ó
>> Deparment of Sociology
>> Fudan University
>>
>
>
> --
> ronggui
> Deparment of Sociology
> Fudan University
>
>

-- 
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


More information about the R-help mailing list