roi-based MVPA with group-analysis
Load t-stat data from all subjects, apply 'vt' mask, compute difference of (fisher-transformed) between on- and off diagonal split-half correlation values, and perform a random effects analysis.
- For CoSMoMVPA's copyright information and license terms, #
- see the COPYING file distributed with CoSMoMVPA. #
Contents
Set analysis parameters
subject_ids = {'s01', 's02', 's03', 's04', 's05', 's06', 's07', 's08'}; rois = {'ev'; 'vt'; 'brain'}; labels = {'monkey'; 'lemur'; 'mallard'; 'warbler'; 'ladybug'; 'lunamoth'}; nsubjects = numel(subject_ids); % allocate space for output sum_weighted_zs_all = zeros(nsubjects, 1); config = cosmo_config(); study_path = fullfile(config.tutorial_data_path, 'ak6');
Loop over rois
nrois = numel(rois);
for i_roi = 1:nrois
% pre-allocate space weighted correlation difference % in each subject sum_weighted_zs_all = zeros(nsubjects, 1);
Computations for each subject
for i_subj = 1:nsubjects subject_id = subject_ids{i_subj}; 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 name for given subject and roi mask_fn = fullfile(data_path, [rois{i_roi}, '_mask.nii']); % load two halves as CoSMoMVPA dataset structs. half1_ds = cosmo_fmri_dataset(half1_fn, 'mask', mask_fn); half2_ds = cosmo_fmri_dataset(half2_fn, 'mask', mask_fn); % 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 % >@@> rho = cosmo_corr(half1_samples', half2_samples'); % <@@< % for the advanced exercise ('compute the average of all individual % correlation matrices'): if the first subject and roi, % allocate space for a 'rho_sum' array with three dimensions; % the first two dimensions for the two halves, the third % one for different rois. % Then add 'rho' to 'rho_sum' % % (If you don't want to do the advanced % exercise, yo don't have to do anything here.) % >@@> if i_subj == 1 && i_roi == 1 % first correlation was just computed, and we now know % the number of conditions through the size of rho. % % allocate space for sum over subjects nclasses = size(rho, 1); rho_sum = zeros([nclasses, nclasses, nrois]); end rho_sum(:, :, i_roi) = rho_sum(:, :, i_roi) + rho; % <@@< % To make these correlations more 'normal', apply a Fisher % transformation and store this in a variable 'z' (use atanh). % >@@> z = atanh(rho); % <@@< % visualize the matrix 'z' subplot(3, 3, i_subj); % >@@> imagesc(z); colorbar(); title([subject_id ' ' rois{i_roi}]); % <@@< % define in a variable 'contrast_matrix' how correlations values % are going to be weighted. % The matrix must have a mean of zero, positive values on diagonal, % negative elsewhere. nclasses = size(rho, 1); % sanity check; in this example there are 6 conditions assert(nclasses == 6); % set contrast matrix. It has a mean of zero, the diagonal elements % sum to 1, and the non-diagonal element sum to -1 contrast_matrix = (eye(nclasses) - 1 / nclasses) / (nclasses - 1); if abs(mean(contrast_matrix(:))) > 1e-14 error('illegal contrast matrix'); end % Weigh the values in the matrix 'z' by those in the % contrast_matrix and then sum them (hint: use the '.*' % operator for element-wise multiplication). Store the results in % a variable 'sum_weighted_z'. % >@@> weighted_z = z .* contrast_matrix; sum_weighted_z = sum(weighted_z(:)); % <@@< % store the result for this subject in sum_weighted_zs_all % (at the i_subj-th position), so that % group statistics can be computed % >@@> sum_weighted_zs_all(i_subj) = sum_weighted_z; % <@@< end



compute t statistic and print the result
run one-sample t-test again zero
% Using matlab's stat toolbox (if present) if cosmo_check_external('@stats', false) % >@@> [h, p, ci, stats] = ttest(sum_weighted_zs_all); fprintf(['correlation difference in %s at group level: '... '%.3f +/- %.3f, t_%d=%.3f, p=%.5f (using matlab stats '... 'toolbox)\n'], ... rois{i_roi}, mean(sum_weighted_zs_all), ... std(sum_weighted_zs_all), ... stats.df, stats.tstat, p); % <@@< else fprintf('Matlab stats toolbox not available\n'); end % Apart from using the 'ttest' function (if available), one can % also use 'cosmo_stat' for univaraite statistics. % For this approach, data must be represented in a dataset struct. % % The targets are chunks are set to indicate that all samples are from % the same class (condition), and each observation is independent from % the others sum_weighted_zs_ds = struct(); sum_weighted_zs_ds.samples = sum_weighted_zs_all; sum_weighted_zs_ds.sa.targets = ones(nsubjects, 1); sum_weighted_zs_ds.sa.chunks = (1:nsubjects)'; ds_t = cosmo_stat(sum_weighted_zs_ds, 't'); % t-test against zero ds_p = cosmo_stat(sum_weighted_zs_ds, 't', 'p'); % convert to p-value fprintf(['correlation difference in %s at group level: '... '%.3f +/- %.3f, %s=%.3f, p=%.5f (using cosmo_stat)\n'], ... rois{i_roi}, mean(sum_weighted_zs_all), std(sum_weighted_zs_all), ... ds_t.sa.stats{1}, ds_t.samples, ds_p.samples);
correlation difference in ev at group level: 0.379 +/- 0.137, t_7=7.854, p=0.00010 (using matlab stats toolbox) correlation difference in ev at group level: 0.379 +/- 0.137, Ttest(7)=7.854, p=0.00010 (using cosmo_stat)
correlation difference in vt at group level: 0.397 +/- 0.163, t_7=6.864, p=0.00024 (using matlab stats toolbox) correlation difference in vt at group level: 0.397 +/- 0.163, Ttest(7)=6.864, p=0.00024 (using cosmo_stat)
correlation difference in brain at group level: 0.074 +/- 0.026, t_7=7.987, p=0.00009 (using matlab stats toolbox) correlation difference in brain at group level: 0.074 +/- 0.026, Ttest(7)=7.987, p=0.00009 (using cosmo_stat)
end
advanced exercise
% plot an image of the correlation matrix averaged over % participants (one for each roi) % allocate space for axis handles, so that later all plots can be set to % have the same color limits ax_handles = zeros(nrois, 1); col_limits = zeros(nrois, 2); for i_roi = 1:nrois figure; % store axis handle for current figure ax_handles(i_roi) = gca; % compute the average correlation matrix using 'rho_sum', and store the % result in a variable 'rho_mean'. Note that the number of subjects is % stored in a variable 'nsubjects' % >@@> rho_mean = rho_sum(:, :, i_roi) / nsubjects; % <@@< % visualize the rho_mean matrix using imagesc % >@@> imagesc(rho_mean); % <@@< % set labels, colorbar and title set(gca, 'xtick', 1:numel(labels), 'xticklabel', labels); set(gca, 'ytick', 1:numel(labels), 'yticklabel', labels); colorbar; desc = sprintf(['Average splithalf correlation across subjects '... 'in mask ''%s'''], rois{i_roi}); title(desc); col_limits(i_roi, :) = get(gca, 'clim'); end % give all figures the same color limits such that correlations can be % compared visually set(ax_handles, 'clim', [min(col_limits(:)), max(col_limits(:))]);


