[R] Interpreting model matrix columns when using contr.sum

Douglas Bates bates at stat.wisc.edu
Sun Jan 25 16:48:32 CET 2009


On Fri, Jan 23, 2009 at 4:58 PM, Gang Chen <gangchen6 at gmail.com> wrote:
> With the following example using contr.sum for both factors,
>
>> dd <- data.frame(a = gl(3,4), b = gl(4,1,12))     # balanced 2-way
>> model.matrix(~ a * b, dd, contrasts = list(a="contr.sum", b="contr.sum"))
>
>   (Intercept) a1 a2 b1 b2 b3 a1:b1 a2:b1 a1:b2 a2:b2 a1:b3 a2:b3
> 1            1  1  0  1  0  0     1     0     0     0     0     0
> 2            1  1  0  0  1  0     0     0     1     0     0     0
> 3            1  1  0  0  0  1     0     0     0     0     1     0
> 4            1  1  0 -1 -1 -1    -1     0    -1     0    -1     0
> 5            1  0  1  1  0  0     0     1     0     0     0     0
> 6            1  0  1  0  1  0     0     0     0     1     0     0
> 7            1  0  1  0  0  1     0     0     0     0     0     1
> 8            1  0  1 -1 -1 -1     0    -1     0    -1     0    -1
> 9            1 -1 -1  1  0  0    -1    -1     0     0     0     0
> 10           1 -1 -1  0  1  0     0     0    -1    -1     0     0
> 11           1 -1 -1  0  0  1     0     0     0     0    -1    -1
> 12           1 -1 -1 -1 -1 -1     1     1     1     1     1     1
> ...

> I have two questions:

> (1) I assume the 1st column (under intercept) is the overall mean, the
> 2rd column (under a1) is the difference between the 1st level of
> factor a and the overall mean, the 4th column (under b1) is the
> difference between the 1st level of factor b and the overall mean.

> Is this interpretation correct?

I don't think so and furthermore I don't see why the contrasts should
have an interpretation.  The contrasts are simply a parameterization
of the space spanned by the indicator columns of the levels of the
factors.  Interpretations as overall means, etc. are mostly a holdover
from antiquated concepts of how analysis of variance tables should be
evalated.

If you want to determine the interpretation of particular coefficients
for the special case of a balanced design (which doesn't always mean a
resulting balanced data set - I remind my students that expecting a
balanced design to produce balanced data is contrary to Murphy's Law)
the easiest way of doing so is (I think this is right but I can
somehow manage to confuse myself on this with great ease) to calculate

> contr.sum(3)
  [,1] [,2]
1    1    0
2    0    1
3   -1   -1
> solve(cbind(1, contr.sum(3)))
              1          2          3
[1,]  0.3333333  0.3333333  0.3333333
[2,]  0.6666667 -0.3333333 -0.3333333
[3,] -0.3333333  0.6666667 -0.3333333
> solve(cbind(1, contr.sum(4)))
         1     2     3     4
[1,]  0.25  0.25  0.25  0.25
[2,]  0.75 -0.25 -0.25 -0.25
[3,] -0.25  0.75 -0.25 -0.25
[4,] -0.25 -0.25  0.75 -0.25

That is, the first coefficient is the "overall mean" (but only for a
balanced data set), the second is a contrast of the first level with
the others, the third is a contrast of the second level with the
others and so on.

> (2) I'm not so sure about those interaction columns. For example, what
> is a1:b1? Is it the 1st level of factor a at the 1st level of factor b
> versus the overall mean, or something more complicated?

Well, at the risk of sounding trivial, a1:b1 is the product of the a1
and b1 columns.  You need a basis for a certain subspace and this
provides one.  I don't see why there must be interpretations of the
coefficients.




More information about the R-help mailing list