Regions extraction using dictionary learning and functional connectomes#
This example shows how to use
to extract spatially constrained brain regions from whole brain maps decomposed
using Dictionary learning and use them to build
a functional connectome.
This example can also be inspired to apply the same steps to even regions extraction
using ICA maps. In that case, idea would be to replace
Dictionary learning to canonical ICA decomposition
Please see the related documentation of
for more details.
Fetch brain development functional datasets#
We use nilearn’s datasets downloading utilities
Extract functional networks with Dictionary learning#
from nilearn.decomposition import DictLearning # Initialize DictLearning object dict_learn = DictLearning(n_components=8, smoothing_fwhm=6., memory="nilearn_cache", memory_level=2, random_state=0) # Fit to the data dict_learn.fit(func_filenames) # Resting state networks/maps in attribute `components_img_` components_img = dict_learn.components_img_ # Visualization of functional networks # Show networks using plotting utilities from nilearn import plotting plotting.plot_prob_atlas(components_img, view_type='filled_contours', title='Dictionary Learning maps')
/home/yasmin/miniconda3/envs/nilearn-dev/lib/python3.10/site-packages/sklearn/decomposition/_fastica.py:304: FutureWarning: From version 1.3 whiten=True should be specified as whiten='arbitrary-variance' (its current behaviour). This behavior is deprecated in 1.1 and will raise ValueError in 1.3. /home/yasmin/miniconda3/envs/nilearn-dev/lib/python3.10/site-packages/sklearn/decomposition/_dict_learning.py:732: FutureWarning: 'n_iter' is deprecated in version 1.1 and will be removed in version 1.3. Use 'max_iter' instead. /home/yasmin/nilearn/nilearn/nilearn/plotting/displays/_axes.py:71: UserWarning: linewidths is ignored by contourf /home/yasmin/nilearn/nilearn/nilearn/plotting/displays/_axes.py:71: UserWarning: No contour levels were found within the data range. <nilearn.plotting.displays._slicers.OrthoSlicer object at 0x7f123e711ed0>
Extract regions from networks#
RegionExtractor from the
threshold=0.5 indicates that we keep nominal of amount nonzero
voxels across all maps, less the threshold means that
more intense non-voxels will be survived.
from nilearn.regions import RegionExtractor extractor = RegionExtractor(components_img, threshold=0.5, thresholding_strategy='ratio_n_voxels', extractor='local_regions', standardize=True, min_region_size=1350) # Just call fit() to process for regions extraction extractor.fit() # Extracted regions are stored in regions_img_ regions_extracted_img = extractor.regions_img_ # Each region index is stored in index_ regions_index = extractor.index_ # Total number of regions extracted n_regions_extracted = regions_extracted_img.shape[-1] # Visualization of region extraction results title = ('%d regions are extracted from %d components.' '\nEach separate color of region indicates extracted region' % (n_regions_extracted, 8)) plotting.plot_prob_atlas(regions_extracted_img, view_type='filled_contours', title=title)
/home/yasmin/miniconda3/envs/nilearn-dev/lib/python3.10/site-packages/numpy/ma/core.py:2826: UserWarning: Warning: converting a masked element to nan. /home/yasmin/nilearn/nilearn/nilearn/plotting/displays/_axes.py:71: UserWarning: No contour levels were found within the data range. /home/yasmin/nilearn/nilearn/nilearn/plotting/displays/_axes.py:71: UserWarning: linewidths is ignored by contourf <nilearn.plotting.displays._slicers.OrthoSlicer object at 0x7f123e33d7e0>
Compute correlation coefficients#
First we need to do subjects timeseries signals extraction and then estimating
correlation matrices on those signals.
To extract timeseries signals, we call
transform onto each subject
functional data stored in
To estimate correlation matrices we import connectome utilities from nilearn.
from nilearn.connectome import ConnectivityMeasure correlations =  # Initializing ConnectivityMeasure object with kind='correlation' connectome_measure = ConnectivityMeasure(kind='correlation') for filename, confound in zip(func_filenames, confounds): # call transform from RegionExtractor object to extract timeseries signals timeseries_each_subject = extractor.transform(filename, confounds=confound) # call fit_transform from ConnectivityMeasure object correlation = connectome_measure.fit_transform([timeseries_each_subject]) # saving each subject correlation to correlations correlations.append(correlation) # Mean of all correlations import numpy as np mean_correlations = np.mean(correlations, axis=0).reshape(n_regions_extracted, n_regions_extracted)
Plot resulting connectomes#
title = 'Correlation between %d regions' % n_regions_extracted # First plot the matrix display = plotting.plot_matrix(mean_correlations, vmax=1, vmin=-1, colorbar=True, title=title) # Then find the center of the regions and plot a connectome regions_img = regions_extracted_img coords_connectome = plotting.find_probabilistic_atlas_cut_coords(regions_img) plotting.plot_connectome(mean_correlations, coords_connectome, edge_threshold='90%', title=title)
<nilearn.plotting.displays._projectors.OrthoProjector object at 0x7f1240518760>
Plot regions extracted for only one specific network#
First, we plot a network of
region extraction (left plot).
Now, we plot (right side) same network after region extraction to show that connected regions are nicely separated. Each brain extracted region is identified as separate color.
For this, we take the indices of the all regions extracted related to original network given as 4.
regions_indices_of_map3 = np.where(np.array(regions_index) == 4) display = plotting.plot_anat(cut_coords=coords, title='Regions from this network') # Add as an overlay all the regions of index 4 colors = 'rgbcmyk' for each_index_of_map3, color in zip(regions_indices_of_map3, colors): display.add_overlay(image.index_img(regions_extracted_img, each_index_of_map3), cmap=plotting.cm.alpha_cmap(color)) plotting.show()
/home/yasmin/miniconda3/envs/nilearn-dev/lib/python3.10/site-packages/numpy/ma/core.py:2826: UserWarning: Warning: converting a masked element to nan.
Total running time of the script: ( 3 minutes 23.216 seconds)
Estimated memory usage: 1257 MB