Need help in identifying the topoplot noise

Hi,
I have recently acquired eeg data, whose protocol is as follows:
120Hz vibrotactile stimulation for 1 s followed by 1.5 seconds of interstimulus interval. This protocol runs for 100 times at a stretch.
After acquiring the raw data, I have marked bad channels and bad segments, followed by a bpf of 1-150Hz and a notch of 50Hz (powerline noise is 50Hz for our country). When I do the ICA after this, I get the following kind of topoplots for my sources:

I have worked with EEG in other experiments as well, but I have never seen such “patchy” kind of topoplots. I marked ECG and EOG sources bad, carried forward with the epoching etc, and on looking at the topoplot of my evoked data, it again gives me the same patchy topoplot, example as follows:

I am absolutely clueless about what I am looking at.
For starters, I additionally tried putting a notch around 120Hz (and its sub harmonics) to eliminate the possibility of the vibrotactor causing some interference but the topoplot remains as patchy as ever.

Additionally, along with the experimental protocol, I had also recorded a separate baseline EEG for all my subjects (The subject sat staring at the screen for 2 minutes without movement, without any stimulation). The topoplots of the ICA sources in this condition is also patchy.

For comparison, I am posting a “good” topoplot (the kind of topoplot I would normally desire) from one of my previous experimental setups—

I hope I am able to explain my issue. Kindly help!

Hello @Suranjita, and welcome to the forum!

Yes, this looks very wrong; something is clearly off there.

  • Have you taken a look at the PSD plots to check if you can maybe already spot something there? (epochs.plot_psd)
  • Why do you only notch-filter for the powerline frequency, but not for the stimulation device artifact (120 Hz)?
  • You should probably try to remove powerline harmonics as well (100 Hz, 150 Hz),
  • Have you tried processing the data the same way, but using a band-pass filter with an upper bound of 40 Hz (to exclude both powerline and vibrotactile stimulator artifacts?
  • Which parameters do you pass to ICA?

Lastly, what version of MNE is that? That’s a significant bit of information we commonly ask for, as things can change quite a bit between different versions of MNE!

Best wishes,
Richard

Hi Richard,
Device and software data:

I am using a 128 channel g.HIAMP EEG amplifier system by gtec
The mne version is 1.0.0 as seen from the python terminal using pip list. I am running Spyder on anaconda and the python version is 3.8.13

Notch Filter Settings:

For the powerline noise, I use the following function with the following settings:

def filterRaw(raw,l_freq,h_freq,method,iir_params):
filt_raw=raw.filter(l_freq=l_freq,h_freq=h_freq,method=method, iir_params=iir_params)
filt_raw2=filt_raw.notch_filter(freqs=[np.arange(50,250,50)])
return filt_raw

So yes, I do filter out the power line harmonics as well.
Yes, I have also tried removing the 120Hz vbt and its subharmonics by modifying the filter as follows:
filt_raw2=filt_raw.notch_filter(freqs=[15,30,45,50,60,90,100,120,150,180,200]

Please note, this has not helped with the patchy topoplots. I also applied a psd for each individual source in the ICA in my coding backend to check for harmonics and subharmonics of the 120Hz to make sure they are not there.

On filtering the data at 1-40Hz
I used the same filterRaw function definition with lfreq=1 and hfreq=40.
The ICA sources after filtering the data from 1-40Hz looks like follows, again patchy:

Epochs.plot_psd()

This plot is after band passing at 1 to 40-Hz.’
Correct me if I am wrong but I do not see anything “suspicious” in the psd…

Parameters passed in ICA

n=20 # no. of components
ica= ICA(n_components=n, random_state=111) #ICA params
ica.fit(filt_raw) # also tried ica.fit(raw,picks=[‘eeg’])

Can you include more details on how you performed ICA? Ideally, a minimal example showing all processing steps would be helpful.

I don’t think I’ve ever seen a PSD plot for EEG that shows that much power… Are you sure the data is in the right scale? To me it looks like the scale might be 3 or even 4 orders of magnitude off.

Can you run

(
    raw_filt
    .copy()
    .crop(30, 35)
    .to_data_frame()
    .head()
)

and see if the voltage values you see make sense as µV?

1 Like

Also the head circle is way too small, meaning the montage (sensor locations) is very off. Where did you get those sensor coordinates from?

Also, the number of ICA components is very small compared to the number of channels.

1 Like

True! I’d suggest setting n_components=None for the beginning.

@Suranjita So the summary so far:

  • I believe the scaling of your signal might be wrong (e.g., mV instead of V or so)
  • I believe the sensor locations are incorrect, probably another scaling issue, e.g. mm instead of m, making the head circle appear tiny (in case you don’t know what I’m talking about: that small circular thing in the center of your topographic plots, which makes it look as if the central electrode has been “selected” or “highlighted” in some way; that’s supposed to be much bigger and represent a head)
  • You’re probably using too few components in ICA decomposition

These are all valid points, but they should not impact ICA at all…

Not even the last one?

Also, I’m not sure how an incorrectly scaled montage might affect the topoplots…

In any case, let’s try to get those points sorted out one-by-one! :slight_smile:

Usually, there should be at least a couple of “nice” components within the first 20, so I don’t think this is the problem here.

The topoplot scaling should not matter I think, because the relative distances between the channels seems to be OK. Also, the other example with a nice topomap has the same (incorrect) montage scaling.

But yes, more information would be great, and the first two points you mention are definitely off and should be corrected (even if they probably do not influence the results).

1 Like