3点識別試験におけるd’の推定
岡本安晴、2019
Pythonの準備についての説明を、このウェブサイトの後ろで行っている。
3つの刺激の内、2つが同じ刺激Aで1つが異なる刺激Bであるとき、3つの中で他の2つと異なるものとして正しくBが選ばれる(あるいは、Bが他の2つと最も異なるものとして選ばれる)頻度を調べる実験(3点識別試験:triangular test, 3AFC Oddity)のデータのベイズ分析によってAとBの感覚量の差の推定を行うプログラムを作成してみた。
信号検出理論に基づいて、刺激Aおよび刺激Bの感覚量が、それぞれ独立に平均および平均の分散の正規分布(ガウス分布)に従うものとする(サーストンモデル)。2つの刺激Aの感覚量をおよびで表し、刺激Bの感覚量をで表すと
である。
3点試験法において正しくBが選ばれるのは
が成り立つときである(Frijters et al., 1980, p. 177)。
いま、信号検出理論の慣例に倣って、感覚量の平均値の差を標準偏差を単位として表し、
とおく。このとき、正答確率(Bが選ばれる確率)と感覚量の差の関係は次式で表される(Frijters et al., 1980, eq.(1))。
式(1)において、の正負を入れ換え(をで置き換え)ても値は変わらない。したがって、感覚量の座標の向きをBの平均の方がAの平均より大きくなる方向にとってとおいても一般性は失われない。式(1)より、感覚量の差に対する正答確率が与えられる。
総試行数の実験において、Bが選ばれた試行数をkとおくと、kは試行数Nの2項分布における成功試行数と考えて、確率は
で与えられる。この確率モデル(2)に基づいての事後分布をMCMCサンプリングによって推定するプログラムを作成した。MCMCサンプリングはMH-algorithm(岡本安晴「心理学データ分析と測定」勁草書房、付録C参照)を用い、以下のスクリプトにより行っている。
for
t in range(self.n_samples):
if (t % 50) == 0:
print(msg0 + '\n{0:}/{1:}'.format(t, self.n_samples))
y = rn.normalMS(self.chain[t], self.sgm)
accpt = -1.0
if 0.0 <= y and y <= 10.0:
num = self.LL(y)
den = prev_LL
accpt = math.exp(num - den)
if rn.uni() < accpt:
self.chain[t + 1] = y
self.naccpt += 1
prev_LL = num
else:
self.chain[t + 1] = self.chain[t]
prev_LL = den
プログラムのスクリプトファイルは圧縮ファイル>FilesTriTest_NF.zipにまとめた。ダウンロードして自由に使用することができる。
ダウンロード解凍したファイルからmain.pyを選び実行する。
Windowsの場合は、端末ソフトWindows PowerShellを起動して図1のようにpython main.pyとコマンドを実行すればよい。
図1
Ubuntuの場合は、図2のようにコマンドpython3 main.pyを実行する。
図2
CentOSの場合は、図3のようにコマンドpython3.6 main.pyを実行する。
図3
プログラムを実行すると、総試行数NとBが選ばれた試行数kの値の設定が求められ、続いて出力用テキストファイル名の設定が求められる。出力用テキストファイル名は、任意のテキストファイル名である。
出力用テキストファイル名が設定されると計算が始まる。
まず、MCMCサンプリングのパラメータsgmの調整が行われ、その後その調整値sgmを用いたMCMCサンプリングが4本のマルコフ鎖によって行われる。サンプリングの途中経過は端末ディスプレイに出力されるが、WindowsのPython IDLEでの実行の場合はmultiprocessingによるサンプリングが始まると何も出力されない。このWindowsのIDLEにおける出力のない状態はmultiproseccingが終了するまで続くが、約2分ぐらいである。
MCMCサンプリングが終わると、各マルコフ鎖のトレースがプロットされる(図4)。
図4
図4のフォームの右上角のX印をクリックして閉じると、つぎにの事後分布のヒストグラムが表示される(図5)。
図5
図中、95%HPDは95%最高密度区間(Highest Posterior Density interval;岡本安晴「いまさら聞けないPythonでデータ分析」丸善出版、p. 176参照」)、Q1とQ3は第1四分位数と第3四分位数を表す。このフームを閉じるとプログラムの実行終了となる。
プログラムの実行終了後、出力ファイルを開くと、以下のようになっている
N = 100
k = 60
Rhat = 1.00
95% CI = [1.47, 2.47]
Q1 = 1.81 Median = 1.98 Q3 = 2.14
95% HPD = [1.49, 2.48]
いま、N=20、k=20で分析を行うと、図6に示す結果を得る。
図6
の事後分布が右端のところで切れているのは、事前分布の設定においての値は10以下という制約を置いているからである。これは、式(1)で与えられるとの関係において、が10を超えるとはほぼ1となる(図7)ので、分布の発散を防ぐためには10以下という制約をおいてもよいと考えられるからである。
図7
参考文献
Craven, B. J. (1992). A table of d’ M-alternative odd-man-out forced-choice procedures. Perception & Psychophysics, 1992, 51, 379-385.
Frijters, J. E. R., Kooistra, A., & Vereijken, P. F. G. (1980). Tables od d' for the triangular method and the 3-AFC signal detection procedure. Perception & Psychophysics, 1980, 27, 176-178.
Pythonの準備
Pythonの準備について説明する。使い方も含めて、<岡本安晴「いまさら聞けないPythonでデータ分析」丸善出版、序章「Pythonの準備と使い方」>、あるいはウェブサイト
http://y-okamoto-psy1949.la.coocan.jp/Python/
でも説明している。
以下では、Pythonの準備をWindowsの場合、ubuntuの場合、CentOSの場合について説明する。
Windowsの場合
Pythonはウェブサイト
からダウンロードできる。ダウンロードしてインストール開始時に「Add Python・・・」にチェックを入れておくとよい(図A.1)。
図A.1
Pythonがインストールされると、コマンドpipが使えるようになる。コマンドpipによって、必要なモジュール(ライブラリ)をインストールする。このインストールは管理者権限で行うのがよいので、端末ソフト(PowerShellなど)は管理者権限で使用できるように呼び出す(参照http://y-okamoto-psy1949.la.coocan.jp/Python/Install35win/)。
本ウェブサイトのプログラムでインストールが必要なモジュールは、numpy、scipy、matplotlibであるので、
pip install
numpy scipy matplotlib
とpipコマンドを実行すればよい。
Ubuntuの場合
Ubuntu 18.04 LTSには既にPython 2とPython 3がインストールされている。コマンドpythonでPython 2が呼び出され、コマンドpython3でPython 3が呼び出される。モジュール(ライブラリ)インストール用コマンドpipによりPython 2用にモジュールがインストールされ、pip3によりPython 3用にモジュールがインストールされる。本ウェブサイトのプログラムでインストールが必要なモジュールは、numpy、scipy、matplotlibであるので、
sudo pip3
install numpy scipy matplotlib
とコマンドpip3を実行すればよい。
pip3の実行で、pipの更新が求められたときは(図A.2)、Python3における更新であるので、pipをpip3で更新する形をとる(図A.2)。
図A.2
Ubuntu 18.04 LTSの場合、モジュールtkinterのインストールも必要である。モジュールtkinterはコマンドapt-getを
sudo apt-get
install python3-tk
と呼び出してインストールする。
CentOSの場合
CentOS 7には、既にPython 2がインストールされていて、コマンドpythonでPython2が呼び出される。Python3を呼び出すときは、まずインストールする必要がある。インストールは以下の手順で行うことができる(2019.08)。これはコマンドyumを用いる方法である。Python3の最新版をダウンロードしてmakeによりインストールする方法もあるが、yumでインストールできるPython3を用いる方が使い易い。
まず、suコマンドを実行して、以下の操作を管理者権限で行う。
yumでインストールするために、以下のコマンドでRPMをインストールしておく。
yum install
-y https://centos7.iuscommunity.org/ius-release.rpm
その後、次のコマンドでPython 3の最新版のチェックを行っておく
yum search
python36
次に、Python 3.6のインストールを行う。次のコマンドの実行でPython 3.6.8がインストールされる(2019.08)。
yum install
-y python36u python36u-libs python36u-devel python36u-pip
インストール後、Python 3をコマンドpython3.6で次のように呼び出すと、インストールされたバージョンが表示される。
python3.6 –V
上のコマンドに対しての出力は
Python 3.6.8
である(2019.08)。
次に必要なモジュールをインストールするが、まずインストール用コマンドpipの更新を行う。Python 3.6用なのでpipに3.6を付けてpip3.6によってpipを更新するという形になる。
pip3.6
install --upgrade pip
pipの更新後、本ウェブサイトのプログラムで用いられているモジュールnumpy、matplotlib、scipyのインストールを行う。
pip3.6
install numpy matplotlib scipy
また、モジュールtkinterも必要であるが、これはyumによってインストールする。
yum install
python36u-tkinter