VB_EEGLAB

EEGLABのビジュアライゼーション機能を使う!! (Now under construction)

#contents

初めに

VBMEGのプログラムを使えば、EEG/MEGから脳内の電流源が推定できるが、その前にデータ自体をしっかりみることは重要でしょう。残念ながらVBMEGでは、そのようなソフトウェアまではサポートしていません。そこでEEGLABのビジュアライゼーション機能を使って、VBMEGの".meg.mat"形式のデータを表示する方法を紹介します。

meg_ts_s.png
全チャンネルの時系列をスクロールバーで見たり、
aerp_on_scalp_s.png
のような時系列をセンサ位置上に表示したり
aerp_scalp_s.png
時系列とスカルプマップを同時表示したり
scalpseries_s.png
スカルプマップの時系列を表示
などしたい人は、ちょっと面倒でもこのドキュメントを読みましょう。比較的簡単に使えるようになるはずです。

構成

"準備"の節は、みなさんとりあえず読みましょう。

EEGLABを使って表示する方法は、2通りあります。 1つはEEGLABのGUIを使ってメニューから選んでいく方法。もう1つはEEGLABの関数をMATLABのスクリプト等から直接呼び出す方法です。

このドキュメントでは、まず前者を

  • GUIを使った図表示方法

で説明し、次に後者を

  • EEGLAB関数を直接呼び出す図表示方法
  • EEGLABの関数を使ったMEGデータ表示(完結編)

で説明します。この部分はEEGLABの知識なくても、簡単に使えることを目指して書いてみました。ある程度MATLABに慣れていて、EEGLABを学ぶのが面倒という人は後半部分だけを読みましょう。

準備

インストール

まずは、http://www.sccn.ucsd.edu/eeglab/から、EEGLABの本体、マニュアル、あとついでに例題用のデータセット類をダウンロードしておきましょう。このドキュメントで使うのは、本体とマニュアルだけですが、EEGLABの他の機能を使いたい人は、データセットとマニュアルは必須です。
ダウンロードが面倒な人は、CNB山下まで連絡くれれば、最新バージョンではないですが一式お渡しします。
インストール自体はごく簡単です。 ダウンロードしてきたアーカイブ ("eeglab4.511.tar.gz"等) を適当な ディレクトリ ("EEGLab"とする) を作ってそこで解凍しましょう。 "EEGLab/eeglab4.511/", "EEGLab/biosig/"のように2つのディレクトリが作成されます。例題データセットもダウンロードした人は、"EEGLab/eeglab4.511/sample_data/" 以下に置きましょう。

起動

"EEGLab/eeglab4.511"に移動して、Matlabコマンドライン上で'eeglab'と入力。 EEGLABのメインGUIが立ち上がる。以下では「VBMEGで保存しているMEGデータをEEGLABのビジュアライゼーション機能を使って表示する」ための手順を説明するが、基本的にはGUI上のメニュー 'File','Edit','Tools','Plot','Datasets','Help'を使って直観的に作業できる。

GUIを使った図表示方法

手順は大きく分けて、

  1. データのimport
  2. センサ情報の登録
  3. データの表示

ステップに分かれる。いずれも、簡単な操作であるので、Matlabの知識が少しあればすぐ使えるようになるはず。EEGLABでは必要に応じて、データのrejection、averaging、re-referenceing、spectral analysis、ICAによる信号分離などの処理も行えるが、ここでは説明しない。詳しくはマニュアルを参照のこと。

以下の作業でVBMEG側のデータフォーマットとして必要なのは、

.meg.mat

の拡張子のついたファイルだけである。

''1. MATファイルからEEGLABのデータセット形式へのImport''

''1-1. MEGデータの用意''
ImportするMEGデータとして、 megdata(Nch,Nt) または megdata(Nch,Nt,Ntrial) を2次元または3次元行列形式で用意する。ここでは、例として変数名を"megdata" としている。またNch:センサチャンネル数、Nt:タイムポイント、Ntrial:試行数を表す VBMEGの'.meg.mat'ファイルをロードすれば、'bexp'という変数にこの形式で入っているので、特に処理は必要無く"megdata=bexp;" のような代入文で自分の付けたい変数名に変更する。

''1-2. データのimport'' (Manual[II.1]を参照)
メインGUIのメニュー

File>Import data>From ASCII/float file or Matlab array

を選択。新たにimport設定用のGUIが立ち上がる。

  • EEGLAB dataset name : import後EEGLAB上でのデータセット名(例えば"test"とする)
  • Data file/array : 変数名 (megdata)
  • Data sampling rate : 1000

などを設定する。 すると、メインGUIに、登録した"test"というデータセットの情報が表示される。ここでは、まだセンサのチャンネル情報を登録していないので、'Channel locations'は'No'と表示される。

''2.センサ情報の登録''
センサ情報ファイルは、各センサの座標、名前、また番号などで構成される。EEGLABでは座標系の種類(xyz座標、極座標)等によって、数種類のセンサ情報ファイルのフォーマットをサポートしているが、ここでは一番簡単な'xyzフォーマット'で登録する方法を紹介する。

''2-1. ファイルの用意''

VBMEGの'.meg.mat'をロードすると pick : Nch*9行列、MEGの各センサの位置情報や検出磁場の方向など Vcenter : 3*1ベクター、VBMEG座標系における球の中心座標 という変数がロードされる。

''2-2. xyzファイルの作成'' (help_readlocs.txtを参照)

2つの変数'pick','Vcenter'を用意したら、以下をMatlabのコマンドラインで実行する。

chanloc = pick(:,1:3)-repmat(Vcenter',[Nch,1]); %adjust origin

chanloc = [[1:Nch]',-chanloc(:,2),chanloc(:,1),chanloc(:,3)] % xyz format

save -ascii <filename> chanloc % save "chanloc" as an Ascii file with extention '.xyz' (for example "meg_chan.xyz")

まず1行目では、"chanloc"という変数(Nch*3)にVBMEGの座標系におけるセンサ情報を球中心を原点として計算する。pickは9成分あるがその始めの3成分のみをセンサ位置情報として使用する。 2行目では、VBMEG座標系をEEGLABの座標系に変換し、さらに.xyzフォーマットに合うように始めの1列目にセンサ番号を付加している。ここで、センサの名前が分かっているときは、最後の列にセンサ名を入れることが可能である。ここでは、その情報は登録していないのでEEGLABデフォルトの名前が各センサにつけられる。.xyzフォーマットについては、別にあるヘルプを参照のこと。 最後に、拡張子".xyz"を持ったアスキーファイルとして"chanloc"をセーブする(ここでは、"meg_chan.xyz"でセーブしたとする)。

''2-3. センサ情報の登録''(Manual[I.2]を参照)

メインGUIのメニュー

Edit>Channel Location

を選択。新たにチャンネル情報登録ようのGUIが立ち上がる。 左下の方にある'Read locations'を選択し、ファイルダイアログで2-2で作成した"meg-chan.xyz"を読み込む。チャンネルの座標やラベルに、自動的に情報が書き込まれたの確認して、'Plot 2-D''Plot 3-D (XYZ)'等でセンサ情報が正しく登録されているか確認する。'Plot 2-D'では、センサが頭からはみ出ていることがあるが、おおまかなScalp Map表示のチェックのためならば、細かいことに気にする必要はない(多分)。確認を終えたら、'OK'ボタンを押し、ダイアログを閉じる。メインGUIの'Channel locations'は'Yes'と表示されば、無事登録されたことになる。

''3.データのプロット''

主にEEGLABでサポートしているビジュアライゼーション機能は、頭皮上におけるEEG/MEGのマップ、時系列の表示、またはそれらを組み合わせたものである。

''3-1. 時系列の表示''(Manual[I.1.6]を参照)

メインGUIメニューの

Plot>Channel data (scroll)

を選択すれば、各チャンネルごとの時系列が新しいGUIに表示される。このGUIの操作は非常にわかりやすいので詳細は省く。 1のデータのimportが済んでいれば、2のセンサ情報の登録がなくても、表示させることができる。

''3-2. 平均ERPの時系列+特定の時間のScalp空間マップの表示''(Manual[I.6.1]を参照)

メインGUIメニューの

Plot>Channel ERPs>With scalp maps

を選択。すると、プロットの時間窓、空間マップの表示時点、キャプションなどの設定用のGUIが立ち上がるので、適切に入力する。

''3-3. 平均ERP時系列をScalp空間マップ上に表示'' (Manual[I.6.2]を参照)

メインGUIメニューの

Plot>Channel ERPs>In scalp array 

を選択。すると、プロットするチャンネル、キャプションなどの入力を求めるGUIが立ち上がるので、適切に入力する。オプションの設定によって、各トライアルごとのERPの表示も可能であるが、全てのトライアルに対して空間マップが表示される。そのためトライアル数が多いときは、表示に必要なメモリの関係で選択しない方が無難(?)。

''3-4. 各チャンネルの平均ERPを2列でsubplot表示'' (Manual[I.6.3]を参照)

メインGUIメニューの

Plot>Channel ERPs>In a two column  array

を選択。設定用のGUIに適切に入力する。 時系列の表示なので基本的には3.1の時系列表示で十分だが、ERPを細かく見たいときに良い。オプションの設定によって、各トライアルごとのERPの表示も可能であるが、全てのトライアルに対して空間マップが表示される。そのためトライアル数が多いときは、表示に必要なメモリの関係で選択しない方が無難(?)。

''3-5. 平均ERPの2-D scalp空間マップの時系列として表示'' (Manual[I.6.4]を参照)

指定した複数の時刻における平均ERPのScalpマップを表示する。 メインGUIメニューの

Plot>Channel ERPs>In a two column  array

を選択。設定用のGUIに適切に入力する。

''3-A. 平均ERPのScalp空間マップの動画作成'' ('eegmovie()'のHelpを参照)

空間マップを動画として表示したいときは、コマンドラインにおいて

eegmovie(mean(megdata,3),1000,EEG.chanlocs)

と入力する。この例では、"megdata"は3次元配列(複数トライアルの時)で、サンプリングレートは1000Hzのであり、平均ERPの動画を生成している。変数'EEG'は、EEGLAB上でデータセットを扱う時に用いる構造体であり、データ、チャンネル情報、データのコメント等を保存している。他のオプションは今後検討。

EEGLAB関数を直接呼び出す図表示方法 '''New!'''

MEGデータを概観するのにEEGLABのプロット関数は使い勝手が良いが、いちいちEEGLABを立ち上げGUIを介してデータを表示するのは手間がかかる。そこでMATLABのスクリプトでEEGLABの関数群を呼び出し、プロットする例を示す。ここでは、特に使い勝手の良い

  • センサ位置に各チャンネルの時系列を表示する(plottopo()関数)
  • 任意の時刻のスカルプマップを表示する(topoplot()関数)

を用いた例を示す(s_import_vbmeg.m)。ファイル中には簡単にカスタマイズできるように、各関数のドキュメントもコメントとして添付してあるので参照のこと。

[基本的なCode進行]

  1. EEGLABの関数群を収めたディレクトリへのパス設定
  2. VBMEGのmeg.matとbasis.matのロード。表示したいMEGデータbexpと座標変数pick(もしかしたらVcenterも必要)を取り出すため。
  3. チャンネルの位置ファイルをEEGLAB用のフォーマットに変換し保存。
  4. MEGデータをEEGLAB用のデータ形式にImport('MEG'というstructに格納される)。しかし、ここで後に実際必要になるのは、MEG.chanlocs(struct変数)というチャンネル情報おさめた変数だけ。(だから、3,4の2つのステップ踏まずに直接chanlocsというstructを定義しても良い。そちらの方が見通しが良いか。後日修正予定!!)
  5. plottopo()関数の利用。ここでは、ノイズありシミュレーションデータ(megdata)とノイズ無しシミュレーションデータ(megdata0)の時系列をセンサ位置上に同時に表示している。1つのデータのみを表示したいときは、Nch*Ntの2次元データ行列を入力すればよい。
  6. topoplot()関数の利用。変数timepointで定義された時刻のスカルプERPマップを表示する。

EEGLAB関数を使ったMEGデータ表示(完結編)

この節の内容は、基本的には前節のスクリプトをモジュール化して見通しをよくしたものである。細かい内容については前節やMファイルのドキュメントを参照のこと。

まず、EEGLABがインストールされていることを仮定する。もし、落とすのが面倒でEEGLABのGUI機能を使う予定がない人は、/home/dcfs3/oyamashi/matlab/EEGLab/eeglab4.511/functions内の関数を全部コピーすればよい。

次に/home/nip/oyamashi/myfunc/plot/ 内にある関数をダウンロードする。以下のような5つのファイルがあるはずである。

  • eeglab_plottopo.m : EEGLABのplottopo関数とVBMEGとのインターフェース関数
  • eeglab_topoplot.m : EEGLABのtopoplot関数とVBMEGとのインターフェース関数
  • eeglab_timtopo.m : EEGLABのtimtopo関数とVBMEGとのインターフェース関数
  • eeglab_gen_chanloc.m : VBMEGのセンサ座標をEEGLAB用の構造体に変換する関数。基本的には上記3つの関数内で呼び出される。
  • s_eeglab_plot_meg.m : 上記3つのプロット関数の使い方をまとめたスクリプト

基本的にはスクリプトを適宜自分の環境に応じて変更して実行すればよい。また、 インターフェース関数自体は使用者の目的に応じて、中身が書き分けられるようにEEGLABの各関数のオリジナルのドキュメントも添付してあるので参考にしてもらいたい。

以下でスクリプトを実行し、3つのインターフェース関数によって表示される図の例を示す。

eeglab_plottopo()関数

plottopo_s.png

また各時系列データはシングルクリックすることにより、以下のようにその部分の時系列だけを拡大してみることが可能である。

plottopo_large_s.png

eeglab_topoplot()関数

topoplot.png

eeglab_timtopo()関数

timtopo.png
また各スカルプマップはシングルクリックすることにより、以下のようにその部分のマップだけを拡大してみることが可能である。

topoplot_large.png

eegmovie()関数

この小節はおまけである。EEGLABではスカルマップの動画を作る関数もサポートされている。ここでは、その使い方を簡単に説明する。

スカルプマップの動画はコマンドラインにおいて

chanlocs = eeglab_gen_chanloc(pick);
MV=eegmovie(meg,1024,chanlocs)

と入力する。この例では、"meg"は[チャンネル数xタイムポイント]の2次元配列で、サンプリングレートは1024Hzである。"chanlocs"はEEGLABでチャンネル情報を扱うための構造体であり、eeglab_gen_chanloc(pick)によってVBMEGの座標変数"pick"から作成することができる。出力"MV"は、seemovie()関数を用いて、

seemovie(MV)

によって再生することができる。詳しくは以下の例題スクリプトを参照のこと。 s_movie.m

その他注意事項

[注意]

  • EEGLABではファイルの取得に、Matlab標準のuigetfile関数を呼び出しているが、ある環境でこの関数のGUIがうまく作動しないことがある。動作確認済のクラスタ内のコンピュータでMatlabを立ち上げるのが望ましい。
  • EEGLABにおけるスペクトル解析(マニュアルI.3, I.8の解析)では、Matlabの"Signal Processing Toolbox"が必要なのである。

[Term]

  • epoch : 試行、trial
  • event : 刺激のオンセットなどの情報?、結構重要らしい。
  • continuous EEG : 一つの連続したEEG時系列(各epochデータを一つの連続した時系列に並べたものであったり、クリニカルデータであったりする)

2005 2/18 by Okito Yamashita