刺激を1秒呈示後,2秒のブランクがあり,刺激呈示時でもブランク時でも反応を取得したいという場合があります。例えば,単純再認テストのように,テスト刺激に対する再認判断に少し時間がかかるので反応自体は受け付けたいが,判断に時間がかかる人ほどテスト刺激を見るという事態を避けたい場合などに利用できるでしょう。
ここで気をつけたいのはこの実装には,実は2つのパターンがあることです。まず,1つ目のパターンとして,刺激とブランクのいずれかの場面で反応を取得し,反応があればすぐに次の試行へ移動するという場合です。こちらの方が簡単です。もう1つのパターンとして,刺激とブランクのいずれかの場面で反応を取得し,反応があっても,指定した時間まで試行を継続したいという場合です。こちらのパターンでは,試行中に反応しても試行を終了しないようにする と同じ挙動をSequenceで実装することになります。
最初にパターン1の方を説明します。重要なポイントは,SequenceはSequenceだけで呈示時間(timeout)や反応を受け付けられる点です(意外と見逃しがちです)。Sequenceにネストしたいくつかのコンポーネントに共通した反応取得を定義できます。例えば,Sequenceの中に以下のような2つのコンポーネントをネストさせます。それぞれ,刺激とブランクの2つです。
何も反応しなければ,2500ms経過で1試行が終わりますが,このような構成でSequenceの方に反応を定義すると,刺激,ブランクいずれの場面でも反応があれば,Sequenceが終了します。この場合,反応があれば2500ms以前に終了します。反応時間もSequenceの行に出力されます。
こちらの方は試行中に反応しても試行を終了しないようにする を応用し,Scriptsで制御します。SequenceのScriptsに以下のようなコードを書いてください。この例では,go/nogo課題を実施しています。数字が画面に出てくるので,3以外はスペースを押す(go),3はスペースを押さない(nogo)という課題です。構造としては以下のようになっていて,刺激,ブランクのいずれの段階でも反応を受け付けますが,反応してもSequenceは時間経過まで終了しません。また,この場合は反応時間が自動で取得できないので,反応時間についてもScriptsで取得するように制御しています。
//nogo反応(無反応時の出力)をデフォルトとして指定しておく
//今回は手続き上は繰り返し反応してもOKですが,1回だけ反応してほしい場合もあるので,respondenedで1回反応したらロックするように処理をしています
//無反応時の反応をデータに(仮に)入れておく
//今回はnogo反応と,条件に応じた正誤(例.nogo試行ならnogoは正答)を入れておく
this.data.response = "nogo";
if(this.parameters.type == "go"){
this.data.correct = "incorrect";
}
else if(this.parameters.type == "nogo"){
this.data.correct = "correct";
}
//反応の有無を記録する変数
let responded = false;
//スペースを押した場合
this.options.events['keypress(Space)'] = (e) =>
{
e.preventDefault();
//反応済みの場合は何もしない
if(responded)
{
return;
}
//初回の場合
else{
//反応時間を記録
this.data.responseTime = e.timeStamp - this.internals.timestamps.show;
//go反応を記録
this.data.response = "go";
//正誤判断
if(this.parameters.type == "go"){
this.data.correct = "correct";
}
else if(this.parameters.type == "nogo"){
this.data.correct = "incorrect";
}
//反応済みと記録
responded = true;
}
}
this.options.events['keypress(Space)']
の(Space)
を任意のキーに変えると対応するキーに変更できます(例えば(f)
など)。今回は反応はスペースだけですが,else{}
の中でいくつかのキーに場合分けすることもできるでしょう。
パターン2の例としてgo/nogo課題です。
©2021 Masanori Kobayashi