.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "auto_examples/07_advanced/plot_age_group_prediction_cross_val.py" .. LINE NUMBERS ARE GIVEN BELOW. .. only:: html .. note:: :class: sphx-glr-download-link-note :ref:`Go to the end ` to download the full example code or to run this example in your browser via Binder .. rst-class:: sphx-glr-example-title .. _sphx_glr_auto_examples_07_advanced_plot_age_group_prediction_cross_val.py: Functional connectivity predicts age group ========================================== This example compares different kinds of :term:`functional connectivity` between regions of interest : correlation, partial correlation, and tangent space embedding. The resulting connectivity coefficients can be used to discriminate children from adults. In general, the tangent space embedding **outperforms** the standard correlations: see :footcite:t:`Dadi2019` for a careful study. .. include:: ../../../examples/masker_note.rst .. GENERATED FROM PYTHON SOURCE LINES 17-23 .. code-block:: Python try: import matplotlib.pyplot as plt except ImportError: raise RuntimeError("This script needs the matplotlib library") .. GENERATED FROM PYTHON SOURCE LINES 24-27 Load brain development :term:`fMRI` dataset and MSDL atlas ---------------------------------------------------------- We study only 60 subjects from the dataset, to save computation time. .. GENERATED FROM PYTHON SOURCE LINES 27-31 .. code-block:: Python from nilearn import datasets development_dataset = datasets.fetch_development_fmri(n_subjects=60) .. GENERATED FROM PYTHON SOURCE LINES 32-33 We use probabilistic regions of interest (ROIs) from the MSDL atlas. .. GENERATED FROM PYTHON SOURCE LINES 33-58 .. code-block:: Python from nilearn.maskers import NiftiMapsMasker msdl_data = datasets.fetch_atlas_msdl() msdl_coords = msdl_data.region_coords masker = NiftiMapsMasker( msdl_data.maps, resampling_target="data", t_r=2, detrend=True, low_pass=0.1, high_pass=0.01, memory="nilearn_cache", memory_level=1, standardize="zscore_sample", standardize_confounds="zscore_sample", ).fit() masked_data = [ masker.transform(func, confounds) for (func, confounds) in zip( development_dataset.func, development_dataset.confounds ) ] .. GENERATED FROM PYTHON SOURCE LINES 59-64 What kind of connectivity is most powerful for classification? -------------------------------------------------------------- we will use connectivity matrices as features to distinguish children from adults. We use cross-validation and measure classification accuracy to compare the different kinds of connectivity matrices. .. GENERATED FROM PYTHON SOURCE LINES 64-96 .. code-block:: Python # prepare the classification pipeline from sklearn.dummy import DummyClassifier from sklearn.model_selection import GridSearchCV from sklearn.pipeline import Pipeline from sklearn.svm import LinearSVC from nilearn.connectome import ConnectivityMeasure kinds = ["correlation", "partial correlation", "tangent"] pipe = Pipeline( [ ( "connectivity", ConnectivityMeasure( vectorize=True, standardize="zscore_sample", ), ), ( "classifier", GridSearchCV(LinearSVC(dual=True), {"C": [0.1, 1.0, 10.0]}, cv=5), ), ] ) param_grid = [ {"classifier": [DummyClassifier(strategy="most_frequent")]}, {"connectivity__kind": kinds}, ] .. GENERATED FROM PYTHON SOURCE LINES 97-100 We use random splits of the subjects into training/testing sets. StratifiedShuffleSplit allows preserving the proportion of children in the test set. .. GENERATED FROM PYTHON SOURCE LINES 100-120 .. code-block:: Python from sklearn.model_selection import GridSearchCV, StratifiedShuffleSplit from sklearn.preprocessing import LabelEncoder groups = [pheno["Child_Adult"] for pheno in development_dataset.phenotypic] classes = LabelEncoder().fit_transform(groups) cv = StratifiedShuffleSplit(n_splits=30, random_state=0, test_size=10) gs = GridSearchCV( pipe, param_grid, scoring="accuracy", cv=cv, verbose=1, refit=False, n_jobs=2, ) gs.fit(masked_data, classes) mean_scores = gs.cv_results_["mean_test_score"] scores_std = gs.cv_results_["std_test_score"] .. rst-class:: sphx-glr-script-out .. code-block:: none Fitting 30 folds for each of 4 candidates, totalling 120 fits .. GENERATED FROM PYTHON SOURCE LINES 121-122 display the results .. GENERATED FROM PYTHON SOURCE LINES 122-133 .. code-block:: Python plt.figure(figsize=(6, 4)) positions = [0.1, 0.2, 0.3, 0.4] plt.barh(positions, mean_scores, align="center", height=0.05, xerr=scores_std) yticks = ["dummy"] + list(gs.cv_results_["param_connectivity__kind"].data[1:]) yticks = [t.replace(" ", "\n") for t in yticks] plt.yticks(positions, yticks) plt.xlabel("Classification accuracy") plt.gca().grid(True) plt.gca().set_axisbelow(True) plt.tight_layout() .. image-sg:: /auto_examples/07_advanced/images/sphx_glr_plot_age_group_prediction_cross_val_001.png :alt: plot age group prediction cross val :srcset: /auto_examples/07_advanced/images/sphx_glr_plot_age_group_prediction_cross_val_001.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 134-140 This is a small example to showcase nilearn features. In practice such comparisons need to be performed on much larger cohorts and several datasets. :footcite:t:`Dadi2019` showed that across many cohorts and clinical questions, the tangent kind should be preferred. .. GENERATED FROM PYTHON SOURCE LINES 140-143 .. code-block:: Python plt.show() .. GENERATED FROM PYTHON SOURCE LINES 144-148 References ---------- .. footbibliography:: .. rst-class:: sphx-glr-timing **Total running time of the script:** (2 minutes 28.122 seconds) **Estimated memory usage:** 1143 MB .. _sphx_glr_download_auto_examples_07_advanced_plot_age_group_prediction_cross_val.py: .. only:: html .. container:: sphx-glr-footer sphx-glr-footer-example .. container:: binder-badge .. image:: images/binder_badge_logo.svg :target: https://mybinder.org/v2/gh/nilearn/nilearn/0.10.4?urlpath=lab/tree/notebooks/auto_examples/07_advanced/plot_age_group_prediction_cross_val.ipynb :alt: Launch binder :width: 150 px .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: plot_age_group_prediction_cross_val.ipynb ` .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: plot_age_group_prediction_cross_val.py ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_