# Outline for Online MTG11 - [第1回オンラインミーティング](https://hackmd.io/zIUjG3M2QsOjzwtQYcQx4w) - [第2回オンラインミーティング](https://hackmd.io/rA8WAd7wSLG3Xnz8lLomNw) - [第3回オンラインミーティング](https://hackmd.io/eJIII3crSMCQRp8DXnPQ_w) - [第4回オンラインミーティング](https://hackmd.io/aDe5ZzHSSxO2VR2JlHHuWw) - [第5回オンラインミーティング](https://hackmd.io/nzYon4gXShOabCJkp5-OqA) - [第6回ミーティング](https://hackmd.io/ltk7OenhSKmRV2U5lN20Sg) - [第7回オンラインミーティング](https://hackmd.io/qdf9dQ1EQjKxknpvNyP4LQ) - [第8回オンラインミーティング](https://hackmd.io/o9YHOUqBTLKAPtC0y53wow) - [第9回オンラインミーティング](https://hackmd.io/KvasieOPR2exnD_7f-_dvQ) - [第10回オンラインミーティング](https://hackmd.io/xGQwEraOSFiNyOdKI9L8tQ) --- - [タスクのチートシート](https://hackmd.io/4cWle4mzRe6b_Ak4botXEA) - [タスクのリポジトリ](https://github.com/kusumotolab/h-azuma_experiment-tasks) - [実験結果のリポジトリ](https://github.com/h-azuma/EEG-analysis) --- - [実験ツール](https://sdl.ist.osaka-u.ac.jp/~h-azuma/_redirect.html?uid=0&next=-2) ## 今回のミーティングの目的 - 分析手法の確認 - 結果の報告 - 今後の方針について ## 前回からの変更点 - 今週は分析スクリプトのデバッグと個人のデータ分析を主に行った. - FFT回りの認識がおかしかった可能性がある - 他の部分のバグは一通り確かめたが特に問題のありそうな場所はなかった - ## 分析手法の確認 ![](https://i.imgur.com/yo3pJAR.png) - [コード](https://github.com/h-azuma/EEG-analysis/blob/master/script/2_1-output-average-power.R) - 生データ ![](https://i.imgur.com/4KEmuJm.png) ### ①フィルタリング - 15~19行目,41行目が対象 - 最初dplRの`pass.filt`を使用していたが,引数`W`の意味が分からなかったため,`signal`ライブラリの`filtfilt`を使用 - [参考ページ](https://qiita.com/hitomecha/items/80d6e3309aa33941cb5e) - [pass.filtの実装](https://github.com/cran/dplR/blob/a236668d10d03bc99d81a1b1d6a7d9ee10af08ff/R/pass.filt.R) ```lang= FS <- 256 ## サンプリング周波数:今回は1/256秒の時間でデータを取っていることから256 fn <- FS / 2 ## ナイキスト周波数 fc <- 45 ## ローパスフィルタの閾値:45hz fc_norm <- fc / fn filn <- 4 ## フィルタの次数(意味は分からなかったが,dplRの実装では4になっていたため,4) bfilter <- butter(filn, fc_norm, type="low") ## フィルタの作成 ``` ```lang= yy <- filtfilt(bfilter, y) ## フィルタの適用 ``` - フィルタ適用後 ![](https://i.imgur.com/IFgTbgv.png) - 波形を見る限り高周波っぽい要素が除かれており,周波数が違うsin波同士の合成波に上の手法で作成したフィルタをかけると,周波数が低い方の波を取り出すことができたため,フィルタ回りに問題はないと考えられる. ### ②FFT・タスク時間での正規化 - 43行目が対象 - [参考ページ](https://tamosblog.wordpress.com/2015/01/09/signal_processing_by_r/) ```lang= spec = fft(yy) / len ## FFTと正規化 ``` - FFTの結果(フーリエスペクトルの絶対値) ![](https://i.imgur.com/KTaKqiz.png) - この部分はただFFTをかけているだけなのでバグはないと思われる ### ③α・β波の抽出 - **ここが一番怪しい** - 10,11行目,44,45行目が対象 ```lang= FS <- 256 DT <- 1 / FS ## 標本間隔(1/256秒) alpha = sum(abs(spec)[floor(8 * (DT * len)):ceiling(13 * (DT * len))]^2) beta = sum(abs(spec)[floor(14 * (DT * len)):ceiling(30 * (DT * len))]^2) ``` - 今回のデータにおいて基本波の周期は`DT*len` - その逆数が基本波の周波数であるため,欲しい周波数を`y`,それに対応するフーリエスペクトルのインデックスを`x`とすると,`y=x/(DT * len)`がなりたつので,今回欲しい周波数8Hzに対応するインデックスは`8*(DT*len)`と求められる. - 同様に13,14,30Hzについても求めると,上記の式のような範囲が求められ,フーリエスペクトルからパワースペクトルに変換するため,2乗したものの和をとって単位時間当たりのα波,β波を抽出した. - α波 ![](https://i.imgur.com/y1MeCey.png) - β波 ![](https://i.imgur.com/KKaqMJp.png) --- - 前の分析結果 ![](https://i.imgur.com/qj6NaZb.png) - 今回の分析結果 ![](https://i.imgur.com/y0eHSfo.png) - p値<0.05になる検定がなくなったため,有意に差があるとは言えなくなったが,前の結果よりは納得できる結果になった. ## 分析結果報告 ### 環境の名称について - そのままだと長すぎる上,判別がつきにくいため,環境ごとに名称をつけた. |環境|今までのアルファベット|名称| |---|---|---| |予約語ハイライト等幅フォント|ResNon|紙| |ランダムハイライトKawaiiフォント|RanKaw|最悪| |ランダムハイライト等幅フォント|RanNon|ランダム| |予約語ハイライトKawaiiフォント|ResKaw|Kawaii| |IDE並み等幅フォント|IDENon|IDE| |ハイライトなし等幅フォント|GraNon|なし| |予約語ハイライト非等幅フォント|ResPro|非等幅| ### 個人ごとのplot #### PCP - 同じクラスタに分類できそうな人はいなかった ![](https://i.imgur.com/E5EubiP.png) #### 被験者1人のboxplot - 特筆すべき特徴のある被験者はいなかった. ## これからの方針 ### SIGSS - 1タスクの難易度が高すぎた可能性がある - もっと単純なタスク(for文1個くらいのもの)のほうが良かったかも - ハイライトの良さが際立つ題材ではなかった - タスクに夢中になるとタスクの環境による影響が薄れてしまうかもしれない - 「タスクが高次すぎたせいで問題による脳波への負荷がハイライトやフォントなどのコードの記述環境による影響を分からなくしてしまった」という方向性で論文を書く --- - できるだけ書いてみて今回は無理そうであれば落ち着いて分析をし,3月のSIGSSに出せるようにシフトチェンジする - ### SEMotion ``` Paper submissions: January 22, 2020 Notification to authors: February 25, 2020 Camera-ready copies due: March 16, 2020 Workshop: May 24 , 2020 ``` - タスクを静的解析して簡単なタスクと難しいタスクに分ける - 「タスクが高次すぎたために結果が出なかった」ということであれば比較的簡単なタスクのなかであれば結果がある可能性がある - それでも結果がなければさらにタスクは簡単なものではならない.もしくは,そもそも脳波には結果が出ないという方向で論文を書く ## お願い - 1,2時間程時間をいただいて脳波の分析手法について再度勉強させていただきたいです. - 12/9(月)の午後にお願いします. ## MEMO - フィルタは次数が高いほど,閾値直前までをそのまま,直後を完全に減衰する. - 音声などではフィルターの次数は基本5 - butter()の出力を可視化できるので,それでフィルタを確認できる --- - FFTをかけるデータは2のべき乗になっている必要がある - 単純な正弦波をFFTのスクリプトに食わせてみて,sumの結果が振幅の二乗の和になってるか確認する - 時間長の影響も入力変えて確認する --- - 全体で傾向が同じ人がいないかもしれないけど,部分だけ見るとできるかも. - kawaii -> 非等幅 -> 等幅という軸と,ランダム→なし->予約->IDEの2軸があるので個別に見た方がよい - - PCPなら両方の基準になってるやつ(紙?)を中心において,左に行くほどfontが悪化,右に行くほどハイライトが悪化,とかすると意味的にも解釈しやすい - あと,基準となる点で正規化する. - 現状だと高い低いの意味が読み取れない - 各自の紙の値を1として正規化する --- - 個々の人にとっていらつくかどうか,を見たいはずなので,紙を基準としてみた方が良い - 箱ひげの方も --- - 44,45行目の範囲指定はOKだけど,floorとかを使わないといけない状態が怪しい - あと,処理の正しさの確認は,正弦波処理するのが確実 - そのうえで,正しさが確認できなかったらコードレビューする,という方針でいく - 振幅1, 1秒,10Hzの正弦波をfftすれば result[10]に1が入るはずです - で,2秒に変えて正しいか,振幅を2に変えて正しいか,という風に確認s.サンプルのコードをそんな感じで動かしてみる