PsychoPy Builderで複数の刺激をランダムに呈示する(その1)

      PsychoPy Builderで複数の刺激をランダムに呈示する(その1) はコメントを受け付けていません

PsychoPy Builderに関する質問を受けて,自分の勉強にもなったのでメモ。

心理学実験において,2つの画像刺激を画面に呈示して,「どっちが好き?」みたいな評価を行わせるというのは,わりとよく目にする実験事態だと思われますが,PsychoPy Builderを使ってそのような実験を実施しようとしたとき,2つの刺激をそれぞれランダムな順序で呈示するにはどうしたら良いのか,というお話です。

Fig 1. 例えばこんな実験事態

PsychoPy Builderで画像刺激をランダム呈示する際には,”条件ファイル”と呼ばれるExcelファイルを作成し,画像のファイル名(パス)を書き込みます。同時に,その画像の呈示時間や正答キーなども書き込むことで,刺激ごとの細かな制御が行えます。

Fig 2. 条件ファイルの例

今回の実験は,画面左側に12種類の画像刺激(1L.png〜12L.png),右側に12種類の画像刺激(1R.png〜12R.png)を,それぞれランダムな順序で呈示したいというものでした。刺激の呈示順序をランダムにするには,Loopの設定画面において”Conditons”に条件ファイル名を入力し,”loopType”で”random”等を選びます。しかし,条件ファイルはLoopに対して1つしか設定できないので,2つの画像をそれぞれ別の条件ファイルで制御することはできません。かといって,1つの条件ファイルに,画面の左右に呈示される画像のファイル名を入力しても,ペアごとの呈示順序がランダムになるだけで,画像の組み合わせは毎回同じになります。

Fig 3. こんな感じに条件ファイルを作っても,列ごとにランダムにしてくれない

解決策として,実験開始時に毎回,ランダムな配列の条件ファイルを作ることで,上記のような実験設定が可能になります。具体的には,codeコンポーネントを開き,”Begin Experiment”に以下のコードを貼り付けます。

import pandas as pd

df_A=pd.Series(["1L.png","2L.png","3L.png","4L.png","5L.png","6L.png","7L.png","8L.png","9L.png","10L.png","11L.png","12L.png"])
df_B=pd.Series(["1R.png","2R.png","3R.png","4R.png","5R.png","6R.png","7R.png","8R.png","9R.png","10R.png","11R.png","12R.png"])

df_Lr=df_L.sample(frac=1)
df_Rr=df_R.sample(frac=1)

df_Lr=df_Lr.reset_index(drop=True)
df_Rr=df_Rr.reset_index(drop=True)

df_cond=pd.DataFrame({'image1':df_Lr,'image2':df_Rr})
df_cond.to_csv('conditionfile.csv', index=False)

pandasはデータ分析用のライブラリで,Psychopyにデフォルトでインストールされています。コードの3行目,4行目ではpd.Series()関数で画像刺激のファイル名のセットを作成しています。6行目,7行目で使用しているsample()関数は,ランダムな行または列を抽出する関数で,引数として”frac=1″を指定することでデータ全体をランダムサンプリングする(=ランダムに並べ替える)ことになります。データにインデックスが付いたままだと,結合する際に元の順序に戻ってしまうので,9, 10行目で削除しています。最後に,pd.DataFrame()関数でランダムな順序になった2つの刺激リストを組み合わせ,to_csv()関数でcsvファイルとして保存しています。

上記のコードによって,毎回,実験が始まる際にランダムな順序の”conditionfile.csv”がディレクトリに作成されます。Loopの設定画面で”conditionfile.csv”を条件ファイルに設定するのを忘れないようにしてください。

さて,実は,今回の実験にはもう1つ厄介な要件がありました。左右に呈示される画像刺激をランダムにしたいということに加えて,数値が同じ画像刺激(1Lと1R,4Lと4R など)はペアにならないようにしたいというものです。これについては,その2の記事で解説します。