Signal denoising for functional connectivity analysis

We are trying to denoise fMRI data in Nilearn. The data were preprocessed using fMRIprep with --use-aroma.
We have some doubts about the Standardize option in NiftiSpheresMasker. It seems to influence the final pattern of connectivity matrices strongly.
Also, after denoising procedure the mean value of the time series from each ROI is not equal zero.
Could you check if our denoising procedure is valid?

###--- import file
file = 'sub-01_ses-1_task-dualnback_bold_space-MNI152NLin2009cAsym_variant-smoothAROMAnonaggr_preproc.nii.gz'
confound='sub-01_ses-1_task-dualnback_bold_confounds.tsv'

### - PARCELLATION
###--- define Power atlas spheres
power = nilearn.datasets.fetch_coords_power_2011()
coords = np.vstack((power.rois['x'], power.rois['y'], power.rois['z'])).T
spheres_masker = nilearn.input_data.NiftiSpheresMasker(seeds=coords, radius=5., standardize=True)

# --- choose only the important regressors (CSF, White Matter, Linear Trend) and save new confounds file
conf=pd.read_csv(confound,delimiter='\t')
conf=conf[['CSF','WhiteMatter']]
conf['LinearTrend']=list(range(1,341))
np.savetxt(confound[:-4]+'_edited.csv',conf,delimiter=',')

###--- create time-series in all ROIs and apply filters
time_series_power = spheres_masker.fit_transform(file, confounds=confound[:-4]+'_edited.csv')
time_series_power_filtered=signal.clean(time_series_power,low_pass=0.08,high_pass=0.009)

###--- create the connectivity matrices
correlation_measure = ConnectivityMeasure(kind='correlation')
correlation_matrix = correlation_measure.fit_transform([time_series_power_filtered])[0]

Thanks for any feedback,
Miriam

1 Like

It might be possible that you are not using “detrend” option. It might be possible that confounds are not normalized. So, it is better to add a detrend option to your analysis pipeline with the confounds.

There a clean and simple example which shows how to use SpheresMasker with signal cleaning parameters, if you have not seen it before ? You don’t need additional signal.clean step as SpheresMasker has low_pass and high_pass options to do it for you.
Please have a look at this example: https://nilearn.github.io/auto_examples/03_connectivity/plot_sphere_based_connectome.html#sphx-glr-auto-examples-03-connectivity-plot-sphere-based-connectome-py

There is some good discussion on using detrend option with confounds. https://github.com/nilearn/nilearn/issues/1419

My Best,

Thank you so much.
In fact we did not set ‘detrend’ option but we added a confound LinearTrend that was supposed to account for this problem. I will try setting ‘detrend’ option and see if it helps.
We take confounds from fMRIprep, I must check if they are normalized.

As for signal cleaning, we use signal.clean as additional step because we want that the low-pass and high-pass filters are applied after the denoising. If I set them as options in SpheresMasker object, they will be set before denoising, which I think is not good?