RSA Tutorial

Compare DSMs

  1. For CoSMoMVPA's copyright information and license terms, #
  2. see the COPYING file distributed with CoSMoMVPA. #
subjects = {'s01','s02','s03','s04','s05','s06','s07','s08'};
masks = {'ev_mask.nii','vt_mask.nii'};


config=cosmo_config();
study_path=fullfile(config.tutorial_data_path,'ak6');

In a nested loop over masks then subjects: load each dataset demean it, get DSM, save it in dsms

n_subjects=numel(subjects);
n_masks=numel(masks);

counter=0;

for m = 1:n_masks
    msk = masks{m};
    for s = 1:length(subjects)
        sub = subjects{s};
        sub_path=fullfile(study_path,sub);

        % load dataset
        ds_fn=fullfile(sub_path,'glm_T_stats_perrun.nii');
        mask_fn=fullfile(sub_path,msk);
        ds_full = cosmo_fmri_dataset(ds_fn,...
                                    'mask',mask_fn,...
                                    'targets',repmat(1:6,1,10)');

        % compute average for each unique target
        ds=cosmo_fx(ds_full, @(x)mean(x,1), 'targets', 1);


        % remove constant features
        ds=cosmo_remove_useless_data(ds);


        % demean
        % Comment this out to see the effects of demeaning vs. not
        ds.samples = bsxfun(@minus, ds.samples, mean(ds.samples, 1));

        % compute the one-minus-correlation value for each pair of
        % targets.
        % (Hint: use cosmo_pdist with the 'correlation' argument)
        % >@@>
        dsm=cosmo_pdist(ds.samples, 'correlation');
        % <@@<


        if counter==0
            % first dsm, allocate space
            n_pairs=numel(dsm);
            neural_dsms=zeros(n_subjects*n_masks,n_pairs);
        end

        % increase counter and store the dsm as the counter-th row in
        % 'neural_dsms'
        % >@@>
        counter=counter+1;
        neural_dsms(counter,:)=dsm;
        % <@@<
    end
end

Then add the v1 model and behavioral DSMs

models_path=fullfile(study_path,'models');
load(fullfile(models_path,'v1_model.mat'));
load(fullfile(models_path,'behav_sim.mat'));
% add to dsms (hint: use comso_squareform)
% >@@>
v1_model_sf=cosmo_squareform(v1_model);
behav_model_sf=cosmo_squareform(behav);
% ensure row vector because Matlab and Octave return
% row and column vectors, respectively
dsms = [neural_dsms; v1_model_sf(:)'; behav_model_sf(:)'];
% <@@<

Now visualize the cross-correlation matrix. Remember that 'cosmo_corr' (or the builtin 'corr') calculates correlation coefficients between columns and we want between rows, so the data has to be transposed.

% >@@>
cc = cosmo_corr(dsms');
figure();
imagesc(cc);
% <@@<

Now use the values in the last two rows of the cross correlation matrix to visualize the distributions in correlations between the neural similarities and the v1 model/behavioral ratings. Store the result in a matrix 'cc_models', which should have 8 rows (corresponding to the participants) and 4 columns (corresponding to EV and VT correlated with both models)

Rows 1 to 8: EV neural similarities Rows 9 to 16: VT neural similarities Row 17: EV model Row 18: behavioural similarities

% >@@>
cc_models = [cc(1:8,17) cc(9:16,17) cc(1:8,18) cc(9:16,18)];
% <@@<
labels = {'v1 model~EV','v1 model~VT','behav~EV','behav~VT'};
figure();
boxplot(cc_models);
set(gca,'XTick',[1:4],'XTickLabel',labels);