Roi-based MVPA for single subject (run_split_half_correlations_single_sub)
Load t-stat data from one subject, apply 'vt' mask, compute difference of (fisher-transformed) between on- and off diagonal split-half correlation values.
- For CoSMoMVPA's copyright information and license terms, #
- see the COPYING file distributed with CoSMoMVPA. #
Contents
Set analysis parameters
subject_id='s01'; roi_label='vt'; % 'vt' or 'ev' or 'brain' config=cosmo_config(); study_path=fullfile(config.tutorial_data_path,'ak6');
Computations
data_path=fullfile(study_path, subject_id); % file locations for both halves half1_fn=fullfile(data_path,'glm_T_stats_odd.nii'); half2_fn=fullfile(data_path,'glm_T_stats_even.nii'); mask_fn=fullfile(data_path,[roi_label '_mask.nii']); % load two halves as CoSMoMVPA dataset structs. half1_ds=cosmo_fmri_dataset(half1_fn,'mask',mask_fn,... 'targets',(1:6)',... 'chunks',repmat(1,6,1)); half2_ds=cosmo_fmri_dataset(half2_fn,'mask',mask_fn,... 'targets',(1:6)',... 'chunks',repmat(2,6,1)); labels={'monkey'; 'lemur'; 'mallard'; 'warbler'; 'ladybug'; 'lunamoth'}; half1_ds.sa.labels = labels; half2_ds.sa.labels = labels; cosmo_check_dataset(half1_ds); cosmo_check_dataset(half2_ds); % Some sanity checks to ensure that the data has matching features (voxels) % and matching targets (conditions) assert(isequal(half1_ds.fa,half2_ds.fa)); assert(isequal(half1_ds.sa.targets,half2_ds.sa.targets)); nClasses = numel(half1_ds.sa.labels); % get the sample data % each half has six samples: % monkey, lemur, mallard, warbler, ladybug, lunamoth. half1_samples=half1_ds.samples; half2_samples=half2_ds.samples; % compute all correlation values between the two halves, resulting % in a 6x6 matrix. Store this matrix in a variable 'rho'. % Hint: use cosmo_corr (or builtin corr, if the matlab stats toolbox % is available) after transposing the samples in the two halves. % >@@> rho=cosmo_corr(half1_samples',half2_samples'); % <@@< % Correlations are limited between -1 and +1, thus they cannot be normally % distributed. To make these correlations more 'normal', apply a Fisher % transformation and store this in a variable 'z' % (hint: use atanh). % >@@> z=atanh(rho); % <@@< % visualize the normalized correlation matrix figure % >@@> imagesc(z); colorbar() set(gca, 'xtick', 1:numel(half1_ds.sa.labels), ... 'xticklabel', half1_ds.sa.labels) set(gca, 'ytick', 1:numel(half1_ds.sa.labels), ... 'yticklabel', half1_ds.sa.labels) title(subject_id) % <@@< % Set up a contrast matrix to test whether the element in the diagonal % (i.e. a within category correlation) is higher than the average of all % other elements in the same row (i.e. the average between-category % correlations). For testing the split half correlation of n classes one % has an n x n matrix (here, n=6). % % To compute the difference between the average of the on-diagonal and the % average of the off-diagonal elements, consider that there are % n on-diagonal elements and n*(n-1) off-diagonal elements. % Therefore, set % - the on-diagonal elements to 1/n [positive] % - the off-diagonal elements to -1/(n*(n-1)) [negative] % This results in a contrast matrix with weights for each element in % the correlation matrix, with positive and equal values on the diagonal, % negative and equal values off the diagonal, and a mean value of zero. % % Under the null hypothesis one would expect no difference between the % average on the on- and off-diagonal, hence correlations weighted by the % contrast matrix has an expected mean of zero. A postive value for % the weighted correlations would indicate more similar patterns for % patterns in the same condition (across the two halves) than in different % conditions. % Set the contrast matrix as described above and assign it to a variable % named 'contrast_matrix' % >@@> contrast_matrix=(eye(nClasses)-1/nClasses)/(nClasses-1); % alternative solution contrast_matrix_alt=zeros(nClasses,nClasses); for k=1:nClasses for j=1:nClasses if k==j value=1/nClasses; else value=-1/(nClasses*(nClasses-1)); end contrast_matrix_alt(k,j)=value; end end % <@@< % sanity check: ensure the matrix has a sum of zero if abs(sum(contrast_matrix(:)))>1e-14 error('illegal contrast matrix: it must have a sum of zero'); end %visualize the contrast matrix % >@@> figure imagesc(contrast_matrix) colorbar title('Contrast Matrix') % <@@< % Weigh the values in the matrix 'z' by those in the contrast_matrix % (hint: use the '.*' operator for element-wise multiplication). % Store the result in a variable 'weighted_z'. % >@@> weighted_z=z .* contrast_matrix; % <@@< % Compute the sum of all values in 'weighted_z', and store the result in % 'sum_weighted_z'. % >@@> sum_weighted_z=sum(weighted_z(:)); %Expected value under H0 is 0 % <@@< %visualize weighted normalized correlation matrix figure imagesc(weighted_z) colorbar % For the advanced exercise title(sprintf('Weighted Contrast Matrix m = %5.3f', sum_weighted_z))