Select Electrodes and Resampling#

Within paradigm, it is possible to restrict analysis only to a subset of electrodes and to resample to a specific sampling rate. There is also a utility function to select common electrodes shared between datasets. This tutorial demonstrates how to use this functionality.

# Authors: Sylvain Chevallier <sylvain.chevallier@uvsq.fr>
#
# License: BSD (3-clause)
import matplotlib.pyplot as plt
from mne.decoding import CSP
from pyriemann.estimation import Covariances
from pyriemann.tangentspace import TangentSpace
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
from sklearn.linear_model import LogisticRegression as LR
from sklearn.pipeline import make_pipeline

import moabb.analysis.plotting as moabb_plt
from moabb.datasets import BNCI2014_001, Zhou2016
from moabb.datasets.utils import find_intersecting_channels
from moabb.evaluations import WithinSessionEvaluation
from moabb.paradigms import LeftRightImagery

Datasets#

Load 2 subjects of BNCI 2014-004 and Zhou2016 datasets, with 2 sessions each

Paradigm#

Restrict further analysis to specified channels, here C3, C4, and Cz. Also, use a specific resampling. In this example, all datasets are set to 200 Hz.

paradigm = LeftRightImagery(channels=["C3", "C4", "Cz"], resample=200.0)

Evaluation#

The evaluation is conducted on with CSP+LDA, only on the 3 electrodes, with a sampling rate of 200 Hz.

evaluation = WithinSessionEvaluation(paradigm=paradigm, datasets=datasets)
csp_lda = make_pipeline(CSP(n_components=2), LDA())
ts_lr = make_pipeline(
    Covariances(estimator="oas"), TangentSpace(metric="riemann"), LR(C=1.0)
)
results = evaluation.process({"csp+lda": csp_lda, "ts+lr": ts_lr})
print(results.head())
Zhou2016-WithinSession:   0%|          | 0/2 [00:00<?, ?it/s]No hdf5_path provided, models will not be saved.
No hdf5_path provided, models will not be saved.
No hdf5_path provided, models will not be saved.
No hdf5_path provided, models will not be saved.
No hdf5_path provided, models will not be saved.
No hdf5_path provided, models will not be saved.

Zhou2016-WithinSession:  50%|█████     | 1/2 [00:04<00:04,  4.49s/it]No hdf5_path provided, models will not be saved.
No hdf5_path provided, models will not be saved.
No hdf5_path provided, models will not be saved.
No hdf5_path provided, models will not be saved.
No hdf5_path provided, models will not be saved.
No hdf5_path provided, models will not be saved.

Zhou2016-WithinSession: 100%|██████████| 2/2 [00:08<00:00,  4.14s/it]
Zhou2016-WithinSession: 100%|██████████| 2/2 [00:08<00:00,  4.19s/it]

BNCI2014-001-WithinSession:   0%|          | 0/2 [00:00<?, ?it/s]No hdf5_path provided, models will not be saved.
No hdf5_path provided, models will not be saved.
No hdf5_path provided, models will not be saved.
No hdf5_path provided, models will not be saved.

BNCI2014-001-WithinSession:  50%|█████     | 1/2 [00:05<00:05,  5.62s/it]No hdf5_path provided, models will not be saved.
No hdf5_path provided, models will not be saved.
No hdf5_path provided, models will not be saved.
No hdf5_path provided, models will not be saved.

BNCI2014-001-WithinSession: 100%|██████████| 2/2 [00:11<00:00,  5.61s/it]
BNCI2014-001-WithinSession: 100%|██████████| 2/2 [00:11<00:00,  5.61s/it]
      score      time  samples subject  ... channels  n_sessions   dataset pipeline
0  0.846212  0.023546    119.0       1  ...        3           3  Zhou2016  csp+lda
1  0.920000  0.020795    100.0       1  ...        3           3  Zhou2016  csp+lda
2  0.938000  0.022822    100.0       1  ...        3           3  Zhou2016  csp+lda
3  0.912000  0.019420    100.0       2  ...        3           3  Zhou2016  csp+lda
4  0.837037  0.021354     90.0       2  ...        3           3  Zhou2016  csp+lda

[5 rows x 9 columns]

Electrode Selection#

It is possible to select the electrodes that are shared by all datasets using the find_intersecting_channels function. Datasets that have 0 overlap with others are discarded. It returns the set of common channels, as well as the list of datasets with valid channels.

electrodes, datasets = find_intersecting_channels(datasets)
evaluation = WithinSessionEvaluation(
    paradigm=paradigm, datasets=datasets, overwrite=True, suffix="resample"
)
results = evaluation.process({"csp+lda": csp_lda, "ts+lr": ts_lr})
print(results.head())
Searching dataset: Zhou2016
Searching dataset: BNCI2014_001

Zhou2016-WithinSession:   0%|          | 0/2 [00:00<?, ?it/s]No hdf5_path provided, models will not be saved.
No hdf5_path provided, models will not be saved.
No hdf5_path provided, models will not be saved.
No hdf5_path provided, models will not be saved.
No hdf5_path provided, models will not be saved.
No hdf5_path provided, models will not be saved.

Zhou2016-WithinSession:  50%|█████     | 1/2 [00:04<00:04,  4.62s/it]No hdf5_path provided, models will not be saved.
No hdf5_path provided, models will not be saved.
No hdf5_path provided, models will not be saved.
No hdf5_path provided, models will not be saved.
No hdf5_path provided, models will not be saved.
No hdf5_path provided, models will not be saved.

Zhou2016-WithinSession: 100%|██████████| 2/2 [00:08<00:00,  4.18s/it]
Zhou2016-WithinSession: 100%|██████████| 2/2 [00:08<00:00,  4.25s/it]

BNCI2014-001-WithinSession:   0%|          | 0/2 [00:00<?, ?it/s]No hdf5_path provided, models will not be saved.
No hdf5_path provided, models will not be saved.
No hdf5_path provided, models will not be saved.
No hdf5_path provided, models will not be saved.

BNCI2014-001-WithinSession:  50%|█████     | 1/2 [00:05<00:05,  5.88s/it]No hdf5_path provided, models will not be saved.
No hdf5_path provided, models will not be saved.
No hdf5_path provided, models will not be saved.
No hdf5_path provided, models will not be saved.

BNCI2014-001-WithinSession: 100%|██████████| 2/2 [00:11<00:00,  5.89s/it]
BNCI2014-001-WithinSession: 100%|██████████| 2/2 [00:11<00:00,  5.89s/it]
      score      time  samples subject  ... channels  n_sessions   dataset pipeline
0  0.859596  0.044560    119.0       1  ...        3           3  Zhou2016  csp+lda
1  0.902000  0.020180    100.0       1  ...        3           3  Zhou2016  csp+lda
2  0.940000  0.018847    100.0       1  ...        3           3  Zhou2016  csp+lda
3  0.920000  0.018447    100.0       2  ...        3           3  Zhou2016  csp+lda
4  0.824691  0.026103     90.0       2  ...        3           3  Zhou2016  csp+lda

[5 rows x 9 columns]

Plot Results#

Compare the obtained results with the two pipelines, CSP+LDA and logistic regression computed in the tangent space of the covariance matrices.

fig = moabb_plt.paired_plot(results, "csp+lda", "ts+lr")
plt.show()
plot select electrodes resample

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

Estimated memory usage: 844 MB

Gallery generated by Sphinx-Gallery