JATOSはコンポーネントを組み合わせて1つの課題を作ることができます。以下のように,ID入力,Stroop課題,質問紙のようにコンポーネントに分けたうえで,1つの課題として実施ができます。具体的には,左上の「Run」を押すと,上から順番に実行されます(ウェブ実験でURLのリンクを配布する場合も同じです)。独立したコンポーネントを用意しておけば,あとは組み合わせでいろいろなバリエーションの課題を行うことができます。また,jsPsychとlab.jsをまぜてJATOSで動かすことも可能です。
ただ,複数のコンポーネントを統合して課題を行った場合には少し工夫も必要です。以下の赤で囲った部分のResultsにjsPsychで設定した情報がJSON形式で保存され,出力して解析に利用できます。ただし,出力されたファイル内には,JATOS側で指定するWorker IDなどは含まれません(JATOS上では確認できますが,それが出力はされない)。また,jsPsych内で設定をしないかぎりはタスク名などの情報も含まれないので,Rなどで一括処理する際に若干不便です。さらに,匿名の参加者によるオンライン実験の場合は良いのですが,対面実験などでID入力をしてIDで対応づけをしたい場合もあるかと思います。その場合,以下のtask00_IDでIDを入力しても,それが次のtask02_stroopには入らないのでちょっと不便です。
そこで,JATOSで複数コンポーネントからなる課題を行う場合は,JATOSが用意している関数を用いてコンポーネント間でIDの対応づけをします。なお,JATOSの関数については,JATOSのサイトのリファレンスに詳しいです。思ったよりいろいろな関数が用意されていて,使いこなすと課題の幅が広がりそうです。
さて,具体的な関数について説明します。以下のように,survey-textを使って,参加者からID入力を求めるとします(対面実験で研究者が入力することもあるかと思います)。その際に,on_finishでJATOSの関数を用いてJATOS側のWorker IDや課題名を追加し,さらに入力したIDを他のコンポーネントでも使えるようにします。
var id = {
type: 'survey-text',
questions: [
{prompt: '参加IDを記入して,「登録」を押してください', columns: 50, name: 'ID'}
],
button_label: "登録",
on_finish: function(data){
var worker_ID = jatos.workerId;
jsPsych.data.addProperties({workerID: worker_ID});
var task_name = jatos.componentProperties.title;
jsPsych.data.addProperties({taskName: task_name});
var responses = JSON.parse(data.responses);
subjectID = responses.ID;
jsPsych.data.addProperties({participantCode: subjectID});
jatos.studySessionData = subjectID;
}
}
以下,それぞれ説明します。
まず,JATOS側で自動的に生成される参加者固有IDのWorkerIDをjsPsychのdataにいれます。jatos.workerIdでWorkerIDが取得できるので,それをJSON形式にしてjsPsych.data.addPropertieで保存します。
var worker_ID = jatos.workerId;
jsPsych.data.addProperties({workerID: worker_ID});
次に,JATOSで課題設定時につけたコンポーネント名をjsPsychのdataにいれます。jatos.componentProperties.titleでコンポーネント名が取得できるので,それをJSON形式にしてjsPsych.data.addPropertieで保存します。私はWorkerIDとコンポーネント名で解析の前処理ができたので良いのですが,他にもJATOS側から情報をもってくることができます。
var task_name = jatos.componentProperties.title;
jsPsych.data.addProperties({taskName: task_name});
最後に,今度は,参加者から得た反応をresponseにいれて,そこからIDを抽出してsubjectIDにいれて保存します。そして,そのsubjectIDをjatos.studySessionDataにいれることで,これ以降に実行されるコンポーネントでsubjectIDを受け取って利用できるようにします。
var responses = JSON.parse(data.responses);
subjectID = responses.ID;
jsPsych.data.addProperties({participantCode: subjectID});
jatos.studySessionData = subjectID;
その後に実行されてるコンポーネントでも,同様にWorkerIdとコンポーネント名を保存します。そして,jatos.studySessionDataの受け取りは,jatos.studySessionDataをinput_idにいれて,それをjsPsych側で保存しています。簡単ですね。
on_finish: function(data){
var worker_ID = jatos.workerId;
jsPsych.data.addProperties({workerID: worker_ID});
var task_name = jatos.componentProperties.title;
jsPsych.data.addProperties({taskName: task_name});
var input_id = jatos.studySessionData;
jsPsych.data.addProperties({inputID: input_id});
}
ちょっと面倒な気もしなくもないですが,このような一手間をかけておくと,あとでJATOSから出力される結果をRで処理する際の処理が随分と楽になるかと思います。特にウェブ実験で参加者が多い場合には,とても楽になるかと思います。