Reconstruc EEG and EOG signal from ICA with excluded component

, ,

due to an equipment problem I had a regular and high-amplitude 2Hz signal injected in my EEG channels. This signal was also injected in the EOG channels. Since this signal is 1) very regular, 2) high-amplitude and 3) equally distributed among all channels, I thought that ICA could be a very good way to get rid of it.
Indeed, if I run an ICA on my data, this “2Hz” component is extremely visible and through plotting equally distributed across all the scalp.
When I then reconstruct my signal from the ICA with this component excluded, the EEG signal looks very good, with the 2Hz noise removed. However, the EOG channels looks exactly the same, as if no reconstruction happened.
I know that ICA is usually used to remove EOG related artifact, and as such it is not meant to clean EOG signal, but I was wondering if there is a way of doing it.

Hi, I am bumping this thread hoping that someone has the answer.

How about a notch filter on the EOG channel?


I thought about it, but I thought that it would be ‘righter’ to clean all channels using the same strategy. Of course your solution has the added benefit of being fast and simple.

You don’t need to apply the same processing to all of your channels, even if they are of the same type. It depends on what you want to achieve. You need to ask yourself if this notch will impact any subsequent processing that uses the EOG channel. If it does not, then it’s a good simple solution.

I don’t see an easy way to remove the noise through ICA, because the ICA is fitted on the EEG channels, not on the EOG channel. And you can’t fit an ICA on a single component or on more components than there are channels.

It also depends on how strong the noise is compared to the original signal. If the noise is too strong, the notch might not be able to attenuate enough. With a quick test, it does not look like the EOG signal is badly impacted by the notch at 2 Hz, at least not visually:

import numpy as np

from mne.datasets import sample
from import read_raw_fif

directory = sample.data_path() / "MEG" / "sample"
fname = "sample_audvis_filt-0-40_raw.fif"
raw = read_raw_fif(directory / fname, preload=False)

noise = np.sin(2 * np.pi * 2 * raw.times)
raw._data[0, :] += noise * 1e-4

raw.notch_filter([2.], picks="eog")

Great answer !
I’ll see for myself if the notch is enough to get the EOG signal clean and it is good to know that the ICA is only fitted on the EEG. I thought that since it is used to remove EOG artifact it would indeed include EOG channels.

If you look at the documentation of the picks argument for, you can see that by default it picks only the good data channels: mne.preprocessing.ICA — MNE 1.0.3 documentation

Data channels do not include the EOG channel, as detailed here: Glossary — MNE 1.0.3 documentation