-
Notifications
You must be signed in to change notification settings - Fork 21
/
matlab_tfce_rm_anova1.m
119 lines (101 loc) · 3.23 KB
/
matlab_tfce_rm_anova1.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
function pcorr = matlab_tfce_rm_anova1(imgs,nperm,H,E,C,dh)
%MATLAB_TFCE_RM_ANOVA1 performs maximal statistic permutation testing
% pcorr = matlab_tfce_rm_anova1(imgs,nperm,H,E,C,dh) corrects
% a one-way omnibus ANOVA (means ~=) for multiple comparisons via a
% permutation procedure (random condition switching). Maximal f-stats of
% permuted data are compared with f-stats in the unshuffled data.
%
% Arguments:
% imgs -- an m x 1 cell array of 4D (x,y,z,subject) matrices of images
% nperm -- number of permutations to perform. More permutations yield
% more precise correct p-values.
% -- img the 3D image to be transformed
% -- H height exponent
% -- E extent exponent
% -- C connectivity
% -- ndh step number for cluster formation
%
% Output:
% pcorr -- wholebrain map of corrected p-values
% calculate matrix size
bsize = size(imgs{1});
nsub = bsize(4);
bsize = bsize(1:3);
levels = size(imgs,1);
% set tranform function
transform = @matlab_tfce_transform;
% calculate implicit mask
cellmeans = cellfun(@(x) sum(x,4),imgs,'UniformOutput',false);
implicitmask = sum(cat(4,cellmeans{:}),4);
implicitmask = ~(implicitmask == 0 | isnan(implicitmask));
nvox = sum(implicitmask(:));
% extract occupied voxels for permutation test
occimgs = NaN(nsub,levels,nvox);
for i = 1:levels
for s = 1:nsub
curimg = imgs{i}(:,:,:,s);
occimgs(s,i,:) = curimg(implicitmask);
end
end
clear imgs curimg
% calculate means
smeans = mean(occimgs,2);
cmeans = mean(occimgs,1);
gmeans = mean(mean(occimgs));
gmeans_c = repmat(gmeans,[1,levels,1]);
gmeans_s = repmat(gmeans,[nsub,1,1]);
% calculate SS
SSfac = sum((cmeans-gmeans_c).^2,2)*nsub;
SSsub = sum((smeans-gmeans_s).^2,1)*levels;
SStot = NaN([1,1,nvox]);
for v = 1:nvox
diffs = occimgs(:,:,v)-gmeans(v);
SStot(v) = sum(diffs(:).^2);
end
SSw = SStot-SSsub;
SSerr = SSw-SSfac;
% calculate MS and F
MSfac = SSfac./(levels-1);
MSerr = SSerr./((levels-1)*(nsub-1));
fvals = MSfac./MSerr;
% perform TFCE
truestat = zeros(bsize);
truestat(implicitmask) = fvals;
tfcestat = transform(truestat,H,E,C,dh);
tfcestat = tfcestat(implicitmask);
% initialize progress indicator
parfor_progress(nperm);
global parworkers
% cycle through permutations
exceedances = zeros(nvox,1);
parfor(p = 1:nperm,parworkers)
% permute labels
roccimgs = NaN(size(occimgs));
for s = 1:nsub
relabeling = randperm(levels)';
roccimgs(s,relabeling,:) = occimgs(s,:,:);
end
% calculate permutation statistic
rcmeans = mean(roccimgs,1);
rSSfac = sum((rcmeans-gmeans_c).^2,2)*nsub;
rSSerr = SSw-rSSfac;
rMSfac = rSSfac./(levels-1);
rMSerr = rSSerr./((levels-1)*(nsub-1));
rfvals = rMSfac./rMSerr;
rbrain = zeros(bsize);
rbrain(implicitmask) = rfvals;
rbrain = transform(rbrain,H,E,C,dh);
rstats = rbrain(implicitmask);
% compare maxima to true statistic and increment as appropriate
curexceeds = max(rstats) >= tfcestat;
exceedances = exceedances + curexceeds;
% update progress indicator (only does so 1 in 5 to minimize overhead)
if ~randi([0 4]);
parfor_progress;
end
end
% create corrected p-value image
corrected = exceedances./nperm;
pcorr = ones(bsize);
pcorr(implicitmask) = corrected;
end