[Rd] model.matrix.default() silently ignores bad contrasts.arg

Martin Maechler m@ech|er @end|ng |rom @t@t@m@th@ethz@ch
Sat Feb 23 11:42:39 CET 2019


>>>>> Fox, John 
>>>>>     on Fri, 22 Feb 2019 17:40:15 +0000 writes:

    > Dear Martin and Ben, I agree that a warning is a good idea
    > (and perhaps that wasn't clear in my response to Ben's
    > post).

    > Also, it would be nice to correct the omission in the help
    > file, which as far as I could see doesn't mention that a
    > contrast-generating function (as opposed to its quoted
    > name) can be an element of the contrasts.arg list.

    > Best, John

Thank you John for the clarification and the reminder about
filling the omission there!

Prepared to go (into the sources) now.
Martin


    >> -----Original Message----- From: Martin Maechler
    >> [mailto:maechler using stat.math.ethz.ch] Sent: Friday,
    >> February 22, 2019 11:50 AM To: Ben Bolker
    >> <bbolker using gmail.com> Cc: Fox, John <jfox using mcmaster.ca>;
    >> r-devel using r-project.org Subject: Re: [Rd]
    >> model.matrix.default() silently ignores bad contrasts.arg
    >> 
    >> >>>>> Ben Bolker >>>>> on Thu, 21 Feb 2019 08:18:51 -0500
    >> writes:
    >> 
    >> > On Thu, Feb 21, 2019 at 7:49 AM Fox, John
    >> <jfox using 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).
    >> 
    >> I currently do think this is a good idea... "even though"
    >> I'm 99% sure that this will make work for package
    >> maintainers and others whose code may suddenly show
    >> warnings.  I hope they would know better than
    >> suppressWarnings(.) ...
    >> 
    >> I see a version of the patch using old style indentation
    >> which makes the diff even "considerably" smaller -- no
    >> need to submit this different, though -- and I plan to
    >> test that a bit, and commit eventually to R-devel,
    >> possibly in a 5 days or so.
    >> 
    >> Thank you Ben for the suggestion and patch !  Martin
    >> 
    >> > 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
    >> <bbolker using 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>______________________________________________



More information about the R-devel mailing list