Massively univariate analysis of a motor task from the Localizer dataset

This example compares results obtained with a massively univariate analysis (permuted_ols) after two permutation test correction methods: Max t-statistic Family-wise Error (FWE) and Max TFCE FWE.

These two methods are compared against a baseline parametric test (Bonferroni FWE).

The example is structured as follows:

  1. First, an ANOVA is performed for feature selection and to generate the baseline model. Here, the effect of each regressor is evaluated sequentially.

  2. Next, we use a permuted Ordinary Least Squares (OLS) analysis, run at each voxel with permuted_ols. This model explicitly tests whether or not a voxel responds differently under different conditions of a visual task.

We use the left button press (auditory cue) task contrast maps from the Localizer dataset (fetch_localizer_contrasts). This dataset includes external, behavioral variates (ext_vars); we therefore evaluate the association between a behavioral variate that measures the speed of pseudo-word reading (pseudo) and the contrast map values, at every voxel.

Load Localizer contrast

First, we fetch all left button press (auditory cue) contrast maps and associated pseudo behavioral variates from the fetch_localizer_contrasts data fetcher.

import numpy as np

from nilearn import datasets

localizer_dataset = datasets.fetch_localizer_contrasts(
    ["left button press (auditory cue)"]
)
[fetch_localizer_contrasts] Dataset directory found: /home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer
behav_var = localizer_dataset.ext_vars["pseudo"].values

# Examine the behavioral variate
print(behav_var)
[15.  16.  14.  19.  16.  18.  22.  19.  17.  15.  10.  21.  17.  21.
  nan 14.  22.  17.  23.  15.  15.  18.  17.  18.  20.  27.  18.  16.
 18.  17.  19.  22.  15.  16.  21.  20.  12.   nan 19.  19.  16.  22.
 23.  14.  24.  22.  20.  25.  23.  15.  12.  16.  20.  18.  14.  14.
 18.  20.  19.  14.  27.   nan 13.  17.  19.  19.  14.  17.  15.  15.
 14.  20.  16.  15.  15.  15.  19.  17.  14.  15.   nan 20.  15.  17.
 18.  17.5  nan 15.  23.  12.  16.  13.  25.  21. ]

Remove subjects without behavioral variate

We see that some subjects do not have scores for this behavioral variate. We therefore need to remove them from our analyses.

quality_mask = np.isfinite(behav_var)
n_samples = np.sum(quality_mask)
print(f"Actual number of subjects after quality check: {int(n_samples)}")
Actual number of subjects after quality check: 89

We cast list of cmaps to numpy array for Boolean masking with quality_mask. Similarly, we subset behav_var with quality_mask and then reshape from shape (n_samples,) to shape (n_samples, 1).

Extract voxelwise data

Next, we use a NiftiMasker to extract voxelwise values for the left button press (auditory cue) task contrast map for each subject who passed quality control. We also apply a light processing on this data, including smoothing with a 5mm FWHM kernel.

Note that we use a NiftiMasker object rather than a MultiNiftiMasker object in order to extract all voxel values for all subjects into the same array.

from nilearn.maskers import NiftiMasker

nifti_masker = NiftiMasker(
    smoothing_fwhm=5,
    memory="nilearn_cache",
    memory_level=1,
    verbose=1,
)
fmri_masked = nifti_masker.fit_transform(contrast_map_filenames)
[NiftiMasker.wrapped] Loading data from array(['/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S01/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S02/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S03/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S04/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S05/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S06/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S07/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S08/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S09/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S10/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S11/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S12/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S13/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S14/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S16/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S17/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S18/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S19/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S20/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S21/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S22/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S23/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S24/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S25/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S26/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S27/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S28/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S29/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S30/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S31/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S32/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S33/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S34/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S35/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S36/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S37/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S39/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S40/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S41/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S42/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S43/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S44/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S45/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S46/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S47/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S48/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S49/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S50/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S51/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S52/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S53/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S54/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S55/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S56/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S57/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S58/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S59/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S60/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S61/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S63/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S64/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S65/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S66/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S67/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S68/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S69/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S70/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S71/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S72/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S73/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S74/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S75/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S76/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S77/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S78/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S79/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S80/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S82/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S83/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S84/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S85/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S86/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S88/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S89/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S90/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S91/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S92/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S93/cmaps_LeftAuditoryClick.nii.gz',
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S94/cmaps_LeftAuditoryClick.nii.gz'],
      dtype='<U118')
[NiftiMasker.wrapped] Computing mask
________________________________________________________________________________
[Memory] Calling nilearn.masking.compute_background_mask...
compute_background_mask(array(['/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S01/cmaps_LeftAuditoryClick.nii.gz',
       ...,
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S94/cmaps_LeftAuditoryClick.nii.gz'],
      dtype='<U118'), verbose=0)
__________________________________________compute_background_mask - 0.4s, 0.0min
[NiftiMasker.wrapped] Resampling mask
________________________________________________________________________________
[Memory] Calling nilearn.image.resampling.resample_img...
resample_img(<nibabel.nifti1.Nifti1Image object at 0x7f5f8a6f3250>, target_affine=None, target_shape=None, copy=False, interpolation='nearest')
_____________________________________________________resample_img - 0.0s, 0.0min
[NiftiMasker.wrapped] Finished fit
/home/runner/work/nilearn/nilearn/examples/07_advanced/plot_localizer_mass_univariate_methods.py:102: FutureWarning:

boolean values for 'standardize' will be deprecated in nilearn 0.15.0.
Use 'zscore_sample' instead of 'True' or use 'None' instead of 'False'.

________________________________________________________________________________
[Memory] Calling nilearn.maskers.nifti_masker.filter_and_mask...
filter_and_mask(array(['/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S01/cmaps_LeftAuditoryClick.nii.gz',
       ...,
       '/home/runner/work/nilearn/nilearn/nilearn_data/brainomics_localizer/brainomics_data/S94/cmaps_LeftAuditoryClick.nii.gz'],
      dtype='<U118'),
<nibabel.nifti1.Nifti1Image object at 0x7f5f8a6f3250>, { 'clean_args': None,
  'clean_kwargs': {},
  'cmap': 'gray',
  'detrend': False,
  'dtype': None,
  'high_pass': None,
  'high_variance_confounds': False,
  'low_pass': None,
  'reports': True,
  'runs': None,
  'smoothing_fwhm': 5,
  'standardize': False,
  'standardize_confounds': True,
  't_r': None,
  'target_affine': None,
  'target_shape': None}, memory_level=1, memory=Memory(location=nilearn_cache/joblib), verbose=1, confounds=None, sample_mask=None, copy=True, sklearn_output_config=None)
[NiftiMasker.wrapped] Loading data from <nibabel.nifti1.Nifti1Image object at 0x7f5f8a6f0850>
[NiftiMasker.wrapped] Smoothing images
[NiftiMasker.wrapped] Extracting region signals
[NiftiMasker.wrapped] Cleaning extracted signals
__________________________________________________filter_and_mask - 1.0s, 0.0min

ANOVA (parametric F-scores)

We use sklearn.feature_selection.f_regression to perform feature selection at every voxel and keep only those most related to the behavioral variate, as assessed via a simple F-score. Assuming that no such effect exists, the F-test follows a Fisher distribution, which yields voxelwise p-values that can be used to assert significance.

from sklearn.feature_selection import f_regression

_, pvals_anova = f_regression(fmri_masked, tested_var.ravel(), center=True)

Calculate the negative log of the p-values for equivalent visualization with permuted_ols.

[NiftiMasker.inverse_transform] Computing image from signals
________________________________________________________________________________
[Memory] Calling nilearn.masking.unmask...
unmask(array([-0., ..., -0.]), <nibabel.nifti1.Nifti1Image object at 0x7f5f8a6f3250>)
___________________________________________________________unmask - 0.0s, 0.0min

Perform massively univariate analysis with permuted OLS

This method will produce both voxel-level Family-wise Error (FWE) corrected negative-log p-values and TFCE-based FWE-corrected negative-log p-values.

Note

permuted_ols can support a wide range of analysis designs, depending on the numerical labels in tested_var. For example, if you wished to perform a one-sample test, you could simply provide an array of ones (e.g., np.ones(n_samples)).

from nilearn.mass_univariate import permuted_ols

ols_outputs = permuted_ols(
    tested_var,  # this is equivalent to the design matrix, in array form
    fmri_masked,
    model_intercept=True,
    masker=nifti_masker,
    tfce=True,
    n_perm=100,  # 100 for the sake of time. Ideally, this should be 10000.
    verbose=1,  # display progress bar
    random_state=0,  # to ensure reproducible results
    n_jobs=2,  # can be changed to use more CPUs
)
[NiftiMasker.inverse_transform] Computing image from signals
________________________________________________________________________________
[Memory] Calling nilearn.masking.unmask...
unmask(array([[ 1.604273, ..., -0.864518]]), <nibabel.nifti1.Nifti1Image object at 0x7f5f8a6f3250>)
___________________________________________________________unmask - 0.0s, 0.0min
[Parallel(n_jobs=2)]: Using backend LokyBackend with 2 concurrent workers.
[Parallel(n_jobs=2)]: Done   2 out of   2 | elapsed:   25.8s remaining:    0.0s
[Parallel(n_jobs=2)]: Done   2 out of   2 | elapsed:   25.8s finished

We select the first regressor from max t-statistic and assign to the variable neg_log_pvals_permuted_ols_unmasked ; then we perform the same procedure for the TFCE corrected outputs, assigning to the first regressor to neg_log_pvals_tfce_unmasked.

[NiftiMasker.inverse_transform] Computing image from signals
________________________________________________________________________________
[Memory] Calling nilearn.masking.unmask...
unmask(array([-0., ..., -0.]), <nibabel.nifti1.Nifti1Image object at 0x7f5f8a6f3250>)
___________________________________________________________unmask - 0.0s, 0.0min
[NiftiMasker.inverse_transform] Computing image from signals
________________________________________________________________________________
[Memory] Calling nilearn.masking.unmask...
unmask(array([ 0.004321, ..., -0.      ]), <nibabel.nifti1.Nifti1Image object at 0x7f5f8a6f3250>)
___________________________________________________________unmask - 0.0s, 0.0min

Visualization

Since we are plotting negative log p-values and using a threshold equal to 1, it corresponds to corrected p-values lower than 10%, meaning that there is less than 10% probability to make a single false discovery (i.e., a 90% chance that we make no false discovery at all).

import matplotlib.pyplot as plt

from nilearn import plotting
from nilearn.image import get_data

threshold = -np.log10(0.1)  # 10% corrected

# Calculate the maximum value across all three model variants.
vmax = max(
    np.amax(ols_outputs["logp_max_t"]),
    np.amax(neg_log_pvals_anova),
    np.amax(ols_outputs["logp_max_tfce"]),
)

images_to_plot = {
    "Parametric Test\n(Bonferroni FWE)": neg_log_pvals_anova_unmasked,
    "Permutation Test\n(Max t-statistic FWE)": (
        neg_log_pvals_permuted_ols_unmasked
    ),
    "Permutation Test\n(Max TFCE FWE)": neg_log_pvals_tfce_unmasked,
}

fig, axes = plt.subplots(figsize=(15, 5), ncols=3)
for i_col, (title, img) in enumerate(images_to_plot.items()):
    ax = axes[i_col]
    n_detections = (get_data(img) > threshold).sum()
    new_title = f"{title}\n{n_detections} sig. voxels"

    plotting.plot_glass_brain(
        img,
        vmax=vmax,
        display_mode="z",
        threshold=threshold,
        vmin=threshold,
        cmap="inferno",
        figure=fig,
        axes=ax,
    )
    ax.set_title(new_title, pad=10.0)

fig.suptitle(
    "Group left button press ($-\\log_{10}$ p-values)",
    y=1,
    fontsize=16,
)

fig.subplots_adjust(top=0.75, wspace=0.8)

plotting.show()
Group left button press ($-\log_{10}$ p-values), Parametric Test (Bonferroni FWE) 3 sig. voxels, Permutation Test (Max t-statistic FWE) 7 sig. voxels, Permutation Test (Max TFCE FWE) 748 sig. voxels

Total running time of the script: (0 minutes 35.156 seconds)

Estimated memory usage: 289 MB

Gallery generated by Sphinx-Gallery