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