8.6.5. NeuroVault cross-study ICA maps.

This example shows how to download statistical maps from NeuroVault, label them with NeuroSynth terms, and compute ICA components across all the maps.

See nilearn.datasets.fetch_neurovault documentation for more details.

# Author: Ben Cipollini
# License: BSD
# Ported from code authored by Chris Filo Gorgolewski, Gael Varoquaux
# https://github.com/NeuroVault/neurovault_analysis
import warnings

import numpy as np
from scipy import stats
from sklearn.decomposition import FastICA

from nilearn.datasets import fetch_neurovault
from nilearn.image import smooth_img

from nilearn.datasets import load_mni152_brain_mask
from nilearn.input_data import NiftiMasker

from nilearn import plotting

8.6.5.1. Get image and term data

# Download images
# Here by default we only download 80 images to save time,
# but for better results I recommend using at least 200.
print("Fetching Neurovault images; "
      "if you haven't downloaded any Neurovault data before "
      "this will take several minutes.")
nv_data = fetch_neurovault(max_images=80, fetch_neurosynth_words=True)

images = nv_data['images']
term_weights = nv_data['word_frequencies']
vocabulary = nv_data['vocabulary']

# Clean and report term scores
term_weights[term_weights < 0] = 0
total_scores = np.mean(term_weights, axis=0)

print("\nTop 10 neurosynth terms from downloaded images:\n")

for term_idx in np.argsort(total_scores)[-10:][::-1]:
    print(vocabulary[term_idx])

Out:

Fetching Neurovault images; if you haven't downloaded any Neurovault data before this will take several minutes.
Reading local neurovault data.
Already fetched 1 image
Already fetched 2 images
Already fetched 3 images
Already fetched 4 images
Already fetched 5 images
Already fetched 6 images
Already fetched 7 images
Already fetched 8 images
Already fetched 9 images
Already fetched 10 images
Already fetched 11 images
Already fetched 12 images
Already fetched 13 images
Already fetched 14 images
Already fetched 15 images
Already fetched 16 images
Already fetched 17 images
Already fetched 18 images
Already fetched 19 images
Already fetched 20 images
Already fetched 21 images
Already fetched 22 images
Already fetched 23 images
Already fetched 24 images
Already fetched 25 images
Already fetched 26 images
Already fetched 27 images
Already fetched 28 images
Already fetched 29 images
Already fetched 30 images
Already fetched 31 images
Already fetched 32 images
Already fetched 33 images
Already fetched 34 images
Already fetched 35 images
Already fetched 36 images
Already fetched 37 images
Already fetched 38 images
Already fetched 39 images
Already fetched 40 images
Already fetched 41 images
Already fetched 42 images
Already fetched 43 images
Already fetched 44 images
Already fetched 45 images
Already fetched 46 images
Already fetched 47 images
Already fetched 48 images
Already fetched 49 images
Already fetched 50 images
Already fetched 51 images
Already fetched 52 images
Already fetched 53 images
Already fetched 54 images
Already fetched 55 images
Already fetched 56 images
Already fetched 57 images
Already fetched 58 images
Already fetched 59 images
Already fetched 60 images
Already fetched 61 images
Already fetched 62 images
Already fetched 63 images
Already fetched 64 images
Already fetched 65 images
Already fetched 66 images
Already fetched 67 images
Already fetched 68 images
Already fetched 69 images
Already fetched 70 images
Already fetched 71 images
Already fetched 72 images
Already fetched 73 images
Already fetched 74 images
Downloading file: http://neurosynth.org/api/v2/decode/?neurovault=2675
Download succeeded, downloaded to: /home/varoquau/nilearn_data/neurovault/collection_413/neurosynth_words_for_image_2675.json
Already fetched 75 images
Downloading file: http://neurosynth.org/api/v2/decode/?neurovault=2676
Download succeeded, downloaded to: /home/varoquau/nilearn_data/neurovault/collection_413/neurosynth_words_for_image_2676.json
Already fetched 76 images
Downloading file: http://neurosynth.org/api/v2/decode/?neurovault=151
Download succeeded, downloaded to: /home/varoquau/nilearn_data/neurovault/collection_42/neurosynth_words_for_image_151.json
Already fetched 77 images
Downloading file: http://neurosynth.org/api/v2/decode/?neurovault=3041
Download succeeded, downloaded to: /home/varoquau/nilearn_data/neurovault/collection_42/neurosynth_words_for_image_3041.json
Already fetched 78 images
Downloading file: http://neurosynth.org/api/v2/decode/?neurovault=2818
Download succeeded, downloaded to: /home/varoquau/nilearn_data/neurovault/collection_423/neurosynth_words_for_image_2818.json
Already fetched 79 images
Downloading file: http://neurosynth.org/api/v2/decode/?neurovault=2834
Download succeeded, downloaded to: /home/varoquau/nilearn_data/neurovault/collection_423/neurosynth_words_for_image_2834.json
Already fetched 80 images
80 images found on local disk.
Computing word features.
Computing word features done; vocabulary size: 2911

Top 10 neurosynth terms from downloaded images:

cingulate
thalamus
striatum
posterior cingulate
reward
precuneus
cingulate cortex
anterior
anterior cingulate
basal ganglia

8.6.5.2. Reshape and mask images

print("\nReshaping and masking images.\n")

with warnings.catch_warnings():
    warnings.simplefilter('ignore', UserWarning)
    warnings.simplefilter('ignore', DeprecationWarning)

    mask_img = load_mni152_brain_mask()
    masker = NiftiMasker(
        mask_img=mask_img, memory='nilearn_cache', memory_level=1)
    masker = masker.fit()

    # Images may fail to be transformed, and are of different shapes,
    # so we need to transform one-by-one and keep track of failures.
    X = []
    is_usable = np.ones((len(images),), dtype=bool)

    for index, image_path in enumerate(images):
        # load image and remove nan and inf values.
        # applying smooth_img to an image with fwhm=None simply cleans up
        # non-finite values but otherwise doesn't modify the image.
        image = smooth_img(image_path, fwhm=None)
        try:
            X.append(masker.transform(image))
        except Exception as e:
            meta = nv_data['images_meta'][index]
            print("Failed to mask/reshape image: id: {0}; "
                  "name: '{1}'; collection: {2}; error: {3}".format(
                      meta.get('id'), meta.get('name'),
                      meta.get('collection_id'), e))
            is_usable[index] = False

# Now reshape list into 2D matrix, and remove failed images from terms
X = np.vstack(X)
term_weights = term_weights[is_usable, :]

Out:

Reshaping and masking images.

8.6.5.3. Run ICA and map components to terms

print("Running ICA; may take time...")
# We use a very small number of components as we have downloaded only 80
# images. For better results, increase the number of images downloaded
# and the number of components
n_components = 16
fast_ica = FastICA(n_components=n_components, random_state=0)
ica_maps = fast_ica.fit_transform(X.T).T

term_weights_for_components = np.dot(fast_ica.components_, term_weights)
print('Done, plotting results.')

Out:

Running ICA; may take time...
Done, plotting results.

8.6.5.4. Generate figures

with warnings.catch_warnings():
    warnings.simplefilter('ignore', DeprecationWarning)

    for index, (ic_map, ic_terms) in enumerate(
            zip(ica_maps, term_weights_for_components)):
        if -ic_map.min() > ic_map.max():
            # Flip the map's sign for prettiness
            ic_map = - ic_map
            ic_terms = - ic_terms

        ic_threshold = stats.scoreatpercentile(np.abs(ic_map), 90)
        ic_img = masker.inverse_transform(ic_map)
        important_terms = vocabulary[np.argsort(ic_terms)[-3:]]
        title = 'IC%i  %s' % (index, ', '.join(important_terms[::-1]))

        plotting.plot_stat_map(
            ic_img, threshold=ic_threshold, colorbar=False,
            title=title)
  • ../../_images/sphx_glr_plot_ica_neurovault_001.png
  • ../../_images/sphx_glr_plot_ica_neurovault_002.png
  • ../../_images/sphx_glr_plot_ica_neurovault_003.png
  • ../../_images/sphx_glr_plot_ica_neurovault_004.png
  • ../../_images/sphx_glr_plot_ica_neurovault_005.png
  • ../../_images/sphx_glr_plot_ica_neurovault_006.png
  • ../../_images/sphx_glr_plot_ica_neurovault_007.png
  • ../../_images/sphx_glr_plot_ica_neurovault_008.png
  • ../../_images/sphx_glr_plot_ica_neurovault_009.png
  • ../../_images/sphx_glr_plot_ica_neurovault_010.png
  • ../../_images/sphx_glr_plot_ica_neurovault_011.png
  • ../../_images/sphx_glr_plot_ica_neurovault_012.png
  • ../../_images/sphx_glr_plot_ica_neurovault_013.png
  • ../../_images/sphx_glr_plot_ica_neurovault_014.png
  • ../../_images/sphx_glr_plot_ica_neurovault_015.png
  • ../../_images/sphx_glr_plot_ica_neurovault_016.png

As we can see, some of the components capture cognitive or neurological maps, while other capture noise in the database. More data, better filtering, and better cognitive labels would give better maps

# Done.
plotting.show()

Total running time of the script: ( 1 minutes 10.646 seconds)

Generated by Sphinx-Gallery