Time-Resolved Decoding with SlidingEstimator#

This example shows how to perform time-resolved decoding of EEG signals using mne.decoding.SlidingEstimator. Instead of reducing the entire trial to a single score, a SlidingEstimator fits an independent classifier at each time point, revealing when during a trial the neural signal carries information about the mental state.

This approach is a natural alternative to pseudo-online evaluation (using overlapping windows): rather than simulating an online scenario by slicing the raw signal with a sliding window, we directly assess decoding accuracy at each sample of the already-epoched trial.

We use the BNCI2014-001 motor-imagery dataset (left- vs right-hand) and apply a logistic-regression classifier wrapped in a SlidingEstimator. For each subject the score is evaluated via stratified 5-fold cross-validation using mne.decoding.cross_val_multiscore(), and the results are averaged across subjects and visualised as a time course.

# Authors: MOABB contributors
#
# License: BSD (3-clause)
# sphinx_gallery_thumbnail_number = 2

import warnings

import matplotlib.pyplot as plt
import numpy as np
from mne.decoding import SlidingEstimator, cross_val_multiscore
from scipy.stats import ttest_1samp
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler

import moabb
from moabb.datasets import BNCI2014_001
from moabb.paradigms import LeftRightImagery


moabb.set_log_level("info")
warnings.filterwarnings("ignore")

Loading the Dataset#

We instantiate the BNCI2014-001 dataset and use all 9 subjects.

Choosing a Paradigm#

The LeftRightImagery paradigm extracts left-hand and right-hand motor-imagery epochs, applies a band-pass filter (8–32 Hz by default), and returns the data as a 3-D NumPy array of shape (n_trials, n_channels, n_times).

Building a Time-Resolved Pipeline#

A SlidingEstimator wraps any scikit-learn compatible estimator and fits/scores it independently at every time point. Here we use a simple logistic-regression classifier with Z-score normalisation. The scoring='roc_auc' argument tells the estimator to use AUC as the evaluation metric.

clf = make_pipeline(StandardScaler(), LogisticRegression(max_iter=1000))
sliding = SlidingEstimator(clf, scoring="roc_auc", n_jobs=1)

Evaluating Each Subject#

For each subject we:

  1. Retrieve the preprocessed epochs via the paradigm using return_epochs=True so we can extract the correct time vector and sampling frequency from the mne.Epochs metadata.

  2. Run stratified 5-fold cross-validation with cross_val_multiscore(), which returns an array of shape (n_folds, n_times).

  3. Average over folds to obtain a single time course per subject.

All per-subject time courses are collected for later aggregation.

all_scores = []

for subject in dataset.subject_list:
    epochs, y, meta = paradigm.get_data(
        dataset=dataset, subjects=[subject], return_epochs=True
    )
    X = epochs.get_data()

    # cross_val_multiscore returns (n_folds, n_times)
    scores = cross_val_multiscore(sliding, X, y, cv=5, n_jobs=1)
    all_scores.append(scores.mean(axis=0))  # average over folds

# Stack into (n_subjects, n_times)
all_scores = np.array(all_scores)
  0%|                                              | 0.00/37.2M [00:00<?, ?B/s]
  0%|                                     | 8.19k/37.2M [00:00<12:27, 49.7kB/s]
  0%|                                      | 56.3k/37.2M [00:00<03:14, 191kB/s]
  0%|▏                                      | 121k/37.2M [00:00<02:11, 281kB/s]
  0%|▏                                      | 176k/37.2M [00:00<02:02, 301kB/s]
  1%|▎                                      | 256k/37.2M [00:00<01:40, 366kB/s]
  1%|▎                                      | 337k/37.2M [00:00<01:30, 407kB/s]
  1%|▍                                      | 424k/37.2M [00:01<01:22, 445kB/s]
  1%|▌                                      | 537k/37.2M [00:01<01:10, 519kB/s]
  2%|▋                                      | 640k/37.2M [00:01<01:06, 551kB/s]
  2%|▊                                      | 824k/37.2M [00:01<00:50, 723kB/s]
  3%|█                                     | 1.01M/37.2M [00:01<00:42, 841kB/s]
  3%|█▎                                   | 1.27M/37.2M [00:01<00:33, 1.07MB/s]
  4%|█▌                                   | 1.55M/37.2M [00:02<00:28, 1.25MB/s]
  5%|█▉                                   | 1.91M/37.2M [00:02<00:23, 1.53MB/s]
  6%|██▍                                  | 2.41M/37.2M [00:02<00:17, 1.96MB/s]
  8%|███                                  | 3.07M/37.2M [00:02<00:13, 2.57MB/s]
 10%|███▊                                 | 3.86M/37.2M [00:02<00:10, 3.22MB/s]
 13%|████▉                                | 4.92M/37.2M [00:02<00:07, 4.16MB/s]
 17%|██████▎                              | 6.30M/37.2M [00:03<00:05, 5.41MB/s]
 22%|████████                             | 8.08M/37.2M [00:03<00:04, 6.99MB/s]
 28%|██████████▍                          | 10.5M/37.2M [00:03<00:02, 9.32MB/s]
 37%|█████████████▋                       | 13.7M/37.2M [00:03<00:01, 12.2MB/s]
 49%|██████████████████                   | 18.1M/37.2M [00:03<00:01, 16.6MB/s]
 64%|███████████████████████▋             | 23.8M/37.2M [00:03<00:00, 21.8MB/s]
 77%|████████████████████████████▌        | 28.7M/37.2M [00:04<00:00, 27.3MB/s]
 87%|████████████████████████████████▏    | 32.4M/37.2M [00:04<00:00, 29.5MB/s]
 99%|████████████████████████████████████▋| 36.8M/37.2M [00:04<00:00, 29.4MB/s]
  0%|                                              | 0.00/37.2M [00:00<?, ?B/s]
100%|██████████████████████████████████████| 37.2M/37.2M [00:00<00:00, 191GB/s]

  0%|                                              | 0.00/41.7M [00:00<?, ?B/s]
  0%|                                     | 8.19k/41.7M [00:00<13:30, 51.5kB/s]
  0%|                                      | 56.3k/41.7M [00:00<03:30, 198kB/s]
  0%|                                      | 96.3k/41.7M [00:00<03:08, 221kB/s]
  0%|▏                                      | 161k/41.7M [00:00<02:22, 293kB/s]
  0%|▏                                      | 201k/41.7M [00:00<02:30, 277kB/s]
  1%|▎                                      | 281k/41.7M [00:00<01:57, 352kB/s]
  1%|▎                                      | 377k/41.7M [00:01<01:35, 433kB/s]
  1%|▍                                      | 488k/41.7M [00:01<01:19, 516kB/s]
  1%|▌                                      | 608k/41.7M [00:01<01:09, 588kB/s]
  2%|▋                                      | 721k/41.7M [00:01<01:05, 623kB/s]
  2%|▊                                      | 841k/41.7M [00:01<01:01, 660kB/s]
  2%|▉                                      | 952k/41.7M [00:01<01:00, 671kB/s]
  3%|▉                                     | 1.06M/41.7M [00:02<00:59, 678kB/s]
  3%|█                                     | 1.18M/41.7M [00:02<00:57, 700kB/s]
  3%|█▏                                    | 1.30M/41.7M [00:02<00:57, 699kB/s]
  3%|█▎                                    | 1.42M/41.7M [00:02<00:56, 713kB/s]
  4%|█▍                                    | 1.61M/41.7M [00:02<00:46, 859kB/s]
  4%|█▋                                    | 1.81M/41.7M [00:02<00:40, 974kB/s]
  5%|█▉                                   | 2.13M/41.7M [00:03<00:30, 1.28MB/s]
  6%|██▏                                  | 2.42M/41.7M [00:03<00:27, 1.45MB/s]
  7%|██▌                                  | 2.91M/41.7M [00:03<00:20, 1.93MB/s]
  8%|███                                  | 3.40M/41.7M [00:03<00:16, 2.26MB/s]
 10%|███▋                                 | 4.17M/41.7M [00:03<00:11, 3.24MB/s]
 12%|████▎                                | 4.84M/41.7M [00:03<00:09, 3.85MB/s]
 14%|█████                                | 5.74M/41.7M [00:03<00:07, 4.85MB/s]
 16%|█████▉                               | 6.70M/41.7M [00:04<00:06, 5.70MB/s]
 19%|███████                              | 8.03M/41.7M [00:04<00:04, 7.19MB/s]
 25%|█████████▏                           | 10.3M/41.7M [00:04<00:02, 10.6MB/s]
 28%|██████████▍                          | 11.8M/41.7M [00:04<00:02, 11.1MB/s]
 34%|████████████▌                        | 14.1M/41.7M [00:04<00:02, 13.5MB/s]
 44%|████████████████▏                    | 18.3M/41.7M [00:04<00:01, 19.6MB/s]
 54%|███████████████████▉                 | 22.4M/41.7M [00:04<00:00, 25.2MB/s]
 60%|██████████████████████▏              | 25.0M/41.7M [00:04<00:00, 24.9MB/s]
 70%|██████████████████████████           | 29.4M/41.7M [00:04<00:00, 30.0MB/s]
 81%|█████████████████████████████▊       | 33.6M/41.7M [00:05<00:00, 30.2MB/s]
 91%|█████████████████████████████████▋   | 37.9M/41.7M [00:05<00:00, 33.7MB/s]
  0%|                                              | 0.00/41.7M [00:00<?, ?B/s]
100%|██████████████████████████████████████| 41.7M/41.7M [00:00<00:00, 140GB/s]

  0%|                                              | 0.00/42.5M [00:00<?, ?B/s]
  0%|                                     | 8.19k/42.5M [00:00<13:44, 51.5kB/s]
  0%|                                      | 56.3k/42.5M [00:00<03:34, 198kB/s]
  0%|                                       | 113k/42.5M [00:00<02:38, 268kB/s]
  0%|▏                                      | 168k/42.5M [00:00<02:21, 298kB/s]
  1%|▏                                      | 224k/42.5M [00:00<02:13, 317kB/s]
  1%|▎                                      | 281k/42.5M [00:00<02:08, 328kB/s]
  1%|▎                                      | 337k/42.5M [00:01<02:05, 336kB/s]
  1%|▎                                      | 392k/42.5M [00:01<02:04, 338kB/s]
  1%|▍                                      | 465k/42.5M [00:01<01:52, 374kB/s]
  1%|▍                                      | 512k/42.5M [00:01<02:00, 349kB/s]
  1%|▌                                      | 616k/42.5M [00:01<01:34, 441kB/s]
  2%|▋                                      | 736k/42.5M [00:01<01:18, 534kB/s]
  2%|▊                                      | 856k/42.5M [00:02<01:09, 598kB/s]
  2%|▉                                     | 1.05M/42.5M [00:02<00:53, 780kB/s]
  3%|█                                     | 1.24M/42.5M [00:02<00:45, 904kB/s]
  4%|█▎                                   | 1.50M/42.5M [00:02<00:36, 1.13MB/s]
  4%|█▌                                   | 1.78M/42.5M [00:02<00:31, 1.30MB/s]
  5%|█▉                                   | 2.18M/42.5M [00:02<00:24, 1.67MB/s]
  6%|██▎                                  | 2.68M/42.5M [00:03<00:18, 2.10MB/s]
  8%|██▉                                  | 3.42M/42.5M [00:03<00:13, 2.84MB/s]
 10%|███▋                                 | 4.27M/42.5M [00:03<00:10, 3.59MB/s]
 13%|████▊                                | 5.57M/42.5M [00:03<00:07, 4.94MB/s]
 17%|██████                               | 7.02M/42.5M [00:03<00:05, 6.60MB/s]
 21%|███████▋                             | 8.87M/42.5M [00:03<00:03, 8.88MB/s]
 25%|█████████▍                           | 10.8M/42.5M [00:03<00:02, 10.9MB/s]
 30%|███████████                          | 12.7M/42.5M [00:04<00:02, 12.3MB/s]
 39%|██████████████▌                      | 16.8M/42.5M [00:04<00:01, 18.2MB/s]
 50%|██████████████████▌                  | 21.3M/42.5M [00:04<00:00, 23.8MB/s]
 58%|█████████████████████▌               | 24.7M/42.5M [00:04<00:00, 26.5MB/s]
 65%|███████████████████████▉             | 27.5M/42.5M [00:04<00:00, 25.2MB/s]
 77%|████████████████████████████▍        | 32.6M/42.5M [00:04<00:00, 28.5MB/s]
 92%|██████████████████████████████████   | 39.1M/42.5M [00:04<00:00, 32.3MB/s]
  0%|                                              | 0.00/42.5M [00:00<?, ?B/s]
100%|██████████████████████████████████████| 42.5M/42.5M [00:00<00:00, 155GB/s]

  0%|                                              | 0.00/44.4M [00:00<?, ?B/s]
  0%|                                     | 8.19k/44.4M [00:00<14:24, 51.3kB/s]
  0%|                                      | 56.3k/44.4M [00:00<03:44, 197kB/s]
  0%|                                       | 113k/44.4M [00:00<02:45, 267kB/s]
  0%|▏                                      | 168k/44.4M [00:00<02:28, 297kB/s]
  1%|▏                                      | 249k/44.4M [00:00<01:58, 371kB/s]
  1%|▎                                      | 321k/44.4M [00:00<01:51, 396kB/s]
  1%|▎                                      | 400k/44.4M [00:01<01:42, 429kB/s]
  1%|▍                                      | 480k/44.4M [00:01<01:37, 450kB/s]
  1%|▍                                      | 568k/44.4M [00:01<01:31, 481kB/s]
  2%|▌                                      | 688k/44.4M [00:01<01:17, 562kB/s]
  2%|▋                                      | 808k/44.4M [00:01<01:10, 618kB/s]
  2%|▊                                     | 1.00M/44.4M [00:01<00:54, 793kB/s]
  3%|█                                    | 1.24M/44.4M [00:02<00:42, 1.00MB/s]
  3%|█▏                                   | 1.45M/44.4M [00:02<00:39, 1.09MB/s]
  4%|█▍                                   | 1.79M/44.4M [00:02<00:30, 1.41MB/s]
  5%|█▊                                   | 2.15M/44.4M [00:02<00:25, 1.66MB/s]
  6%|██                                   | 2.52M/44.4M [00:02<00:22, 1.84MB/s]
  7%|██▌                                  | 3.02M/44.4M [00:02<00:18, 2.23MB/s]
  8%|██▉                                  | 3.54M/44.4M [00:03<00:16, 2.52MB/s]
  9%|███▍                                 | 4.18M/44.4M [00:03<00:13, 2.97MB/s]
 11%|████                                 | 4.94M/44.4M [00:03<00:11, 3.48MB/s]
 14%|█████                                | 6.00M/44.4M [00:03<00:08, 4.42MB/s]
 16%|█████▉                               | 7.12M/44.4M [00:03<00:07, 5.18MB/s]
 19%|███████▏                             | 8.62M/44.4M [00:03<00:05, 6.41MB/s]
 24%|████████▉                            | 10.7M/44.4M [00:04<00:04, 8.30MB/s]
 30%|███████████                          | 13.3M/44.4M [00:04<00:02, 10.8MB/s]
 38%|██████████████                       | 16.9M/44.4M [00:04<00:01, 14.1MB/s]
 49%|█████████████████▉                   | 21.5M/44.4M [00:04<00:01, 18.6MB/s]
 61%|██████████████████████▍              | 26.9M/44.4M [00:04<00:00, 26.0MB/s]
 70%|█████████████████████████▊           | 31.0M/44.4M [00:04<00:00, 29.3MB/s]
 77%|████████████████████████████▋        | 34.4M/44.4M [00:04<00:00, 28.2MB/s]
 88%|████████████████████████████████▌    | 39.1M/44.4M [00:04<00:00, 32.9MB/s]
 99%|████████████████████████████████████▍| 43.8M/44.4M [00:05<00:00, 36.5MB/s]
  0%|                                              | 0.00/44.4M [00:00<?, ?B/s]
100%|██████████████████████████████████████| 44.4M/44.4M [00:00<00:00, 151GB/s]

  0%|                                              | 0.00/44.6M [00:00<?, ?B/s]
  0%|                                     | 8.19k/44.6M [00:00<14:25, 51.5kB/s]
  0%|                                      | 48.1k/44.6M [00:00<04:25, 168kB/s]
  0%|                                       | 128k/44.6M [00:00<02:19, 319kB/s]
  0%|▏                                      | 193k/44.6M [00:00<02:06, 352kB/s]
  1%|▎                                      | 329k/44.6M [00:00<01:23, 531kB/s]
  1%|▍                                      | 465k/44.6M [00:00<01:09, 639kB/s]
  2%|▌                                      | 688k/44.6M [00:01<00:49, 884kB/s]
  2%|▊                                     | 904k/44.6M [00:01<00:42, 1.03MB/s]
  3%|█                                    | 1.27M/44.6M [00:01<00:30, 1.43MB/s]
  4%|█▎                                   | 1.63M/44.6M [00:01<00:25, 1.68MB/s]
  5%|█▉                                   | 2.26M/44.6M [00:01<00:17, 2.37MB/s]
  6%|██▎                                  | 2.82M/44.6M [00:01<00:15, 2.71MB/s]
  9%|███▏                                 | 3.90M/44.6M [00:02<00:10, 3.93MB/s]
 11%|████                                 | 4.87M/44.6M [00:02<00:08, 4.56MB/s]
 15%|█████▋                               | 6.79M/44.6M [00:02<00:05, 7.29MB/s]
 18%|██████▌                              | 7.95M/44.6M [00:02<00:04, 7.91MB/s]
 22%|████████                             | 9.75M/44.6M [00:02<00:03, 9.83MB/s]
 28%|██████████▌                          | 12.7M/44.6M [00:02<00:02, 13.9MB/s]
 35%|████████████▉                        | 15.6M/44.6M [00:02<00:01, 17.8MB/s]
 40%|██████████████▉                      | 17.9M/44.6M [00:02<00:01, 19.1MB/s]
 46%|█████████████████▏                   | 20.7M/44.6M [00:03<00:01, 20.3MB/s]
 59%|█████████████████████▋               | 26.2M/44.6M [00:03<00:00, 25.5MB/s]
 69%|█████████████████████████▍           | 30.6M/44.6M [00:03<00:00, 26.3MB/s]
 83%|██████████████████████████████▋      | 37.0M/44.6M [00:03<00:00, 30.3MB/s]
 97%|███████████████████████████████████▉ | 43.3M/44.6M [00:03<00:00, 33.3MB/s]
  0%|                                              | 0.00/44.6M [00:00<?, ?B/s]
100%|██████████████████████████████████████| 44.6M/44.6M [00:00<00:00, 186GB/s]

  0%|                                              | 0.00/43.4M [00:00<?, ?B/s]
  0%|                                      | 16.4k/43.4M [00:00<07:03, 102kB/s]
  0%|                                      | 56.3k/43.4M [00:00<03:49, 189kB/s]
  0%|                                      | 96.3k/43.4M [00:00<03:20, 216kB/s]
  0%|▏                                      | 161k/43.4M [00:00<02:29, 289kB/s]
  0%|▏                                      | 216k/43.4M [00:00<02:19, 309kB/s]
  1%|▎                                      | 304k/43.4M [00:00<01:50, 390kB/s]
  1%|▎                                      | 369k/43.4M [00:01<01:49, 393kB/s]
  1%|▍                                      | 512k/43.4M [00:01<01:17, 552kB/s]
  1%|▌                                      | 600k/43.4M [00:01<01:17, 550kB/s]
  2%|▋                                      | 816k/43.4M [00:01<00:53, 795kB/s]
  2%|▉                                     | 1.02M/43.4M [00:01<00:44, 947kB/s]
  3%|█▏                                   | 1.32M/43.4M [00:01<00:34, 1.22MB/s]
  4%|█▍                                   | 1.64M/43.4M [00:02<00:28, 1.45MB/s]
  5%|█▋                                   | 2.02M/43.4M [00:02<00:23, 1.73MB/s]
  6%|██                                   | 2.44M/43.4M [00:02<00:20, 1.99MB/s]
  7%|██▌                                  | 3.06M/43.4M [00:02<00:15, 2.54MB/s]
  9%|███▏                                 | 3.72M/43.4M [00:02<00:13, 3.02MB/s]
 11%|████                                 | 4.71M/43.4M [00:02<00:09, 3.96MB/s]
 13%|████▉                                | 5.78M/43.4M [00:03<00:07, 4.76MB/s]
 17%|██████▎                              | 7.34M/43.4M [00:03<00:05, 6.25MB/s]
 21%|███████▋                             | 9.04M/43.4M [00:03<00:04, 7.54MB/s]
 27%|█████████▉                           | 11.6M/43.4M [00:03<00:03, 10.1MB/s]
 33%|████████████▎                        | 14.4M/43.4M [00:03<00:02, 12.2MB/s]
 43%|███████████████▊                     | 18.6M/43.4M [00:03<00:01, 16.3MB/s]
 54%|███████████████████▉                 | 23.4M/43.4M [00:04<00:00, 20.4MB/s]
 69%|█████████████████████████▍           | 29.9M/43.4M [00:04<00:00, 26.1MB/s]
 84%|███████████████████████████████      | 36.4M/43.4M [00:04<00:00, 30.0MB/s]
 99%|████████████████████████████████████▌| 42.9M/43.4M [00:04<00:00, 32.7MB/s]
  0%|                                              | 0.00/43.4M [00:00<?, ?B/s]
100%|██████████████████████████████████████| 43.4M/43.4M [00:00<00:00, 180GB/s]

  0%|                                              | 0.00/42.8M [00:00<?, ?B/s]
  0%|                                     | 8.19k/42.8M [00:00<13:51, 51.5kB/s]
  0%|                                      | 56.3k/42.8M [00:00<03:35, 198kB/s]
  0%|                                       | 128k/42.8M [00:00<02:16, 312kB/s]
  0%|▏                                      | 193k/42.8M [00:00<02:02, 347kB/s]
  1%|▎                                      | 289k/42.8M [00:00<01:37, 438kB/s]
  1%|▎                                      | 392k/42.8M [00:00<01:23, 508kB/s]
  1%|▍                                      | 512k/42.8M [00:01<01:12, 586kB/s]
  1%|▌                                      | 633k/42.8M [00:01<01:06, 639kB/s]
  2%|▋                                      | 801k/42.8M [00:01<00:54, 766kB/s]
  2%|▉                                      | 984k/42.8M [00:01<00:47, 882kB/s]
  3%|█                                    | 1.29M/42.8M [00:01<00:34, 1.19MB/s]
  4%|█▎                                   | 1.58M/42.8M [00:01<00:30, 1.37MB/s]
  5%|█▊                                   | 2.11M/42.8M [00:02<00:19, 2.11MB/s]
  5%|██                                   | 2.34M/42.8M [00:02<00:19, 2.05MB/s]
  7%|██▌                                  | 2.92M/42.8M [00:02<00:14, 2.82MB/s]
  9%|███▏                                 | 3.64M/42.8M [00:02<00:10, 3.71MB/s]
 10%|███▊                                 | 4.37M/42.8M [00:02<00:08, 4.34MB/s]
 14%|████▉                                | 5.78M/42.8M [00:02<00:05, 6.48MB/s]
 15%|█████▋                               | 6.53M/42.8M [00:02<00:05, 6.42MB/s]
 18%|██████▊                              | 7.90M/42.8M [00:02<00:04, 7.91MB/s]
 25%|█████████▏                           | 10.7M/42.8M [00:03<00:02, 12.3MB/s]
 29%|██████████▊                          | 12.5M/42.8M [00:03<00:02, 13.1MB/s]
 36%|█████████████▎                       | 15.4M/42.8M [00:03<00:01, 16.5MB/s]
 44%|████████████████▍                    | 19.0M/42.8M [00:03<00:01, 20.5MB/s]
 56%|████████████████████▋                | 24.0M/42.8M [00:03<00:00, 28.3MB/s]
 64%|███████████████████████▋             | 27.3M/42.8M [00:03<00:00, 26.5MB/s]
 75%|███████████████████████████▊         | 32.2M/42.8M [00:03<00:00, 32.2MB/s]
 86%|███████████████████████████████▊     | 36.7M/42.8M [00:03<00:00, 35.7MB/s]
 95%|██████████████████████████████████▉  | 40.5M/42.8M [00:03<00:00, 33.0MB/s]
  0%|                                              | 0.00/42.8M [00:00<?, ?B/s]
100%|██████████████████████████████████████| 42.8M/42.8M [00:00<00:00, 168GB/s]

  0%|                                              | 0.00/42.2M [00:00<?, ?B/s]
  0%|                                     | 8.19k/42.2M [00:00<13:41, 51.4kB/s]
  0%|                                      | 56.3k/42.2M [00:00<03:33, 198kB/s]
  0%|                                      | 96.3k/42.2M [00:00<03:11, 221kB/s]
  0%|▏                                      | 144k/42.2M [00:00<02:47, 252kB/s]
  0%|▏                                      | 201k/42.2M [00:00<02:26, 287kB/s]
  1%|▏                                      | 232k/42.2M [00:00<02:43, 256kB/s]
  1%|▎                                      | 304k/42.2M [00:01<02:11, 318kB/s]
  1%|▎                                      | 344k/42.2M [00:01<02:21, 296kB/s]
  1%|▍                                      | 424k/42.2M [00:01<01:56, 358kB/s]
  1%|▍                                      | 480k/42.2M [00:01<01:57, 356kB/s]
  1%|▌                                      | 577k/42.2M [00:01<01:36, 430kB/s]
  2%|▌                                      | 673k/42.2M [00:01<01:26, 481kB/s]
  2%|▋                                      | 784k/42.2M [00:02<01:16, 545kB/s]
  2%|▊                                      | 881k/42.2M [00:02<01:13, 561kB/s]
  2%|▉                                     | 1.02M/42.2M [00:02<01:03, 647kB/s]
  3%|█                                     | 1.14M/42.2M [00:02<00:59, 692kB/s]
  3%|█▏                                    | 1.31M/42.2M [00:02<00:51, 797kB/s]
  4%|█▎                                    | 1.49M/42.2M [00:02<00:45, 886kB/s]
  4%|█▌                                   | 1.77M/42.2M [00:03<00:35, 1.14MB/s]
  5%|█▊                                   | 2.03M/42.2M [00:03<00:31, 1.29MB/s]
  6%|██▏                                  | 2.47M/42.2M [00:03<00:23, 1.72MB/s]
  7%|██▌                                  | 2.96M/42.2M [00:03<00:18, 2.12MB/s]
  9%|███▎                                 | 3.78M/42.2M [00:03<00:12, 3.02MB/s]
 11%|████                                 | 4.62M/42.2M [00:03<00:10, 3.66MB/s]
 14%|█████▎                               | 6.09M/42.2M [00:04<00:06, 5.31MB/s]
 18%|██████▌                              | 7.49M/42.2M [00:04<00:05, 6.32MB/s]
 24%|████████▉                            | 10.2M/42.2M [00:04<00:03, 9.46MB/s]
 30%|███████████                          | 12.7M/42.2M [00:04<00:02, 11.2MB/s]
 42%|███████████████▍                     | 17.6M/42.2M [00:04<00:01, 17.0MB/s]
 53%|███████████████████▌                 | 22.3M/42.2M [00:04<00:00, 20.6MB/s]
 65%|████████████████████████             | 27.4M/42.2M [00:04<00:00, 24.0MB/s]
 80%|█████████████████████████████▋       | 33.9M/42.2M [00:05<00:00, 28.6MB/s]
 96%|███████████████████████████████████▍ | 40.4M/42.2M [00:05<00:00, 31.8MB/s]
  0%|                                              | 0.00/42.2M [00:00<?, ?B/s]
100%|██████████████████████████████████████| 42.2M/42.2M [00:00<00:00, 218GB/s]

  0%|                                              | 0.00/45.0M [00:00<?, ?B/s]
  0%|                                     | 8.19k/45.0M [00:00<14:35, 51.4kB/s]
  0%|                                      | 56.3k/45.0M [00:00<03:47, 198kB/s]
  0%|                                       | 121k/45.0M [00:00<02:34, 291kB/s]
  0%|▏                                      | 176k/45.0M [00:00<02:23, 312kB/s]
  1%|▏                                      | 249k/45.0M [00:00<02:03, 363kB/s]
  1%|▎                                      | 329k/45.0M [00:00<01:49, 408kB/s]
  1%|▎                                      | 409k/45.0M [00:01<01:42, 437kB/s]
  1%|▍                                      | 505k/45.0M [00:01<01:31, 489kB/s]
  1%|▌                                      | 585k/45.0M [00:01<01:30, 492kB/s]
  2%|▋                                      | 736k/45.0M [00:01<01:10, 631kB/s]
  2%|▊                                      | 904k/45.0M [00:01<00:58, 758kB/s]
  2%|▉                                     | 1.11M/45.0M [00:01<00:47, 921kB/s]
  3%|█                                    | 1.36M/45.0M [00:02<00:39, 1.11MB/s]
  4%|█▎                                   | 1.60M/45.0M [00:02<00:35, 1.23MB/s]
  4%|█▌                                   | 1.91M/45.0M [00:02<00:29, 1.44MB/s]
  5%|█▊                                   | 2.25M/45.0M [00:02<00:26, 1.64MB/s]
  6%|██▏                                  | 2.70M/45.0M [00:02<00:21, 2.00MB/s]
  7%|██▌                                  | 3.19M/45.0M [00:02<00:18, 2.31MB/s]
  9%|███▏                                 | 3.86M/45.0M [00:03<00:14, 2.86MB/s]
 10%|███▊                                 | 4.57M/45.0M [00:03<00:12, 3.33MB/s]
 12%|████▌                                | 5.54M/45.0M [00:03<00:09, 4.14MB/s]
 15%|█████▍                               | 6.67M/45.0M [00:03<00:07, 5.02MB/s]
 18%|██████▋                              | 8.13M/45.0M [00:03<00:05, 6.23MB/s]
 22%|████████▏                            | 9.94M/45.0M [00:03<00:04, 7.74MB/s]
 27%|██████████                           | 12.2M/45.0M [00:04<00:03, 9.68MB/s]
 34%|████████████▍                        | 15.1M/45.0M [00:04<00:02, 12.2MB/s]
 42%|███████████████▌                     | 18.9M/45.0M [00:04<00:01, 15.5MB/s]
 53%|███████████████████▍                 | 23.7M/45.0M [00:04<00:01, 19.8MB/s]
 63%|███████████████████████▏             | 28.2M/45.0M [00:04<00:00, 22.3MB/s]
 75%|███████████████████████████▉         | 33.9M/45.0M [00:04<00:00, 26.1MB/s]
 89%|████████████████████████████████▉    | 40.1M/45.0M [00:04<00:00, 29.8MB/s]
  0%|                                              | 0.00/45.0M [00:00<?, ?B/s]
100%|██████████████████████████████████████| 45.0M/45.0M [00:00<00:00, 156GB/s]

  0%|                                              | 0.00/46.3M [00:00<?, ?B/s]
  0%|                                     | 8.19k/46.3M [00:00<15:00, 51.4kB/s]
  0%|                                      | 56.3k/46.3M [00:00<03:53, 198kB/s]
  0%|                                      | 96.3k/46.3M [00:00<03:29, 221kB/s]
  0%|▏                                      | 161k/46.3M [00:00<02:38, 292kB/s]
  0%|▏                                      | 209k/46.3M [00:00<02:36, 294kB/s]
  1%|▏                                      | 281k/46.3M [00:00<02:13, 346kB/s]
  1%|▎                                      | 352k/46.3M [00:01<02:01, 378kB/s]
  1%|▎                                      | 424k/46.3M [00:01<01:54, 399kB/s]
  1%|▍                                      | 488k/46.3M [00:01<01:54, 400kB/s]
  1%|▍                                      | 560k/46.3M [00:01<01:50, 414kB/s]
  1%|▌                                      | 633k/46.3M [00:01<01:47, 425kB/s]
  2%|▌                                      | 713k/46.3M [00:01<01:41, 447kB/s]
  2%|▋                                      | 776k/46.3M [00:02<01:45, 431kB/s]
  2%|▋                                      | 881k/46.3M [00:02<01:31, 497kB/s]
  2%|▊                                      | 977k/46.3M [00:02<01:25, 527kB/s]
  2%|▉                                     | 1.14M/46.3M [00:02<01:07, 667kB/s]
  3%|█                                     | 1.28M/46.3M [00:02<01:01, 734kB/s]
  3%|█▏                                    | 1.51M/46.3M [00:02<00:47, 947kB/s]
  4%|█▍                                   | 1.76M/46.3M [00:03<00:36, 1.21MB/s]
  4%|█▌                                   | 2.00M/46.3M [00:03<00:31, 1.41MB/s]
  5%|█▉                                   | 2.38M/46.3M [00:03<00:23, 1.89MB/s]
  6%|██                                   | 2.66M/46.3M [00:03<00:21, 1.99MB/s]
  7%|██▌                                  | 3.14M/46.3M [00:03<00:16, 2.57MB/s]
  8%|███                                  | 3.85M/46.3M [00:03<00:12, 3.51MB/s]
  9%|███▌                                 | 4.39M/46.3M [00:03<00:11, 3.81MB/s]
 11%|████                                 | 5.13M/46.3M [00:03<00:09, 4.49MB/s]
 14%|█████▎                               | 6.57M/46.3M [00:03<00:05, 6.66MB/s]
 18%|██████▌                              | 8.26M/46.3M [00:04<00:04, 8.87MB/s]
 21%|███████▉                             | 9.94M/46.3M [00:04<00:03, 10.4MB/s]
 25%|█████████▎                           | 11.6M/46.3M [00:04<00:03, 11.4MB/s]
 32%|███████████▉                         | 15.0M/46.3M [00:04<00:01, 16.2MB/s]
 42%|███████████████▌                     | 19.4M/46.3M [00:04<00:01, 20.3MB/s]
 53%|███████████████████▌                 | 24.5M/46.3M [00:04<00:00, 24.1MB/s]
 65%|████████████████████████▏            | 30.3M/46.3M [00:04<00:00, 27.7MB/s]
 79%|█████████████████████████████▍       | 36.8M/46.3M [00:05<00:00, 31.4MB/s]
 93%|██████████████████████████████████▌  | 43.3M/46.3M [00:05<00:00, 33.8MB/s]
  0%|                                              | 0.00/46.3M [00:00<?, ?B/s]
100%|██████████████████████████████████████| 46.3M/46.3M [00:00<00:00, 171GB/s]

  0%|                                              | 0.00/44.8M [00:00<?, ?B/s]
  0%|                                     | 8.19k/44.8M [00:00<14:28, 51.6kB/s]
  0%|                                      | 56.3k/44.8M [00:00<03:45, 198kB/s]
  0%|                                       | 121k/44.8M [00:00<02:33, 291kB/s]
  0%|▏                                      | 168k/44.8M [00:00<02:32, 292kB/s]
  1%|▏                                      | 249k/44.8M [00:00<02:00, 369kB/s]
  1%|▎                                      | 312k/44.8M [00:00<01:57, 378kB/s]
  1%|▎                                      | 417k/44.8M [00:01<01:35, 467kB/s]
  1%|▍                                      | 528k/44.8M [00:01<01:22, 540kB/s]
  1%|▌                                      | 665k/44.8M [00:01<01:09, 636kB/s]
  2%|▋                                      | 849k/44.8M [00:01<00:55, 794kB/s]
  2%|▊                                     | 1.01M/44.8M [00:01<00:51, 856kB/s]
  3%|█                                    | 1.23M/44.8M [00:01<00:42, 1.02MB/s]
  3%|█▏                                   | 1.50M/44.8M [00:02<00:35, 1.21MB/s]
  4%|█▍                                   | 1.73M/44.8M [00:02<00:33, 1.28MB/s]
  5%|█▊                                   | 2.13M/44.8M [00:02<00:25, 1.64MB/s]
  6%|██                                   | 2.54M/44.8M [00:02<00:21, 1.93MB/s]
  7%|██▌                                  | 3.06M/44.8M [00:02<00:17, 2.32MB/s]
  9%|███▏                                 | 3.81M/44.8M [00:02<00:13, 3.02MB/s]
 11%|███▉                                 | 4.73M/44.8M [00:03<00:10, 3.83MB/s]
 13%|████▊                                | 5.89M/44.8M [00:03<00:08, 4.85MB/s]
 17%|██████▏                              | 7.42M/44.8M [00:03<00:05, 6.26MB/s]
 21%|███████▊                             | 9.40M/44.8M [00:03<00:04, 8.08MB/s]
 27%|█████████▉                           | 12.0M/44.8M [00:03<00:03, 10.5MB/s]
 34%|████████████▋                        | 15.4M/44.8M [00:03<00:02, 13.7MB/s]
 44%|████████████████▍                    | 19.9M/44.8M [00:04<00:01, 18.1MB/s]
 56%|████████████████████▊                | 25.2M/44.8M [00:04<00:00, 25.3MB/s]
 65%|███████████████████████▉             | 29.0M/44.8M [00:04<00:00, 25.6MB/s]
 74%|███████████████████████████▍         | 33.3M/44.8M [00:04<00:00, 29.5MB/s]
 85%|███████████████████████████████▌     | 38.3M/44.8M [00:04<00:00, 34.6MB/s]
 94%|██████████████████████████████████▋  | 42.0M/44.8M [00:04<00:00, 32.6MB/s]
  0%|                                              | 0.00/44.8M [00:00<?, ?B/s]
100%|██████████████████████████████████████| 44.8M/44.8M [00:00<00:00, 129GB/s]

  0%|                                              | 0.00/44.8M [00:00<?, ?B/s]
  0%|                                      | 16.4k/44.8M [00:00<07:17, 102kB/s]
  0%|                                      | 64.5k/44.8M [00:00<03:24, 219kB/s]
  0%|                                       | 121k/44.8M [00:00<02:40, 279kB/s]
  0%|▏                                      | 209k/44.8M [00:00<01:55, 385kB/s]
  1%|▎                                      | 296k/44.8M [00:00<01:40, 441kB/s]
  1%|▎                                      | 417k/44.8M [00:00<01:21, 546kB/s]
  1%|▍                                      | 528k/44.8M [00:01<01:14, 594kB/s]
  2%|▌                                      | 673k/44.8M [00:01<01:03, 691kB/s]
  2%|▋                                      | 793k/44.8M [00:01<01:02, 707kB/s]
  2%|▊                                      | 992k/44.8M [00:01<00:50, 872kB/s]
  2%|▉                                     | 1.11M/44.8M [00:01<00:52, 833kB/s]
  3%|█▏                                   | 1.42M/44.8M [00:01<00:37, 1.17MB/s]
  4%|█▎                                   | 1.59M/44.8M [00:02<00:38, 1.13MB/s]
  5%|█▊                                   | 2.12M/44.8M [00:02<00:23, 1.78MB/s]
  6%|██▏                                  | 2.65M/44.8M [00:02<00:18, 2.23MB/s]
  8%|██▊                                  | 3.36M/44.8M [00:02<00:14, 2.89MB/s]
  9%|███▌                                 | 4.25M/44.8M [00:02<00:11, 3.68MB/s]
 12%|████▎                                | 5.25M/44.8M [00:02<00:08, 4.44MB/s]
 15%|█████▍                               | 6.58M/44.8M [00:03<00:06, 5.58MB/s]
 17%|██████▍                              | 7.80M/44.8M [00:03<00:05, 6.19MB/s]
 22%|████████▏                            | 9.85M/44.8M [00:03<00:04, 8.15MB/s]
 25%|█████████▎                           | 11.3M/44.8M [00:03<00:04, 8.37MB/s]
 33%|████████████                         | 14.6M/44.8M [00:03<00:02, 12.0MB/s]
 37%|█████████████▋                       | 16.5M/44.8M [00:03<00:02, 12.0MB/s]
 47%|█████████████████▍                   | 21.1M/44.8M [00:04<00:01, 16.9MB/s]
 55%|████████████████████▌                | 24.8M/44.8M [00:04<00:01, 18.8MB/s]
 70%|█████████████████████████▉           | 31.3M/44.8M [00:04<00:00, 25.1MB/s]
 82%|██████████████████████████████▏      | 36.5M/44.8M [00:04<00:00, 27.2MB/s]
 96%|███████████████████████████████████▌ | 43.0M/44.8M [00:04<00:00, 30.7MB/s]
  0%|                                              | 0.00/44.8M [00:00<?, ?B/s]
100%|██████████████████████████████████████| 44.8M/44.8M [00:00<00:00, 159GB/s]

Extracting the Time Vector#

Because we used return_epochs=True, we can read the time axis and sampling frequency directly from the last Epochs object rather than hard-coding dataset-specific values.

times = epochs.times
sfreq = epochs.info["sfreq"]
print(f"Sampling frequency: {sfreq} Hz, {len(times)} time points")
Sampling frequency: 250.0 Hz, 1001 time points

Statistical Significance#

We run a one-sample t-test against chance level (AUC = 0.5) at each time point. Time points with p < 0.05 (uncorrected) are flagged as significant.

_, p_values = ttest_1samp(all_scores, 0.5, axis=0)
sig_mask = p_values < 0.05

Plot 1 – Mean AUC Time Course with Significance#

We plot the group-average AUC score together with the standard error of the mean (SEM) across subjects. A horizontal dashed line at 0.5 indicates chance level. Time points that are significantly above chance are highlighted with an orange bar along the x-axis.

mean_scores = all_scores.mean(axis=0)
sem_scores = all_scores.std(axis=0) / np.sqrt(len(dataset.subject_list))

fig, ax = plt.subplots(figsize=(8, 4))
ax.plot(times, mean_scores, label="Mean AUC across subjects", color="steelblue")
ax.fill_between(
    times,
    mean_scores - sem_scores,
    mean_scores + sem_scores,
    alpha=0.3,
    color="steelblue",
    label="\u00b1SEM",
)
ax.axhline(0.5, linestyle="--", color="k", label="Chance level (AUC = 0.5)")
ax.axvline(times[0], linestyle=":", color="gray", label="MI onset")

# Mark significant time points with a bar at the bottom of the axes
ax.fill_between(
    times,
    0.0,
    0.03,
    where=sig_mask,
    color="tab:orange",
    alpha=0.7,
    label="p < 0.05 (uncorrected)",
    transform=ax.get_xaxis_transform(),
)

ax.set_xlabel("Time (s)")
ax.set_ylabel("AUC")
ax.set_title("Time-Resolved Decoding \u2013 Left vs. Right Motor Imagery\n(BNCI2014-001)")
ax.legend(loc="upper left", fontsize="small")
ax.set_xlim(times[0], times[-1])
ax.set_ylim(0.4, 1.0)
plt.tight_layout()
plt.show()
Time-Resolved Decoding – Left vs. Right Motor Imagery (BNCI2014-001)

Plot 2 – Per-Subject Heatmap#

A heatmap of AUC scores (subjects x time) gives a richer picture than the mean curve alone, revealing inter-subject variability and the temporal structure of discriminability for each participant.

fig, ax = plt.subplots(figsize=(8, 4))
im = ax.imshow(
    all_scores,
    aspect="auto",
    origin="lower",
    extent=[times[0], times[-1], 0.5, len(dataset.subject_list) + 0.5],
    cmap="RdBu_r",
    vmin=0.3,
    vmax=0.7,
)
ax.set_xlabel("Time (s)")
ax.set_ylabel("Subject")
ax.set_yticks(range(1, len(dataset.subject_list) + 1))
ax.set_title("Per-Subject Time-Resolved AUC\n(BNCI2014-001)")
ax.axvline(times[0], linestyle=":", color="k", linewidth=0.8)
ax.set_xlim(times[0], times[-1])
fig.colorbar(im, ax=ax, label="AUC")
plt.tight_layout()
plt.show()
Per-Subject Time-Resolved AUC (BNCI2014-001)

Total running time of the script: (7 minutes 21.695 seconds)

Estimated memory usage: 592 MB

Gallery generated by Sphinx-Gallery