[R] multinomial logistic regression with equality constraints?
Roger Levy
rlevy at ucsd.edu
Tue Feb 13 18:40:15 CET 2007
Many thanks for this, Jas. I was successfully able to use the revised
version of multinomRob, and it satisfies exactly the needs I was looking
for.
Thanks once again.
Best,
Roger
Jasjeet Singh Sekhon wrote:
> As we noted earlier and as is clearly stated in the docs, multinomRob
> is estimating an OVERDISPERSED multinomial model. And in your models
> here the overdispersion parameter is not identified; you need more
> observations. Walter pointed out using the print.level trick to get
> the coefs for the standard MNL model, but when the model the function
> is actually trying to estimate is not identified, that trick will not
> work.
>
> As I also previously noted, it is a simple matter to change the
> multinomMLE function to estimate the standard MNL model. Since you
> don't want to change that file and since nnet's multinom function
> doesn't have some functionality people need, we'll add a "MLEonly"
> function to multinomRob which will allow you to do what you want.
> We'll post a new version on my webpage later tonight:
> http://sekhon.berkeley.edu/robust. And after some testing, we'll
> forward the new version to CRAN.
>
> Jas.
>
> =======================================
> Jasjeet S. Sekhon
>
> Associate Professor
> Travers Department of Political Science
> Survey Research Center
> UC Berkeley
>
> http://sekhon.berkeley.edu/
> V: 510-642-9974 F: 617-507-5524
> =======================================
>
>
>
>
> Roger Levy writes:
> > Walter Mebane wrote:
> > > Roger,
> > >
> > > > Error in if (logliklambda < loglik) bvec <- blambda :
> > > > missing value where TRUE/FALSE needed
> > > > In addition: Warning message:
> > > > NaNs produced in: sqrt(sigma2GN)
> > >
> > > That message comes from the Newton algorithm (defined in source file
> > > multinomMLE.R). It would be better if we bullet-proofed it a bit
> > > more. The first thing is to check the data. I don't have the
> > > multinomLogis() function, so I can't run your code.
> >
> > Whoops, sorry about that -- I'm putting revised code at the end of the
> > message.
> >
> > > But do you really
> > > mean
> > >
> > > > for(i in 1:length(choice)) {
> > > and
> > > > dim(counts) <- c(length(choice),length(choice))
> > >
> > > Should that be
> > >
> > > for(i in 1:n) {
> > > and
> > > dim(counts) <- c(n, length(choice))
> > >
> > > or instead of n, some number m > length(choice). As it is it seems to
> > > me you have three observations for three categories, which isn't going
> > > to work (there are five coefficient parameters, plus sigma for the
> > > dispersion).
> >
> > I really did mean for(i in 1:length(choice)) -- once again, the proper
> > code is at the end of this message.
> >
> > Also, I notice that I get the same error with another kind of data,
> > which works for multinom from nnet:
> >
> >
> > library(nnet)
> > library(multinomRob)
> > dtf <- data.frame(y1=c(1,1),y2=c(2,1),y3=c(1,2),x=c(0,1))
> > summary(multinom(as.matrix(dtf[,1:3]) ~ x, data=dtf))
> > summary(multinomRob(list(y1 ~ 0, y2 ~ x, y3 ~ x), data=dtf,print.level=128))
> >
> >
> > The call to multinom fits the following coefficients:
> >
> > Coefficients:
> > (Intercept) x
> > y2 0.6933809622 -0.6936052
> > y3 0.0001928603 0.6928327
> >
> > but the call to multinomRob gives me the following error:
> >
> > multinomRob(): Grouped MNL Estimation
> > [1] "multinomMLE: -loglik initial: 9.48247391895106"
> > Error in if (logliklambda < loglik) bvec <- blambda :
> > missing value where TRUE/FALSE needed
> > In addition: Warning message:
> > NaNs produced in: sqrt(sigma2GN)
> >
> >
> > Does this shed any light on things?
> >
> >
> > Thanks again,
> >
> > Roger
> >
> >
> >
> >
> >
> > ***
> >
> > set.seed(10)
> > library(multinomRob)
> > multinomLogis <- function(vector) {
> > x <- exp(vector)
> > z <- sum(x)
> > x/z
> > }
> >
> > n <- 20
> > choice <- c("A","B","C")
> > intercepts <- c(0.5,0.3,0.2)
> > prime.strength <- rep(0.4,length(intercepts))
> > counts <- c()
> > for(i in 1:length(choice)) {
> > u <- intercepts[1:length(choice)]
> > u[i] <- u[i] + prime.strength[i]
> > counts <- c(counts,rmultinomial(n = n, pr = multinomLogis(u)))
> > }
> > dim(counts) <- c(length(choice),length(choice))
> > counts <- t(counts)
> > row.names(counts) <- choice
> > colnames(counts) <- choice
> > data <- data.frame(Prev.Choice=choice,counts)
> >
> > for(i in 1:length(choice)) {
> > data[[paste("last",choice[i],sep=".")]] <-
> > ifelse(data$Prev.Choice==choice[i],1,0)
> > }
> >
> > multinomRob(list(A ~ last.A ,
> > B ~ last.B ,
> > C ~ last.C - 1 ,
> > ),
> > data=data,
> > print.level=128)
> >
> >
> >
> > I obtained this output:
> >
> >
> > Your Model (xvec):
> > A B C
> > (Intercept)/(Intercept)/last.C 1 1 1
> > last.A/last.B/NA 1 1 0
> >
> > [1] "multinomRob: WARNING. Limited regressor variation..."
> > [1] "WARNING. ... A regressor has a distinct value for only one
> > observation."
> > [1] "WARNING. ... I'm using a modified estimation algorithm (i.e.,
> > preventing LQD"
> > [1] "WARNING. ... from modifying starting values for the affected
> > parameters)."
> > [1] "WARNING. ... Affected parameters are TRUE in the following table."
> >
> > A B C
> > (Intercept)/(Intercept)/last.C FALSE FALSE TRUE
> > last.A/last.B/NA TRUE TRUE FALSE
> >
> >
> >
> > multinomRob(): Grouped MNL Estimation
> > [1] "multinomMLE: -loglik initial: 70.2764843511374"
> > Error in if (logliklambda < loglik) bvec <- blambda :
> > missing value where TRUE/FALSE needed
> > In addition: Warning message:
> > NaNs produced in: sqrt(sigma2GN)
>
> ______________________________________________
> 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
> and provide commented, minimal, self-contained, reproducible code.
More information about the R-help
mailing list