R-beta: formula() and model formulae

Bill Venables wvenable at attunga.stats.adelaide.edu.au
Thu May 8 02:13:42 CEST 1997

Peter Dalgaard writes:
 > Bill Venables <wvenable at attunga.stats.adelaide.edu.au> writes:
 > > Ah, the Helmert contrasts b\^ete noir.  For ANOVA the contrast
 > > matrix used is mostly irrelevant.  For regression models I agree,
 > > treatment contrasts would be generally more easily interpreted.
 > Understatement of the year... Last time I bumped into them, it took me
 > and a colleague more than an hour to figure out how to interpret the
 > regression coefficients, and, I may add, the solution was *not* what
 > the white book said it was (it's not just one level minus the average
 > of the preceding, the parameter is also scaled by the reciprocal of
 > the level number). [There's a split-second solution -- see below --
 > but we sort of didn't think of it at the time...] 

A few weeks ago I gave a fairly detailed discussion of how to
relate contrast matrices and their interpretation in s-news.  I
could re-issue it or post it to people if that was their wish.

There is also to be an extended discussion of the subject in V&R2
due out in July, with a further elaboration to appear (real soon
now...) in the online complements.

 > > I presume the reason they were used at all is because if you have
 > > equal replication of everything the Helmert contrasts give you a
 > > model matrix with orthogonal columns, so all estimates are
 > > uncorrelated.  Whenever do you get equal replication, though?
 > Hardly ever. Actually, I though that the point was not so much
 > ortogonality, but the successive testing (A=B, A=B=C, A=B=C=D,...).
 > However that is just plainly wrong outside of balanced ANOVA's.
 > And, even in that case, once the first two levels differ, the rest
 > of the coefficients lose all meaning.

Indeed.  That's why I tended to discount that possibility myself.
Here is a contrast matrix generator I sometimes prefer to use
that corresponds to testing A=B, B=C, C=D, ...  Of course the
contrasts are not mutually orthogonal.  How it works is left as a
little puzzle.  (This function works in S.  I haven't tested it
in R, but it should work if lower.tri() is available.)

contr.sdif <- function(n, contrasts = T)
# contrasts generator giving `successive difference' contrasts.
  if(is.numeric(n) && length(n) == 1) {
    if(n %% 1 || n < 2)
      stop("invalid number of levels")
    lab <- as.character(seq(n))
  else {
    lab <- as.character(n)
    n <- length(n)
    if(n < 2)
      stop("invalid number of levels")
  if(contrasts) {
    contr <- col(matrix(nrow = n, ncol = n - 1))
    upper.tri <- !lower.tri(contr)
    contr[upper.tri] <- contr[upper.tri] - n
    structure(contr/n, dimnames = list(lab, paste(
      lab[-1], lab[ - n], sep = "-")))
  else structure(diag(n), dimnames = list(lab, lab))
> contr.sdif(4)
    2-1  3-2   4-3 
1 -0.75 -0.5 -0.25
2  0.25 -0.5 -0.25
3  0.25  0.5 -0.25
4  0.25  0.5  0.75

Bill Venables, Head, Dept of Statistics,    Tel.: +61 8 8303 5418
University of Adelaide,                     Fax.: +61 8 8303 3696
South AUSTRALIA.     5005.   Email: Bill.Venables at adelaide.edu.au
r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-help-request at stat.math.ethz.ch

More information about the R-help mailing list