Git Product home page Git Product logo

yasa's Introduction


https://travis-ci.org/raphaelvallat/yasa.svg?branch=master https://ci.appveyor.com/api/projects/status/4ua0pwy62jhpd9mx?svg=true

YASA

YASA (Yet Another Spindle Algorithm) is a fast, robust, and data-agnostic sleep spindles & slow-waves detection algorithm written in Python 3.

The sleep spindles algorithm of YASA is largely inspired by the method described in:

The slow-waves detection algorithm is adapted from:

Installation

pip install --upgrade yasa

Dependencies

  • python>=3.5
  • numpy>=1.14
  • scipy>=1.1.0
  • pandas>=0.23,
  • mne>=0.17.0
  • numba>=0.39.0
  • scikit-learn>=0.20

Note

Several functions of YASA are written using Numba, a just-in-time compiler for Python. This allows to greatly speed up the computation time (typically a few seconds for a full night recording).

What are the prerequisites for using YASA?

In order to use YASA, you need:

  • Some basic knowledge of Python and especially the NumPy, Pandas and MNE libraries.
  • A Python editor: YASA works best with Jupyter Lab, a web-based interactive user interface.
  • Some EEG data, either already loaded into a NumPy array, or loaded as a raw MNE object (for instance, using the mne.io.read_raw_edf function for EDF file.)
  • Optionally, a sleep staging vector (= hypnogram) to run the detections on specific sleep stages. Note that YASA requires that the data and hypnogram have the same sampling frequency.

Examples

Notebooks

Spindles

  1. notebooks/01_spindles_detection.ipynb: single-channel spindles detection and step-by-step description of the algorithm.
  2. notebooks/02_spindles_detection_multi.ipynb: multi-channel spindles detection using MNE Raw objects.
  3. notebooks/03_slow_fast_spindles.ipynb: slow and fast spindles differentiation.
  4. notebooks/04_detection_NREM_only.ipynb: detection on NREM sleep only.
  5. notebooks/05_run_visbrain.py: interactive display with the Visbrain graphical user interface.

Slow-waves

  1. notebooks/06_sw_detection.ipynb: single-channel slow-waves detection and step-by-step description of the algorithm.
  2. notebooks/07_sw_detection_multi.ipynb: multi-channel slow-waves detection using MNE Raw objects.

Typical uses

import yasa

# SLEEP SPINDLES
# ==============
# 1 - Single-channel spindles detection
yasa.spindles_detect(data, sf)

# 2 - Single-channel full command (shows all the default implicit parameters)
yasa.spindles_detect(data, sf, hypno=None, include=(1, 2, 3),
                     freq_sp=(12, 15), duration=(0.5, 2), freq_broad=(1, 30),
                     min_distance=500, downsample=True,
                     thresh={'rel_pow': 0.2, 'corr': 0.65, 'rms': 1.5},
                     remove_outliers=False)

# 3 - Multi-channels detection on NREM sleep only (requires an hypnogram)
yasa.spindles_detect_multi(data, sf, ch_names, hypno=hypno)

# 4 - Multi-channels detection on N2 sleep only with automatic outlier rejection
yasa.spindles_detect_multi(data, sf, ch_names, hypno=hypno, include=(2), remove_outliers=True)

# SLOW-WAVES
# ==========
# 1 - Single-channel slow-wave detection
yasa.sw_detect(data, sf)

# 2 - Single-channel full command (shows all the default implicit parameters)
yasa.sw_detect(data, sf, hypno=hypno, include=(2, 3), freq_sw=(0.3, 3.5),
               dur_neg=(0.3, 1.5), dur_pos=(0.1, 1), amp_neg=(40, 300),
               amp_pos=(10, 150), amp_ptp=(75, 400), downsample=True,
               remove_outliers=False)

# 3 - Multi-channel slow-waves detection on N2 + N3 sleep only (requires an hypnogram)
yasa.sw_detect_multi(data, sf, ch_names, hypno=hypno)

The result of the detection is a pandas DataFrame...

Start End Duration Amplitude RMS AbsPower RelPower Frequency Oscillations Symmetry
3.32 4.06 0.74 81.80 19.65 2.72 0.49 12.85 10 0.67
13.26 13.85 0.59 99.30 24.49 2.82 0.24 12.15 7 0.25

...that can be easily used to plot the detected spindles / slow-waves.

notebooks/detection.png

Interactive visualization with Visbrain

YASA can also be used in combination with the Sleep module of the Visbrain visualization package. The result of the detection can then easily be displayed and checked in an interactive graphical user interface. To do so, load Visbrain using the following python file (make sure to update 'PATH/TO/EEGFILE').

from visbrain.gui import Sleep
from yasa import spindles_detect

sl = Sleep(data='PATH/TO/EEGFILE')

def fcn_spindle(data, sf, time, hypno):
    """Replace Visbrain built-in spindles detection by YASA algorithm.
    See http://visbrain.org/sleep.html#use-your-own-detections-in-sleep
    """
    # Apply on the full recording...
    # sp = spindles_detect(data, sf)
    # ...or on NREM sleep only
    sp = spindles_detect(data, sf, hypno=hypno)
    return (sp[['Start', 'End']].values * sf).astype(int)

sl.replace_detections('spindle', fcn_spindle)
sl.show()

Then navigate to the Detection tab and click on Apply to run the YASA algorithm on the specified channel.

images/visbrain.PNG

Outlier rejection

YASA incorporates an optional post-processing step to identify and remove pseudo (fake) spindles / slow-waves. The method is based on a machine-learning algorithm (the Isolation Forest, implemented in the scikit-learn package), which uses the spindles parameters (e.g. amplitude, duration, frequency, etc) as input features to identify aberrant spindles / slow-waves.

To activate this post-processing step, simply use:

import yasa
yasa.spindles_detect(data, sf, remove_outliers=True)  # Spindles
yasa.sw_detect(data, sf, remove_outliers=True)        # Slow-waves

API

Check out the API documentation at html/main.html.

Development

YASA was created and is maintained by Raphael Vallat. Contributions are more than welcome so feel free to contact me, open an issue or submit a pull request!

To see the code or report a bug, please visit the GitHub repository.

Note that this program is provided with NO WARRANTY OF ANY KIND.

Citation

To cite YASA, please use the Zenodo DOI:

yasa's People

Contributors

raphaelvallat avatar

Stargazers

你又皮皮林 avatar

Watchers

James Cloos avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.