ECG-Derived Respiration (EDR)

ECG-Derived Respiration (EDR)#

This example can be referenced by citing the package.

ECG-derived respiration (EDR) is the extraction of respiratory information from ECG and is a noninvasive method to monitor respiration activity under instances when respiratory signals are not recorded. In clinical settings, this presents convenience as it allows the monitoring of cardiac and respiratory signals simultaneously from a recorded ECG signal. This example shows how to use NeuroKit to perform EDR analysis.

# Load NeuroKit and other useful packages
import neurokit2 as nk
import numpy as np
import pandas as pd

Download ECG Data#

In this example, we will download a dataset containing an ECG signal sampled at 1000 Hz.

# Get data
ecg = nk.data('ecg_1000hz.csv')

# Visualize signal
nk.signal_plot(ecg) 
../../_images/b19a991122f389698201a07f90c32e8b165e20a37849c601e92aa4835ef0f8ca.png

Extraction of ECG Features#

Now you can extract the R peaks of the signal using ecg_peaks() and compute the heart period using ecg_rate().

Note: As the dataset has a frequency of 1000Hz, make sure the sampling_rate is also set to 1000Hz. It is critical that you specify the correct sampling rate of your signal throughout all the processing functions.

# Extract peaks
rpeaks, info = nk.ecg_peaks(ecg, sampling_rate=1000)

# Compute rate
ecg_rate = nk.ecg_rate(rpeaks, sampling_rate=1000, desired_length=len(ecg))

Analyse EDR#

Now that we have an array of the heart period, we can then input this into ecg_rsp() to extract the EDR.

edr = nk.ecg_rsp(ecg_rate, sampling_rate=1000)

# Visual comparison
nk.signal_plot(edr)
../../_images/43758a0b42def8631ac85a9383c8535cf2326183fdc075c0c4ad6c2f52df4b7c.png

The default method used is the one by Van Gent et al. (2019), but the function ecg_rsp() incorporates different methods to compute EDR. For a visual comparison of the different methods, we can create a dataframe of EDR columns each of which are produced by different methods, and then plot it, like so:

edr_df = pd.DataFrame({
    "Van Gent et al.": nk.ecg_rsp(ecg_rate, sampling_rate=1000),
    "Charlton et al." : nk.ecg_rsp(ecg_rate, sampling_rate=1000, method="charlton2016"),
    "Soni et al.": nk.ecg_rsp(ecg_rate, sampling_rate=1000, method="soni2019"),
    "Sarkar et al.": nk.ecg_rsp(ecg_rate, sampling_rate=1000, method="sarkar2015")
    })
nk.signal_plot(edr_df, subplots=True)
../../_images/00648a9fed48594252e27215a08bc0c39f2c5d0cb61df1e9504ad5f7aa060004.png