On Thu, Feb 21, 2019 at 7:49 AM Fox, John <j...@mcmaster.ca> wrote:
>
> Dear Ben,
>
> Perhaps I'm missing the point, but contrasts.arg is documented to be a list. 
> From ?model.matrix: "contrasts.arg: A list, whose entries are values (numeric 
> matrices or character strings naming functions) to be used as replacement 
> values for the contrasts replacement function and whose names are the names 
> of columns of data containing factors."

  I absolutely agree that this is not a bug/behaves as documented (I
could have said that more clearly).  It's just that (for reasons I
attempted to explain) this is a really easy mistake to make.

> This isn't entirely accurate because a function also works as a named element 
> of the list (in addition to a character string naming a function and a 
> contrast matrix), as your example demonstrates, but nowhere that I'm aware of 
> is it suggested that a non-list should work.
>
> It certainly would be an improvement if specifying contrast.arg as a non-list 
> generated an error or warning message, and it at least arguably would be 
> convenient to allow a general contrast specification such as 
> contrasts.arg-"contr.sum", but I don't see a bug here.

  I agree.  That's what my patch does (throws a warning message if
contrasts.arg is non-NULL and not a list).

  cheers
   Ben Bolker



>
> Best,
>  John
>
>   -------------------------------------------------
>   John Fox, Professor Emeritus
>   McMaster University
>   Hamilton, Ontario, Canada
>   Web: http::/socserv.mcmaster.ca/jfox
>
> > On Feb 20, 2019, at 7:14 PM, Ben Bolker <bbol...@gmail.com> wrote:
> >
> > An lme4 user pointed out <https://github.com/lme4/lme4/issues/491> that
> > passing contrasts as a string or symbol to [g]lmer (which would work if
> > we were using `contrasts<-` to set contrasts on a factor variable) is
> > *silently ignored*. This goes back to model.matrix(), and seems bad
> > (this is a very easy mistake to make, because of the multitude of ways
> > to specify contrasts for factors in R  - e.g. options(contrasts=...);
> > setting contrasts on the specific factors; passing contrasts as a list
> > to the model function ... )
> >
> > The relevant code is here:
> >
> > https://github.com/wch/r-source/blob/trunk/src/library/stats/R/models.R#L578-L603
> >
> > The following code shows the problem: a plain-vanilla model.matrix()
> > call with no contrasts argument, followed by two wrong contrasts
> > arguments, followed by a correct contrasts argument.
> >
> > data(cbpp, package="lme4")
> > mf1 <- model.matrix(~period, data=cbpp)
> > mf2 <- model.matrix(~period, contrasts.arg="contr.sum", data=cbpp)
> > all.equal(mf1,mf2) ## TRUE
> > mf3 <- model.matrix(~period, contrasts.arg=contr.sum, data=cbpp)
> > all.equal(mf1,mf3)  ## TRUE
> > mf4 <- model.matrix(~period, contrasts.arg=list(period=contr.sum),
> > data=cbpp)
> > isTRUE(all.equal(mf1,mf4))  ## FALSE
> >
> >
> >  I've attached a potential patch for this, which is IMO the mildest
> > possible case (if contrasts.arg is non-NULL and not a list, it produces
> > a warning).  I haven't been able to test it because of some mysterious
> > issues I'm having with re-making R properly ...
> >
> >  Thoughts?  Should I submit this as a bug report/patch?
> >
> >  cheers
> >   Ben Bolker
> >
> >
> > <models.R.diff>______________________________________________
> > R-devel@r-project.org mailing list
> > https://stat.ethz.ch/mailman/listinfo/r-devel
>

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to