0

MATLAB で Stroop のような反応時間タスクを作成しましたが、パイロットの結果を見ると、コードに何か問題がある可能性があります (一致効果は予想よりもはるかに大きい)。RT を間違って記録している可能性があるので、次の設定で問題ないかどうか誰か助けてもらえますか?

任意の試行で、2 つのイベントが発生します (固視交差に続く): 最初に、ターゲット刺激が最大 3 秒間 (または応答まで) 提示され、次に参加者はボタンを押して次の試行を開始する必要があります。両方のボタン押下 (ターゲット ボタンと試行開始ボタン) の RT が記録されます。これが私のコードです:

Screen('DrawTexture', mainwin, Target);
        Screen('Flip', mainwin);
        timeStart = GetSecs;keyIsDown=0; correct=0; rt=0;
        while 1 & (GetSecs - timeStart) < 3 
                [keyIsDown, secs, keyCode] = KbCheck;
                FlushEvents('keyDown');
                if keyIsDown
                    nKeys = sum(keyCode);
                    if nKeys==1
                        if keyCode(Left)||keyCode(Right)||keyCode(Down)||keyCode(Up)
                            rt = 1000.*(GetSecs-timeStart);
                            keypressed=find(keyCode);
                            Screen('Flip', mainwin);
                            if ... [I removed some irrelevant ERROR feedback related code here]...
                        elseif keyCode(escKey)
                            ShowCursor; fclose(outfile);  Screen('CloseAll'); return
                        end
                        keyIsDown=0; keyCode=0;
                    end
                else
                    keypressed = 0; %the resp column in output is 0 if no button is pressed
                end
        end
        if keypressed == 0 %indicates timeout errors
            DrawFormattedText(mainwin, 'TOO SLOW', 'center', 'center', errorcol);
            Screen('Flip', mainwin);
            WaitSecs(1);
        end
        Screen('DrawTexture', mainwin, press5);
        Screen('Flip', mainwin);
        keyIsDown=0; timeSt = GetSecs;
        while 1
            [keyIsDown, secs, keyCode] = KbCheck;
            if keyIsDown
                if keyCode(MoveOn)
                    pause_rt = 1000.*(secs - timeSt);
                    break ;
                elseif keyCode(escKey)
                    ShowCursor;
                    fclose(outfile);
                    Screen('CloseAll');
                    return;
                end
            end
        end  

私の質問: コマンド GetSecs は呼び出されるたびに時間を取得しますよね? したがって、GetSecs - timeStart は RT を計算する適切な方法ですが、secs - timeSt (2 番目の刺激で見られるように) も同様です。2 つの方法はほとんど同じです (GetSecs を使用すると、timeStart は RT を少し過大評価する可能性があります)、それは正しいですか?

ここで心配なのは、NEXT トライアルのターゲットの RT 推定値が、PREVIOUS トライアルの 2 回目のボタン押下 RT の影響を受ける可能性があることです。その証拠はありますか?

4

1 に答える 1

1

GetSecs呼び出されるたびに時間を返すのは正しいです。ただし、エラーの原因ではありませんが、Flip 関数は関数の 2 番目の出力として刺激開始の推定値を返すため、各ウィンドウ Flip の後に GetSecs を呼び出す必要はありません。たとえば、次の代わりに:

Screen('Flip', mainwin); timeStart = GetSecs;

あなたはただ使うことができます

[~, timeStart] = Screen('Flip', mainwin);

コードに明らかな間違いは見当たりません。RT が間違っているように見える場合、速すぎるように見えますか、それとも遅すぎるように見えますか? 個人的にはKbReleaseWaitRT を集めてから Key が解放されるまで待つのですが、FlushEvents も同様のことをしているのかもしれません。

于 2017-10-31T02:50:57.737 に答える