123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- function Con = spm_make_contrasts(k)
- % Make contrasts for one, two or three-way ANOVAs
- % FORMAT Con = spm_make_contrasts(k)
- %
- % k - vector where the ith entry is the number of levels of factor i
- %
- % Con - struct array with fields:
- % Con(c).c - Contrast matrix
- % .name - Name
- %
- % This function computes contrasts for a generic k(1)-by-k(2)-by-k(3)
- % design. It is assumed that the levels of the first factor change slowest.
- %
- % For one-way ANOVAs set k=L, where L is the number of
- % levels, for two-way ANOVAs set k=[L1 L2], for three way set k=[L1 L2 L3]
- %
- % This function generates (transposed) contrast matrices to test
- % average effect, main effect of each factor and interactions.
- %__________________________________________________________________________
- %
- % Reference:
- %
- % For details of Kronecker operations, see section 5 of
- % http://www.fil.ion.ucl.ac.uk/~wpenny/publications/rik_anova.pdf
- %__________________________________________________________________________
- % Copyright (C) 2005-2012 Wellcome Trust Centre for Neuroimaging
- % Will Penny
- % $Id: spm_make_contrasts.m 6157 2014-09-05 18:17:54Z guillaume $
- %-Number of factors
- %--------------------------------------------------------------------------
- nf = numel(k);
- k = [k(:)' 1 1 1];
- if nf > 3
- fprintf('spm_make_contrasts not written for %d-way ANOVAs.\n',nf);
- Con = [];
- return
- end
- %-Get common and differential vectors
- %--------------------------------------------------------------------------
- C1 = ones(k(1),1);
- C2 = ones(k(2),1);
- C3 = ones(k(3),1);
- C4 = ones(k(4),1);
- D1 = -diff(eye(k(1)))';
- D2 = -diff(eye(k(2)))';
- D3 = -diff(eye(k(3)))';
- D4 = -diff(eye(k(4)))';
- %-Average effect, main effects and interactions contrast vectors
- %--------------------------------------------------------------------------
- Con(1).c = kron(kron(kron(C1,C2),C3),C4)';
- Con(2).c = kron(kron(kron(D1,C2),C3),C4)';
- Con(1).name = 'Average effect of condition';
- Con(2).name = 'Main effect of factor 1';
- if nf > 1
- Con(3).c = kron(kron(kron(C1,D2),C3),C4)';
- Con(4).c = kron(kron(kron(D1,D2),C3),C4)';
- Con(3).name = 'Main effect of factor 2';
- Con(4).name = 'Interaction, factor 1 x 2';
- end
- if nf > 2
- Con(5).c = kron(kron(kron(C1,C2),D3),C4)';
- Con(6).c = kron(kron(kron(D1,C2),D3),C4)';
- Con(7).c = kron(kron(kron(C1,D2),D3),C4)';
- Con(8).c = kron(kron(kron(D1,D2),D3),C4)';
- Con(5).name = 'Main effect of factor 3';
- Con(6).name = 'Interaction, factor 1 x 3';
- Con(7).name = 'Interaction, factor 2 x 3';
- Con(8).name = 'Interaction, factor 1 x 2 x 3';
- end
- if nf > 3
- Con(9).c = kron(kron(kron(C1,C2),C3),D4)';
- Con(10).c = kron(kron(kron(D1,C2),C3),D4)';
- Con(11).c = kron(kron(kron(C1,D2),C3),D4)';
- Con(12).c = kron(kron(kron(C1,C2),D3),D4)';
- Con(13).c = kron(kron(kron(D1,D2),C3),D4)';
- Con(14).c = kron(kron(kron(D1,C2),D3),D4)';
- Con(15).c = kron(kron(kron(C1,D2),D3),D4)';
- Con(16).c = kron(kron(kron(D1,D2),D3),D4)';
- Con(9).name = 'Main effect of factor 4';
- Con(10).name = 'Interaction, factor 1 x 4';
- Con(11).name = 'Interaction, factor 2 x 4';
- Con(12).name = 'Interaction, factor 3 x 4';
- Con(13).name = 'Interaction, factor 1 x 2 x 4';
- Con(14).name = 'Interaction, factor 1 x 3 x 4';
- Con(15).name = 'Interaction, factor 2 x 3 x 4';
- Con(16).name = 'Interaction, factor 1 x 2 x 3 x 4';
- end
|