File: eog_regression.py

package info (click to toggle)
python-mne 1.3.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 100,172 kB
  • sloc: python: 166,349; pascal: 3,602; javascript: 1,472; sh: 334; makefile: 236
file content (78 lines) | stat: -rw-r--r-- 2,535 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# -*- coding: utf-8 -*-
"""
=======================================
Reduce EOG artifacts through regression
=======================================

Reduce artifacts by regressing the EOG channels onto the rest of the channels
and then subtracting the EOG signal.

This is a quick example to show the most basic application of the technique.
See the :ref:`tutorial <tut-artifact-regression>` for a more thorough
explanation that demonstrates more advanced approaches.
"""

# Author: Marijn van Vliet <w.m.vanvliet@gmail.com>
#
# License: BSD (3-clause)

# %%
# Import packages and load data
# -----------------------------
#
# We begin as always by importing the necessary Python modules and loading some
# data, in this case the :ref:`MNE sample dataset <sample-dataset>`.

import mne
from mne.datasets import sample
from mne.preprocessing import EOGRegression
from matplotlib import pyplot as plt

print(__doc__)

data_path = sample.data_path()
raw_fname = data_path / 'MEG' / 'sample' / 'sample_audvis_filt-0-40_raw.fif'

# Read raw data
raw = mne.io.read_raw_fif(raw_fname, preload=True)
events = mne.find_events(raw, 'STI 014')

# Highpass filter to eliminate slow drifts
raw.filter(0.3, None, picks='all')

# %%
# Perform regression and remove EOG
# ---------------------------------

# Fit the regression model
weights = EOGRegression().fit(raw)
raw_clean = weights.apply(raw, copy=True)

# Show the filter weights in a topomap
weights.plot()

# %%
# Before/after comparison
# -----------------------
# Let's compare the signal before and after cleaning with EOG regression. This
# is best visualized by extracting epochs and plotting the evoked potential.

tmin, tmax = -0.1, 0.5
event_id = {'visual/left': 3, 'visual/right': 4}
evoked_before = mne.Epochs(raw, events, event_id, tmin, tmax,
                           baseline=(tmin, 0)).average()
evoked_after = mne.Epochs(raw_clean, events, event_id, tmin, tmax,
                          baseline=(tmin, 0)).average()

# Create epochs after EOG correction
epochs_after = mne.Epochs(raw_clean, events, event_id, tmin, tmax,
                          baseline=(tmin, 0))
evoked_after = epochs_after.average()

fig, ax = plt.subplots(nrows=3, ncols=2, figsize=(10, 7),
                       sharex=True, sharey='row')
evoked_before.plot(axes=ax[:, 0], spatial_colors=True)
evoked_after.plot(axes=ax[:, 1], spatial_colors=True)
fig.subplots_adjust(top=0.905, bottom=0.09, left=0.08, right=0.975,
                    hspace=0.325, wspace=0.145)
fig.suptitle('Before --> After')