[Eeglablist] EEGLAB Preprocessing with High Density electrodes and issues in IC Labelling
Cedric Cannard
ccannard at protonmail.com
Tue Feb 17 15:15:42 PST 2026
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 .
More information about the eeglablist
mailing list