心電図は体表面につけた電極間に誘起する電圧変動差を記録しているものです。心臓の筋収縮に伴って発生する電力が体表面に到達して、心臓を挟む2点間と参照点間の電圧差で計測されています。測定方法として臨床検査では複数の電極間の電位差から心臓の収縮に関する情報を取得しています。心電図にはR波と名付けられたシャープなピークがあり、このピークを目印に心拍間隔を解析します。心拍変動にはいくつかの要因がありますが、変動に起因する早い制御とそれよりもゆっくりした制御があります。これらは交換神経や副交感神経の働きと関連しています。リラックスした状態を知る手がかりとして心拍変動の解析が利用されることがあります。ここではこれまで学修してきた文法を使ってR波のピークを捉えて、R波間隔として心拍間隔を捉えます。そしてRR間隔の時間変動関数をフーリエ変換して周波数スペクトルから心拍変動を解析するプログラムについて解説します。
目次
- 代表的な心電図波形とその特徴
- 心拍動の制御と心拍変動解析(交感神経と副交感神経)
- 利用モジュールのインポート
- 初期パラメータの設定と作成
- データの読み込み
- データを補間して時間分解能を向上
- 心電図の単純化(ベースの下をカットする)
- R波間隔の積算時間の計算
- RR間隔関数を等間隔時間軸で再サンプリング
- 心電図・RR間隔などのプロット
1. 代表的な心電図波形とその特徴
![](https://tankoala2.sakura.ne.jp/medinfo_edu/wp-content/uploads/2022/12/ecg_analytics_07_typical-1.png)
また、で得られる波形は以下のようにいくつかのピークがあります。特にR波のピークはシャープな信号で解析し易いためこのR波のピークの間隔を利用して心拍変動を解析する方法が一般的です。
2. 心拍動の制御と心拍変動解析(交感神経と副交感神経)
心拍数は内因性(洞房結節にあるペースメーカー細胞の発火)によって制御され、加齢によって低下します。また、心拍数 (HR) は吸気中に増加し、呼気中に減少します。このほかに延髄の心臓血管中枢が自律神経を介し、以下の交感神経と副交感神経の要因で制御されています。2つの要因の周期の違いは心拍変動周期の違いとして観測できます。心拍変動(R-R波の時間間隔)をフーリエ変換して、変動に含まれる低周波成分(交感神経制御関連)と高周波成分(副交感神経関連)を調べることができます。
①交感神経末端からのノルアドレナリン(ノルエピネフリン)[心拍数の上昇]のβ1受容体(ペースメーカー細胞上)結合
②副交感神経(心臓迷走神経)活動に連動して放出されたアセチルコリンがムスカリン受容体(ペースメーカー細胞にある)の結合[心拍数の低下]
①ノルアドレナリン:周期6秒から7秒(0.15Hzに相当)
・β1レセプターと結合→カルシウムチャンネルを開く→ペースメーカー細胞の興奮
・α2レセプターと結合→カルシウムチャンネルを開きにくくする→抑制 (副交感神経末梢のα2と結合してアセチルコリンの放出も抑制)
②アセチルコリン:早い応答(3-4秒周期(0.25〜0.3Hz)の呼吸変動で影響される:呼吸性j向性不整脈 respiratory sinus arrhythmia (RSA))
・アセチルコリン受容体(心臓の洞房結節、房室結節)に結合して抑制
参考URL: ストレスと自律神経の科学(http://hclab.sakura.ne.jp/):心拍変動の機序の詳細な解説サイト
参考URL; 心拍変動と自律神経機能: 大まかな心拍変動のまとめサイト
※呼吸性j向性不整脈 respiratory sinus arrhythmia (RSA)は心拍数は吸気に 増加して,呼気に減少する。
参考論文: 早野 順一郎, 他, 心拍のゆらぎ: そのメカニズムと意義, ,人 工 臓 器25巻5号1996年
参考文献: Yasuma F, Hayano J, Respiratory sinus arrhythmia: why does the heartbeat synchronize with respiratory rhythm?, Chest, 2004, 125(2):683-90, DOI: 10.1378/胸部.125.2.683
目次へ
3. 利用するモジュールのインポート
データを格納、計算、プロットに関連するモジュールをインポートします。モジュールは”as”でニックネームで呼ぶことができます(下図参照)。
![](https://tankoala2.sakura.ne.jp/medinfo_edu/wp-content/uploads/2022/12/code01_import_module.png)
![](https://tankoala2.sakura.ne.jp/medinfo_edu/wp-content/uploads/2022/12/code02_nickne_module.png)
目次へ
4. 初期パラメータの設定と作成
まずはパラメータを設定します。ここは私が勝手に決めた初期パラメータです。他の決め方もあると思います。処理を理解した上で工夫してください。2番目の解析区間はデータ数未満なるように決める必要があります。エラー処理はしていません。
![](https://tankoala2.sakura.ne.jp/medinfo_edu/wp-content/uploads/2023/01/pythonRRFT02_setting_parameters-1024x432.png)
設定した初期値を利用してプログラム内で利用するパラメータを定義します。
![](https://tankoala2.sakura.ne.jp/medinfo_edu/wp-content/uploads/2023/01/pythonRRFT03_constants-1024x224.png)
目次へ
5. データの読み込み
Apple watchで記録されたtextデータをnumpyのloadtxtコマンドで読み込みます。データの数などをカウントしておきます。
![](https://tankoala2.sakura.ne.jp/medinfo_edu/wp-content/uploads/2023/01/pythonRRFT04_loading_data-1024x286.png)
目次へ
6. データを補間して時間分解能を向上
読み込んだデータを単純補間します。補間にはinterpolate.inerpold関数を利用します。補間関数として2次関数の”quadrtic”を用いて、補間処理関数x_newを作成します。補完されたデータは”data_intp”として定義しています。補間のための1ms単位の新しい時間軸をnp.arangeで作成しています。
![](https://tankoala2.sakura.ne.jp/medinfo_edu/wp-content/uploads/2023/01/pythonRRFT05_interpolate.png)
データ補間は、スプライン関数を用いて滑らかな曲線を作り、その上に新しく定義した等間隔な軸でy値を撮り直します。
![](https://tankoala2.sakura.ne.jp/medinfo_edu/wp-content/uploads/2023/01/pythonRRFT06_interpolate_fig.png)
補間によりデータのサンプリング分解能を上げることができます。補間前に比べてより細かくサンプリングできているのがわかります(2.5msは十分なサンプリング間隔かもしれませんが)。
![](https://tankoala2.sakura.ne.jp/medinfo_edu/wp-content/uploads/2023/01/pythonRRFT07_interpolate_wave.png)
目次へ
7. 心電図の単純化(ベースの下をカットする)
データの下の部分をカットするために、データの平均値に定数を掛けて引いて、負をゼロとして省きます。本来この処理の前に低周波成分をカットするローパスフィルタを行い、余分なベースラインのアップダウンを修正する必要があります。
![](https://tankoala2.sakura.ne.jp/medinfo_edu/wp-content/uploads/2023/01/pythonRRFT08_cut_wave.png)
目次へ
8. R波間隔の積算時間の計算
R波のピークをpeaks関数で選び出し、RR波間隔の時間rri_t(RR間隔時間)を求め、そのrri_tがRRt_maxを超えるか、RRt_minを下回る不適切なデータを省きます。
![](https://tankoala2.sakura.ne.jp/medinfo_edu/wp-content/uploads/2023/01/pythonRRFT09_RR_intervals.png)
その上でrri_tの積算時間rri_ttを計算します。これは単にrri_tを次々と足して行くだけです。
![](https://tankoala2.sakura.ne.jp/medinfo_edu/wp-content/uploads/2023/01/pythonRRFT10_RR_interval_time_series.png)
次にrri_ttを秒単位に変更します。これも補間後データはデータの間隔をミリ秒にしていたので0.001を掛けるだけです。
![](https://tankoala2.sakura.ne.jp/medinfo_edu/wp-content/uploads/2023/01/pythonRRFT11_RRtime_to_miriseconds.png)
目次へ
9. RR間隔関数を等間隔時間軸で再サンプリン
rri_ttは心電図のR波の間隔でしたので横軸が変動しています。これでは解析ができません。等間隔なスケールに直すにはまた、補間関数e”f2″を利用して、等間隔の時間軸”t_new”で再サンプリングします。
![](https://tankoala2.sakura.ne.jp/medinfo_edu/wp-content/uploads/2023/01/pythonRRFT12_RRtime_resampling.png)
目次へ
10. 心電図・RR間隔などのプロット
読み込んだ心電図データのプロット
![](https://tankoala2.sakura.ne.jp/medinfo_edu/wp-content/uploads/2023/01/pythonRRFT13_ECG_plot-1024x271.png)
補間して下をカットした心電図のプロット
![](https://tankoala2.sakura.ne.jp/medinfo_edu/wp-content/uploads/2023/02/pythonRRFT14_cutting_ECGplot-1024x206.png)
補間して下をカットした心電図のプロット
![](https://tankoala2.sakura.ne.jp/medinfo_edu/wp-content/uploads/2023/01/pythonRRFT15_RRtime_curve-1024x267.png)
RR間隔変動波形のフーリエ変換
![](https://tankoala2.sakura.ne.jp/medinfo_edu/wp-content/uploads/2023/01/pythonRRFT16_FFT.png)
RR間隔変動の周波数成分プロット
![](https://tankoala2.sakura.ne.jp/medinfo_edu/wp-content/uploads/2023/01/pythonRRFT17_RR_frequency_plot-1024x265.png)