Go/NoGo課題 jsPsych 8.3.0
緑では押し、赤では押さない課題。スクリプトを順に読み、実行例で動きを確かめましょう。
Go/NoGo課題
緑で押し、赤では押さない
固視点の後に緑または赤の丸を1秒間提示します。緑(Go)ではスペースキーを押し、赤(NoGo)では押しません。response_ends_trial: false
により、反応の有無にかかわらず提示時間を一定にします。
終了後にCSV形式のデータを画面に表示し、gonogo-data.csv
を保存します。condition、response、correct などを確認してください。
このスクリプトの読み方
-
結果の出力
on_finish: () => { ... }全試行が終わるとCSVを画面に表示し、gonogo-data.csvを保存します。ブラウザからダウンロードを確認する場合があります。
-
教示
instruction / choices: [' ']課題のルールを示します。半角スペースを押すと開始します。
-
固視点
fixation / trial_duration: 500各刺激の前に「+」を500ミリ秒表示します。choices: 'NO_KEYS' なのでキーを受け付けません。
-
試行の並び
const originalSequence = [...] / const sequence = jsPsych.randomization.shuffle(originalSequence)緑(Go)と赤(NoGo)の条件を先に4回ずつ用意し、そのあと
shuffleで順番を擬似ランダムに並べ替えます。これにより、GoとNoGoの数は均等に保ちながら、連続して同じ色が出るのを避けやすくなります。jsPsychではjsPsych.randomization.shuffle()を使うと簡単に擬似ランダム化できます。 -
繰り返し
for (const kind of sequence) / timeline.push(...)sequenceはシャッフル後の配列です。for (const kind of sequence)は、この配列を先頭から順番に1つずつ取り出して処理するための文です。kindには各試行の状態'go'や'nogo'が順番に入ります。各回で固定のfixationを加えたあと、刺激の試行をtimeline.push({...})で追加します。つまり、全体の試行数だけ繰り返しが起こり、同じコードを何度も書かずに順番に実行できるのが特徴です。また、
kind === 'go' ? 'green' : 'red'は、kindがgoのときだけ緑、それ以外は赤を使うという条件分岐です。これで、配列の値に応じて刺激の色が自動で変わります。 -
反応時間
choices: [' '] / trial_duration: 1000 / response_ends_trial: falseスペースキーだけを記録します。押した場合も試行を早く終了せず、1秒間表示を続けます。押さなかった場合の response と rt は空欄になります。
-
正誤判定
data.correct = (kind === 'go') === (data.response === ' ')Goで押した場合、またはNoGoで押さなかった場合を正解にします。condition列に刺激の種類、correct列に正誤を記録します。
ここで
correctはtrueまたはfalseの論理値です。Go試行でスペースキーを押せばTrue、NoGo試行で押さなければTrueになります。逆に押し忘れや誤押しがあればFalseです。CSVではTrue/Falseまたはtrue/falseのように見えることがあります。 -
結果の見方
rt / condition / correctCSVには各試行ごとに
rt、condition、correctが入ります。rtは刺激が出てからキーが押されるまでの反応時間(ミリ秒)で、反応がなければ空欄になります。conditionはその試行がgoかnogoかを示し、correctは正答か不正答かをTrue/Falseで示します。これらを使って、Go試行の反応時間や正答率をまとめて分析できます。 -
読み方
CSVの instruction / fixation / stimulus 行保存されるCSVには教示と固視点も含まれます。正答率を計算するときは condition が go または nogo の行だけを使います。
サンプルコードを見る
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Go/NoGo課題 | jsPsych 8.3.0</title>
<script src="dist/jspsych.js"></script>
<script src="dist/plugin-html-keyboard-response.js"></script>
<link rel="stylesheet" href="dist/jspsych.css">
</head>
<body></body>
<script>
const jsPsych = initJsPsych({
on_finish: () => {
jsPsych.data.displayData('csv');
jsPsych.data.get().localSave('csv', 'gonogo-data.csv');
}
});
const instruction = {
type: jsPsychHtmlKeyboardResponse,
stimulus: '<p>緑色の丸が出たらスペースキーを押してください。</p>' +
'<p>赤色の丸では押さないでください。</p>' +
'<p>スペースキーで開始します。</p>',
choices: [' ']
};
const fixation = {
type: jsPsychHtmlKeyboardResponse,
stimulus: '<div style="font-size:48px">+</div>',
choices: 'NO_KEYS',
trial_duration: 500
};
const originalSequence = [
'go', 'go', 'go', 'go',
'nogo', 'nogo', 'nogo', 'nogo'
];
const sequence = jsPsych.randomization.shuffle(originalSequence);
const timeline = [instruction];
for (const kind of sequence) {
timeline.push(fixation);
timeline.push({
type: jsPsychHtmlKeyboardResponse,
stimulus: `<div style="font-size:72px;color:${kind === 'go' ? 'green' : 'red'}">●</div>`,
choices: [' '],
trial_duration: 1000,
response_ends_trial: false,
data: {
condition: kind
},
on_finish: (data) => {
data.correct = (kind === 'go') === (data.response === ' ');
}
});
}
jsPsych.run(timeline);
</script>
</html>