Skip to article content
Rebuilt preprint

A reproducible benchmark of resting-state fMRI denoising strategies using fMRIPrep and Nilearn

Results: atlas level

Source
import warnings

warnings.filterwarnings("ignore")
from fmriprep_denoise.dataset.atlas import ATLAS_METADATA
from fmriprep_denoise.visualization import figures, utils

import ipywidgets as widgets
from ipywidgets import interactive, interact


path_root = utils.repo2data_path() / "denoise-metrics"
Output

Results: atlas level

Important - Unknown Directive
The dropdown menu only works in interactive mode!
Please launch binder to see the alterative results.

It is possible to view the data at atlas level!

In the report we used four atlases, three of them came with multiple parcellation schemes.

  • Gordon atlas Gordon et al., 2014: 333

  • Schaefer 7 network atlas Schaefer et al., 2017: 100, 200, 300, 400, 500, 600, 800

  • Multiresolution Intrinsic Segmentation Template (MIST) Urchs et al., 2019: 7, 12, 20, 36, 64, 122, 197, 325, 444, “ROI” (210 parcels, 122 split by the midline)

  • DiFuMo Dadi et al., 2020: 64, 128, 256, 512, 1024

1Before we start: Loss of temporal degrees of freedom

As any denoising strategy aims at a particular trade-off between the amount of noise removed and the preservation of degrees of freedom for signals, first and foremost, we would like to presentthe loss of temporal degrees of freedom.

This is an important consideration accompanying the remaining metrics.

Source
from fmriprep_denoise.visualization import degrees_of_freedom_loss


def notebook_plot_loss_degrees_of_freedom(criteria_name, fmriprep_version):
    datasets = ["ds000228", "ds000030"]
    data = degrees_of_freedom_loss.load_data(
        path_root, datasets, criteria_name, fmriprep_version
    )
    degrees_of_freedom_loss.plot_stats(data)


criteria_name = widgets.Dropdown(
    options=["stringent", "minimal", None],
    value="stringent",
    description="Threshould: ",
    disabled=False,
)
fmriprep_version = widgets.Dropdown(
    options=["fmriprep-20.2.1lts", "fmriprep-20.2.5lts"],
    value="fmriprep-20.2.1lts",
    description="Preporcessing version : ",
    disabled=False,
)

interactive(
    notebook_plot_loss_degrees_of_freedom,
    criteria_name=criteria_name,
    fmriprep_version=fmriprep_version,
)
Loading...

2Each parcellation scheme

We can also plot them by each parcellation schemes.

This is the original way Ciric and colleagues Ciric et al., 2017 presented their results!

2.1Gordon atlas

Source
atlas = "gordon333"

dataset = widgets.Dropdown(
    options=["ds000228", "ds000030"], description="Dataset : ", disabled=False
)
fmriprep_version = widgets.Dropdown(
    options=["fmriprep-20.2.1lts", "fmriprep-20.2.5lts"],
    description="fmriprep : ",
    disabled=False,
)
dimension = widgets.Dropdown(
    description="dimensions : ",
    options=ATLAS_METADATA[atlas]["dimensions"],
    disabled=False,
)

@interact(ds=dataset, f=fmriprep_version, d=dimension)
def show_atlas(ds, f, d):
    print(ds, f, ATLAS_METADATA[atlas]["atlas"], "dimensions: ", d)
    figures.plot_motion_resid(ds, f, path_root, atlas_name=atlas, dimension=d)
    figures.plot_distance_dependence(ds, f, path_root, atlas_name=atlas, dimension=d)
    figures.plot_network_modularity(ds, f, path_root, atlas_name=atlas, dimension=d)
Loading...

2.2MIST

If selecting None for dimension, the figure will summmarise the metrics by the atlas collection.

Important - Unknown Directive
The summary statistics are computed on the fly, it might take a bit of time, especially when displaying summary of the atlas collection.
Source
atlas = "mist"

dataset = widgets.Dropdown(
    options=["ds000228", "ds000030"], description="Dataset : ", disabled=False
)
fmriprep_version = widgets.Dropdown(
    options=["fmriprep-20.2.1lts", "fmriprep-20.2.5lts"],
    description="fmriprep : ",
    disabled=False,
)
dimension = widgets.Dropdown(
    description="dimensions : ",
    options=ATLAS_METADATA[atlas]["dimensions"] + [None],
    disabled=False,
)

@interact(ds=dataset, f=fmriprep_version, d=dimension)
def show_atlas(ds, f, d):
    print(ds, f, ATLAS_METADATA[atlas]["atlas"], "dimensions: ", d)
    figures.plot_motion_resid(ds, f, path_root, atlas_name=atlas, dimension=d)
    figures.plot_distance_dependence(ds, f, path_root, atlas_name=atlas, dimension=d)
    figures.plot_network_modularity(ds, f, path_root, atlas_name=atlas, dimension=d)
Loading...

2.3Schaefer 7 network

If selecting None for dimension, the figure will summmarise the metrics by the atlas collection.

Important - Unknown Directive
The summary statistics are computed on the fly, it might take a bit of time, especially when displaying summary of the atlas collection.
Source
atlas = "schaefer7networks"

dataset = widgets.Dropdown(
    options=["ds000228", "ds000030"], description="Dataset : ", disabled=False
)
fmriprep_version = widgets.Dropdown(
    options=["fmriprep-20.2.1lts", "fmriprep-20.2.5lts"],
    description="fmriprep : ",
    disabled=False,
)
dimension = widgets.Dropdown(
    description="dimensions : ",
    options=ATLAS_METADATA[atlas]["dimensions"] + [None],
    disabled=False,
)

@interact(ds=dataset, f=fmriprep_version, d=dimension)
def show_atlas(ds, f, d):
    print(ds, f, ATLAS_METADATA[atlas]["atlas"], "dimensions: ", d)
    figures.plot_motion_resid(ds, f, path_root, atlas_name=atlas, dimension=d)
    figures.plot_distance_dependence(ds, f, path_root, atlas_name=atlas, dimension=d)
    figures.plot_network_modularity(ds, f, path_root, atlas_name=atlas, dimension=d)
Loading...

2.4DiFuMo

If selecting None for dimension, the figure will summmarise the metrics by the atlas collection.

Important - Unknown Directive
The summary statistics are computed on the fly, it might take a bit of time, especially when displaying summary of the atlas collection.
Source
atlas = "difumo"

dataset = widgets.Dropdown(
    options=["ds000228", "ds000030"], description="Dataset : ", disabled=False
)
fmriprep_version = widgets.Dropdown(
    options=["fmriprep-20.2.1lts", "fmriprep-20.2.5lts"],
    description="fmriprep : ",
    disabled=False,
)
dimension = widgets.Dropdown(
    description="dimensions : ",
    options=ATLAS_METADATA[atlas]["dimensions"] + [None],
    disabled=False,
)

@interact(ds=dataset, f=fmriprep_version, d=dimension)
def show_atlas(ds, f, d):
    print(ds, f, ATLAS_METADATA[atlas]["atlas"], "dimensions: ", d)
    figures.plot_motion_resid(ds, f, path_root, atlas_name=atlas, dimension=d)
    figures.plot_distance_dependence(ds, f, path_root, atlas_name=atlas, dimension=d)
    figures.plot_network_modularity(ds, f, path_root, atlas_name=atlas, dimension=d)
Loading...
References
  1. Gordon, E. M., Laumann, T. O., Adeyemo, B., Huckins, J. F., Kelley, W. M., & Petersen, S. E. (2014). Generation and Evaluation of a Cortical Area Parcellation from Resting-State Correlations. Cerebral Cortex, 26(1), 288–303. 10.1093/cercor/bhu239
  2. Schaefer, A., Kong, R., Gordon, E. M., Laumann, T. O., Zuo, X.-N., Holmes, A. J., Eickhoff, S. B., & Yeo, B. T. T. (2017). Local-Global Parcellation of the Human Cerebral Cortex from Intrinsic Functional Connectivity MRI. Cerebral Cortex, 1–20. 10.1093/cercor/bhx179
  3. Urchs, S., Armoza, J., Moreau, C., Benhajali, Y., St-Aubin, J., Orban, P., & Bellec, P. (2019). MIST: A multi-resolution parcellation of functional brain networks. MNI Open Research, 1(3), 3.
  4. Dadi, K., Varoquaux, G., Machlouzarides-Shalit, A., Gorgolewski, K. J., Wassermann, D., Thirion, B., & Mensch, A. (2020). Fine-grain atlases of functional modes for fMRI analysis. NeuroImage, 221, 117126. 10.1016/j.neuroimage.2020.117126
  5. Ciric, R., Wolf, D. H., Power, J. D., Roalf, D. R., Baum, G. L., Ruparel, K., Shinohara, R. T., Elliott, M. A., Eickhoff, S. B., Davatzikos, C., Gur, R. C., Gur, R. E., Bassett, D. S., & Satterthwaite, T. D. (2017). Benchmarking of participant-level confound regression strategies for the control of motion artifact in studies of functional connectivity. NeuroImage, 154(1), 174–187. 10.1016/j.neuroimage.2017.03.020