ВИКОРИСТАННЯ БІБЛІОТЕКИ NEUROKIT2 ДЛЯ ВИЗНАЧЕННЯ АНОМАЛЬНИХ ДІЛЯНОК ЕКГ - Scientific conference

Congratulation from Internet Conference!

Hello

Рік заснування видання - 2011

ВИКОРИСТАННЯ БІБЛІОТЕКИ NEUROKIT2 ДЛЯ ВИЗНАЧЕННЯ АНОМАЛЬНИХ ДІЛЯНОК ЕКГ

08.10.2023 20:25

[1. Information systems and technologies]

Author: Антосяк Павло Павлович, кандидат фізико-математичних наук, Державний вищий навчальний заклад "Ужгородський національний університет", м.Ужгород; Самусь Василь Михайлович, аспірант, Державний вищий навчальний заклад "Ужгородський національний університет", м.Ужгород; Самусь Євгенія Іванівна, старший викладач, Державний вищий навчальний заклад "Ужгородський національний університет", м.Ужгород


ORCID: 0000-0001-7131-1795 Павло Антосяк

ORCID: 0000-0002-1682-689X Vasyl Samus

ORCID: 0009-0003-9601-289X Yevheniia Samus 

Аналіз кардіограм (ECG) є досить поширеною задачею, тому крім спеціалізованих програмних комплексів є значна кількість відкритих бібліотек. Спеціалізовані програмні комплекси мають ряд обмежень – загалом досить дорогі, обмежені набором включених функцій, мають повільний темп оновлень, і не є «відкритим кодом». Тому перевага надається програмному забезпеченню (бібліотекам) з відкритим кодом. Більшість таких бібліотек базуються на Python, хоча є і пакети, які використовують Matlab, R або Julia.

Однією із найбільш повнофункціональних бібліотек є NeuroKit2. NeuroKit2 — це зручний пакет, що забезпечує легкий доступ до передових процедур обробки біосигналів. Дослідники та клініцисти, які не мають глибоких знань у програмуванні чи обробці біомедичних сигналів, можуть аналізувати фізіологічні дані лише за допомогою декількох рядків коду . 

Безпосередня обробка сигналу починається з очистки та перевірки якості: 

ecg_clean = nk.ecg_clean(ecg_raw, sampling_rate=SAMPLING_RATE)

Доступні алгоритми очистки: biosppy, pantompkins1985, hamilton2002, elgendi2010, engzeemod2012

quality = nk.ecg_quality(ecg_clean, sampling_rate=SAMPLING_RATE)

Очищений сигнал використовуємо для знаходження R зубців і частоти серцевих скорочень

peaks, r_peaks = nk.ecg_peaks(ecg_clean,sampling_rate=SAMPLING_RATE)

ecg_rate = nk.ecg_rate(r_peaks, sampling_rate=SAMPLING_RATE)

r_peaks_arr = r_peaks.get('ECG_R_Peaks')

Для знаходження R-зубців можна використовувати різні методи: pantompkins1985, nabian2018, gamboa2008, zong2003, hamilton2002, christov2004, engzeemod2012, elgendi2010, kalidas2017, martinez2003, rodrigues2021, promac.

На основі цих даних створюємо об’єкт з агрегованими характеристиками частоти серцевих скорочень. Для знаходження ектопічних ударів потрібно використовувати матрицю хвиль – результат ecg_delineate. 

ignalsw, waves = nk.ecg_delineate(ecg_raw, r_peaks, sampling_rate=SAMPLING_RATE, method="dwt", show=False, show_type='all')

За замовчуванням функція повертає матрицю як список. Для подальшого аналізу корисно перетворити його в таблицю DataFrame Pandas. 

waves = pd.DataFrame(waves)

Всі подальші операції будемо застосовувати до стовпців як векторів.

Спочатку додамо R зубці, як окремий стовпець.

waves['ECG_R_Peaks'] = r_peaks.get('ECG_R_Peaks')

Далі знайдемо RR інтервали в точках та мілісекундах

waves['ECG_RR'] = waves['ECG_R_Peaks'].diff()

waves['ECG_RR_ms'] = waves['ECG_RR'] / SAMPLING_RATE*1000

Тепер використовуємо всі переваги Pandas. Це не тільки короткий та інтуїтивний запис, а й надзвичайно висока швидкість обчислень. 

Для аналізу ектопічних ударів спочатку знайдемо удари, які виходять за межі норми

waves['ECG_HR'] = 60 * SAMPLING_RATE / waves['ECG_RR']

waves['ECG_60'] = waves['ECG_HR'] < 60

waves['ECG_100'] = waves['ECG_HR'] > 100

Далі знаходимо самі удари

waves['ECG_QRS'] = waves['ECG_R_Offsets'] - waves['ECG_R_Onsets']

waves['ECG_QS'] = waves['ECG_S_Peaks'] - waves['ECG_Q_Peaks']

waves['ECG_V'] = waves['ECG_100'] & (waves['ECG_QRS'] > 16)

waves['ECG_CV'] = waves['ECG_P_Peaks'].isnull() & waves['ECG_100'] & (waves['ECG_QRS'] <= 16)

waves['AFIB'] = waves['ECG_100'] & (waves['ECG_P_Peaks'] > 0) 

Таким чином отримаємо вектор з елементами типу Boolean. Подальші операції проводяться безпосередньо з цими векторами. І якщо кількість ектопічних ударів визначаються просто: 'total beats': int(waves['ECG_CV'].sum(), то для бігемінії, трігемінії та інших параметрів потрібно використовувати власні алгоритми. 

Таким чином за допомогою бібліотеки Neurokit2 та Pandas можна будувати ефективні та точні моделі для пошуку ектопічних серцевих ударів. 

Література

1.The Python Toolbox for Neurophysiological Signal Processing. Електронний ресурс – Режим доступу : https://neurokit2.readthedocs.io/en/latest/resources/recording.html

2.Analysing a Noisy ECG Signal. Електронний ресурс – Режим доступу: https://github.com/paulvangentcom/heartrate_analysis_python/blob/master/examples/5_noisy_ECG/Analysing_Noisy_ECG.ipynb

3.Pan, J., & Tompkins, W. J. (1985). A real-time QRS detection algorithm. IEEE transactions on biomedical engineering, (3), 230-236. Електронний ресурс – Режим доступу :  https://github.com/berndporr/py-ecg-detectors/

Creative Commons Attribution Ця робота ліцензується відповідно до Creative Commons Attribution 4.0 International License
допомога Знайшли помилку? Виділіть помилковий текст мишкою і натисніть Ctrl + Enter
Сonferences

Conference 2024

Conference 2023

Conference 2022

Conference 2021



Міжнародна інтернет-конференція з економіки, інформаційних систем і технологій, психології та педагогіки

Наукова спільнота - інтернет конференції

:: LEX-LINE :: Юридична лінія

Інформаційне суспільство: технологічні, економічні та технічні аспекти становлення