Transform EEG data using current source density (CSD)#

This script shows an example of how to use CSD [1][2][3][4]. CSD takes the spatial Laplacian of the sensor signal (derivative in both x and y). It does what a planar gradiometer does in MEG. Computing these spatial derivatives reduces point spread. CSD transformed data have a sharper or more distinct topography, reducing the negative impact of volume conduction.

# Authors: Alex Rockhill <aprockhill@mailbox.org>
#
# License: BSD-3-Clause
# Copyright the MNE-Python contributors.
import matplotlib.pyplot as plt
import numpy as np

import mne
from mne.datasets import sample

print(__doc__)

data_path = sample.data_path()

Load sample subject data

meg_path = data_path / "MEG" / "sample"
raw = mne.io.read_raw_fif(meg_path / "sample_audvis_raw.fif")
raw = raw.pick(picks=["eeg", "eog", "ecg", "stim"], exclude="bads").load_data()
events = mne.find_events(raw)
raw.set_eeg_reference(projection=True).apply_proj()
Opening raw data file /home/circleci/mne_data/MNE-sample-data/MEG/sample/sample_audvis_raw.fif...
    Read a total of 3 projection items:
        PCA-v1 (1 x 102)  idle
        PCA-v2 (1 x 102)  idle
        PCA-v3 (1 x 102)  idle
    Range : 25800 ... 192599 =     42.956 ...   320.670 secs
Ready.
Reading 0 ... 166799  =      0.000 ...   277.714 secs...
320 events found on stim channel STI 014
Event IDs: [ 1  2  3  4  5 32]
EEG channel type selected for re-referencing
Adding average EEG reference projection.
1 projection items deactivated
Average reference projection was added, but has not been applied yet. Use the apply_proj method to apply it.
Created an SSP operator (subspace dimension = 1)
1 projection items activated
SSP projectors applied...
General
Filename(s) sample_audvis_raw.fif
MNE object type Raw
Measurement date 2002-12-03 at 19:01:10 UTC
Participant Unknown
Experimenter MEG
Acquisition
Duration 00:04:38 (HH:MM:SS)
Sampling frequency 600.61 Hz
Time points 166,800
Channels
EEG
EOG
Stimulus
Head & sensor digitization 146 points
Filters
Highpass 0.10 Hz
Lowpass 172.18 Hz
Projections Average EEG reference (on)


Plot the raw data and CSD-transformed raw data:

  • Raw plots
  • Raw plots
Fitted sphere radius:         91.0 mm
Origin head coordinates:      -4.1 16.0 51.8 mm
Origin device coordinates:    1.4 17.8 -10.3 mm

Also look at the power spectral densities:

raw.compute_psd().plot(picks="data", exclude="bads", amplitude=False)
raw_csd.compute_psd().plot(picks="data", exclude="bads", amplitude=False)
  • EEG
  • Current source density
Effective window size : 3.410 (s)
Plotting power spectral density (dB=True).
Effective window size : 3.410 (s)
Plotting power spectral density (dB=True).

CSD can also be computed on Evoked (averaged) data. Here we epoch and average the data so we can demonstrate that.

event_id = {
    "auditory/left": 1,
    "auditory/right": 2,
    "visual/left": 3,
    "visual/right": 4,
    "smiley": 5,
    "button": 32,
}
epochs = mne.Epochs(raw, events, event_id=event_id, tmin=-0.2, tmax=0.5, preload=True)
evoked = epochs["auditory"].average()
Not setting metadata
320 matching events found
Setting baseline interval to [-0.19979521315838786, 0.0] s
Applying baseline correction (mode: mean)
Created an SSP operator (subspace dimension = 1)
1 projection items activated
Using data from preloaded Raw for 320 events and 421 original time points ...
0 bad epochs dropped

First let’s look at how CSD affects scalp topography:

times = np.array([-0.1, 0.0, 0.05, 0.1, 0.15])
evoked_csd = mne.preprocessing.compute_current_source_density(evoked)
evoked.plot_joint(title="Average Reference", show=False)
evoked_csd.plot_joint(title="Current Source Density")
  • Average Reference, 0.093 s, 0.205 s, 0.320 s
  • Current Source Density, 0.095 s, 0.208 s, 0.310 s
Fitted sphere radius:         91.0 mm
Origin head coordinates:      -4.1 16.0 51.8 mm
Origin device coordinates:    1.4 17.8 -10.3 mm
Projections have already been applied. Setting proj attribute to True.
Projections have already been applied. Setting proj attribute to True.

CSD has parameters stiffness and lambda2 affecting smoothing and spline flexibility, respectively. Let’s see how they affect the solution:

fig, ax = plt.subplots(4, 4, layout="constrained")
fig.set_size_inches(10, 10)
for i, lambda2 in enumerate([0, 1e-7, 1e-5, 1e-3]):
    for j, m in enumerate([5, 4, 3, 2]):
        this_evoked_csd = mne.preprocessing.compute_current_source_density(
            evoked, stiffness=m, lambda2=lambda2
        )
        this_evoked_csd.plot_topomap(
            0.1, axes=ax[i, j], contours=4, time_unit="s", colorbar=False, show=False
        )
        ax[i, j].set_title(f"stiffness={m}\nλ²={lambda2}")
stiffness=5 λ²=0, stiffness=4 λ²=0, stiffness=3 λ²=0, stiffness=2 λ²=0, stiffness=5 λ²=1e-07, stiffness=4 λ²=1e-07, stiffness=3 λ²=1e-07, stiffness=2 λ²=1e-07, stiffness=5 λ²=1e-05, stiffness=4 λ²=1e-05, stiffness=3 λ²=1e-05, stiffness=2 λ²=1e-05, stiffness=5 λ²=0.001, stiffness=4 λ²=0.001, stiffness=3 λ²=0.001, stiffness=2 λ²=0.001
Fitted sphere radius:         91.0 mm
Origin head coordinates:      -4.1 16.0 51.8 mm
Origin device coordinates:    1.4 17.8 -10.3 mm
Fitted sphere radius:         91.0 mm
Origin head coordinates:      -4.1 16.0 51.8 mm
Origin device coordinates:    1.4 17.8 -10.3 mm
Fitted sphere radius:         91.0 mm
Origin head coordinates:      -4.1 16.0 51.8 mm
Origin device coordinates:    1.4 17.8 -10.3 mm
Fitted sphere radius:         91.0 mm
Origin head coordinates:      -4.1 16.0 51.8 mm
Origin device coordinates:    1.4 17.8 -10.3 mm
Fitted sphere radius:         91.0 mm
Origin head coordinates:      -4.1 16.0 51.8 mm
Origin device coordinates:    1.4 17.8 -10.3 mm
Fitted sphere radius:         91.0 mm
Origin head coordinates:      -4.1 16.0 51.8 mm
Origin device coordinates:    1.4 17.8 -10.3 mm
Fitted sphere radius:         91.0 mm
Origin head coordinates:      -4.1 16.0 51.8 mm
Origin device coordinates:    1.4 17.8 -10.3 mm
Fitted sphere radius:         91.0 mm
Origin head coordinates:      -4.1 16.0 51.8 mm
Origin device coordinates:    1.4 17.8 -10.3 mm
Fitted sphere radius:         91.0 mm
Origin head coordinates:      -4.1 16.0 51.8 mm
Origin device coordinates:    1.4 17.8 -10.3 mm
Fitted sphere radius:         91.0 mm
Origin head coordinates:      -4.1 16.0 51.8 mm
Origin device coordinates:    1.4 17.8 -10.3 mm
Fitted sphere radius:         91.0 mm
Origin head coordinates:      -4.1 16.0 51.8 mm
Origin device coordinates:    1.4 17.8 -10.3 mm
Fitted sphere radius:         91.0 mm
Origin head coordinates:      -4.1 16.0 51.8 mm
Origin device coordinates:    1.4 17.8 -10.3 mm
Fitted sphere radius:         91.0 mm
Origin head coordinates:      -4.1 16.0 51.8 mm
Origin device coordinates:    1.4 17.8 -10.3 mm
Fitted sphere radius:         91.0 mm
Origin head coordinates:      -4.1 16.0 51.8 mm
Origin device coordinates:    1.4 17.8 -10.3 mm
Fitted sphere radius:         91.0 mm
Origin head coordinates:      -4.1 16.0 51.8 mm
Origin device coordinates:    1.4 17.8 -10.3 mm
Fitted sphere radius:         91.0 mm
Origin head coordinates:      -4.1 16.0 51.8 mm
Origin device coordinates:    1.4 17.8 -10.3 mm

References#

Total running time of the script: (0 minutes 24.679 seconds)

Gallery generated by Sphinx-Gallery