How to effectively handle globally bad channels using a combination of AutoReject and ICA?

I am trying to denoise some anesthesia EEG data. Specifically, having bandpass filtered the data to 1-50Hz, I applied a denoising pipeline with a hybrid of AutoReject and ICA, inspired by this thread: EEG processing pipeline with autoreject. Specifically, my pipeline is something similar to the following:

# Autoreject epochs to benefit ICA
auto_reject_pre_ica   = AutoReject().fit(epochs_dirty)
epochs_ar, reject_log = auto_reject_pre_ica.transform(epochs_dirty, return_log = True)
            
# Fit ICA on non-artifactual epochs 
ica = mne.preprocessing.ICA()
ica.fit(epochs[~reject_log.bad_epochs])

# Exclude muscle artifact components
muscle_inds, _ = ica.find_bads_muscle(epochs_dirty)
epochs_ica = ica.apply(epochs_dirty.copy(), exclude=muscle_inds)
            
# Autoreject on muscle-artifact-free epochs
auto_reject_post_ica = AutoReject().fit(epochs_ica)
epochs_clean = auto_reject_post_ica.transform(epochs_ica)

The problem for me is that while this pipeline works for a few epochs in my data (there are 100 epochs in total, each comprising 5 seconds of data with a sampling rate of 250Hz), in most cases it fails to suppress globally bad channels, that is, channels with much higher amplitudes than the others in most epochs. For example, one epoch before applying the aforementioned pipeline looks like this:

After applying ICA but without the second AutoReject, it turns into this:

Finally, after applying the second AutoReject, it turns into this:

As is shown, initially, and after ICA, the amplitude of Cp2 clearly dwarfs all other channels, and this problem persists (and actually transfers to Cp1) after applying the second AutoReject. The abnormally high amplitude of Cp2 persists across nearly all epochs, and while the aforementioned denoising pipeline (especially AutoReject) can suppress it to varying extents for different epochs, it fails to fully address this in most cases, and this anomaly in the amplitude of one particular channel (Cp2 → Cp1) is actually magnified after applying further source separation methods such as Surface Laplacian to the supposably denoised signal. In fact, in many cases, just by looking at the denoised signal, I find it hard to notice that the second AutoReject was not fully effective. Only when I applied Surface Laplacian did I notice that the amplitude of Cp1 is still much higher than the other channels.

I wonder why this is happening. As far as I know, AutoReject has a built-in data augmentation sub-routine that specifically addresses the globally bad channel problem, yet in my case it doesn’t seem to work. Is it because I have chosen the wrong parameter settings for AutoReject (I simply used the default settings), or is it because AutoReject (and ICA) have some innate flaws that prevent them from being effective? If the latter is the case, are there any other techniques I can apply to solve this problem? Thanks!

Hi – just to confirm, did you set a montage or channel locations in your data? It’s needed for the data augmentation. It’s a bit difficult to comment more without actually looking at your data. It might be worth making some diagnostic plots like a plot of the reject log. See this example: https://autoreject.github.io/stable/auto_examples/plot_auto_repair.html#sphx-glr-auto-examples-plot-auto-repair-py which repairs a globally bad channel.

Mainak

Thanks for the response! Yes, there is a standard 10-20 system montage. Unfortunately, the data is proprietary so I can’t show more here, but I’ll definitely give the reject log plot a go.