[Eeglablist] EEGLAB Preprocessing with High Density electrodes and issues in IC Labelling
mahshid SHARIFI
dr.mahshidsharifi at gmail.com
Wed Feb 18 01:04:22 PST 2026
Hi Naviya
This is a very common set of issues when moving from ~32 channels to
high-density EEG, and nothing you’ve written sounds “wrong” or careless.
Let’s unpack what’s going on and how to improve things without making your
life miserable.
why ICLabel struggles with 155 channels? ICLabel was trained mostly on
lower-density, task-based, continuous EEG, and your current setup
(high-density + resting-state + epoched before ICA) pushes it outside its
comfort zone.
Longer answer: with 155 channels, ICA becomes much more sensitive to:
rank reduction,
preprocessing order,
data stationarity,
and whether ICA “sees” continuous physiological structure or chopped epochs.
When those conditions aren’t ideal, ICLabel becomes conservative and dumps
components into “Other”.
This does not automatically mean your data are bad.
First: some key points about your current pipeline
Your steps are all reasonable individually, but the order matters a lot for
ICA, especially with high-density EEG.
You are doing epoching before ICA.
This is very likely the main reason ICLabel is failing.
ICA (and ICLabel) work best when:
the data are continuous
artifacts (eye blinks, heartbeats) occur naturally and repeatedly
temporal structure is preserved
For resting-state, epoching before ICA removes exactly the kind of temporal
information ICLabel uses to classify components.
This alone can turn many otherwise clean Eye/ECG/Brain ICs into “Other”.
Recommended ICA-friendly pipeline (155-channel resting EEG)
Here’s a pipeline that is much more robust for high-density resting-state
data and aligns closely with recommendations from Arnaud Delorme and Scott
Makeig.
Pre-ICA (continuous data only)
Import continuous data
Remove bad channels (important with 155 channels)
Flat, noisy, or bridged channels
High-pass filter at 1 Hz (for ICA only)
This is critical
You can later transfer ICA weights back to 0.1 Hz data
Notch filter (48–52 Hz is fine)
Average reference
Run ICA on continuous data
Do not epoch before ICA
Do not band-pass 0.1–50 Hz before ICA
Post-ICA
Run ICLabel
Reject Eye / Heart / Channel noise ICs (conservatively)
Apply ICA weights to your 0.1–50 Hz data
Epoch into 2-second resting-state segments
Proceed with analysis
Your specific questions (one by one)
1. Is there a different pipeline for resting-state data?
Yes — resting-state needs better ICA conditions than task data, not simpler
ones.
Why task data “worked” at 32 channels:
fewer channels → fewer components
task events introduce structured variance
ICLabel has more training examples like this
For resting-state:
ICA must be run on continuous data
High-pass at 1 Hz for ICA
Remove bad channels before ICA
If ICA on continuous data looked “worse”, that usually means:
bad channels still present
too low a high-pass
rank deficiency
2. Dark horizontal line in ICLabel time-course plot
That dark line usually indicates:
a single epoch with unusually high variance
often caused by:
motion
electrode pop
muscle burst
amplifier saturation
Why it appears only in some components:
ICA isolates that transient artifact
it doesn’t occur at the same time for all ICs
What to do:
Identify and reject those bad epochs
Or reject the IC if it’s clearly artifact-dominated
This is not a bug, and not related to ICLabel directly.
3. 155 channels = 155 components — is that correct?
Yes — this is mathematically correct if your data rank is full.
But here’s the important nuance:
Do all 155 components “matter”?
No.
Typically:
~10–20 Eye
~2–5 ECG
~10–30 muscle/noise
~40–70 plausible brain ICs
the rest: weak, mixed, or irrelevant
Should you reduce the number of components?
Sometimes, yes — carefully.
Valid reasons to reduce dimensionality:
many interpolated channels
strong rank reduction from referencing
short recordings
If you do PCA reduction:
keep ≥ rank of data
avoid aggressive reduction (e.g., don’t go from 155 → 40)
Do you need to inspect every IC?
Early on: yes (and you’re doing the right thing )
Later:
trust ICLabel probabilities, not labels alone
focus on ICs explaining meaningful variance
brain ICs should show:
dipolar scalp maps
1/f-like spectra
plausible time courses
Best
Mahshid
On Wed, 18 Feb 2026, 5:02 am Cedric Cannard via eeglablist, <
eeglablist at sccn.ucsd.edu> wrote:
> Quick correction: I meant issues related to "higher" channel count. I've
> deinfitely seen poor decompositions with less than 64 channels.
>
>
> Cedric
>
>
> On Tuesday, February 17th, 2026 at 3:11 PM, Cedric Cannard via eeglablist <
> eeglablist at sccn.ucsd.edu> wrote:
>
> > Hi Naviya,
> >
> > I haven't encountered issues related to channel count before. Are you
> sure the problem isn't the 0.1 Hz highpass filter? ICA generally doesn't
> perform well without removing slow drifts up to ~1 Hz, and that should have
> applied to your 32-channel dataset as well.
> >
> > Also, just run ICA on the continuous data, the more data, the better.
> This is especially true for resting-state data, where epoching prior to ICA
> isn't necessary. I don't see why you would have to do epoching at all,
> actually.
> >
> > Also, I suspect you just have more bad channels with the greater number
> of channels. You should make sure to remove bad channels, interpolate them,
> and reject large artifacts, for example using ASR with a fairly lax cutoff
> (~60–100, depending on your signal quality) so that it removes only the
> worst sections without discarding eye blinks or large alpha waves. Then
> call ICA with the data rank as input to avoid the ghost IC problem.
> >
> > If you really need to preserve low frequencies down to 0.1 Hz, the
> standard approach is to work from a copy of the dataset (e.g. EEG2 = EEG),
> preprocess both identically except that EEG2 is highpass filtered at 1 Hz
> for a better ICA decomposition. You then transfer the ICA weights to EEG
> (filtered at 0.1 Hz), run ICLabel on it, and subtract the flagged
> components. Here is a minimal example:
> > % Run ICA on the 1 Hz highpass filtered copy
> > EEG2 = pop_runica(EEG2, 'icatype', 'runica', 'pca', rank);
> >
> > % Transfer weights to the 0.1 Hz highpass filtered dataset
> > EEG.icaweights = EEG2.icaweights;
> > EEG.icasphere = EEG2.icasphere;
> > EEG = eeg_checkset(EEG); % recomputes EEG.icaact and EEG.icawinv
> >
> > % Classify components and subtract artefacts
> > EEG = pop_iclabel(EEG, 'default');
> > EEG = pop_icflag(EEG, [NaN NaN; 0.8 1; 0.8 1; NaN NaN; NaN NaN; NaN NaN;
> NaN NaN]); % flags Muscle and Eye above 80%
> > EEG = pop_subcomp(EEG);
> >
> > One more thing: impedance values are typically expressed in Ohms, not Hz.
> >
> >
> > Cedric
> >
> >
> > On Tuesday, February 17th, 2026 at 8:41 AM, Naviya Lall via eeglablist <
> eeglablist at sccn.ucsd.edu> wrote:
> >
> > > Hello,
> > >
> > > My name is Naviya and I am a Junior Research Fellow in Delhi, India.
> > >
> > > At our lab we collect EEG data with students from our university.
> Initially
> > > we used a 32 channel system and EEG preprocessing was convenient and
> > > straightforward, including Independent Components (IC) labelling.
> However,
> > > we recently started using a 160-channel system, particularly 155
> > > electrodes. Here the IC Label tool/function began to struggle a bit
> > > and a *majority
> > > of the components are labelled as "Other" with very few being labelled
> as
> > > Eye, Heart, Channel noise or Brain*. I request your feedback and help
> in
> > > trying to understand why this could be happening and if my methods for
> > > cleaning data have been effective. I have attached a few screenshots of
> > > different plots and steps from when I was working on* Eye closed -
> Resting
> > > State data, recorded for 5 minutes at 500Hz. All impedance was below
> 25Hz
> > > when we recorded this. *
> > >
> > > I have read Dr. Delorme and Dr. Makeig's documentation for
> preprocessing
> > > and finalised this pipeline. These are the steps that I followed-
> > >
> > > 1. Channel locations already present from BrainVision recorder
> > > 2. Downsampling to 250Hz
> > > 3. Adding a Notch filter at 48 to 52Hz.
> > > 4. Bandpass filter between 0.1 and 50Hz (allowing these frequencies
> to
> > > pass)
> > > 5. Epoching to create 2 second long segments of Resting state
> > > 6. Re-referencing the data to Average reference
> > > 7. ICA followed by removing Eye, heart, channel noise components
> > >
> > > *A few specific questions-*
> > >
> > > 1. With the 32 channel data, we had a task based experiment and I
> had
> > > used the same pipeline I have described above, *is there a different
> > > pipeline for preprocessing Resting State data? *I attempted
> > > preprocessing continuous data but the ICAs looked similar, if not
> worse.
> > > 2. One of the graphs that appears on the bottom left when IC label
> is
> > > used shows the component across time for each epoch. I had many
> components
> > > with a dark line across any one epoch (refer image -
> > > 10_Single_component.png) and this was not uniform in trial/epoch
> across
> > > components. I could not figure out what this meant exactly
> > > 3. Since I have 150+ channels, I end up with 150+ components, is
> that
> > > the right way of running ICA or *should the number of components be
> > > less?* And how many of those 155 components actually matter? Do I
> need
> > > to go through each and every one in detail? *So far, I have. *
> > >
> > > I would be very grateful if anyone can help me figure this out and
> come up
> > > with the best pipeline for preprocessing. I can also share our RAW
> resting
> > > state EEG data with you if that would help.
> > >
> > > Thank you for your time.
> > >
> > > Best regards,
> > > Naviya
> > >
> > > --
> > > Naviya Lall
> > > Junior Research Fellow
> > > Cognitive Science Lab
> > > IIIT Delhi
> > > naviyalalluni.wixsite.com <
> https://urldefense.com/v3/__https://naviyalalluni.wixsite.com/naviyalall__;!!Mih3wA!FT2n5_CMINbUXGerS6qz4y_upfBU-l96eIBOnRDtVe243I5ifTqI3uKWyKBtR0gS3YnNirKKi66z1EJXJejiv5yt$
> >
> > > _______________________________________________
> > > To unsubscribe, send an empty email to
> eeglablist-unsubscribe at sccn.ucsd.edu or visit
> https://sccn.ucsd.edu/mailman/listinfo/eeglablist .
> > >
> > _______________________________________________
> > To unsubscribe, send an empty email to
> eeglablist-unsubscribe at sccn.ucsd.edu or visit
> https://sccn.ucsd.edu/mailman/listinfo/eeglablist .
> _______________________________________________
> To unsubscribe, send an empty email to
> eeglablist-unsubscribe at sccn.ucsd.edu or visit
> https://sccn.ucsd.edu/mailman/listinfo/eeglablist .
More information about the eeglablist
mailing list