Note
Go to the end to download the full example code. or to run this example in your browser via Binder
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:
First, an ANOVA is performed for feature selection and to generate the baseline model. Here, the effect of each regressor is evaluated sequentially.
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).
contrast_map_filenames = np.array(localizer_dataset.cmaps)[quality_mask]
tested_var = behav_var[quality_mask].reshape((-1, 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.
neg_log_pvals_permuted_ols_unmasked = nifti_masker.inverse_transform(
ols_outputs["logp_max_t"][0, :]
)
neg_log_pvals_tfce_unmasked = nifti_masker.inverse_transform(
ols_outputs["logp_max_tfce"][0, :]
)
[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()

Total running time of the script: (0 minutes 35.156 seconds)
Estimated memory usage: 289 MB