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

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.

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