全身麻酔中の脳波スペクトル解析2:pythonによる応用編1-深い麻酔状態

●Spectral Analysis 2
セボフルラン全身麻酔中の脳波のスペクトル解析
・実際にセボフルラン全身麻酔中にEEG Analyzerを用いて、BISモニタから取得したデジタル脳波データファイルeeg_bis.tsvを用いて、Pythonによるスペクトル解析を実践する。窓関数の影響、マルチテーパー法の適用、そしてスペクトログラムへ発展させる。

データファイル:eeg_bis_10_20_2.tsv

Jupyter Notebook: spectral_analysis_1.ipynb

深い麻酔の状態の脳波分析

・EEG Analyzerを用いて、BISモニタから取得したデジタル脳波データファイルeeg_bis_10_20_2.tsvから脳波データを、全部PandasのDataFrameであるdf_tsvに取り込ませる。

・取り込んだデータの先頭5件を表示

Ch Time ch[0] ch[1] ch[2] ch[3] ch[4] ch[5] ch[6] ch[7] ch[8] ch[9] ch[10] ch[11] ch[12] ch[13] ch[14] ch[15]
0 ch1: 09:18:52 0.00 0.00 0.00 0.00 0.00 0.0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.0
1 ch1: 09:18:52 0.00 0.00 0.00 0.00 0.00 0.0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.0
2 ch1: 09:18:52 27.35 26.90 27.00 23.05 16.15 9.7 6.35 8.30 13.30 24.65 37.40 41.55 33.15 15.40 -9.80 -21.0
3 ch1: 09:18:52 -5.30 22.50 40.80 42.45 30.45 18.0 11.60 5.65 -0.95 -3.85 0.25 12.20 28.35 40.05 43.20 31.7
4 ch1: 09:18:52 12.60 5.15 9.65 13.10 14.80 17.7 21.80 27.55 29.25 23.85 15.65 9.30 3.80 5.25 17.85 31.4
・取り込んだデータのラスト5件を表示

Ch Time ch[0] ch[1] ch[2] ch[3] ch[4] ch[5] ch[6] ch[7] ch[8] ch[9] ch[10] ch[11] ch[12] ch[13] ch[14] ch[15]
109607 ch1: 13:13:31 5.80 5.90 5.75 5.65 5.80 5.90 6.15 6.20 5.85 5.55 5.60 5.70 5.50 5.55 5.65 5.70
109608 ch1: 13:13:31 5.80 5.85 5.85 6.00 5.75 5.65 5.80 5.65 5.70 6.15 6.10 5.85 5.75 5.75 5.90 6.10
109609 ch1: 13:13:31 5.70 5.60 5.65 5.65 5.60 5.60 5.65 5.85 5.65 5.80 6.00 5.70 5.50 5.65 5.55 5.75
109610 ch1: 13:13:31 5.90 5.85 5.90 5.95 6.00 6.00 5.90 6.00 5.95 5.70 5.85 6.10 5.75 5.70 5.95 6.10
109611 ch1: 13:13:31 5.85 5.95 6.15 6.05 6.05 6.20 6.00 5.85 5.85 5.80 5.80 6.05 5.80 5.75 5.85 5.85
・PandasのDataFrameであるdf_eegを新たに作成し、コラム名”Time”と”eeg”を設定する。

・df_tsv(109611行)のうち、深いセボフルラン麻酔状態にある部分の電圧?Vデータを1024行をdf_eegに写す。

・df_eegに取り込んだ1024行x16=16383件の?Vデータを確認表示する。128秒分。

Time eeg
0 12:10:08 21.05
1 12:10:08 17.45
2 12:10:08 14.20
3 12:10:08 7.45
4 12:10:08 -0.25
5 12:10:08 -3.45
6 12:10:08 2.15
7 12:10:08 14.35
8 12:10:08 23.45
9 12:10:08 25.25
10 12:10:08 21.95
11 12:10:08 14.55
12 12:10:08 6.30
13 12:10:08 2.30
14 12:10:08 4.35
15 12:10:08 13.65
16 12:10:08 23.70
17 12:10:08 23.90
18 12:10:08 16.65
19 12:10:08 11.50
20 12:10:08 9.45
21 12:10:08 10.75
22 12:10:08 17.40
23 12:10:08 19.45
24 12:10:08 9.45
25 12:10:08 0.45
26 12:10:08 2.90
27 12:10:08 12.00
28 12:10:08 19.20
29 12:10:08 21.95
… … …
16354 12:12:21 11.25
16355 12:12:21 8.45
16356 12:12:21 0.85
16357 12:12:21 -9.25
16358 12:12:21 -24.45
16359 12:12:21 -41.90
16360 12:12:21 -59.45
16361 12:12:21 -75.10
16362 12:12:21 -78.40
16363 12:12:21 -67.50
16364 12:12:21 -50.40
16365 12:12:21 -34.15
16366 12:12:21 -23.95
16367 12:12:21 -18.80
16368 12:12:21 -14.55
16369 12:12:21 -11.65
16370 12:12:21 -13.90
16371 12:12:21 -30.20
16372 12:12:21 -46.35
16373 12:12:21 -34.35
16374 12:12:21 -2.85
16375 12:12:21 21.90
16376 12:12:21 36.65
16377 12:12:21 39.30
16378 12:12:21 31.70
16379 12:12:21 21.85
16380 12:12:21 11.85
16381 12:12:21 9.00
16382 12:12:21 14.05
16383 12:12:21 10.60
16384 rows × 2 columns
・df_eegに取り込んだデータをcsvファイルとして保存しておく。

・df_eegの時間と?Vデータをそれぞれ新たなPython配列Timeとeegに写す。

・配列eegに取り込んだデータをplotで表示させる。

データ前処理
・eegの平均値と標準偏差を算定。

Out: 0

・外れ値の除去:平均値から標準偏差の3倍をはみ出るデータをNoneに変更する。

・外れ値を除去したあと、再度null(NA)データ数をカウントする。

Out: 152

・df_eegのコピーを作成、コピーに対してnull(NA値)を前後の値でスプライン補完する。

・df_eegのコピーのnull(NA)データ数をカウントする。

Out: 0
・外れ値を前後のデータでスプライン補完修正したファイルをcsv保存

・eegデータを配列eeg_ipへコピーする。

・eegのデータをplotして表示。

・eegのデータから、512件(4秒, eeg_512)と、8192件(64秒, eeg_8192)を取り出す。

eeg_512をグラフ表示


・eeg_512の1秒分128件を表示


・eeg_8192のデータをグラフ表示


・FFT関数のパラメータをセット。ここではサンプリング周波数128とする。

・デシベル変換式を関数定義する

Out: (64.0, 256.0)

・Scipyのfft()関数でeeg_512(4秒分)データをFFT演算する。

・単純なFFTでのパワースペクトルを求める。


・デシベル変換する

・単純なFFT(ピリオドグラム)によるSPDをデジベル変換表示する。


・ScipyのSignalモジュールを利用してHann窓を作成する。

Out: 2.0039138943248536
・eeg_512にHann窓を適応して、FFT演算を行う。

・Hann窓関数を適応したピリオドグラムによるPSDを表示する。


・デシベル変換

・Hann窓関数を適応したピリオドグラムによるデシベルPSDを表示する。


・単純なピリオドグラムとHann窓の適応とのPSDを比較する。


・Hann窓、Hamming窓、Blackman窓を作成する。

・Blackman窓関数をアプライしたPSDをHann窓と比較するグラフ表示する。

脳波複数解析セグメントのパワースペクトルの実践
・窓関数の選択ができるようにする。Hann窓を選択する。解析データウィンドウは512で、ウインドウ間は50%オーバーラップとする。

Hanningを選択
・脳波記録を解析セグメントごとにスプリットして解析できるようにする関数data_split()を定義する。

・FFT関数を定義する。

・FFT結果をプロットする関数plot_TTFを定義する。

・スプリットされた脳波を表示させる関数plot_split_eeg()を定義する。

・スプリットされた脳波を全部まとめて表示させる関数plot_FFT_all()を定義する。

・データを三次元配置する関数set_3D_dataを定義する。

・4秒間512データの時間軸配列を設定する。

・eeg_8192(64秒分)のデータについて、SPD算定の処理を行う。ここでは31セグメントに分割される。

フレームサンプル数: 512
オーバーラップサンプル数: 256
総フレーム数: 31
・スプリットされた脳波データを表示する。


・全体で平均化されたアンプリチュードとスペクトルを表示する。


・セグメントに分けて解析されたSPDを同じグラフ上にまとめて表示させる。

スペクトログラムの構築

時間配列2次元データ数: 31
時間配列1次元データ数: 513
周波数配列2次元データ数: 31
周波数配列1次元データ数: 257
周波数パワー配列2次元データ数: 31
周波数パワー配列2次元データ数: 257

・単純なピリオドグラムからのSPDで描くスペクトログラム構築

・セグメントに分けて解析されたSPDを同じグラフ上にまとめて表示させる。

・より高度なスペクトログラム構築のため、libtfrライブラリ、librosaライブラリ等を導入する

・libtfrを用いたスペクトログラム算定のためのパラメータ定義を行う。

(257, 32) 231388.4331020175 0.0
(257, 32) 0.0 -100.0
(257, 32) 0.0 -100.0
・libtfrのtfr_spec()関数を用いた周波数時間再割当て法によるSPDによるスペクトログラム構築

・はじめのデータセグメントのPSDを表示させる。

・libtfrのマルチテーパ法mfft_dpss()を用いて、スペクトログラムを作成する。

(257, 121, 5) (290.40539223527196+0j) (-284.31933845774296+21.55352222591088j)
(257, 121) 50412.716942419465 0.002685783319892681


・マルチテーパ法による第一セグメントのSPDを表示させる。


・第一セグメントのPSDについて、libtfrの2つの方法(時間再割当て法、マルチテーパ法)の2つを比較する。

マルチテーパ法の分解
・マルチテーパ法ライブラリmtspecを導入

・Slepianシークエンス5つをを描画。


・第1Slepianテーパ関数処理

28.843575280051258

・第2Slepianテーパ関数処理


・第3Slepianテーパ関数


・第4Slepianテーパ関数処理


・第5Slepianテーパ関数処理


・5つのテーパ処理からFFTされた結果を平均化して、PSD表示


・マルチテーパ法によるPSDと、ピリオドグラムによるPSDを比較表示させる。