例題18-7:続^3・Builderで行こう¶
B: 早く帰らせて下さいよー。
A: もうすぐだから待ってろっての。うーん。やはりまだBuilderを使いこなせていないというか、よくわからん部分があるなあ。
B: こんな人に教わって大丈夫なのかな。
A: いや…LoopのconditionsFile自体をset every repeat出来たら楽なんだが…。ちょっと無理っぽいな。Codeコンポーネントを使って…いや、初級編のサンプルでそれはいくらなんでも…
B: もう帰りますよー。いくらなんでも待ってられません。ていうかなんで僕が待ってなきゃいけないんですかー。
A: んーっ、もうこれでいいや! すまんすまん。これで完成にするからぱぱっと終わらせよう。
B: 本当にすぐに終わるんでしょうね?
A: もー、そりゃーもう。説明済みのコンポーネントだけで作成できて、正答、誤答がある課題で…と思うと案外ネタが限られていて、結局以下のような課題にしてみた。
B: ええと、これ、講義か何かで聞いたことがあります。なんていうんでしたっけ。
A: それこそ講義ノートを読み返して復習しておくように。で、BuilderでこのようなFlowを組んでみた。読者の皆様には実験ファイル(18-5.psyexp)と使用する条件ファイルをまとめたZipファイルを用意していますので、ダウンロードしてご利用ください( 18-5.zip )。Builderのメニューから[File]→[Open...]で開くことが出来ます。
B: ええと、Loopが二つありますね。
A: まず最初のInstructionRedLeftでは「赤だったら左、緑だったら右で反応してください」という教示を表示する。で、次のLoopで実験。続くInstructionRedRightでは逆に「赤だったら右、緑だったら左で反応してください」という教示を出して、また次のLoopで実験。最後に「ありがとうございました」を表示しておしまい。
B: 刺激の色と押すキーの組み合わせの順番が固定されていていいんですか?
A: それよ。それをスマートに出来なかなぁと思ってちょっと試行錯誤したんだが、今まで説明した範囲では無理そう。っていうか思いつかなかった。誰かここまで説明した範囲で参加者毎にランダムに順番を切り替える方法をひらめいた方が降りましたらアホな作者まで連絡してやってください。
B: お願いいたします。
2013/01/25追記 :方法がわかりました。 例題19-4 をご覧ください。
A: ま、順番を入れ替えた実験をもう一種類作って参加者毎に使い分けるのが一番だろうな。で、さっさと今回の本題に進もう。まず、trialという名前のRoutineを開いて、stimulusという名前のTextコンポーネントを開いてほしい。Colorに$stimColor、Positionに[pos, 0]という値が設定されている。そして、どちらもset every repeatに設定してある。
A: 続いてKeyboardコンポーネントだが、Stopは空欄、Force end of Routineはチェック、Allowed keysを'left', 'right'だけにしておいて、次がポイント。 Store correctをチェックするとCorrect answerという欄が出現するので条件ファイル内で正しい反応キーを入力してある列を指定する 。後述するように今回のサンプルではcorrectAnsというラベルが付いた列に正しい反応キーを入力してあるので、$correctAnsと入力しておく。
B: ふむふむ。じゃあ正答のキーがgomeitouというラベルを付けた列に入っていたら$gomeitouと入れればいいんですね?
A: それで正しいんだが、その列ラベルのセンスは…
B: 何か?
A: いや。いい。Routineの確認はこのくらいにしておいて、次はLoopの設定。まずはtrialsRedLeftの方を見てもらおうか。ここでのポイントはred-left.csvというファイルを条件ファイルとして指定していること。nRepsの下に書いてあるようにcorrectAns, stimColor, posはこの条件ファイルから読み込まれる。
A: 続いてtrialsRedRightのLoopの設定を確認。条件ファイルとしてred-right.csvというファイルが指定されている。correctAns, stimColor, posがこの条件ファイルから読み込まれるという点はtrialsRedLeftと同じ。繰り返し回数はどちらのLoopも5回で、本番の実験ではもう少し試行数が欲しいところだが、まあこれはサンプルということで。
B: あー、これ今気づいたんですけど、前回Aさんが言っていた同一RoutineがFlowの中に複数回使われている例になっているんですね。Trial Routineが2回出てきている。
A: おっと、そうそう、その通り。触れておくのを忘れていた。サンクス。正答となるキーが違うだけで刺激の配置や出現タイミングなどは全く同じだからね。こういう時はRoutineを使いまわすのが楽で良い。以上で実験のFlowとRouineの解説はおしまい。例題18-4から18-6まで見ていただいた方は後の部分はわかるはず。ていうかわからなかったら復習してください。
B: えー。Aさんが説明忘れている部分があるんじゃないんですかー?
A: 正直自信ないから気づいたら指摘してくれ。次はいったんBuilderを離れて条件ファイルの中身を確認しよう。まずはred-left.csv。直接エディタで開くとこんな感じに見える。
stimColor,pos,correctAns
red,-0.25,left
red,0.25,left
green,-0.25,right
green,0.25,right
A: あー、えーと、CSVファイルになじみがない方のために解説しておきますと、CSVファイルは通常のテキストファイルで、Excelなどのアプリケーションで言うところのひとつの行がテキストファイルでの一行に対応しています。各行内で列を区切るのはカンマです。例えば一行目を見ると「stimColor」と「pos」の間にカンマがありますので、stimColorが1列目、posが2列目ということになります。
B: あの、ふと思ったんですが、カンマを含む文を条件ファイルに入れたいばあはどうすればいいんですか?
A: CSVというのはかなり縛りが緩くてそのあたりの扱いはアプリケーションによって異なるが、PsychoPyでちょっと試してみた感じでは全体を" "でくくるといいみたいだな。"a, b, and c"みたいに。
B: じゃあ" "を含む文を条件ファイルに入れるには…
A: 変な事ばかり思いつくやつだな。ここはまだちゃんとソースを読んでないんで断言はしないが、文の先頭文字以外に"が含まれる場合は何もしなくても普通に表示されるようだ。しかし、文頭に"がある場合はちょっとうまい方法が見当たらない。\とかを付けてもダメだ。文頭に空白文字を入れておけば、空白文字のぶんだけちょっと表示がずれることに目をつむれば表示されれるが…。
B: なんだかよくわかんない仕様ですね。
A: 話が脱線したので元に戻るが、さっきのCSVファイルを見やすいようにレイアウトしなおすと以下のようになる。
stimColor |
pos |
correctAns |
red |
-0.25 |
left |
red |
0.25 |
left |
green |
-0.25 |
right |
green |
0.25 |
right |
A: ここでのポイントは、red-leftのブロックでは赤色の刺激に対して左キーを押すのが正答なのでstimColorの列がredならばcorrectAnsの列がleftになっている点だ。一方、red-right.csvではこの対応が逆になっている。
stimColor |
pos |
correctAns |
red |
-0.25 |
right |
red |
0.25 |
right |
green |
-0.25 |
left |
green |
0.25 |
left |
B: なるほど。
A: このcorrectAnsに書かれたキー名がLoopの度にKeyboardコンポーネントのCorrect answerの欄に代入される。そして参加者がキーを押したときに、押したキーの名前とCorrect answerのキーの名前が一致すれば正答、一致しなければ誤答としてデータファイルに記録される。わかったかな?
B: 多分。実行してみていいですか?
A: もちろんどうぞ。
B: じゃ、ちょっとやってみますので。
A: …B君が試している間にデータファイルについて少し確認しておきましょう。Experiment settingsでの設定によって出力されるファイルは異なりますが、とくに何も設定を変更していなければ実験ファイルを保存したディレクトリのdataというサブディレクトリに全試行の記録が出力されたCSVファイルが保存されます。これを使えば大抵の解析は出来るはずです。
A: 例えば今回のサンプルであればkey_resp.corrという列に参加者が押したキーが正しかったかどうか出力されています。key_respという部分はBuilderのRoutine内でKeyboardコンポーネントに付けた名前が入りますので、もしresponseという名前に変更していればresponse.corrという名前になります。1が正答、0が誤答ですね。key_resp.keysという列に参加者が押したキーが保存されていますので、その気になればkey_resp.corrがなくても簡単に正答率の計算は出来ます。ぶっちゃけた話、 自分でデータ分析用スクリプトを書いてゴリゴリデータ処理しちゃうような人には、今回解説した正答、誤答の記録はそれほど美味しい機能ではないと思います 。あと注目すべき出力としては、key_resp.rtに反応時間が記録されています。 単位は秒です 。ミリ秒ではないのでご注意ください。ついでにxlsx形式のファイルに実験全体のsummaryが出力されていますが、これまた正直なところ、ちょっと複雑な実験になるとこのsummaryはあまり役に立たないので結局試行毎の出力をスクリプトで処理した方が気分爽快ですね。
B: また入門講座にあるまじき偏った発言を…
A: うわっ、もう終わっていたのか。いくらなんでも早すぎないか?
B: だいたい動作の様子がわかったのでEscapeを押して中断してAさんの聞いていました。やっぱり僕が相手してあげないとAさんだけじゃろくな話にならないなあ。
A: む。B君がいないと間をとりにくいのは認める。
B: で、話したかったことはこれでもうおしまいですか? 僕はもう帰ってよろしいですかね?
A: ああ。予定外に長くなてしまったが、とりあえず最低限話しておきたいと思うところまではなんとか進んだ。PsychoPyについてはまだまだ解説すべきネタが残っているけど、ここで区切りにするべきだろう。
B: あーぁあっ。今日はすっかり予定が狂っちゃった。さて、僕は帰ります。
A: お疲れさま。ときにB君よ。
B: はい、なにか?
A: …おみやげは?
B: はぁ? おみやげ?
A: いや、実家の親父さんに呼ばれて帰省していいもの食べて帰ってきたんでしょ? 「大学でお世話になっている皆さんにぜひ」とかなんとか言って何か持たせてくれたりとかなんとかかんとか。
B: あー りー まー せー ん! あったとしてもAさん分はなし! 今日はさんざん付き合わされたんだし、こっちが何か食べさせていただきたいくらいです!
A: そうか。ま、今回はB君にずいぶんフォローしてもらったしな。じゃあおごってやるから今からなんか食いに行くか。とにかく腹が減った。
B: えっ、おごりですか。行きます行きます。いやー、そうこなくっちゃ。
A: というわけで、長かった例題18はこれでおしまい。ではでは、皆さんもお疲れさまでしたー。