First, I’d like to sincerely thank all of you who contribute to this forum, as well as the developers for providing such detailed tutorials on the website. I’ve learned a lot from these resources and truly appreciate the valuable insights shared in the discussions here.
Regarding my own data, I have a question about ICA and would love to hear your suggestions. I am conducting an EEG experiment based on a complex working memory task using a BioSemi 32-channel system. I applied ICA on continuous data after filtering the raw signals with a band-pass filter of 1.0 to 30 Hz.
However, for some samples, the ICA results show that most of the variance is explained by just a few components (sometimes even only the first one). Additionally, the topomaps of these components display an unusual pattern, as shown below:
Another question I’m curious about is the fitting time for ICA. In my case, it typically takes only 50 to 100 seconds, whereas I recall that in my previous study using EEGLAB, it took nearly 20 to 30 minutes. Does this difference make sense, or could it indicate a potential issue in my preprocessing pipeline?
Thank you in advance for your help! I truly appreciate any advice you can share and look forward to your insights!
Hi,
it’s tricky to figure out what is wrong without the actual preprocessing pipeline. But I would suggest first looking at the raw EEG data of the participants that show weird ICA solutions.
It looks like there is a bad sensor (channel) and that’s why you see the very focal ica component (just an idea). Did you remove bad channels or bad segments before running ica?
Regarding these components you’re showing, I second Carina’s suggestion to inspect your data prior to performing ICA. It looks like one or two occipital channels contain substantial artifacts and/or have a bad SNR. I would check both the PSD and time series data, maybe even before re-referencing.
Don’t worry about ICA being much faster than EEGLAB’s implementation, it seems like their implementation is rather inefficient, including binica. May I ask which ICA you used? If you used MNE’s built-in (Extended) Infomax, I’d recommend to try Picard, which in my experience is even faster and often produces slightly better results.
I checked the PSD plots before filtering and noticed that channels in the occipital lobe, particularly O1, appear noisier than others. Previously, I was advised to leave interpolation until a later step to better retain data features for ICA, so I only interpolated channels that were completely flat. However, after encountering these unexpected ICA results, I tried interpolating O1 before filtering and then applied ICA again, but the results remained quite similar.
That being said, I didn’t exclude any bad segments before running ICA, and I’m wondering if this might be a contributing factor. Do you think rejecting bad segments before ICA could help improve the decomposition? Also, do you typically identify bad segments through visual inspection, or do you set specific exclusion criteria for this step?
Thanks a lot for your response! I really appreciate your insights.
Actually I already tried interpolating the noisy channel (O1) first and then reapplying ICA, but the results remained quite similar.
Before running ICA, I also applied the pipeline toolbox to detect potentially problematic channels. The detection flagged one channel (‘Fp2’) as having high-frequency noise and several occipital channels (‘T7’, ‘C3’, ‘O1’, ‘Oz’, ‘Cz’) as having high correlations. However, no channels were marked as having bad SNR, flat signals, or excessive deviation. When I reran the detection after interpolating O1, both O1 and Oz were no longer included in the high-correlation channel list. This makes me suspect that O1 is indeed a problematic channel, but its influence on the unexpected ICA results seems to be mild.
For ICA, I am currently using the following parameters:
You could try using method="picard", which by default returns FastICA-like solutions, but it is both faster and more robust. I’d also recommend to take a look at (Extended) Infomax solutions, which you can get by setting fit_params=dict(ortho=False, extended=True) (while keeping method="picard"). AFAIK, EEGLAB uses Extended Infomax by default, which might give different solutions than FastICA.
I just reran the ICA using your suggested parameter settings, but the results remained largely the same as in the previous two runs.
Here is the source plot of the ICA components. I noticed that some ICs occasionally exhibit significantly noisier patterns compared to other samples, although they appear normal most of the time. Could this pattern suggest a potential issue with this sample?
These relatively large artifacts should also be present in the raw data. If possible, you could try to only provide time segments of interest to the ICA algorithm instead of the entire time course. If there are still obvious artifacts in these segments, I’d (manually) remove them.
Yes, I’m currently running ICA on continuous data since extracting epochs is a bit challenging in my case due to the inconsistent trial durations. I’ll try ASR first and see if it works. Thanks a lot!
Unequal trial durations shouldn’t be a problem for ICA. ICA (as far as I know) works on data concatenated along the time axis anyway. I’m not as familiar with MNE, but Fieldtrip supports unequal trial durations.
Yes, ICA can be applied to concatenated data, but in my case, both the trial durations and task procedures vary slightly across trials. For now, I run ICA on continuous data, re-reference it, and then extract single-trial data by selecting time periods between two ‘onset’ markers of individual trials. Following this approach, it seems that using single-trial epochs for ICA wouldn’t differ much from using continuous data, as there wouldn’t be many inter-trial, task-irrelevant segments to exclude.
Alternatively, I could extract only the specific event I’m interested in before running ICA, ensuring a relatively ‘clear’ cut-off. However, I’m unsure whether I might need to analyze other task phases (events) later, which could require another round of ICA on those events. Would this be an appropriate approach for my analysis?
If there are no substantial inter-trial segments to throw away, it probably won’t make a huge difference whether you include them or not. I think the main point here is to make sure you don’t have any large artifacts in your data prior to ICA.
Okay, I will check the time periods where large artifacts appear in the source ICA plot, identify the corresponding timepoints in the raw data, and try to remove these artifacts before running ICA again to see if it yields different results!
I just removed several bad segments through visual inspection and found that the ICA results improved significantly—they now look much more normal! I believe I can apply this approach to other problematic samples with similar unusual ICA results. This gives me hope that more valid data can be salvaged for my research. Many thanks to you and I really appreciate your help!