- このページでは、言語科学教室の学部生・院生のために、Presentation(Neurobehavioral Systems)のファイルの作り方を説明しています。主に、言語理解ERP実験に関するものです。 まず「基本的な説明」の箇所を見て、あとは、サンプルファイルを見ながら、自分の用途に合わせて、色々と修正していくのが一番早いと思います。
- !購入方法は、こちらを見てください。
- !Windowsのパソコンにしかインストールができません。ただし、Macでもテキストとしてファイル(.sce/.tem)を開くことはできます。Parallelsなどを持っているひとは、Windowsと同じように開くことができます。
- !外部の方へ:誤っている箇所があるかもしれませんので、ご自身の実験で使用されるときは、十分ご注意ください。何らかの支障が生じた場合において一切の責任は負いかねますのであらかじめご了承ください。
- 1. Scenarioファイル(.sce):主に、実験文を書き込むためのファイルです。その他に、使うボタンの数、トリガーの有無・長さ、教示(休憩・フィードバックを含む)なども書き込むことができます。Scenarioファイルは、リストの数だけこのファイルを作ります。必ずしも、本番用ファイルとわける必要はないのですが、練習試行用のファイルはどの参加者にも同じものを呈示すると思いますので、練習用のファイルが1つ必要です。実験文は、エクセルで作成し、そのままコピペするのが良いです。
- 2. Templateファイル(.tem):刺激の呈示時間(DOS)や刺激呈示間隔(ISI)、刺激の画面上の位置・色、試行間間隔(ITI)、タスクでどのボタンを使うかなどを設定するファイルです。Templateファイルは、リスト間で同じものを使用するため、1つの実験につき1ファイルです。
- 3. Experimentファイル(.exp):ボタンの選択・トリガーポートとの接続・ログ(.logファイル)の設定をするファイルです。
- ボタンの選択とは?
- .sceと.temではボタン(例えば文法性判断のYES/NO)は、数字を用いて表します(例えば、1はYES反応、2はNO反応).expファイルでは、それぞれの数字と、どのボタン(例えばキーボードのFとか)を対応させたいかを決めます。ボタンは1番から始まり、番号を飛ばして使うことはできません(例えば1番と3番とか)
- ログ(.log)ファイルとは?
- 実験が終了すると、Presentationは、実際に刺激が呈示された時間や実験参加者のレスポンスを記録したファイルを出力してくれます。拡張子は.logになっていますが、エクセルで開くことができます。 そのデータを分析すると、参加者の課題に対する正答率が算出できます。(参加者毎に1つずつファイルが出力されますが、1つのエクセルファイルにまとめてピボットテーブルを使うと、すばやく分析することができます)
- 学部生・院生(・外部の教員など)から質問があった点について紹介しています。 Presentation (NBS)のサイトにForumsもありますので、そちらもご覧ください。
- Q:試行毎・条件毎にDOS・SOA・ITIなどを指定するには、どうしたらいいですか?
- A: プライミング実験など、試行毎・条件毎にそれらを操作したい場合には、SOA・DOSには、$SOAや、$DOSと書き込んで、変数にすることができます。その参照先として、刺激文を記入する箇所に、DOS・SOAの行を追加します:
- ほとんどの文理解実験では、DOS・SOA・ITIなどは試行間で共通しているケースが多いと思います。そのような場合には、durationやdelta_timeのところに直接、値(例えば、500と700など)を記入しても問題はありません。 ただし、サンプルファイルのように変数にしておいた方が、各文節の呈示時間を変更したくなったときに、参照先の数値を変更するだけで変更できるので便利です。Templateファイルのduration, delata_timeをご覧いただくと、Scenarioファイルの値を参照するようになっていることがわかると思います。
- Q:以下のようなエラーがでるんですが何が原因ですか?
- ...\sample.list.sce (182, 6): Invalid declaration ending
- ...\sample.list.sce (182, 10): Invalid list item
- A:エラーが出ている箇所の「前」にあるtrial {}のあとに、「;」がついていない可能性があります。また、刺激文のあとにも「;」が付いているか確認してください。(このエラーに関する質問が一番多いです!)
- 文字として認識してほしい箇所に「" "」がついていない場合にも同じエラーがでます。
- Q:トリガーの数が足りません (*´Д`) 各文節のオンセットに異なるトリガーを出す方法はありますか?(一般的な文処理実験で各条件の各文節にトリガを出そうとすると15種類では足りません)
- A:トリガーを15種類しか受け付けない脳波計でも、トリガーを連続して2発出すことで対応できます。(4bitだと、2x2x2x2で16になりますが、0/0/0/0はトリガーが出ていないのと同じなので−1で、15種類)この方法を使えば、240種類(で計算あってますかね..)のトリガーを区別できます。
- 通常、第1文節で、オンセットに1回だけトリガーを出す場合、templateファイルは以下のような設定になっていると思います:
- !DOSは、700 msという状況です
- !caption = $P1、port_code = $PortCode はScenarioファイルの、それぞれP1、PortCode1の行を参照する変数です
- !delta_timeは、前の刺激が呈示され始めてからの時間ですのでお間違えなく
- 2発出しというのは、このP1を2つに分けるという方法です:
- !トリガーの長さは、50 msに設定しています
- ここでは、DOS 700 msを、100 msと600 msにわけてそれぞれのオンセットにトリガー(50ms)を出力するようにしています。刺激はP1-1とP1-2で全く同一のものを出しますので、captionは同じ変数を参照させます。実験がおわったら、MATLAB(とEEGLAB/ERPLAB)を使って、「当該トリガーに先行して、100 ms以内に何らかのトリガーが出ている場合、そのトリガーの値を16倍してください」というスクリプトを書きます。そうすると、例えば、第1文節の1発目で1番トリガー、2発目で1番トリガーが出ると、1 + 1*16で、17番トリガーが出たと認識してくれます。
- MATLABのスmファイルは、以下のように書きます:
-
EvNum=size(EEG.event,2); % get number of events for n=5:EvNum; if (EEG.event(n).latency-EEG.event(n-4).latency<110 && EEG.event(n).latency- EEG.event(n-4).latency>10)... |(EEG.event(n).latency-EEG.event(n-3).latency<110 && EEG.event(n).latency- EEG.event(n-3).latency>10)... |(EEG.event(n).latency-EEG.event(n-2).latency<110 && EEG.event(n).latency- EEG.event(n-2).latency>10)... |(EEG.event(n).latency-EEG.event(n-1).latency<110 && EEG.event(n).latency- EEG.event(n-1).latency>10)...; EEG.event(n).type=EEG.event(n).type*16; else EEG.event(n).type=EEG.event(n).type; % elseは無くても良い end end
- 補足:
- もしトリガーが全てのピンで同じタイミングで出ているのであれば、&&から>10の部分はいりません(ピン間で若干ズレが発生している場合は、<110 msという条件を満たすことになり、16倍されてしまいますので、>10をつけたほうが良いです)。
- 注意点:
- トリガー2発出しの方法は、モニターのリフレッシュレート?との兼ね合いもありますので、刺激呈示が、本来の設定時間に呈示されているかどうかを確認して使用してください。また、2発目を16倍にする条件は1発目が110 ms以内に出た場合という条件がついていますので、2発目のみを出す番号は使えません(例えば、0 + 1で16、0 + 2で32など)文理解実験の場合だと、通常は、「条件毎」にトリガー番号を決めると思いますが、同じ条件内に異なる性質を持つ可能性があるものが使われている場合、念の為に条件内のものでも、別々にトリガーを出しておくほうが良いです。例えばNPI条件としておきならがも何種類かのNPIを使っているような場合のことです)このような場合、トリガーが足りなくなることが多いので、2発出しトリガーが有効です。 それらを一緒に分析したいときは、ERPLABのBinOperationで簡単に統合できます。逆に同じトリガーが出ているのをあとからわけるのは相当大変です。
- Q:音声呈示中に複数のトリガーを出したいときはどうしたらいいか?
- 聴解実験の場合、下記のように各文節の前にトリガーを出したいことがあると思います(例えばYasunaga et al. 2015など)。
- 例: りんごを 太郎君が 食べたよ。
- ↑トリガー1 ↑トリガー2 ↑トリガー3
- 聴解実験では、試行毎に各文節のオンセットは若干異なるので、そのタイミングに応じてトリガーを出す必要があります。私が理解できている限りでは、Presentationでは音声ファイルでひとまとめになっていると複数のトリガーを異なるタイミングで出す設定をするのは難しいみたいです。
- しかしEEGLABでは、任意のトリガー(e.g. EEG.event(1).type)を基準にトリガーを入れることができます。この機能を使えば、以下の手順で、問題を解決することができると思います。(最初から、音声ファイルの再生中にトリガーが出力可能なソフト(stim2など)を使うというのが一番簡単です 笑)
- 1. 実験の段階では、全ての試行のオンセットに異なるトリガーを出す(例えば、1-192番までを使用するなど)(もともと15種類程度のトリガーしか区別ができなくても、上記の2発出しトリガーの方法を使えば問題ありません)
- 2. 実験終了後、MATLAB/EEGLABを使って、データを読み込む。
- 3. 各イベントのトリガー番号を確認し(File - Export - Event to txt filesもしくはEEG.event(1).type)、それに応じて、EEGLABのEdit - Event values - Insert eventでトリガーを新しく挿入します。
- 4. もともと挿入されていたトリガーを消します(もしくはもともと挿入されていたトリガーをP1のトリガー番号に書き換えます)。
- 3を手作業ですると、かなり面倒くさいので、あらかじめcsvファイルでトリガーの表を作成しておき、その表を、エクセルのvlookup関数のように参照させながら、自動でトリガーを挿入する方法を取ると良いです。
- ただこの文頭だけに出す方法は、何らかの理由で最初にトリガーがでないとその試行毎使えなくなるので、事前に、トリガーが安定して出ていることを確認しておいたほうがよいです。(この解析時にトリガー(イベント)を入れる方法を使えば、視覚呈示の実験ではそもそも、2発出しトリガーを使う必要なんてないんですが...笑)
- Q:レスポンスをどの文節でしても良いという実験をしたい場合、templateファイルはどう設定したらいいですか?
- A:各文節の下に、target_button, codeを追加すれば大丈夫です。
- (ボタンは1–3の3種類使うという状況です)
- レスポンス時にもトリガーがでるようにしておけば、レスポンスにタイムロックして加算することができます。レスポンスにタイムロックして分析している例としては、Sassenhagen et al. (2014) B&Lが参考になるかと思います。
- Q:休憩にはいる設定はどうしたら良いですか?
- A:少なくとも2つの方法があります。
- 1.指定した試行数に達したときに休憩に入る方法
- まず、Scenarioファイルで、休憩にはいる試行数を指定しておきます。begin;のあとの行あたりに入れてください:
- !$のあとのアルファベットは任意
- !30は30回に1回休憩にはいるという意味
- 次に、TemplateファイルのITIの指定のあとに、試行が終わるたびに、$TrialNumの値が1ずつ大きくなるようにしておきます:
- さらに、IFで、$TrialNumの値が、$Breakで指定した値になったときに、休憩に入るように指定します。先ほどの行の直後にいれます:
- !2行目の$TrialNum = 0は、連続の試行回数を0に戻すために入れています。実験全体で50試行しかなく、30試行たった時点で1回だけ休憩を入れるようなケースでは不要です。
- !==は、等価演算子(TrialNumとBreakの値が等しい)、=は代入演算子(TrialNumに0を代入する)として用います。
- 2.実験者がボタンをおしたときに休憩に入る方法
- この方法では、TemplateファイルのITIの設定を以下のようにします:
- correct_feedback = rest;は、正しいボタンが押された時に、指定したフィードバック(rest)を呈示するという意味です。ここで指定している1番のボタンは、Presentationがインストールされたパソコンの任意のボタンです。このボタンを実験参加者が押すことはできませんので、参加者のボタン押しによって勝手に休憩が始まったりすることはありません。durationやtarget_buttonは、任意の値ですので、好きな値に変更してください。
- さらにフィードバックの内容を、Scenarioファイルに書き込んでおきます。これもbegin;よりあとの行(ただし刺激が書かれたTEMPLATE ".tem"よりは前)に書き込みます:
/* 休憩時の教示 */ trial { picture { text { caption = "休憩してください。"; font_color = 0,0,0; }; x = 0; y = 0; }; code = "rest-1"; duration = target_response; target_button = 1,2,3; picture { text { caption = "黙読中は、文の意味を確実に\n把握するようにしてください。"; font_color = 0,0,0; }; x = 0; y = 0; }; code = "rest-2"; duration = target_response; target_button = 1,2,3; picture { text { caption = "では、再開します。"; font_color = 0,0,0; }; x = 0; y = 0; }; code = "rest-2"; duration = target_response; target_button = 1,2,3; }rest;
- ポイントは、このtrial{}には、restという名前が付いていることです。このように名前をつけておくことで、.temファイルが.sceファイルを参照して、休憩に入ることができます。
- ScenarioファイルとTemplateファイルに情報がまたがってしまうとわかりにくいと思う方は、先ほどのIFを使って、IF (条件) trial {(休憩の内容)}; ENDIF; のように書けば、問題ありません。
- 紹介した2つの方法のうち、私は2番目を使用しています。実験参加者が汗をかいたときや疲れている場合、早めに休憩に入るなど、実験中に色々と工夫ができるためです。このような工夫をすることで、1番目の場合よりも、有効なデータを得やすいと思います。サンプルファイルはこちらの方法を使用した例です。
- Q:実験の最初は、指定した順番でウォームアップ文を呈示し、その後は、ランダム順で実験文を呈示するにはどうしたら良いですか?
- A:SenarioファイルのTEMPLATEの部分を2つに分けることで、簡単にできます。
- このようにしておけば、まずウォームアップが、表示されている順に呈示され、その次に、実験文がランダム順で呈示されます。
- !実験文 --> ウォームアップ文の順に並べてはいけません。
- 実験の最初に行うPracticeで、NO反応(非文)が正答の試行が数回連続で呈示されてしまう可能性も考えられるので、Practiceは、そのようなことが起きないようにrandomizeを外し、自分で試行を並び替えて呈示するといいと思います。
- Q:実験参加者のレスポンスが誤っていたときにフィードバックを出すにはどうすれば良いですか?
- A:まず、TemplateファイルのITIを指定しているtrial{}のの部分にincorrect_feedback = incorrect;と入れておきます。(=のあとのincorrectは、任意です)
- 次に、ScenarioファイルでIncorrectの場合に何を呈示するかを書き込みます。これもbegin;よりあとの行(ただし刺激が書かれたTEMPLATE ".tem"よりは前)に書き込みます:
- この例は、wavファイルでピーという音がなる場合の例です。音や画像を呈示する場合、そのファイルは.sceと.temがあるフォルダと同じ場所に入れてください。
- trial {}; の中を、picture { text { }; }; にすると文字も呈示できます。(やり方は、休憩などの場合と同じですのでそちらを参考にしてください)
- TemplateファイルのCorRes1は、ScenarioファイルのCorRes1行を参照しています。この場合だと3を押してしまうと、incorrectとみなされ、フィードバックが呈示されることになります。
- またIFなどを使って工夫することで、何回以上間違えたら、もしくは何%以下の正答率だったらフィードバックを出すというようなこともできます。この方法については、休憩の入り方1が参考になると思います。
- Q:PresentationでもSelf-paced reading実験はできますか?
- A:もちろんやろうと思えばできるのですが、Presentationは、文節毎のRTデータがかなり分析しにくいので、オススメしません。よっぽどの理由がない限りは、LingerやLinguaToolsなどを使うほうが良いと思います。
- 補足:分析しにくいのは、各文節とRTデータがすべて縦並びになるためです。このような並びでは、RTのデータを集計するときにエクセルのピボットテーブルが使えません。もしこのようなデータでも問題なく分析できるのであればPresentationで行っても問題ありません。
- 1.コメントアウト
- Presentationには、2種類のコメントアウトがあります:#を使うと、その行の#以降に書いてある内容が無視されます。一方、/ /を使うと、その間に挟まれている内容が無視されます。/ /は、複数の行にまたがっていても構いません。また、コメントアウトされている箇所には、日本語を使うことができます。
- Presentationファイルが、うまく動くかどうかを、脳波計に繋いでいない状況で、確かめたいときは、トリガーを出すための行をコメントアウトで外しておく必要があります。
write_codes = true; #トリガーを出す。 pulse_width = 50; #トリガーの幅(ms)。
- !Rのコメントアウトも#ですが、MATLABのコメントアウトは、%なので気をつけましょう。
- 2.ターゲットボタンの設定
- 容認性・文法性判断課題などでは、実験参加者間でボタンのカウンターバランスを取る必要があるので、expファイルは2つ必要です。ボタン変更の仕方は以下の通りです:
- ・SettingsにあるResponseを選択
- ・Scenariosにあるdefaultを選択
- ・下のDevicesでCedrusのレスポンスパッドをクリック
- !言語科学教室の場合です。
- !とりあえずで自分で実験ファイルを作る練習をしているときは、キーボード上の好きなキーを設定すれば問題ありません。
- ・Buttonsのところで、使いたいボタンを選択し、Useを選択
- !#の箇所に表示される番号は、シナリオファイルのactive_buttonやbutton_codesに関係するので、順番を考えながら選択する
- !キーボードのところは、スクロールしなくても、指定したいキーを押せば表示されます
- ・Scenariosのところで、右クリックをし、copy all from defaultを選択してすべてのシナリオファイルにコピーする
- ・ターゲットボタンの設定についての注意点1
- ・Experimentファイルでは、「scenarioファイルで使用していているボタンの数字」と「どのボタン(キーボード・マウス・レスポンスパッド)を使うか」を対応させる必要があります。もし指定していない場合は、以下のようなエラーがでます。
- This scenario requires exactly 3 active response button(s), as set by the active_buttons header parameter,but 2 response button(s) were selected on the Response panel of the Setting tab.
- ・ターゲットボタンの設定についての注意点2
- ・Presentationでは、.expファイルで使用可能なボタンとして設定しており、かつ、あるtrial {}でtarget_buttonとして指定していない場合、そのボタンを押すと、フリーズしてしまうことがあります。ややこしい(;´д`)トホホ…
- 例えば、ある実験で、1番(実験の進行・中断・終了用のボタン)、2番(YES反応)、3番(NO反応)の3つのボタンを使用しているとします。この状況で、もし実験開始のtarget_buttonを、以下のように1しか設定していないと、実験参加者が誤って2, 3を押した場合にフリーズします。
/* 本番スタート */ trial { picture { text { caption = "それでは本番を始めます。\n画面に注目してください。"; font_color = 0,0,0; }; x = 0; y = 0; }; code = "instruction-1"; duration = target_response; target_button = 1; #フリーズしやすい例 };
- これを回避するためには、使わないターゲットボタンでもtarget_button = 1, 2, 3;のように書いておきます。
- 実験の開始前であれば、もう一度RUNを押せば問題ないのですが、休憩から実験再開への時に、1番しか設定していないと悲惨なことになりますので、ご注意をください(フリーズするとその時点から再開することはできません)。ただし、参加者が誤って休憩中にボタンを押すこともありえるので、最初の休憩のときに、ボタンを押さないようにお願いするか、ボタンを押しても急に再開されない(例えば何枚かシートがある)ようにしておくと良いです。
- ログファイルの設定
- ・Delimiter tabを選択
- ・Reports General EventとWarningsを選択
- ・Set Definition File defaultを選択
- ・Log/Output File Names Prefix subject name to scenario file…を選択
- ・Subject Name ID Promptを選択
- ・Logfile Patient Insert atを選択
- ・トリガーを出すための設定
- 脳波計で実際にトリガーを出すには以下の作業が必要です。サンプルファイルでは、脳波計に接続していないパソコンでも再生できるようにしていますので、以下の手順に従って、設定してください。
- ・ Scenarioでの作業
- コメントアウトを外す。
- #write_codes = true; #トリガーを出すための設定
- #pulse_width = 50; #上で指定したトリガーの幅(ms)を決める設定。
- ・Templateでの設定
- トリガーを出す文節にある二つのコメントアウトを外す。
- #port = 1;
- #トリガーを出すための設定。ポートの場所(言語科学教室のは1)を教える。
- #port_code = $PortCodeP2;
- #トリガーを出すための設定
- ・Settingsでの設定
- 1. SettingsのOutput PortsでADDをクリックし、USB-6501を選択(脳波計によってADDのあとに選択するものは異なります)
- 2. Data SourceでPort1を選択。
- 3. Testでトリガーが出るかを確認する
基本的な説明
まず、実験で刺激を呈示するためには、3つのファイルを作る必要があります:
✓サンプルファイルをダウンロードする
Frequently Asked Questions
SenNum CorRes P1 P2 SOA DOS ;
"L1" 2 "リンゴ" "バナナ" 700 500 ;
"L2" 3 "サクラ" "バナナ" 300 500 ;
/* 本番 */
TEMPLATE "template.tem" randomize {
SenNum PortCode1 PortCode2 P1 P2 CorRes ;
"L1-1" 4 8 "木が" "枯れた。 " 2 ;
"L1-2" 4 8 "花が" "咲いた。" 3 ;
};
/* P1 */
picture {
text {
caption = $P1;
};
x = 0; y = 0;
};
delta_time = 1300;
duration = 700;
port = 1;#トリガーを出すための設定
port_code = $PortCode1;#トリガーを出すための設定
/* P1-1 */
picture {
text {
caption = $P1;
};
x = 0; y = 0;
};
delta_time = 1300;
duration = 100;
port = 1; #トリガーを出すための設定
port_code = $PortCode1_1; #トリガーを出すための設定
/* P1-2 */
picture {
text {
caption = $P1;
};
x = 0; y = 0;
};
delta_time = 100;
duration = 600;
port = 1;#トリガーを出すための設定
port_code = $PortCode1_2;#トリガーを出すための設定
Original P1 P2 P3
1 11 12 13
2 11 12 13
3 21 22 23
4 21 22 23
/* P1 */
picture {
text {
caption = $P1;
};
x = 0; y = 0;
};
delta_time = 800;
duration = 700;
port = 1;
port_code = $PortCode1;
target_button = 1,2,3;
code = $SenNum;
stimulus_time_in = 0;
/* 変数:休憩に入るまでの連続試行回数 */
$Break = 30;
/* 変数:文を連続呈示回数の初期値(常にゼロ) */
$TrialNum = 0;
$TrialNum = '$TrialNum+1';
IF '$TrialNum == $Break';
$TrialNum = 0;
trial {
(省略)
};
ENDIF;
/* ITI */
trial{
trial_type = correct_response;
correct_feedback = rest;
picture {
text {
caption = " ";
};
x = 0; y = 0;
};
code = 1;
duration = 3000;
target_button = 1;
};
/* ウォームアップ */
TEMPLATE "template.tem" {
SenNum PortCode1 PortCode2 P1 P2 CorRes ;
"W-01" 14 14 "太郎君が" "泣いた。" 2 ;
"W-02" 14 14 "花子さんが" "笑った。" 3 ;
};
/* 本番 */
TEMPLATE "template.tem" randomize {
SenNum PortCode1 PortCode2 P1 P2 CorRes ;
"L1-1" 4 8 "木が" "枯れた。 " 2 ;
"L1-2" 4 8 "花が" "咲いた。" 3 ;
};
/* ITI */
trial{
incorrect_feedback = incorrect;
picture {
text {
caption = " ";
font_color = 0,0,0;
};
x = 0; y = 0;
};
delta_time = 2000;
duration = 1500;
target_button = $CorRes1;
code = $SenNum;
};
/* Incorrect */
trial {
sound {
wavefile {
filename = "wrong.wav";
};
};
code = "incorrect-1";
duration = 500;
target_button = 1,2,3;#休憩中に被験者のボタンが押されてもフリーズしないように2と3を追加してある。
}incorrect;
TEMPLATE ...(省略)
SenNum CorRes1 P1 P2 P3 P4 ;
"S-1-1-01-2" 2 "コーチが" "30分間" "選手を" "指導しました。" ;