Hi, 
I am analyzing a repeated-measures Greco-Latin Square with the aov command.
I am using aov to calculate the MSs and then picking by hand the appropriate
neumerator and denominator terms for the F tests. 
The data are the following:
							responseFinger
mapping.code	Subject.n	index		middle	ring
little
----------------------------------------------------------------------------
1			1		green(1)	yellow(4)   blue(2)
red(3)
1			2		green(1)	yellow(4)   blue(2)
red(3)
2			3           red(2)	blue(3)     yellow(1)
green(4)
2			4		red(2)	blue(3)     yellow(1)
green(4)
3			5		yellow(3)	green(2)
red(4)	blue(1)
3			6		yellow(3)	green(2)
red(4)	blue(1)
4			7		blue(4)     red(1)	green(3)
yellow(2)
4			8		blue(4)     red(1)	green(3)
yellow(2)
There are 4 factors:
factor	     levels					type
-----------------------------------------------------------------
responseFinger   index, middle, ring, little	within-subject
stimulusName     green, yellow, blue, red		within-subject
oom              1, 2, 3, 4				within-subject
mapping.code     1, 2, 3, 4				between-subjects
Subject.n        1, 2, 3, 4, 5, 6, 7, 8		nested within mapping.code
DV = asin.Stimulus.ER
There are 32 observations and 31 total dfs.
I fit the following model:
m1 <- asin.Stimulus.ER ~ stimulusName + responseFinger + oom + mapping.code
+  mapping.code:Subject.n + stimulusName:mapping.code +
stimulusName:mapping.code:Subject.n, data=w.tmp)
summary(m1)
                                    Df   Sum Sq  Mean Sq
stimulusName                         3 0.005002 0.001667
responseFinger                       3 0.033730 0.011243
oom                                  3 0.006146 0.002049
mapping.code                         3 0.028190 0.009397
mapping.code:Subject.n               4 0.020374 0.005094
stimulusName:mapping.code            3 0.022318 0.007439
stimulusName:mapping.code:Subject.n 12 0.013903 0.001159
There are 3 dfs for each main effect of stimulusName, responseFinger, oom,
and mapping.code. That leaves 3 df to estimate any higher-order interactions
involving these 4 factors. To capture this variance I use
stimulusName:mapping.code, but I believe I could use any of the two-way
interactions. The variance aassociated with this effect should be orthogonal
to the variance for the main effects. However, when I look at the contrasts
with summary.lm it seems as though the estimates of contrasts involving
responseFinger, for example, depend on whether stimulusName:mapping.code is
in the model. That suggests to me that variance contributing to
stimulusName:mapping.code in the ANOVA table is not orthogonal to the main
effect of responseFinger, as it should be. Yet, I have calculated the MS by
hand and am confident that the SS in the ANOVA table for
stimulusName:mapping.code is orthogonal to other terms in the model. If that
is true, then why aren't the contrasts that R is using to estimate the SS in
the ANOVA table also not orthogonal?
m2 <- aov(asin.Stimulus.ER ~ stimulusName + responseFinger + oom +
mapping.code + mapping.code:Subject.n + stimulusName:mapping.code,
data=w.tmp, contrasts=list(stimulusName="contr.poly",
responseFinger="contr.poly",
oom="contr.poly",mapping.code="contr.poly",
Subject.n="contr.poly"))
summary.lm(m2)
Call:
aov(formula = asin.Stimulus.ER ~ stimulusName + responseFinger + 
    oom + mapping.code + mapping.code:Subject.n, data = w.tmp, 
    contrasts = list(stimulusName = "contr.poly", responseFinger
"contr.poly",
        oom = "contr.poly", mapping.code = "contr.poly",
Subject.n "contr.poly"))
Residuals:
      Min        1Q    Median        3Q       Max 
-0.063950 -0.027306 -0.002311  0.033117  0.055900 
Coefficients:
                             Estimate Std. Error t value Pr(>|t|)    
(Intercept)                 0.0894680  0.0086867  10.299 3.38e-08 ***
stimulusName.L              0.0095592  0.0173734   0.550  0.59027    
stimulusName.Q              0.0205827  0.0173734   1.185  0.25456    
stimulusName.C              0.0104971  0.0173734   0.604  0.55474    
responseFinger.L            0.0246606  0.0173734   1.419  0.17622    
responseFinger.Q           -0.0571795  0.0173734  -3.291  0.00495 ** 
responseFinger.C           -0.0184023  0.0173734  -1.059  0.30626    
oom.L                       0.0243220  0.0173734   1.400  0.18187    
oom.Q                      -0.0126019  0.0173734  -0.725  0.47940    
oom.C                      -0.0042307  0.0173734  -0.244  0.81090    
mapping.code.L              0.0465695  0.0173734   2.681  0.01711 *  
mapping.code.Q             -0.0300432  0.0173734  -1.729  0.10428    
mapping.code.C              0.0212706  0.0173734   1.224  0.23971    
mapping.code13:Subject.n.L -0.0154836  0.0245697  -0.630  0.53805    
mapping.code14:Subject.n.L -0.0642852  0.0245697  -2.616  0.01945 *  
mapping.code15:Subject.n.L -0.0001106  0.0245697  -0.005  0.99647    
mapping.code16:Subject.n.L -0.0268560  0.0245697  -1.093  0.29162    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05
'.' 0.1 ' ' 1
Residual standard error: 0.04914 on 15 degrees of freedom
Multiple R-Squared: 0.7207,     Adjusted R-squared: 0.4227 
F-statistic: 2.419 on 16 and 15 DF,  p-value: 0.0474 
m3 <- aov(asin.Stimulus.ER ~ stimulusName + responseFinger + oom +
mapping.code + mapping.code:Subject.n + stimulusName:mapping.code,
data=w.tmp, contrasts=list(stimulusName="contr.poly",
responseFinger="contr.poly",
oom="contr.poly",mapping.code="contr.poly",
Subject.n="contr.poly"))
summary.lm(m3)
Call:
aov(formula = asin.Stimulus.ER ~ stimulusName + responseFinger + 
    oom + mapping.code + mapping.code:Subject.n + stimulusName:mapping.code,
    data = w.tmp, contrasts = list(stimulusName = "contr.poly", 
        responseFinger = "contr.poly", oom = "contr.poly",
mapping.code "contr.poly",
        Subject.n = "contr.poly"))
Residuals:
       Min         1Q     Median         3Q        Max 
-4.332e-02 -1.370e-02 -9.216e-19  1.370e-02  4.332e-02 
Coefficients: (6 not defined because of singularities)
                                Estimate Std. Error t value Pr(>|t|)    
(Intercept)                    0.0894680  0.0060170  14.869  4.3e-09 ***
stimulusName.L                 0.0095592  0.0120340   0.794 0.442421    
stimulusName.Q                 0.0205827  0.0120340   1.710 0.112901    
stimulusName.C                 0.0104971  0.0120340   0.872 0.400168    
responseFinger.L               0.0483851  0.0163680   2.956 0.012008 *  
responseFinger.Q              -0.1217915  0.0269089  -4.526 0.000694 ***
responseFinger.C              -0.0089211  0.0142389  -0.627 0.542703    
oom.L                          0.0319155  0.0131826   2.421 0.032257 *  
oom.Q                         -0.0465613  0.0269089  -1.730 0.109180    
oom.C                         -0.0080275  0.0123312  -0.651 0.527323    
mapping.code.L                 0.0465695  0.0120340   3.870 0.002229 ** 
mapping.code.Q                -0.0300432  0.0120340  -2.497 0.028094 *  
mapping.code.C                 0.0212706  0.0120340   1.768 0.102532    
mapping.code13:Subject.n.L    -0.0154836  0.0170187  -0.910 0.380838    
mapping.code14:Subject.n.L    -0.0642852  0.0170187  -3.777 0.002636 ** 
mapping.code15:Subject.n.L    -0.0001106  0.0170187  -0.006 0.994921    
mapping.code16:Subject.n.L    -0.0268560  0.0170187  -1.578 0.140543    
stimulusName.L:mapping.code.L  0.0848984  0.0601701   1.411 0.183649    
stimulusName.Q:mapping.code.L -0.1444769  0.0538178  -2.685 0.019869 *  
stimulusName.L:mapping.code.Q -0.0853739  0.0269089  -3.173 0.008029 ** 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05
'.' 0.1 ' ' 1
Residual standard error: 0.03404 on 12 degrees of freedom
Multiple R-Squared: 0.8928,     Adjusted R-squared: 0.723 
F-statistic: 5.259 on 19 and 12 DF,  p-value: 0.002629 
The dataframe is below.
Thanks for any insight you can provide, 
Steve
w.tmp <-
structure(list(activeMapping = structure(as.integer(c(1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1)), .Label = "letter", class =
"factor"),
    mapping.code = structure(as.integer(c(1, 1, 1, 1, 1, 1, 1, 
    1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 
    4, 4, 4, 4, 4, 4)), .Label = c("13", "14",
"15", "16"), class "factor"),
    oom = structure(as.integer(c(1, 1, 4, 4, 2, 2, 3, 3, 2, 2, 
    3, 3, 1, 1, 4, 4, 3, 3, 2, 2, 4, 4, 1, 1, 4, 4, 1, 1, 3, 
    3, 2, 2)), .Label = c("1", "2", "3",
"4"), class = "factor"),
    stimulusName = structure(as.integer(c(1, 1, 2, 2, 3, 3, 4, 
    4, 4, 4, 3, 3, 2, 2, 1, 1, 2, 2, 1, 1, 4, 4, 3, 3, 3, 3, 
    4, 4, 1, 1, 2, 2)), .Label = c("Q", "J", "X",
"B"), class = "factor"),
    responseFinger = structure(as.integer(c(1, 1, 2, 2, 3, 3, 
    4, 4, 1, 1, 2, 2, 3, 3, 4, 4, 1, 1, 2, 2, 3, 3, 4, 4, 1, 
    1, 2, 2, 3, 3, 4, 4)), .Label = c("index", "middle",
"ring",
    "little"), class = "factor"), Subject.a =
structure(as.integer(c(1,
    5, 1, 5, 1, 5, 1, 5, 2, 6, 2, 6, 2, 6, 2, 6, 3, 7, 3, 7, 
    3, 7, 3, 7, 4, 8, 4, 8, 4, 8, 4, 8)), .Label = c("17",
"18",
    "19", "20", "21", "22",
"23", "24"), class = "factor"), Subject
structure(as.integer(c(1,
    5, 1, 5, 1, 5, 1, 5, 2, 6, 2, 6, 2, 6, 2, 6, 3, 7, 3, 7, 
    3, 7, 3, 7, 4, 8, 4, 8, 4, 8, 4, 8)), .Label = c("25",
"26",
    "27", "28", "29", "30",
"36", "41"), class = "factor"), Subject.n
structure(as.integer(c(1,
    2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 
    1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2)), .Label = c("1",
"2"
    ), class = "factor"), Block = structure(as.integer(c(1, 1, 
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)), .Label = "1", class =
"factor"),
    Stimulus.ACC = c(0.9875, 0.995833333333333, 0.9875, 0.975, 
    0.9625, 0.995833333333333, 0.975, 0.9875, 0.954166666666667, 
    0.983333333333333, 0.9125, 0.95, 0.908333333333333, 0.983333333333333, 
    0.958333333333333, 0.979166666666667, 0.9875, 0.979166666666667, 
    0.9625, 0.954166666666667, 0.904166666666667, 0.904166666666667, 
    0.975, 0.991666666666667, 0.979166666666667, 0.975, 0.970833333333333, 
    0.954166666666667, 0.9, 0.958333333333333, 0.929166666666667, 
    0.958333333333333), Stimulus.ER = c(0.0125, 0.00416666666666667, 
    0.0125, 0.025, 0.0375, 0.00416666666666667, 0.025, 0.0125, 
    0.0458333333333333, 0.0166666666666667, 0.0875, 0.05,
0.0916666666666667, 
    0.0166666666666667, 0.0416666666666667, 0.0208333333333333, 
    0.0125, 0.0208333333333333, 0.0375, 0.0458333333333333,
0.0958333333333333, 
    0.0958333333333333, 0.025, 0.00833333333333333, 0.0208333333333333, 
    0.025, 0.0291666666666667, 0.0458333333333333, 0.1, 0.0416666666666667, 
    0.0708333333333333, 0.0416666666666667), asin.Stimulus.ER
c(0.0315400751462974,
    0.0105133583820991, 0.0315400751462974, 0.0630801502925948, 
    0.0714356562826538, 0.0105133583820991, 0.0630801502925948, 
    0.0259003510988588, 0.115646942203090, 0.0420534335283965, 
    0.209501077929205, 0.114880852490312, 0.190564470141143, 
    0.0420534335283965, 0.0994938597735527, 0.0525667919104956, 
    0.0315400751462974, 0.0525667919104956, 0.0889805013914536, 
    0.110007218155652, 0.219248346598526, 0.218622673632042, 
    0.0630801502925948, 0.0210267167641983, 0.0525667919104956, 
    0.0511750292312336, 0.0735935086746939, 0.110007218155652, 
    0.229761704980625, 0.105133583820991, 0.161807920353369, 
    0.0994938597735527), cell = structure(as.integer(c(1, 1, 
    2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 
    11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16)), .Label = c("1", 
    "2", "3", "4", "5", "6",
"7", "8", "9", "10", "11",
"12",
    "13", "14", "15", "16"), class =
c("ordered", "factor"))), .Names
c("activeMapping",
"mapping.code", "oom", "stimulusName",
"responseFinger", "Subject.a",
"Subject", "Subject.n", "Block",
"Stimulus.ACC", "Stimulus.ER",
"asin.Stimulus.ER", "cell"), row.names =
c("13/1/Q/index/17/25/1",
"13/1/Q/index/21/29/2", "13/4/J/middle/17/25/1",
"13/4/J/middle/21/29/2",
"13/2/X/ring/17/25/1", "13/2/X/ring/21/29/2",
"13/3/B/little/17/25/1",
"13/3/B/little/21/29/2", "14/2/B/index/18/26/1",
"14/2/B/index/22/30/2",
"14/3/X/middle/18/26/1", "14/3/X/middle/22/30/2",
"14/1/J/ring/18/26/1",
"14/1/J/ring/22/30/2", "14/4/Q/little/18/26/1",
"14/4/Q/little/22/30/2",
"15/3/J/index/19/27/1", "15/3/J/index/23/36/2",
"15/2/Q/middle/19/27/1",
"15/2/Q/middle/23/36/2", "15/4/B/ring/19/27/1",
"15/4/B/ring/23/36/2",
"15/1/X/little/19/27/1", "15/1/X/little/23/36/2",
"16/4/X/index/20/28/1",
"16/4/X/index/24/41/2", "16/1/B/middle/20/28/1",
"16/1/B/middle/24/41/2",
"16/3/Q/ring/20/28/1", "16/3/Q/ring/24/41/2",
"16/2/J/little/20/28/1",
"16/2/J/little/24/41/2"), class = "data.frame")
Your self-contained example interested me, because both lme{nlme} and 
lmer{lme4} returned only error messages for my saturated models, but 
'aov' solved it fine.  I'd be interested in hearing from someone
else if
it's actually possible to solve your problem using either 'lme' or 
'lmer';  typical failed attempts appear below.  Both stopped with a 
singular error message, and neither has a 'singular.ok' option.
	  If I've read your post correctly, you are asking, "why aren't
the
contrasts that R is using to estimate the SS in the ANOVA table also not 
orthogonal?"  Are you confused, because when you look at summary.lm(m1) 
when 'm1' is fit with and without one of the interactions, you see 
different numbers?  Part of the magic of least squares is that it works 
by thinking of N observations as a point in N-dimensional space and then 
projecting the vector of observations on different sub-spaces.  The 
particular parameterization, which is what you see with summary.lm(m1), 
does not matter as long as you have specified the correct subspaces. 
You can find more on this in almost any book that discusses regression 
and least squares from this perspective.
	  hope this help.
	  Spencer Graves
p.s.  Your self-contained example helped me a lot.  I don't know if I 
answered your question, if I did, I likely would not have without that 
example.  I almost never use aov, because I rarely have such a simple, 
well-balanced experiment.  Failed attempts to solve the same problem 
with lme{nlme} and lmer{lme4} appear below.  If your example had NOT 
been so balanced, it would not have been feasible to get a sensible 
answer without something like lme or lmer.
 > library(nlme)
 > m1.lme <-lme(asin.Stimulus.ER ~
+     responseFinger + oom +
+     (stimulusName + mapping.code)^2,
+     random=~stimulusName:mapping.code|Subject,
+              data=w.tmp)
Error in MEEM(object, conLin, control$niterEM) :
	Singularity in backsolve at level 0, block 1
In addition: Warning message:
Fewer observations than random effects in all level 1 groups in: 
lme.formula(asin.Stimulus.ER ~ responseFinger + oom + (stimulusName +
library(lme4)
 > m1 <- lmer(asin.Stimulus.ER ~
+     responseFinger + oom +
+     (stimulusName + mapping.code)^2
+     +(mapping.code:stimulusName|Subject),
+            data=w.tmp)
Error in lmer(asin.Stimulus.ER ~ responseFinger + oom + (stimulusName + 
  :Leading minor of order 17 in downdated X'X is not positive definite
  sessionInfo()
Version 2.3.0 (2006-04-24)
i386-pc-mingw32
attached base packages:
[1] "methods"   "stats"     "graphics" 
"grDevices" "utils"     "datasets"
[7] "base"
other attached packages:
       lme4    lattice     Matrix
  "0.995-2"   "0.13-8" "0.995-10"
Steven Lacey wrote:> Hi, 
> 
> I am analyzing a repeated-measures Greco-Latin Square with the aov command.
> I am using aov to calculate the MSs and then picking by hand the
appropriate
> neumerator and denominator terms for the F tests. 
> 
> The data are the following:
> 
> 							responseFinger
> mapping.code	Subject.n	index		middle	ring
> little
>
----------------------------------------------------------------------------
> 1			1		green(1)	yellow(4)   blue(2)
> red(3)
> 1			2		green(1)	yellow(4)   blue(2)
> red(3)
> 2			3           red(2)	blue(3)     yellow(1)
> green(4)
> 2			4		red(2)	blue(3)     yellow(1)
> green(4)
> 3			5		yellow(3)	green(2)
> red(4)	blue(1)
> 3			6		yellow(3)	green(2)
> red(4)	blue(1)
> 4			7		blue(4)     red(1)	green(3)
> yellow(2)
> 4			8		blue(4)     red(1)	green(3)
> yellow(2)
> 
> There are 4 factors:
> 
> factor	     levels					type
> -----------------------------------------------------------------
> responseFinger   index, middle, ring, little	within-subject
> stimulusName     green, yellow, blue, red		within-subject
> oom              1, 2, 3, 4				within-subject
> mapping.code     1, 2, 3, 4				between-subjects
> Subject.n        1, 2, 3, 4, 5, 6, 7, 8		nested within mapping.code
> 
> DV = asin.Stimulus.ER
> 
> There are 32 observations and 31 total dfs.
> 
> I fit the following model:
> m1 <- asin.Stimulus.ER ~ stimulusName + responseFinger + oom +
mapping.code
> +  mapping.code:Subject.n + stimulusName:mapping.code +
> stimulusName:mapping.code:Subject.n, data=w.tmp)
> summary(m1)
>                                     Df   Sum Sq  Mean Sq
> stimulusName                         3 0.005002 0.001667
> responseFinger                       3 0.033730 0.011243
> oom                                  3 0.006146 0.002049
> mapping.code                         3 0.028190 0.009397
> mapping.code:Subject.n               4 0.020374 0.005094
> stimulusName:mapping.code            3 0.022318 0.007439
> stimulusName:mapping.code:Subject.n 12 0.013903 0.001159
> 
> There are 3 dfs for each main effect of stimulusName, responseFinger, oom,
> and mapping.code. That leaves 3 df to estimate any higher-order
interactions
> involving these 4 factors. To capture this variance I use
> stimulusName:mapping.code, but I believe I could use any of the two-way
> interactions. The variance aassociated with this effect should be
orthogonal
> to the variance for the main effects. However, when I look at the contrasts
> with summary.lm it seems as though the estimates of contrasts involving
> responseFinger, for example, depend on whether stimulusName:mapping.code is
> in the model. That suggests to me that variance contributing to
> stimulusName:mapping.code in the ANOVA table is not orthogonal to the main
> effect of responseFinger, as it should be. Yet, I have calculated the MS by
> hand and am confident that the SS in the ANOVA table for
> stimulusName:mapping.code is orthogonal to other terms in the model. If
that
> is true, then why aren't the contrasts that R is using to estimate the
SS in
> the ANOVA table also not orthogonal?
> 
> m2 <- aov(asin.Stimulus.ER ~ stimulusName + responseFinger + oom +
> mapping.code + mapping.code:Subject.n + stimulusName:mapping.code,
> data=w.tmp, contrasts=list(stimulusName="contr.poly",
> responseFinger="contr.poly",
oom="contr.poly",mapping.code="contr.poly",
> Subject.n="contr.poly"))
> 
> summary.lm(m2)
> 
> Call:
> aov(formula = asin.Stimulus.ER ~ stimulusName + responseFinger + 
>     oom + mapping.code + mapping.code:Subject.n, data = w.tmp, 
>     contrasts = list(stimulusName = "contr.poly", responseFinger
> "contr.poly",
>         oom = "contr.poly", mapping.code =
"contr.poly", Subject.n > "contr.poly"))
> 
> Residuals:
>       Min        1Q    Median        3Q       Max 
> -0.063950 -0.027306 -0.002311  0.033117  0.055900 
> 
> Coefficients:
>                              Estimate Std. Error t value Pr(>|t|)    
> (Intercept)                 0.0894680  0.0086867  10.299 3.38e-08 ***
> stimulusName.L              0.0095592  0.0173734   0.550  0.59027    
> stimulusName.Q              0.0205827  0.0173734   1.185  0.25456    
> stimulusName.C              0.0104971  0.0173734   0.604  0.55474    
> responseFinger.L            0.0246606  0.0173734   1.419  0.17622    
> responseFinger.Q           -0.0571795  0.0173734  -3.291  0.00495 ** 
> responseFinger.C           -0.0184023  0.0173734  -1.059  0.30626    
> oom.L                       0.0243220  0.0173734   1.400  0.18187    
> oom.Q                      -0.0126019  0.0173734  -0.725  0.47940    
> oom.C                      -0.0042307  0.0173734  -0.244  0.81090    
> mapping.code.L              0.0465695  0.0173734   2.681  0.01711 *  
> mapping.code.Q             -0.0300432  0.0173734  -1.729  0.10428    
> mapping.code.C              0.0212706  0.0173734   1.224  0.23971    
> mapping.code13:Subject.n.L -0.0154836  0.0245697  -0.630  0.53805    
> mapping.code14:Subject.n.L -0.0642852  0.0245697  -2.616  0.01945 *  
> mapping.code15:Subject.n.L -0.0001106  0.0245697  -0.005  0.99647    
> mapping.code16:Subject.n.L -0.0268560  0.0245697  -1.093  0.29162    
> ---
> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05
'.' 0.1 ' ' 1
> 
> Residual standard error: 0.04914 on 15 degrees of freedom
> Multiple R-Squared: 0.7207,     Adjusted R-squared: 0.4227 
> F-statistic: 2.419 on 16 and 15 DF,  p-value: 0.0474 
> 
> m3 <- aov(asin.Stimulus.ER ~ stimulusName + responseFinger + oom +
> mapping.code + mapping.code:Subject.n + stimulusName:mapping.code,
> data=w.tmp, contrasts=list(stimulusName="contr.poly",
> responseFinger="contr.poly",
oom="contr.poly",mapping.code="contr.poly",
> Subject.n="contr.poly"))
> 
> summary.lm(m3)
> 
> Call:
> aov(formula = asin.Stimulus.ER ~ stimulusName + responseFinger + 
>     oom + mapping.code + mapping.code:Subject.n +
stimulusName:mapping.code,
> 
>     data = w.tmp, contrasts = list(stimulusName = "contr.poly", 
>         responseFinger = "contr.poly", oom =
"contr.poly", mapping.code > "contr.poly",
>         Subject.n = "contr.poly"))
> 
> Residuals:
>        Min         1Q     Median         3Q        Max 
> -4.332e-02 -1.370e-02 -9.216e-19  1.370e-02  4.332e-02 
> 
> Coefficients: (6 not defined because of singularities)
>                                 Estimate Std. Error t value Pr(>|t|)    
> (Intercept)                    0.0894680  0.0060170  14.869  4.3e-09 ***
> stimulusName.L                 0.0095592  0.0120340   0.794 0.442421    
> stimulusName.Q                 0.0205827  0.0120340   1.710 0.112901    
> stimulusName.C                 0.0104971  0.0120340   0.872 0.400168    
> responseFinger.L               0.0483851  0.0163680   2.956 0.012008 *  
> responseFinger.Q              -0.1217915  0.0269089  -4.526 0.000694 ***
> responseFinger.C              -0.0089211  0.0142389  -0.627 0.542703    
> oom.L                          0.0319155  0.0131826   2.421 0.032257 *  
> oom.Q                         -0.0465613  0.0269089  -1.730 0.109180    
> oom.C                         -0.0080275  0.0123312  -0.651 0.527323    
> mapping.code.L                 0.0465695  0.0120340   3.870 0.002229 ** 
> mapping.code.Q                -0.0300432  0.0120340  -2.497 0.028094 *  
> mapping.code.C                 0.0212706  0.0120340   1.768 0.102532    
> mapping.code13:Subject.n.L    -0.0154836  0.0170187  -0.910 0.380838    
> mapping.code14:Subject.n.L    -0.0642852  0.0170187  -3.777 0.002636 ** 
> mapping.code15:Subject.n.L    -0.0001106  0.0170187  -0.006 0.994921    
> mapping.code16:Subject.n.L    -0.0268560  0.0170187  -1.578 0.140543    
> stimulusName.L:mapping.code.L  0.0848984  0.0601701   1.411 0.183649    
> stimulusName.Q:mapping.code.L -0.1444769  0.0538178  -2.685 0.019869 *  
> stimulusName.L:mapping.code.Q -0.0853739  0.0269089  -3.173 0.008029 ** 
> ---
> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05
'.' 0.1 ' ' 1
> 
> Residual standard error: 0.03404 on 12 degrees of freedom
> Multiple R-Squared: 0.8928,     Adjusted R-squared: 0.723 
> F-statistic: 5.259 on 19 and 12 DF,  p-value: 0.002629 
> 
> The dataframe is below.
> 
> Thanks for any insight you can provide, 
> Steve
> 
> w.tmp <-
> structure(list(activeMapping = structure(as.integer(c(1, 1, 1, 
> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
> 1, 1, 1, 1, 1, 1, 1, 1)), .Label = "letter", class =
"factor"),
>     mapping.code = structure(as.integer(c(1, 1, 1, 1, 1, 1, 1, 
>     1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 
>     4, 4, 4, 4, 4, 4)), .Label = c("13", "14",
"15", "16"), class > "factor"),
>     oom = structure(as.integer(c(1, 1, 4, 4, 2, 2, 3, 3, 2, 2, 
>     3, 3, 1, 1, 4, 4, 3, 3, 2, 2, 4, 4, 1, 1, 4, 4, 1, 1, 3, 
>     3, 2, 2)), .Label = c("1", "2", "3",
"4"), class = "factor"),
>     stimulusName = structure(as.integer(c(1, 1, 2, 2, 3, 3, 4, 
>     4, 4, 4, 3, 3, 2, 2, 1, 1, 2, 2, 1, 1, 4, 4, 3, 3, 3, 3, 
>     4, 4, 1, 1, 2, 2)), .Label = c("Q", "J",
"X", "B"), class = "factor"),
>     responseFinger = structure(as.integer(c(1, 1, 2, 2, 3, 3, 
>     4, 4, 1, 1, 2, 2, 3, 3, 4, 4, 1, 1, 2, 2, 3, 3, 4, 4, 1, 
>     1, 2, 2, 3, 3, 4, 4)), .Label = c("index",
"middle", "ring",
>     "little"), class = "factor"), Subject.a =
structure(as.integer(c(1,
>     5, 1, 5, 1, 5, 1, 5, 2, 6, 2, 6, 2, 6, 2, 6, 3, 7, 3, 7, 
>     3, 7, 3, 7, 4, 8, 4, 8, 4, 8, 4, 8)), .Label = c("17",
"18",
>     "19", "20", "21", "22",
"23", "24"), class = "factor"), Subject >
structure(as.integer(c(1,
>     5, 1, 5, 1, 5, 1, 5, 2, 6, 2, 6, 2, 6, 2, 6, 3, 7, 3, 7, 
>     3, 7, 3, 7, 4, 8, 4, 8, 4, 8, 4, 8)), .Label = c("25",
"26",
>     "27", "28", "29", "30",
"36", "41"), class = "factor"), Subject.n >
structure(as.integer(c(1,
>     2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 
>     1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2)), .Label = c("1",
"2"
>     ), class = "factor"), Block = structure(as.integer(c(1, 1, 
>     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
>     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)), .Label = "1", class =
"factor"),
>     Stimulus.ACC = c(0.9875, 0.995833333333333, 0.9875, 0.975, 
>     0.9625, 0.995833333333333, 0.975, 0.9875, 0.954166666666667, 
>     0.983333333333333, 0.9125, 0.95, 0.908333333333333, 0.983333333333333, 
>     0.958333333333333, 0.979166666666667, 0.9875, 0.979166666666667, 
>     0.9625, 0.954166666666667, 0.904166666666667, 0.904166666666667, 
>     0.975, 0.991666666666667, 0.979166666666667, 0.975, 0.970833333333333, 
>     0.954166666666667, 0.9, 0.958333333333333, 0.929166666666667, 
>     0.958333333333333), Stimulus.ER = c(0.0125, 0.00416666666666667, 
>     0.0125, 0.025, 0.0375, 0.00416666666666667, 0.025, 0.0125, 
>     0.0458333333333333, 0.0166666666666667, 0.0875, 0.05,
> 0.0916666666666667, 
>     0.0166666666666667, 0.0416666666666667, 0.0208333333333333, 
>     0.0125, 0.0208333333333333, 0.0375, 0.0458333333333333,
> 0.0958333333333333, 
>     0.0958333333333333, 0.025, 0.00833333333333333, 0.0208333333333333, 
>     0.025, 0.0291666666666667, 0.0458333333333333, 0.1, 0.0416666666666667,
>     0.0708333333333333, 0.0416666666666667), asin.Stimulus.ER >
c(0.0315400751462974,
>     0.0105133583820991, 0.0315400751462974, 0.0630801502925948, 
>     0.0714356562826538, 0.0105133583820991, 0.0630801502925948, 
>     0.0259003510988588, 0.115646942203090, 0.0420534335283965, 
>     0.209501077929205, 0.114880852490312, 0.190564470141143, 
>     0.0420534335283965, 0.0994938597735527, 0.0525667919104956, 
>     0.0315400751462974, 0.0525667919104956, 0.0889805013914536, 
>     0.110007218155652, 0.219248346598526, 0.218622673632042, 
>     0.0630801502925948, 0.0210267167641983, 0.0525667919104956, 
>     0.0511750292312336, 0.0735935086746939, 0.110007218155652, 
>     0.229761704980625, 0.105133583820991, 0.161807920353369, 
>     0.0994938597735527), cell = structure(as.integer(c(1, 1, 
>     2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 
>     11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16)), .Label = c("1",
>     "2", "3", "4", "5",
"6", "7", "8", "9", "10",
"11", "12",
>     "13", "14", "15", "16"), class
= c("ordered", "factor"))), .Names >
c("activeMapping",
> "mapping.code", "oom", "stimulusName",
"responseFinger", "Subject.a",
> "Subject", "Subject.n", "Block",
"Stimulus.ACC", "Stimulus.ER",
> "asin.Stimulus.ER", "cell"), row.names =
c("13/1/Q/index/17/25/1",
> "13/1/Q/index/21/29/2", "13/4/J/middle/17/25/1",
"13/4/J/middle/21/29/2",
> "13/2/X/ring/17/25/1", "13/2/X/ring/21/29/2",
"13/3/B/little/17/25/1",
> "13/3/B/little/21/29/2", "14/2/B/index/18/26/1",
"14/2/B/index/22/30/2",
> "14/3/X/middle/18/26/1", "14/3/X/middle/22/30/2",
"14/1/J/ring/18/26/1",
> "14/1/J/ring/22/30/2", "14/4/Q/little/18/26/1",
"14/4/Q/little/22/30/2",
> "15/3/J/index/19/27/1", "15/3/J/index/23/36/2",
"15/2/Q/middle/19/27/1",
> "15/2/Q/middle/23/36/2", "15/4/B/ring/19/27/1",
"15/4/B/ring/23/36/2",
> "15/1/X/little/19/27/1", "15/1/X/little/23/36/2",
"16/4/X/index/20/28/1",
> "16/4/X/index/24/41/2", "16/1/B/middle/20/28/1",
"16/1/B/middle/24/41/2",
> "16/3/Q/ring/20/28/1", "16/3/Q/ring/24/41/2",
"16/2/J/little/20/28/1",
> "16/2/J/little/24/41/2"), class = "data.frame")
> 
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide!
http://www.R-project.org/posting-guide.html
## Thank you for a very nice example.  I would like to make two
## expansions on the discussion that Spencer Graves gave.
## Rich
## 1. Multiple regression is a sequential algorithm.  In the
## sequential anova table the sums of squares for non-orthogonal
## predictor variables depends on the order in which they are brought
## into the model.  As part of the regression algorithm each of the
## predictor variables, in this case the dummy variables corresponding
## to the contrasts, is orthogonalized against all previous dummy
## variables.
## We can see that the algorithm has done its task by looking at the
## projection of Y=asin.Stimulus.ER onto the orthogonalized subspaces
## associated with each of the multi-degree-of-freedom terms in the
## model.  We do so by projecting Y onto each of those subspaces with
## the proj() function.
m1 <- aov(asin.Stimulus.ER ~
          stimulusName + responseFinger + oom + mapping.code +
          mapping.code:Subject.n + stimulusName:mapping.code +
          stimulusName:mapping.code:Subject.n,
          data=w.tmp)
summary(m1)
m1.proj <- proj(m1)
tmp <- crossprod(m1.proj)
## zapsmall(tmp)
dimnames(tmp) <- rep(list(abbreviate(dimnames(tmp)[[1]])), 2)
## The projections onto the subspaces are orthogonal to each other.
zapsmall(tmp, digits=3)
## > zapsmall(tmp, digits=3)
##         (In)  stmN   rspF    oom   mpp.   m.:S  stN:.  sN:.:
## (In)  0.2561 0.000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
## stmN  0.0000 0.005 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
## rspF  0.0000 0.000 0.0337 0.0000 0.0000 0.0000 0.0000 0.0000
## oom   0.0000 0.000 0.0000 0.0061 0.0000 0.0000 0.0000 0.0000
## mpp.  0.0000 0.000 0.0000 0.0000 0.0282 0.0000 0.0000 0.0000
## m.:S  0.0000 0.000 0.0000 0.0000 0.0000 0.0204 0.0000 0.0000
## stN:. 0.0000 0.000 0.0000 0.0000 0.0000 0.0000 0.0223 0.0000
## sN:.: 0.0000 0.000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0139
## > 
## The sums of squares of the projections are exactly the sums of
## squares in the ANOVA table.
as.matrix(apply(m1.proj, 2, function(x) sum(x^2)))
## > as.matrix(apply(m1.proj, 2, function(x) sum(x^2)))
##                                            [,1]
## (Intercept)                         0.256144760
## stimulusName                        0.005001724
## responseFinger                      0.033730254
## oom                                 0.006146134
## mapping.code                        0.028189996
## mapping.code:Subject.n              0.020374325
## stimulusName:mapping.code           0.022317815
## stimulusName:mapping.code:Subject.n 0.013902509
## >
## 2. We can ask the summary function to do all the right tests.
## There is no need to do them by hand.  The Error() function works
## directly with the orthogonal subspaces and recognizes which terms
## are the numerators and denominators for the F tests.
m1e <- aov(asin.Stimulus.ER ~
           (stimulusName + mapping.code + responseFinger + oom)^2 +
           Error(mapping.code:Subject.n),
           data=w.tmp)
summary(m1e)
## > m1e <- aov(asin.Stimulus.ER ~
## +            (stimulusName + mapping.code + responseFinger + oom)^2 +
## +            Error(mapping.code:Subject.n),
## +            data=w.tmp)
## Warning message:
## Error() model is singular in: aov(asin.Stimulus.ER ~ (stimulusName +
mapping.code +
responseFinger +  
## > 
## > summary(m1e)
##
## Error: mapping.code:Subject.n
##              Df    Sum Sq   Mean Sq F value Pr(>F)
## mapping.code  3 0.0281900 0.0093967  1.8448 0.2794
## Residuals     4 0.0203743 0.0050936               
##
## Error: Within
##                           Df   Sum Sq  Mean Sq F value   Pr(>F)   
## stimulusName               3 0.005002 0.001667  1.4391 0.280137   
## responseFinger             3 0.033730 0.011243  9.7048 0.001569 **
## oom                        3 0.006146 0.002049  1.7684 0.206609   
## stimulusName:mapping.code  3 0.022318 0.007439  6.4212 0.007677 **
## Residuals                 12 0.013903 0.001159                    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05
'.' 0.1 ' ' 1
## > 
## The warning about the singular model is an indicator that more
## dummy variables have been generated than are needed.  This is
## consistent with your observation that any of the twoway
## interactions could be used to capture those interactions.