Dataset Basics
Run operations on datasets
- For CoSMoMVPA's copyright information and license terms, #
- see the COPYING file distributed with CoSMoMVPA. #
Contents
Load data and set targets
Load data as before setting targets and chunks appropriately
config=cosmo_config(); data_path=fullfile(config.tutorial_data_path,'ak6','s01'); mask_fn = fullfile(data_path, 'vt_mask.nii'); data_fn = fullfile(data_path, 'glm_T_stats_perrun.nii'); ds=cosmo_fmri_dataset(data_fn, 'mask', mask_fn); % set ds.sa.targets (trial conditions) to the 60x1 column vector: % [ 1 2 3 4 5 6 1 2 3 ... 5 6 ]' % >@@> ds.sa.targets = repmat((1:6)',10,1); % <@@< % set ds.sa.chunks (acquistion run number) to the 60x1 column vector: % [ 1 1 1 1 1 1 2 2 2 ... 10 10 ]' % >@@> ds.sa.chunks = ceil((1:60)'/6); % <@@< % set the labels labels = repmat({ 'monkey'; 'lemur'; 'mallard'; 'warbler'; 'ladybug'; 'lunamoth'},10,1); ds.sa.labels = labels; % This particular ROI has a few constant features due to % not-so-agressive masking, so remove constant features ds=cosmo_remove_useless_data(ds);
Various slicing operations on the samples
% only get data in chunks 1 and 2. % Make a logical mask indicating where .ds.chunks less than or equal to 2 % and store the result in a variable 'chunks12_msk'. % Then use cosmo_slice to select these samples and assign it to a variable % 'ds_chunks12' % (hint: you can use cosmo_match or just '<=') % >@@> chunks12_msk=ds.sa.chunks<=2; ds_chunks12=cosmo_slice(ds,chunks12_msk); cosmo_disp(ds_chunks12); % <@@< % As above, but only select data with targets equal to 1 or 3. % (corresponding to {'monkey','mallard'}) % >@@> % (there are multiple ways of doing this) targets_13=ds.sa.targets==1 | ds.sa.targets==3; % element-wise logical 'or' ds_targets13=cosmo_slice(ds,targets_13); cosmo_disp(ds_targets13); % this is an alternative way to achieve the same goal targets_13_alt=cosmo_match(ds.sa.targets,[1 3]); % using cosmo_match ds_targets13_alt=cosmo_slice(ds,targets_13_alt); cosmo_disp(ds_targets13_alt); % sanity check showing they are the same assert(isequal(ds_targets13,ds_targets13_alt)); % alterative using cosmo_match and the labels labels_monkey_or_mallard=cosmo_match(ds.sa.labels,{'monkey','mallard'}); ds_targets13_alt2=cosmo_slice(ds,labels_monkey_or_mallard); cosmo_disp(ds_targets13_alt2); % sanity check showing they are the same assert(isequal(ds_targets13,ds_targets13_alt2)); % <@@<
.a
.vol
.mat
[ -3 0 0 121
0 3 0 -114
0 0 3 -11.1
0 0 0 1 ]
.xform
'scanner_anat'
.dim
[ 80 80 43 ]
.fdim
.labels
{ 'i'
'j'
'k' }
.values
{ [ 1 2 3 ... 78 79 80 ]@1x80
[ 1 2 3 ... 78 79 80 ]@1x80
[ 1 2 3 ... 41 42 43 ]@1x43 }
.sa
.targets
[ 1
2
3
:
4
5
6 ]@12x1
.chunks
[ 1
1
1
:
2
2
2 ]@12x1
.labels
{ 'monkey'
'lemur'
'mallard'
:
'warbler'
'ladybug'
'lunamoth' }@12x1
.samples
[ 2.73 2.62 2.19 ... 0.669 1.78 2.42
2.51 2.99 3.25 ... 1.06 1.61 0.943
1.3 0.646 0.591 ... 1.51 1.75 3.08
: : : : : :
1.89 1.37 3.05 ... 4.38 4.46 3.86
3.46 3.08 4.2 ... 2.78 1.77 1.19
3.25 2.18 3.99 ... 4.21 4.54 3.41 ]@12x384
.fa
.i
[ 32 33 34 ... 28 29 29 ]@1x384
.j
[ 24 24 24 ... 25 25 26 ]@1x384
.k
[ 3 3 3 ... 9 9 9 ]@1x384
.a
.vol
.mat
[ -3 0 0 121
0 3 0 -114
0 0 3 -11.1
0 0 0 1 ]
.xform
'scanner_anat'
.dim
[ 80 80 43 ]
.fdim
.labels
{ 'i'
'j'
'k' }
.values
{ [ 1 2 3 ... 78 79 80 ]@1x80
[ 1 2 3 ... 78 79 80 ]@1x80
[ 1 2 3 ... 41 42 43 ]@1x43 }
.sa
.targets
[ 1
3
1
:
3
1
3 ]@20x1
.chunks
[ 1
1
2
:
9
10
10 ]@20x1
.labels
{ 'monkey'
'mallard'
'monkey'
:
'mallard'
'monkey'
'mallard' }@20x1
.samples
[ 2.73 2.62 2.19 ... 0.669 1.78 2.42
1.3 0.646 0.591 ... 1.51 1.75 3.08
3.52 2.01 3.32 ... 1.8 2.54 0.949
: : : : : :
2.24 2.37 3.27 ... 4.61 2.13 4.32
2.31 1.61 1.6 ... 0.839 0.544 2.83
2.13 1.22 2.12 ... 2.3 3.14 1.99 ]@20x384
.fa
.i
[ 32 33 34 ... 28 29 29 ]@1x384
.j
[ 24 24 24 ... 25 25 26 ]@1x384
.k
[ 3 3 3 ... 9 9 9 ]@1x384
.a
.vol
.mat
[ -3 0 0 121
0 3 0 -114
0 0 3 -11.1
0 0 0 1 ]
.xform
'scanner_anat'
.dim
[ 80 80 43 ]
.fdim
.labels
{ 'i'
'j'
'k' }
.values
{ [ 1 2 3 ... 78 79 80 ]@1x80
[ 1 2 3 ... 78 79 80 ]@1x80
[ 1 2 3 ... 41 42 43 ]@1x43 }
.sa
.targets
[ 1
3
1
:
3
1
3 ]@20x1
.chunks
[ 1
1
2
:
9
10
10 ]@20x1
.labels
{ 'monkey'
'mallard'
'monkey'
:
'mallard'
'monkey'
'mallard' }@20x1
.samples
[ 2.73 2.62 2.19 ... 0.669 1.78 2.42
1.3 0.646 0.591 ... 1.51 1.75 3.08
3.52 2.01 3.32 ... 1.8 2.54 0.949
: : : : : :
2.24 2.37 3.27 ... 4.61 2.13 4.32
2.31 1.61 1.6 ... 0.839 0.544 2.83
2.13 1.22 2.12 ... 2.3 3.14 1.99 ]@20x384
.fa
.i
[ 32 33 34 ... 28 29 29 ]@1x384
.j
[ 24 24 24 ... 25 25 26 ]@1x384
.k
[ 3 3 3 ... 9 9 9 ]@1x384
.a
.vol
.mat
[ -3 0 0 121
0 3 0 -114
0 0 3 -11.1
0 0 0 1 ]
.xform
'scanner_anat'
.dim
[ 80 80 43 ]
.fdim
.labels
{ 'i'
'j'
'k' }
.values
{ [ 1 2 3 ... 78 79 80 ]@1x80
[ 1 2 3 ... 78 79 80 ]@1x80
[ 1 2 3 ... 41 42 43 ]@1x43 }
.sa
.targets
[ 1
3
1
:
3
1
3 ]@20x1
.chunks
[ 1
1
2
:
9
10
10 ]@20x1
.labels
{ 'monkey'
'mallard'
'monkey'
:
'mallard'
'monkey'
'mallard' }@20x1
.samples
[ 2.73 2.62 2.19 ... 0.669 1.78 2.42
1.3 0.646 0.591 ... 1.51 1.75 3.08
3.52 2.01 3.32 ... 1.8 2.54 0.949
: : : : : :
2.24 2.37 3.27 ... 4.61 2.13 4.32
2.31 1.61 1.6 ... 0.839 0.544 2.83
2.13 1.22 2.12 ... 2.3 3.14 1.99 ]@20x384
.fa
.i
[ 32 33 34 ... 28 29 29 ]@1x384
.j
[ 24 24 24 ... 25 25 26 ]@1x384
.k
[ 3 3 3 ... 9 9 9 ]@1x384
Get sample indices for primates and bugs
Get the sample indices that correspond to primates and bugs, and assign the result to variables 'primate_idx' and 'bug_idx'
% >@@> primate_idx = ds.sa.targets <= 2; bug_idx = ds.sa.targets > 4; % <@@< % Slice the dataset % use the indices in 'primate_idx' and 'bug_idx' as input to cosmo_slice, % and store the result in 'primate_ds' and 'bug_ds', respectively. % >@@> primate_ds = cosmo_slice(ds, primate_idx); bug_ds = cosmo_slice(ds, bug_idx); % <@@<
Subtract mean pattern
Find the mean pattern for primates and bugs and subtract the bug pattern from the primate pattern
% >@@> primates_mean = mean(primate_ds.samples, 1); bugs_mean = mean(bug_ds.samples, 1); primates_minus_bugs = primates_mean - bugs_mean; % <@@<
Store and visualize the results
Finally save the result as a dataset with the original header. Just replace ds.samples with the result and remove the sample attributes. Then convert back to nifti and save it using the cosmo_map2fmri function.
% >@@> ds_primates_minus_bugs=ds; % make a copy ds_primates_minus_bugs.samples = primates_minus_bugs; ds_primates_minus_bugs.sa=struct(); cosmo_check_dataset(ds_primates_minus_bugs); %good practice % store to disc output_path=config.output_data_path; output_fn=fullfile(output_path, 'primates_minus_bugs.nii'); ni = cosmo_map2fmri(ds_primates_minus_bugs, output_fn); % <@@<
Plot results
figure %... using cosmo_plot_slices % >@@> cosmo_plot_slices(ds_primates_minus_bugs) % <@@< % ... using AFNI, FSL, or Matlab's imagesc figure % >@@> imagesc(rot90(ni.img(:,:,4))); title('Primates minus Bugs') box off ylabel('P <- y -> A'), xlabel('L <- x -> R') % <@@<