I have posted an FDR script at https://www.alivelearn.net/?p=1840. I noticed that there is a small bug. In rare cases, this bug will cause the most significant voxel to be classified as ‘non-significant’ while other voxels are ‘significant’.
Consider the following example:
p = [0.8147 0.9058 0.0030 0.9134 0.6324 0.0029 0.2785 0.5469 0.9575 0.9649 0.1576 0.9706 0.9572 0.4854 0.8003 0.1419 0.4218 0.9157];
The previous script will classify p(3) as significant but p(6) as non-significant.
Here is the updated version of the script:
function y = fdr0(p, q) % y = fdr0(p, q) % % to calculate whether a pvalue survive FDR corrected q % % p: an array of p values. (e.g. p values for each channel) % q: desired FDR threshold (typically 0.05) % y: an array of the same size with p with only two possible values. 0 % means this position (channel) does not survive the threshold, 1 mean it % survives % % Ref: % Genovese et al. (2002). Thresholding statistical maps in functional % neuroimaging using the false discovery rate. Neuroimage, 15:722-786. % % Example: % y = fdr0(rand(10,1),0.5); % % Xu Cui % 2016/3/14 % pvalue = p; y = 0 * p; [sortedpvalue, sortedposition] = sort(pvalue); v = length(sortedposition); for ii=1:v if q*ii/v >= sortedpvalue(ii) y(sortedposition(1:ii)) = 1; end end return;
There is a small bug in this script. An updated version can be found at http://www.alivelearn.net/?p=1914