one-way, three-level ANOVA (e.g. three groups)

Illustrate tests of "main effect" F-contrast and separate two-sample t-tests (standard, not repeated-measures, ANOVA)

Contents

Data

randn('state', 0);
Na = 10; Nb = 10; Nc = 10; % balanced case
% Na = 10; Nb = 12; Nc = 11; % unbalanced group sizes
a = randn(Na, 1);
b = randn(Nb, 1);
c = randn(Nc, 1);

ANOVA main effect F-contrast

Y = [a;b;c];
X = [ones(size(a)) zeros(size(a)) zeros(size(a))
     zeros(size(b)) ones(size(b)) zeros(size(b))
     zeros(size(c)) zeros(size(c)) ones(size(c))];
Cmain = [1 -1  0
         0  1 -1]';
[Fmain DFmain Bmain] = spm_ancova(X, eye(length(Y)), Y, Cmain)
ResMS = sum((Y-X*(X'*X\X'*Y)).^2)/DFmain(2)
% equivalent alternative F-contrast
Cmain2 = [1    -1/2 -1/2
          -1/2  1   -1/2
          -1/2 -1/2  1  ]';
[Fmain DFmain Bmain] = spm_ancova(X, eye(length(Y)), Y, Cmain)
Fmain =

    0.1588


DFmain =

     2    27


Bmain =

    0.0013
    0.2310
    0.0253


ResMS =

    1.0038


Fmain =

    0.1588


DFmain =

     2    27


Bmain =

    0.0013
    0.2310
    0.0253

Two-sample t-contrasts in ANOVA model

Y = [a;b;c];
X = [ones(size(a)) zeros(size(a)) zeros(size(a))
     zeros(size(b)) ones(size(b)) zeros(size(b))
     zeros(size(c)) zeros(size(c)) ones(size(c))];
Cab = [1;-1;0];
[Tab DFab Bab] = spm_ancova(X, eye(length(Y)), Y, Cab)
Cac = [1;0;-1];
[Tac DFac Bac] = spm_ancova(X, eye(length(Y)), Y, Cac)
Tab =

   -0.5126


DFab =

    1.0000   27.0000


Bab =

    0.0013
    0.2310
    0.0253


Tac =

   -0.0536


DFac =

    1.0000   27.0000


Bac =

    0.0013
    0.2310
    0.0253

Separately modelled two-sample t-tests

Yab = [a;b];
Xab = [ones(size(a)) zeros(size(a))
       zeros(size(b)) ones(size(b))];
Cab = [1;-1];
[Tab DFab Bab] = spm_ancova(Xab, eye(length(Yab)), Yab, Cab)
Yac = [a;c];
Xac = [ones(size(a)) zeros(size(a))
       zeros(size(c)) ones(size(c))];
Cac = [1;-1];
[Tac DFac Bac] = spm_ancova(Xac, eye(length(Yac)), Yac, Cac)
Tab =

   -0.5750


DFab =

    1.0000   18.0000


Bab =

    0.0013
    0.2310


Tac =

   -0.0508


DFac =

    1.0000   18.0000


Bac =

    0.0013
    0.0253

See also anova1 and multcompare in MATLAB

[p tab st] = anova1(Y, [ones(Na,1);2*ones(Nb,1);3*ones(Nb,1)]); st
mc = multcompare(st);
% Note, multcompare uses only the information in the st structure, it
% doesn't perform separate two-sample t-tests. Compare e.g.
Bmain = st.means'
DFmain = st.df
ResMS = st.s^2
% this leads me to believe that the ANOVA approach is correct. Though note
% that the above didn't touch on the multiple comparison adjustment issue.
st = 

    gnames: {3x1 cell}
         n: [10 10 10]
    source: 'anova1'
     means: [0.0013 0.2310 0.0253]
        df: 27
         s: 1.0019


Bmain =

    0.0013
    0.2310
    0.0253


DFmain =

    27


ResMS =

    1.0038