ロゴ

渕野 裕

Fuchino Yutaka

Go/NoGo課題 jsPsych 8.3.0

緑では押し、赤では押さない課題。スクリプトを順に読み、実行例で動きを確かめましょう。

jsPsych 8.3.0 · gonogo

Go/NoGo課題

緑で押し、赤では押さない

固視点の後に緑または赤の丸を1秒間提示します。緑(Go)ではスペースキーを押し、赤(NoGo)では押しません。response_ends_trial: false により、反応の有無にかかわらず提示時間を一定にします。

終了後にCSV形式のデータを画面に表示し、gonogo-data.csv を保存します。condition、response、correct などを確認してください。

このスクリプトの読み方

  1. 結果の出力

    on_finish: () => { ... }

    全試行が終わるとCSVを画面に表示し、gonogo-data.csvを保存します。ブラウザからダウンロードを確認する場合があります。

  2. 教示

    instruction / choices: [' ']

    課題のルールを示します。半角スペースを押すと開始します。

  3. 固視点

    fixation / trial_duration: 500

    各刺激の前に「+」を500ミリ秒表示します。choices: 'NO_KEYS' なのでキーを受け付けません。

  4. 試行の並び

    const originalSequence = [...] / const sequence = jsPsych.randomization.shuffle(originalSequence)

    緑(Go)と赤(NoGo)の条件を先に4回ずつ用意し、そのあと shuffle で順番を擬似ランダムに並べ替えます。これにより、GoとNoGoの数は均等に保ちながら、連続して同じ色が出るのを避けやすくなります。jsPsychでは jsPsych.randomization.shuffle() を使うと簡単に擬似ランダム化できます。

  5. 繰り返し

    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 のときだけ緑、それ以外は赤を使うという条件分岐です。これで、配列の値に応じて刺激の色が自動で変わります。

  6. 反応時間

    choices: [' '] / trial_duration: 1000 / response_ends_trial: false

    スペースキーだけを記録します。押した場合も試行を早く終了せず、1秒間表示を続けます。押さなかった場合の response と rt は空欄になります。

  7. 正誤判定

    data.correct = (kind === 'go') === (data.response === ' ')

    Goで押した場合、またはNoGoで押さなかった場合を正解にします。condition列に刺激の種類、correct列に正誤を記録します。

    ここで correct は true または false の論理値です。Go試行でスペースキーを押せば True、NoGo試行で押さなければ True になります。逆に押し忘れや誤押しがあれば False です。CSVでは True/False または true/false のように見えることがあります。

  8. 結果の見方

    rt / condition / correct

    CSVには各試行ごとに rt、condition、correct が入ります。rt は刺激が出てからキーが押されるまでの反応時間(ミリ秒)で、反応がなければ空欄になります。condition はその試行が go か nogo かを示し、correct は正答か不正答かを True / False で示します。これらを使って、Go試行の反応時間や正答率をまとめて分析できます。

  9. 読み方

    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>

教材の目次に戻る ↑