[R] mlogit and weights

Achim Zeileis Achim.Zeileis at uibk.ac.at
Thu Jun 3 12:54:54 CEST 2010


On Wed, 2 Jun 2010, Misha Spisok wrote:

> Hello,
>
> I can't figure out why using and not using weights in mlogit yields
> identical results.  My motivation is for the case when an
> "observation" or "individual" represents a number of individuals.  For
> example,
>
> library(mlogit)
> library(AER)
> data("TravelMode", package = "AER")
> TM <- mlogit.data(TravelMode, choice = "choice", shape = "long",
>                 alt.levels = c("air", "train", "bus", "car"))
> myweight = rep(floor(1000*runif(nrow(TravelMode)/4)), each = 4)
>
> summary(mlogit(choice ~ wait + vcost + travel + gcost, data=TM))
> summary(mlogit(choice ~ wait + vcost + travel + gcost, weights=income, data=TM))
> summary(mlogit(choice ~ wait + vcost + travel + gcost,
> weights=myweight, data=TM))
>
> Each gives the same result.

I can't replicate that. For me all three give different results. For 
example, the first two (which do not contain random elements) are

    alttrain      altbus      altcar        wait       vcost      travel
-0.84413818 -1.44150828 -5.20474275 -0.10364955 -0.08493182 -0.01333220
       gcost
  0.06929537

and

    alttrain      altbus      altcar        wait       vcost      travel
-1.56910793 -1.67020936 -5.44725428 -0.11157800 -0.08866886 -0.01435371
       gcost
  0.08087749

respectively. I'm using the current "mlogit" version from CRAN: 0.1-7.

> Am I specifying "weights" incorrectly?

Yes, I think so.

> Is there a better way to do what I want to do?  That is, if "myweight"
> contains the number of observations represented by an "observation,"
> is this the correct approach?

You will get the correct parameter estimates but not the correct 
inference. Following most of the basic model fitting function (such as 
lm() or glm()), the weights are _not_ interpreted as case weights. I.e., 
the function treats
   length(weights > 0)
as the number of observations and not
   sum(weights)

A simple example using lm():

   x <- 1:5
   y <- c(0, 2, 1, 4, 5)
   w <- rep(2, 5)
   xx <- c(x, x)
   yy <- c(y, y)

Then you can fit both models

   fm1 <- lm(y ~ x, weights = w)
   fm2 <- lm(yy ~ xx)

and you get the same coefficients

   all.equal(coef(fm1), coef(fm2))

(which only mentions that the strings 'xx' and 'x' are different.) But fm1 
thinks 2 parameters have been estimated from 5 observations while the 
latter thinks 2 parameters have been estimated from 10 observations. Hence

   df.residual(fm1) / df.residual(fm2)
   vcov(fm2) / vcov(fm1)

Hope that helps,
Z


> If so, what am I doing wrong?  If not,
> what suggestions are there?
>
> Thank you for your time.
>
> Best,
>
> Misha
>
> ______________________________________________
> R-help at r-project.org 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