ВИКОРИСТАННЯ БІБЛІОТЕКИ NEUROKIT2 ДЛЯ ВИЗНАЧЕННЯ АНОМАЛЬНИХ ДІЛЯНОК ЕКГ
08.10.2023 20:25
[1. Information systems and technologies]
Author: Антосяк Павло Павлович, кандидат фізико-математичних наук, Державний вищий навчальний заклад "Ужгородський національний університет", м.Ужгород;
Самусь Василь Михайлович, аспірант, Державний вищий навчальний заклад "Ужгородський національний університет", м.Ужгород;
Самусь Євгенія Іванівна, старший викладач, Державний вищий навчальний заклад "Ужгородський національний університет", м.Ужгород
Аналіз кардіограм (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/