Marco,
> I have a PET study with 8 subjects and 3 conditions (each condition,
> 1 scan). Signal (hence analysis) is restricted to the basal
> ganglia. I have performed non-parametric paired comparisons with
> SnPM99 and did not find any evidence of significant differences
> (even at P<0.1).
>
> I have conducted a non-parametric analysis of ROI data in parallel,
> and the results are in agreement with the SnPM analysis. However, in
> the ROI analysis I found evidence of a significant correlation
> between ROI values and a behavioral measure of performance (Spearman
> rank correlation test).
>
> I would like to perform such a correlation also in SnPM, but it
> seems there is no such option available.
SnPM currently only uses a permutation test, and doesn't use any
rank-based tests. The reason for this is that rank-based tests were
developed as approximations to the permutation test--when data are
converted to ranks, the null distributions can be tabulated in advance
or easily computed. With modern computing power, a permutation can be
performed which should generally be more powerful. The notable
exception is in the case of extreme outliers, which will be 'pulled
in' when the data is converted into ranks.
While an outlier could explain the differences you see, more likely
the difference is explained by (a) a voxel-wise vs a ROI analysis, and
(b) corrected vs. uncorrected inferences. SPM and SnPM's does
voxel-wise analyses with corrected inferences (SnPM offers *only*
corrected inferences). An ROI analysis can be more sensitive because
it pools voxels *and* because it eliminates the multiple comparisons
problem, making corrected inferences unnecessary.
> Can the 'Single subject: single covariate of interest' plugin be
> used (somewhat inappropriately) for this purpose? And is this
> equivalent to a Spearman rank correlation test?
Unfortunately not. I will put this in the 'To Do' list for SnPM. In
the mean time, I've attached a SPM99 function ImgRank.m that will take
a one-sample dataset and create a rank version (e.g. if voxel 1 in a
4-subject dataset has values 0.4, -0.3, 2.3, 1.2, then ImgRank.m
will create a set of 4 images with voxel 1 values of 2, 1, 4, 3.)
Submit the rank-transformed dataset to SnPM to impliment a rank-based
anlaysis. Note this will also work with a correlation as well; just
replace your covariate with ranks as well. (Note that all of this
assumes there are no ties).
I've only tested it a bit; please get back to me with problems (and if
you use it w/ SnPM let me know how it turns out).
-Tom
-- Thomas Nichols -------------------- Department of Biostatistics
http://www.sph.umich.edu/~nichols University of Michigan
[log in to unmask] 1420 Washington Heights
-------------------------------------- Ann Arbor, MI 48109-2029
function ImgRank(P)
% Convert of set of images to ranks
% FORMAT ImgRank([P])
%
% P Matrix of filenames (optional); all must have the same dimensions.
%
% TE Nichols
% @(#)ImgRank.m 1.2 04/05/08
if (nargin<1), P = []; end
% Get & map files
if ~isempty(P)
P = spm_get(Inf,'*.img','Select images to rank-xform');
end
V = spm_vol(P);
nV = length(V);
Vr = V;
Dim = V(1).dim(1:3);
% Open output dataset
for i=1:nV
Vr(i).fname = fullfile(spm_str_manip(V(i).fname,'H'), ...
['Rnk_' spm_str_manip(V(i).fname,'t') ]);
Vr(i).descrip = ['Rank ' Vr(i).descrip];
Vr(i).dim(4) = spm_type('int16');
Vr(i).pinfo = [1 0 0]';
Vr(i) = spm_create_image(Vr(i));
end
% Rank!
img = zeros(nV,prod(Dim(1:2)));
rnk = zeros(nV,prod(Dim(1:2)));
for z = 1:Dim(3),
for i=1:nV
tmp = spm_slice_vol(V(i),spm_matrix([0 0 z]),Dim(1:2),0);
img(i,:) = tmp(:)';
end
% Ignore NaN or all-constant voxels
I = all(isfinite(img)) & ~all(diff(img)==0);
[srt tmp] = sort(img(:,I));
rnk(:,I) = tmp;
rnk(:,~I) = NaN; % NaN's written as 0's
for i=1:nV
spm_write_plane(Vr(i),reshape(rnk(i,:),Dim(1:2)),z);
end
end
|