Up

信号検出理論2選択肢強制選択課題

評定法データのベイズ分析

岡本安晴、2019.10

 

 2選択肢強制選択(2 alternative-forced-choice: 3AFC)課題の場合、ノイズ刺激とシグナル刺激が各試行において提示されるが、空間的位置を変えて(右と左、あるいは上と下など)同時に提示される場合、あるいは提示の時間順序を変えて(第1インタバルと第2インタバル)提示される場合がある。統計モデルを考えるときは、空間順序あるいは時間順序における2つの刺激提示法をともに<>あるいは<>で表してよい。<>は、刺激が空間位置で提示されているときは、例えば、左側にノイズ刺激、右側にシグナル刺激が提示されることを表し、時間順序のときは第1インタバルでノイズ刺激が提示され、第2インタバルでシグナル刺激が提示されることを表す。<>のときは、順序が逆になる。以後の説明では、例えば<>は、は第1位置、は第2位置に提示される条件を表すということにする。刺激提示条件別に判断(反応)を分類すると表1のようになる。

 

1 2AFC課題における刺激提示条件と反応(判断)。

 

シグナル刺激の提示位置として判断された位置

 

第1位置

第2位置

誤反応

正反応

正反応

誤反応

 

 いま、1AFC課題のモデルと同じく、ノイズ刺激の感覚が平均0、分散1の正規分布に従い、シグナル刺激の感覚が平均、分散の正規分布に従うものとする(等分散ガウス型モデル)。すなわち、

、 

である。

 提示条件<>および<>において恒常誤差および位置選択バイアスを考える。恒常誤差は、時間誤差あるいは空間誤差を表す。位置選択バイアスは、感覚の違いの弁別とは別に第1位置あるいは第2位置の選択を好む傾向を表す。これらのバイアスをまとめて

とおき、第2位置を基準にした第1位置へのバイアス効果として表すと、感覚およびの分布は以下のようになる。

刺激提示が<>のとき、

、 

で与えられ、

となる。

刺激提示が<>のとき、

、 

で与えられ、

となる。

 評定法における判断カテゴリの境界値(基準値)をとおく。すなわち、シグナル刺激の感覚とノイズ刺激の感覚の差の間にあるときカテゴリの判断になると考える。

のとき

観察者の判断カテゴリ

である。

 判断カテゴリの総数が4カテゴリのとき、例えば判断カテゴリは次のようになる。ここで、の値は、シグナル刺激の感覚が強いほどカテゴリの値は大きい値になるが、<>と<>ではシグナル刺激の提示位置が異なることに注意。

>のとき、

カテゴリ1: シグナルは第1位置である。

カテゴリ2: シグナルは多分第1位置である。

カテゴリ3: シグナルは多分第2位置である。

カテゴリ4: シグナルは第2位置である。

>のとき、

カテゴリ1: シグナルは第2位置である。

カテゴリ2: シグナルは多分第2位置である。

カテゴリ3: シグナルは多分第1位置である。

カテゴリ4: シグナルは第1位置である。

 

 いま、判断カテゴリの総数をとおいたとき、カテゴリ境界を

とおく。累積標準正規分布関数に対して

、 

とおいたとき、判断カテゴリがカテゴリである確率は次のように与えられる。

>のとき、カテゴリである確率は、式(1)より

となる。

>のとき、カテゴリである確率は、式(2)より

となる。

 

2 刺激提示条件に対するカテゴリ評定判断の頻度。

 

カテゴリ1

・・・

カテゴリk

・・・

カテゴリK

・・・

・・・

・・・

・・・

 

 各刺激提示条件に対するカテゴリ判断の頻度が表2のようであるとき、尤度関数は次式で与えられる。

 モデルのパラメータの数は

であるが、式(3)および式(4)の関数の引数の分数形から以下のようなパラメータ値の不定性が認められる。

 分数の分母子に同じ数を掛けても値は変わらないので、分母の値をとおいても一般性は失われない。これは、等分散モデル()あるいはより一般的には感覚の単位をであるように設定するということである。等分散モデルのもとでは

と表記される。

 また、分子におけるに同じ定数を加えても

であるので、パラメータ値を決めるためには制約条件が必要である。感覚の差の判断が原点に関して対称であるとすると、これはカテゴリ境界に次の仮定をおくことである。

 カテゴリ数が偶数 自然数)のとき

 このとき、モデルのパラメータの自由度は

となる。

 カテゴリ数が奇数 自然数)のとき

 このとき、モデルのパラメータの自由度は

となる。

 表2のデータの自由度は、表2のデータを刺激提示条件における頻度の比率データと考えれば

となる。パラメータの推定が不定とならないためには、パラメータの自由度はデータの自由度以下でなければならない。すなわち、

であるが、この条件は満たされている。

 

上記のモデルに基づくベイズ分析のためのStanスクリプトとそれを用いるPythonスクリプトを、K=2(標準的な2AFC課題)Kが奇数Kが4以上の偶数の3つの場合に分けて作成してみた。なお、Python用のStanPyStan)については、拙著<岡本安晴「いまさら聞けないPythonでデータ分析」丸善出版>で説明している。信号検出理論の基礎的な説明を拙著<岡本安晴「心理学データ分析と測定」勁草書房>あるいは<岡本安晴「計量心理学」培風館>で行っている。

 

K=2の場合(標準的な2AFC課題)

StanスクリプトリストA.1のように用意した。

 

リストA.1 K=2の場合のStanスクリプト(ファイル名SDT2AFC2Cat.stan

data {

    int n_NS[2];

    int n_SN[2];

}

parameters {

    real mu_s;

    real tau;

}

transformed parameters {

    simplex[2] p_NS;

    simplex[2] p_SN;

    p_NS[1] = Phi(-(mu_s - tau)/sqrt(2.0));

    p_NS[2] = 1 - p_NS[1];

    p_SN[1] = Phi(-(mu_s + tau)/sqrt(2.0));

    p_SN[2] = 1 - p_SN[1];

}

model {

    mu_s ~ normal(0.0, 100.0);

    tau ~ normal(0.0, 100.0);

    n_NS ~ multinomial(p_NS);

    n_SN ~ multinomial(p_SN);

}

 

リストA.1StanスクリプトファイルSDT2AFC2Cat.stanを利用するPythonスクリプトを、リストA.2のように用意した。

 

リストA.2 StanスクリプトファイルSDT2AFC2Cat.stanを利用するPythonスクリプト(ファイル名SDT2AFC2Cat.py

import numpy as np

import pystan

import matplotlib.pyplot as plt

import csv

 

flnm = input('入力データファイル名(*.csv) = ')

with open(flnm, 'r') as f:

    data = [v for v in csv.reader(f)]

 

fout_nm = input('出力テキストファイル名(*.txt) = ')

fout = open(fout_nm, 'w')

fout.write('Input Data File = {}\n'.format(flnm))

   

Freq_NS = []

Freq_NS.append(int(data[1][1]))

Freq_NS.append(int(data[1][2]))

Freq_SN = []

Freq_SN.append(int(data[2][1]))

Freq_SN.append(int(data[2][2]))

print(Freq_NS)

print(Freq_SN)

fout.write('<N, S>: {}'.format(Freq_NS))

fout.write('\n<S, N>: {}'.format(Freq_SN))

TN_NS = sum(Freq_NS)

Rating_NS = []

Rating_NS.append(Freq_NS[0])

Rating_NS.append(Freq_NS[1])

 

TN_SN = sum(Freq_SN)

Rating_SN = []

Rating_SN.append(TN_SN - Freq_SN[0])

Rating_SN.append(TN_SN - Freq_SN[1])

 

Data = {'n_NS': Rating_NS, 'n_SN': Rating_SN}

 

sm = pystan.StanModel(file = 'SDT2AFC2Cat.stan')

 

fit = sm.sampling(data = Data, n_jobs = 1)

 

print(fit)

fout.write('\n{}\n'.format(fit))

 

mu = fit['mu_s']

tau = fit['tau']

p_NS = fit['p_NS']

p_SN = fit['p_SN']

 

mu_L05 = np.percentile(mu, 5)

mu_med = np.percentile(mu, 50)

mu_U95 = np.percentile(mu, 95)

fout.write("\nd': \nMed. = {0:<.3f},  90%CI = [{1:<.3f}, {2:<.3f}".

           format(mu_med, mu_L05, mu_U95))

 

tau_L05 = np.percentile(tau, 5)

tau_med = np.percentile(tau, 50)

tau_U95 = np.percentile(tau, 95)

fout.write('\ntau: \nMed. = {0:<.3f},  90%CI ~ [{1:<.3f}, {2:<.3f}]'.

           format(tau_med, tau_L05, tau_U95))

 

p1 = np.median(p_NS, axis = 0)

p2 = np.median(p_SN, axis = 0)

p2 = [p2[1], p2[0]]

 

plt.hist(mu)

plt.xlabel("d'($\mu_S$)", fontsize = 14)

plt.title("Posterior Distribution of d'($\mu_S$)" + \

          '\nMed. = {0:<.3f},  90%CI = [{1:M<.3f}, {2:<.3f}]'.

          format(mu_med, mu_L05, mu_U95), fontsize = 16)

plt.show()

 

plt.hist(tau)

plt.xlabel(r'$\tau$', fontsize = 18)

plt.title(r'Posterior Distribution of $\tau$' + \

          '\nMed. = {0:<.3f},  90%CI = [{1:<.3f}, {2:<.3f}]'.

          format(tau_med, tau_L05, tau_U95), fontsize = 16)

plt.show()

 

xcat = [1, 2]

xlabels = ['Cat-1', 'Cat-2']

y1 = [Freq_NS[0]/TN_NS, Freq_NS[1]/TN_NS]

y2 = [Freq_SN[0]/TN_SN, Freq_SN[1]/TN_SN]

 

plt.plot(xcat, y1, 'b:', linewidth = 10, label = 'Data/<N, S>')

plt.plot(xcat, p1, 'g-', linewidth = 3, label = 'Model/<N, S>')

plt.plot(xcat, y2, 'r:', linewidth = 10, label = 'Data/<S, N>')

plt.plot(xcat, p2, 'm-', linewidth = 3,label = 'Model/<S, N>')

plt.xticks(xcat, xlabels, fontsize = 14)

plt.xlim(0.8, 2.2)

plt.xlabel('Rating Category', fontsize = 14)

plt.ylabel('Probability/Proportion', fontsize = 14)

plt.title('Rating in Conditions <N, S> and <S, N>', fontsize = 18)

plt.legend(loc = 'upper center', fontsize = 10)

plt.show()

     

fout.close()

print('\n' + fout_nm + ' was saved.\n')

 

リストA.1とリストA.2のファイルおよびサンプルデータファイルは、まとめて圧縮ファイルRating2Cat.zipとした。ダウンロード解凍すれば、自由に利用できる。

リストA.2のファイルSDT2AFC2Cat.pyを実行すると、入力データファイル名と出力データファイル名の設定が求められる(図A.1)。

A.1

 

出力データファイルは任意のテキストファイル名(ファイル拡張子.txt)であるが、入力データファイルはCSV形式のファイルとして図A.2の様式で用意する。

A.2 データファイルData2Cat.csv

 

第1行目は変数名の名前を設定するが、プログラムでは用いないので任意の文字列でよい。ただし、第1行目第1列目に文字列IDを設定すると、Excelの場合、読み込み時にエラーメッセージが表示されることがあるが、これは無視する。第2行目に刺激提示条件<NS>(例えば、左にノイズ刺激、右にシグナル刺激)におけるデータを設定する。第2列目に「シグナル刺激は第1位置である(シグナル刺激は左である)」と判断された度数、第3列目に「シグナル刺激は第2位置である(シグナル刺激は右である)」と判断された度数を設定する。第3行目に刺激提示条件<SN>(例えば、左にシグナル刺激、右にノイズ刺激)におけるデータを設定する。第2列目に「シグナル刺激は第1位置である(シグナル刺激は左である)」と判断された度数、第3列目に「シグナル刺激は第2位置である(シグナル刺激は右である)」と判断された度数を設定する。第2行目、第3行目とも、第2列目は「シグナル刺激は第1位置である(例えば、シグナル刺激は左である)」と判断された度数、第3列目は「シグナル刺激は第2位置である(例えば、シグナル刺激は右である)」と判断された度数である。データの設定が終われば、ファイル拡張子として「.csv」を選んで保存すると、CSV形式のファイルとして保存される。

A.1のように入力データファイル名と出力テキストファイル名を設定すると、計算が始まる。Stanによるサンプリングが終了すると、まず)の事後分布のヒストグラムが表示される(図A.3)。

A.3

 

事後分布の中央値がMed.=1.07590CI[0.850, 1.316]であることが示されている。

A.3のふぉむを閉じると、τの事後分布のヒストグラムが表示される(図A.4)。

A.4

 

事後分布の中央値がMed.=0.33590CI[0.106, 0.579]であることが示されている。

A.4のフォームを閉じると、各判断カテゴリの確率/比率を示すグラフが折れ線グラフで表示される(図A.5)。

A.5

 

データが破線で比率を表し、モデルが実線で各判断カテゴリの確率の中央値である。「シグナル刺激は第1位置である」判断が「Cat-1」で、「シグナル刺激は第2位置である」判断が「Cat-2」で表されている。

A.5のフォームを閉じると、プログラムの実行終了となる。実行終了後、出力ファイルを適当なエディタで開くと、以下のようになっている。

Input Data File = Data2Cat.csv

<N, S>: [30, 70]

<S, N>: [84, 16]

Inference for Stan model: anon_model_76fee9688e040eaa9d47a70bb9cf69e2.

4 chains, each with iter=2000; warmup=1000; thin=1;

post-warmup draws per chain=1000, total post-warmup draws=4000.

 

          mean se_mean     sd   2.5%    25%    50%    75%  97.5%  n_eff   Rhat

mu_s      1.08  2.6e-3   0.14    0.8   0.99   1.08   1.18   1.37   3058    1.0

tau       0.34  2.3e-3   0.14   0.06   0.24   0.34   0.43   0.62   3648    1.0

p_NS[0]    0.3  7.2e-4   0.05   0.22   0.27    0.3   0.33   0.39   4000    1.0

p_NS[1]    0.7  7.2e-4   0.05   0.61   0.67    0.7   0.73   0.78   4000    1.0

p_SN[0]   0.16  6.8e-4   0.04    0.1   0.13   0.16   0.18   0.24   2877    1.0

p_SN[1]   0.84  6.8e-4   0.04   0.76   0.82   0.84   0.87    0.9   2877    1.0

lp__    -106.0    0.02   1.04 -108.7 -106.4 -105.7 -105.3 -105.0   1800    1.0

 

Samples were drawn using NUTS at Tue Oct 22 10:30:19 2019.

For each parameter, n_eff is a crude measure of effective sample size,

and Rhat is the potential scale reduction factor on split chains (at

convergence, Rhat=1).

 

d':

Med. = 1.082,  90%CI = [0.847, 1.320

tau:

Med. = 0.339,  90%CI ~ [0.105, 0.577]

 

 

Kが奇数の場合

判断のカテゴリ数Kが奇数の場合のStanスクリプトをリストB.1のように用意した。

 

リストB.1 Kが奇数の場合のStanスクリプト(ファイル名SDT2AFCOddCat.stan

functions {

    real half_normal_lpdf(real y, real sgm){

        if (y > 0.0){

            return normal_lpdf(y | 0.0, sgm);

        } else {

            return log(0.0);

        }

    }

}

data {

    int K;

    int n_NS[K];

    int n_SN[K];

}

 

parameters {

    real mu_s;

    real tau;

    real<lower = 0.0> theta[(K - 1) / 2];

}

transformed parameters {

    real C[K - 1];

    simplex[K] p_NS;

    simplex[K] p_SN;

    C[(K - 1) / 2 + 1] = theta[1];

    C[(K - 1) / 2] = -C[(K - 1) / 2 + 1];

    for (k in 2: ((K - 1) / 2)){

        C[(K - 1) /2 + k] = C[(K - 1) / 2 + k - 1] + theta[k];

        C[(K - 1) / 2 - k + 1] = -C[(K - 1) / 2 + k];

    }

    p_NS[1] = Phi((C[1] - (mu_s - tau))/sqrt(2.0));

    p_NS[K] = 1 - Phi((C[K - 1] - (mu_s - tau))/sqrt(2.0));

 

    for (k in 2:(K-1)) {

        p_NS[k] = Phi((C[k] - (mu_s - tau))/sqrt(2.0)) -

                   Phi((C[k - 1] - (mu_s - tau))/sqrt(2.0));

    }

 

    p_SN[1] = Phi((C[1] - (mu_s + tau))/sqrt(2.0));

    p_SN[K] = 1 - Phi((C[K - 1] - (mu_s + tau))/sqrt(2.0));

   

    for (k in 2:(K-1)) {

        p_SN[k] = Phi((C[k] - (mu_s + tau))/sqrt(2.0)) -

                   Phi((C[k - 1] - (mu_s + tau))/sqrt(2.0));

    }

 

}

model {

    for (k in 1:((K - 1) / 2)) {

        theta[k] ~ half_normal(1000.0);

    }

    mu_s ~ normal(0.0, 100.0);

    tau ~ normal(0.0, 100.0);

    n_NS ~ multinomial(p_NS);

    n_SN ~ multinomial(p_SN);

}

 

リストB.1StanスクリプトSDT2AFCOddCat.stanを利用するPythonスクリプトを、リストB.2のように用意した。

 

リストB.2 StanスクリプトSDT2AFCOddCat.stanを利用するPythonスクリプト(ファイル名SDT2AFCOddCat.py

import numpy as np

import pystan

import matplotlib.pyplot as plt

import csv

 

flnm = input('入力データファイル(*.csv) = ')

with open(flnm, 'r') as f:

    data = [v for v in csv.reader(f)]

fout_nm = input('出力テキストファイル名 = ')

fout = open(fout_nm, 'w')

fout.write('\nInput Data File = {}\n'.format(flnm))

 

K = len(data[0]) - 1

print('K = ', K)

if (K % 2) == 0:

    print('カテゴリ数 K は奇数でなければならない!')

    import sys

    sys.exit()

   

Freq_NS = []

for k in range(K):

    Freq_NS.append(int(data[1][1 + k]))

Freq_SN = []

for k in range(K):

    Freq_SN.append(int(data[2][1 + k]))

print(Freq_NS)

print(Freq_SN)

fout.write('\n<N, S>\n{}\n'.format(Freq_NS))

fout.write('\n<S, N>\n{}\n'.format(Freq_SN))          

TN_NS = sum(Freq_NS)

Rating_NS = Freq_NS

TN_SN = sum(Freq_SN)

Rating_SN = []

for k in range(K):

    Rating_SN.append(Freq_SN[K - 1 - k])

 

 

Data = {'K': K, 'n_NS': Rating_NS, 'n_SN': Rating_SN}

 

sm = pystan.StanModel(file = 'SDT2AFCOddCat.stan')

 

fit = sm.sampling(data = Data, n_jobs = 1)

 

print(fit)

fout.write('\n{}\n'.format(fit))

 

mu = fit['mu_s']

tau = fit['tau']

C = fit['C']

p_NS = fit['p_NS']

p_SN = fit['p_SN']

 

mu_L05 = np.percentile(mu, 5)

mu_med = np.percentile(mu, 50)

mu_U95 = np.percentile(mu, 95)

fout.write("\nd':\nMedian = {0:<.3f},   90%CI = [{1:<.3f}, {2:<.3f}]\n".

           format(mu_med, mu_L05, mu_U95))

 

 

tau_L05 = np.percentile(tau, 5)

tau_med = np.percentile(tau, 50)

tau_U95 = np.percentile(tau, 95)

fout.write('\ntau:\nMedian = {0:<.3f},   90%CI = [{1:<.3f}, {2:<.3f}]\n'.

           format(tau_med, tau_L05, tau_U95))

 

C_L05 = np.zeros(K-1)

C_med = np.zeros(K-1)

C_U95 = np.zeros(K-1)

for k in range(K-1):

    C_L05[k] = np.percentile(C.T[k], 5)

    C_med[k] = np.percentile(C.T[k], 50)

    C_U95[k] = np.percentile(C.T[k], 95)

for k in range(K-1):

    fout.write(('\nC[{0}]:\n' + \

               'Median = {1:<.3f},   90%CI = [{2:<.3f}, {3:<.3f}]\n').

               format(k+1, C_med[k], C_L05[k], C_U95[k]))

 

plt.hist(mu)

plt.xlabel("d'($\mu_S$)", fontsize = 14)

plt.title("Posterior Distribution of d'($\mu_S$)" + \

          '\nMed. = {0:<.3f},   90%CI = [{1:<.3f}, {2:<.3f}]'.

          format(mu_med, mu_L05, mu_U95), fontsize = 16)

plt.show()

 

plt.hist(tau)

plt.xlabel(r'$\tau$', fontsize = 18)

plt.title(r'Posterior Distribution of $\tau$' + \

          '\nMed. = {0:<.3f},   90%CI = [{1:<.3f}, {2:<.3f}]'.

          format(tau_med, tau_L05, tau_U95), fontsize = 16)

plt.show()

 

for k in range(K-1):

    plt.hist(C.T[k], label = 'C{}'.format(k+1))

plt.title('Posterior Distributions of Category Boundaries', fontsize = 18)

plt.legend()

plt.show()

 

p1 = np.median(p_NS, axis = 0)

p2 = np.median(p_SN, axis = 0)

p2 = np.flip(p2)

 

xcat = np.arange(1, K+0.1, 1)

xlabels = ['{}'.format(int(v)) for v in xcat]

y1 = []

y2 = []

for k in range(K):

    y1.append(Freq_NS[k]/TN_NS)

    y2.append(Freq_SN[k]/TN_SN)

   

plt.plot(xcat, y1, 'b--', linewidth = 3, alpha = 0.7, label = 'Data/<N, S>')

plt.plot(xcat, p1, 'g-', linewidth = 3, alpha = 0.7, label = 'Model/<N, S>')

plt.plot(xcat, y2, 'r--', linewidth = 3, alpha = 0.7, label = 'Data/<S, N>')

plt.plot(xcat, p2, 'm-', linewidth = 3, alpha = 0.7, label = 'Model/<S, N>')

 

plt.xticks(xcat, xlabels, fontsize = 14)

plt.xlabel('Rating Category', fontsize = 14)

plt.ylabel('Probability/Proportion', fontsize = 14)

plt.title('Ratings in Conditions <N, S> and <S, N>', fontsize = 18)

plt.legend(loc = 'upper center', fontsize = 10)

plt.show()

 

fout.close()

print('\n{} was saved.\n'.format(fout_nm))

 

リストB.1とリストB.2のファイルおよびサンプルデータファイルは、まとめて圧縮ファイルRatingOddCat.zipとした。ダウンロード解凍すれば、自由に利用できる。

リストB.2のファイルSDT2AFCOddCat.pyを実行すると、入力データファイル名と出力データファイル名の設定が求められる(図B.1)。

B.1

 

出力データファイルは任意のテキストファイル名(ファイル拡張子.txt)であるが、入力データファイルはCSV形式のファイルとして図B.2の様式で用意する。

B.2 データファイルData3Cat.csv

 

第1行目は変数名の名前を設定するが、プログラムでは用いないので任意の文字列でよい。ただし、第1行目第1列目に文字列IDを設定すると、Excelの場合、読み込み時にエラーメッセージが表示されることがあるが、これは無視する。第2行目に刺激提示条件<NS>(例えば、左にノイズ刺激、右にシグナル刺激)におけるデータを設定する。第2列目に「シグナルは第1位置である(シグナル刺激は左である)」と判断された度数、第3列目に「わからない」と判断された度数、第4列目に「シグナル刺激は第2位置である(シグナル刺激は右である)」と判断された度数を設定する。第3行目に刺激提示条件<SN>(例えば、左にシグナル刺激、右にノイズ刺激)におけるデータを設定する。第2列目に「シグナル刺激は第1位置である(シグナル刺激は左である)」と判断された度数、第3列目に「わからない」、第4列目に「シグナル刺激は第2位置である(シグナル刺激は右である)」と判断された度数を設定する。第2行目、第3行目とも、第2列目は「シグナル刺激は第1位置である(例えば、シグナル刺激は左である)」と判断された度数、第3列目は「わからない」、第4列目は「シグナル刺激は第2位置である(例えば、シグナル刺激は右である)」と判断された度数である。データの設定が終われば、ファイル拡張子として「.csv」を選んで保存すると、CSV形式のファイルとして保存される。

B.1のように入力データファイル名と出力テキストファイル名を設定すると、計算が始まる。Stanによるサンプリングが終了すると、まず)の事後分布のヒストグラムが表示される(図B.3)。

B.3

 

事後分布の中央値がMed.=1.05590CI[0.834, 1.262]であることが示されている。

B.3のふぉむを閉じると、τの事後分布のヒストグラムが表示される(図B.4)。

B.4

 

事後分布の中央値がMed.=0.40390CI[0.194, 0.614]であることが示されている。

B.4のフォームを閉じると、カテゴリ境界の事後分布が示される(図B.5)。

B.5

 

B.5のフォームを閉じると、各判断カテゴリの確率/比率を示すグラフが折れ線グラフで表示される(図B.6)。

B.6

 

データが破線で比率を表し、モデルが実線で各判断カテゴリの確率の中央値である。「シグナルは第1位置である」判断が「カテゴリ1」で、「わからない」判断が「カテゴリ2」、「シグナルは第2位置である」判断が「カテゴリ3」で表されている。

B.6のフォームを閉じると、プログラムの実行終了となる。実行終了後、出力ファイルを適当なエディタで開くと、以下のようになっている。

Input Data File = Data3Cat.csv

 

<N, S>

[20, 26, 54]

 

<S, N>

[77, 12, 11]

 

Inference for Stan model: anon_model_4f4c02dce251e874ae19399d5b4bfa08.

4 chains, each with iter=2000; warmup=1000; thin=1;

post-warmup draws per chain=1000, total post-warmup draws=4000.

 

           mean se_mean     sd   2.5%    25%    50%    75%  97.5%  n_eff   Rhat

mu_s       1.05  2.0e-3   0.13    0.8   0.97   1.05   1.14    1.3   4000    1.0

tau         0.4  2.1e-3   0.13   0.15   0.32    0.4   0.49   0.65   3685    1.0

theta[0]   0.46  1.2e-3   0.07   0.33   0.41   0.46    0.5    0.6   3380    1.0

C[0]      -0.46  1.2e-3   0.07   -0.6   -0.5  -0.46  -0.41  -0.33   3380    1.0

C[1]       0.46  1.2e-3   0.07   0.33   0.41   0.46    0.5    0.6   3380    1.0

p_NS[0]    0.22  6.2e-4   0.04   0.15   0.19   0.22   0.24    0.3   4000    1.0

p_NS[1]    0.23  5.3e-4   0.03   0.17    0.2   0.23   0.25    0.3   4000    1.0

p_NS[2]    0.55  7.7e-4   0.05   0.46   0.52   0.55   0.59   0.65   4000    1.0

p_SN[0]    0.09  4.9e-4   0.02   0.05   0.07   0.09   0.11   0.15   2583    1.0

p_SN[1]    0.15  4.4e-4   0.03    0.1   0.13   0.15   0.17   0.21   4000    1.0

p_SN[2]    0.76  6.9e-4   0.04   0.67   0.73   0.76   0.79   0.83   3707    1.0

lp__     -181.4    0.03   1.25 -184.6 -181.9 -181.0 -180.4 -179.9   1942    1.0

 

Samples were drawn using NUTS at Wed Oct 23 11:33:50 2019.

For each parameter, n_eff is a crude measure of effective sample size,

and Rhat is the potential scale reduction factor on split chains (at

convergence, Rhat=1).

 

d':

Median = 1.055,   90%CI = [0.834, 1.262]

 

tau:

Median = 0.403,   90%CI = [0.194, 0.614]

 

C[1]:

Median = -0.455,   90%CI = [-0.575, -0.353]

 

C[2]:

Median = 0.455,   90%CI = [0.353, 0.575]

 

 

次に、判断カテゴリ数が5個の場合(K=5)の例を示す。

データ例を図B.7に示す。

B.7 データファイル名Data5Cat.csv

 

プログラムを起動して、図B.8のように入力データファイル名と出力データファイル名を設定する。

B.8

 

入力データファイル名と出力データファイル名を設定すると計算が始まり、Stanによるサンプリングが終了すると、まずd’の事後分布が表示される(図B.9)。

B.9

 

B.9のフォームを閉じると、τの事後分布が表示される(図B.10)。

B.10

 

B.10のフォームを閉じると、カテゴリ境界の事後分布が表示される(図B.11)。

B.11

 

B.11のフォームを閉じると、判断カテゴリの比率と確率が表示される(図B.12)。

B.12

 

データが破線で比率を表し、モデルが実線で各判断カテゴリの確率の中央値である。例えば、「シグナルは第1位置である」判断が「カテゴリ1」、「たぶんシグナルは第1位置である」判断が「カテゴリ2」、「わからない」判断が「カテゴリ3」、「たぶんシグナルは第2位置である」判断が「カテゴリ4」、「シグナルは第2位置である」判断が「カテゴリ5」で表されている。

B.12のフォームを閉じると、プログラムの実行終了となる。実行終了後、出力ファイルをテキストエディタで開くと以下のようになっている。

 

Input Data File = Data5Cat.csv

 

<N, S>

[21, 10, 5, 18, 46]

 

<S, N>

[66, 10, 7, 12, 5]

 

Inference for Stan model: anon_model_4f4c02dce251e874ae19399d5b4bfa08.

4 chains, each with iter=2000; warmup=1000; thin=1;

post-warmup draws per chain=1000, total post-warmup draws=4000.

 

           mean se_mean     sd   2.5%    25%    50%    75%  97.5%  n_eff   Rhat

mu_s       0.93  1.9e-3   0.12   0.68   0.85   0.93   1.01   1.17   4000    1.0

tau        0.38  1.9e-3   0.12   0.16    0.3   0.38   0.46   0.62   4000    1.0

theta[0]   0.14  5.9e-4   0.04   0.08   0.11   0.14   0.16   0.22   3924    1.0

theta[1]   0.58  1.1e-3   0.07   0.44   0.53   0.58   0.62   0.72   4000    1.0

C[0]      -0.72  1.2e-3   0.08  -0.87  -0.77  -0.72  -0.66  -0.57   4000    1.0

C[1]      -0.14  5.9e-4   0.04  -0.22  -0.16  -0.14  -0.11  -0.08   3924    1.0

C[2]       0.14  5.9e-4   0.04   0.08   0.11   0.14   0.16   0.22   3924    1.0

C[3]       0.72  1.2e-3   0.08   0.57   0.66   0.72   0.77   0.87   4000    1.0

p_NS[0]    0.19  5.6e-4   0.04   0.12   0.16   0.19   0.21   0.26   4000    1.0

p_NS[1]    0.13  2.6e-4   0.02    0.1   0.12   0.13   0.14   0.16   4000    1.0

p_NS[2]    0.07  3.1e-4   0.02   0.04   0.06   0.07   0.09   0.11   3901    1.0

p_NS[3]    0.16  3.2e-4   0.02   0.12   0.15   0.16   0.17    0.2   4000    1.0

p_NS[4]    0.45  7.6e-4   0.05   0.36   0.42   0.45   0.48   0.55   4000    1.0

p_SN[0]    0.08  3.4e-4   0.02   0.04   0.06   0.08   0.09   0.12   3837    1.0

p_SN[1]    0.08  2.0e-4   0.01   0.05   0.07   0.08   0.08    0.1   4000    1.0

p_SN[2]    0.05  2.4e-4   0.01   0.03   0.04   0.05   0.06   0.08   3703    1.0

p_SN[3]    0.13  3.0e-4   0.02    0.1   0.12   0.13   0.14   0.17   4000    1.0

p_SN[4]    0.66  7.2e-4   0.05   0.57   0.63   0.66   0.69   0.75   4000    1.0

lp__     -270.3    0.03   1.41 -273.8 -271.0 -270.0 -269.3 -268.5   2250    1.0

 

Samples were drawn using NUTS at Wed Oct 23 12:01:07 2019.

For each parameter, n_eff is a crude measure of effective sample size,

and Rhat is the potential scale reduction factor on split chains (at

convergence, Rhat=1).

 

d':

Median = 0.927,   90%CI = [0.727, 1.131]

 

tau:

Median = 0.383,   90%CI = [0.190, 0.579]

 

C[1]:

Median = -0.715,   90%CI = [-0.845, -0.592]

 

C[2]:

Median = -0.136,   90%CI = [-0.206, -0.086]

 

C[3]:

Median = 0.136,   90%CI = [0.086, 0.206]

 

C[4]:

Median = 0.715,   90%CI = [0.592, 0.845]

 

 

Kが4以上の偶数の場合

判断のカテゴリ数Kが4以上の偶数である場合のStanスクリプトをリストC.1のように用意した。

 

リストC.1 Kが4以上の偶数の場合のStanスクリプト(ファイル名SDT2AFCEvenCat.stan

functions {

    real half_normal_lpdf(real y, real sgm){

        if (y > 0.0){

            return normal_lpdf(y | 0.0, sgm);

        } else {

            return log(0.0);

        }

    }

}

data {

    int K;

    int n_NS[K];

    int n_SN[K];

}

 

parameters {

    real mu_s;

    real tau;

    real<lower = 0.0> theta[K/2 - 1];

}

transformed parameters {

    real C[K - 1];

    simplex[K] p_NS;

    simplex[K] p_SN;

    C[K/2] = 0.0;

    for (k in 1: (K/2 -1)){

        C[K/2 + k] = C[K/2 + k - 1] + theta[k];

        C[K/2 - k] = -C[K/2 + k];

    }

    p_NS[1] = Phi((C[1] - (mu_s - tau))/sqrt(2.0));

    p_NS[K] = 1 - Phi((C[K - 1] - (mu_s - tau))/sqrt(2.0));

 

    for (k in 2:(K-1)) {

        p_NS[k] = Phi((C[k] - (mu_s - tau))/sqrt(2.0)) -

                   Phi((C[k - 1] - (mu_s - tau))/sqrt(2.0));

    }

 

    p_SN[1] = Phi((C[1] - (mu_s + tau))/sqrt(2.0));

    p_SN[K] = 1 - Phi((C[K - 1] - (mu_s + tau))/sqrt(2.0));

   

    for (k in 2:(K-1)) {

        p_SN[k] = Phi((C[k] - (mu_s + tau))/sqrt(2.0)) -

                   Phi((C[k - 1] - (mu_s + tau))/sqrt(2.0));

    }

}

model {

    for (k in 1:(K/2 - 1)) {

        theta[k] ~ half_normal(1000.0);

    }

    mu_s ~ normal(0.0, 100.0);

    tau ~ normal(0.0, 100.0);

    n_NS ~ multinomial(p_NS);

    n_SN ~ multinomial(p_SN);

}

 

リストC.1StanスクリプトSDT2AFCEvenCat.stanを利用するPythonスクリプトを、リストC.2のように用意した。

 

リストC.2 StanスクリプトSDT2AFCEvenCat.stanを利用するPythonスクリプト(ファイル名SDT2AFCEvenCat.py

import numpy as np

import pystan

import matplotlib.pyplot as plt

import csv

import pickle

 

flnm = input('入力データファイル名(*.csv) = ')

with open(flnm, 'r') as f:

    data = [v for v in csv.reader(f)]

 

fout_nm = input('出力テキストファイル名 = ')

fout = open(fout_nm, 'w')

fout.write('Input Data File = {}\n'.format(flnm))

 

K = len(data[0]) - 1

print('K = ', K)

if (K % 2) == 1:

    print('評定カテゴリ数は偶数でなければならない!')

    import sys

    sys.exit()

   

Freq_NS = []

for k in range(K):

    Freq_NS.append(int(data[1][1 + k]))

Freq_SN = []

for k in range(K):

    Freq_SN.append(int(data[2][1 + k]))

print(Freq_NS)

print(Freq_SN)

fout.write('\n<N, S>\n{}\n'.format(Freq_NS))

fout.write('\n<S, N>\n{}\n'.format(Freq_SN))  

TN_NS = sum(Freq_NS)

Rating_NS = Freq_NS

print(Rating_NS)

TN_SN = sum(Freq_SN)

Rating_SN = []

for k in range(K):

    Rating_SN.append(Freq_SN[K - 1 - k])

 

Data = {'K': K, 'n_NS': Rating_NS, 'n_SN': Rating_SN}

 

sm = pystan.StanModel(file = 'SDT2AFCEvenCat.stan')

 

fit = sm.sampling(data = Data, n_jobs = 1)

 

print(fit)

fout.write('\n{}\n'.format(fit))

 

mu = fit['mu_s']

tau = fit['tau']

C = fit['C']

p_NS = fit['p_NS']

p_SN = fit['p_SN']

 

mu_L05 = np.percentile(mu, 5)

mu_med = np.percentile(mu, 50)

mu_U95 = np.percentile(mu, 95)

fout.write("\nd':\nMedian = {0:<.3f},   90%CI = [{1:<.3f}, {2:<.3f}]\n".

           format(mu_med, mu_L05, mu_U95))

 

tau_L05 = np.percentile(tau, 5)

tau_med = np.percentile(tau, 50)

tau_U95 = np.percentile(tau, 95)

fout.write('\ntau:\nMedian = {0:<.3f},   90%CI = [{1:<.3f}, {2:<.3f}]\n'.

           format(tau_med, tau_L05, tau_U95))

 

C_L05 = np.zeros(K-1)

C_med = np.zeros(K-1)

C_U95 = np.zeros(K-1)

for k in range(K-1):

    C_L05[k] = np.percentile(C.T[k], 5)

    C_med[k] = np.percentile(C.T[k], 50)

    C_U95[k] = np.percentile(C.T[k], 95)

for k in range(K-1):

    fout.write(('\nC[{0}]:\n' + \

               'Median = {1:<.3f},   90%CI = [{2:<.3f}, {3:<.3f}]\n').

               format(k+1, C_med[k], C_L05[k], C_U95[k]))

 

plt.hist(mu)

plt.xlabel("d'($\mu_S$)", fontsize = 14)

plt.title("Posterior Distribution of d'($\mu_S$)" + \

          '\nMed. = {0:<.3f},   90%CI = [{1:<.3f}, {2:<.3f}]'.

          format(mu_med, mu_L05, mu_U95), fontsize = 16)

plt.show()

 

plt.hist(tau)

plt.xlabel(r'$\tau$', fontsize = 18)

plt.title(r'Posterior Distribution of $\tau$' + \

          '\nMed. = {0:<.3f},   90%CI = [{1:<.3f}, {2:<.3f}]'.

          format(tau_med, tau_L05, tau_U95), fontsize = 16)

plt.show()

 

for k in range(K-1):

    if k + 1 != K/2:

        plt.hist(C.T[k], label = 'C{}'.format(k+1))

plt.title('Posterior Distributions of Category Boundaries' + \

          '\nC{} = 0 fixed'.format(K//2), fontsize = 16)

plt.legend(loc = 'lower center')

plt.show()

 

xcat = np.arange(1, K+0.1, 1)

xlabels = ['{}'.format(int(v)) for v in xcat]

y1 = []

y2 = []

for k in range(K):

    y1.append(Freq_NS[k]/TN_NS)

    y2.append(Freq_SN[k]/TN_SN)

 

p1 = np.median(p_NS, axis = 0)

p2 = np.median(p_SN, axis = 0)

p2 = np.flip(p2)

 

plt.plot(xcat, y1, 'b--', linewidth = 3, alpha = 0.7, label = 'Data/<N, S>')

plt.plot(xcat, p1, 'g-', linewidth = 3, alpha = 0.7, label = 'Model/<N, S>')

plt.plot(xcat, y2, 'r--', linewidth = 3, alpha = 0.7, label = 'Data/<S, N>')

plt.plot(xcat, p2, 'm-', linewidth = 3, alpha = 0.7, label = 'Model/<S, N>')

 

plt.xticks(xcat, xlabels, fontsize = 14)

plt.xlabel('Rating Category', fontsize = 14)

plt.ylabel('Probability/Proportion', fontsize = 14)

plt.title('Ratings in Conditions <N, S> and <S, N>', fontsize = 18)

plt.legend(loc = 'upper center', fontsize = 10)

plt.show()

 

fout.close()

print('\n{} was saved.\n'.format(fout_nm))

 

リストC.1とリストC.2のファイルおよびサンプルデータファイルは、まとめて圧縮ファイルRatingEvenCat.zipとした。ダウンロード解凍すれば、自由に利用できる。

リストC.2のファイルSDT2AFCEvenCat.pyを実行すると、入力データファイル名と出力データファイル名の設定が求められる(図C.1)。

C.1

 

出力データファイルは任意のテキストファイル名(ファイル拡張子.txt)であるが、入力データファイルはCSV形式のファイルとして図C.2の様式で用意する。

C.2 データファイルData4Cat.csv

 

第1行目は変数名の名前を設定するが、プログラムでは用いないので任意の文字列でよい。ただし、第1行目第1列目に文字列IDを設定すると、Excelの場合、読み込み時にエラーメッセージが表示されることがあるが、これは無視する。第2行目に刺激提示条件<NS>(例えば、左にノイズ刺激、右にシグナル刺激)におけるデータを設定する。第2列目に「シグナルは第1位置である(シグナル刺激は左である)」と判断された度数、第3列目に「多分シグナル刺激は第1位置である(多分シグナル刺激は左である)」と判断された度数、第4列目に「多分シグナル刺激は第2位置である(多分シグナル刺激は右である)」と判断された度数、第5列目に「シグナル刺激は第2位置である(シグナル刺激は右である)」と判断された度数を設定する。第3行目に刺激提示条件<SN>(例えば、左にシグナル刺激、右にノイズ刺激)におけるデータを設定する。第2列目に「シグナル刺激は第1位置である(シグナル刺激は左である)」と判断された度数、第3列目に「多分シグナル刺激は左である」と判断された度数、第4列目に「多分シグナル刺激は第2位置である(多分シグナル刺激は右である)」と判断された度数、第5列目に「シグナル刺激は第2位置である(シグナル刺激は右である)」と判断された度数を設定する。第2行目、第3行目とも、第2列目は「シグナル刺激は第1位置である(例えば、シグナル刺激は左である)」と判断された度数、第3列目は「多分シグナル刺激は第1位置である(多分シグナル刺激は左である)」と判断された度数、第4列目は「多分シグナル刺激は第2位置である(多分シグナル刺激は右である)」と判断された度数、第5列目は「シグナル刺激は第2位置である(シグナル刺激は右である)」と判断された度数である。データの設定が終われば、ファイル拡張子として「.csv」を選んで保存すると、CSV形式のファイルとして保存される。

C.1のように入力データファイル名と出力テキストファイル名を設定すると、計算が始まる。Stanによるサンプリングが終了すると、まず)の事後分布のヒストグラムが表示される(図C.3)。

C.3

 

事後分布の中央値がMed.=1.05290CI[0.849, 1.264]であることが示されている。

C.3のふぉむを閉じると、τの事後分布のヒストグラムが表示される(図C.4)。

C.4

 

事後分布の中央値がMed.=0.43390CI[0.227, 0.631]であることが示されている。

C.4のフォームを閉じると、カテゴリ境界の事後分布が示される(図C.5)。

C.5

 

カテゴリ境界C2=0は制約条件として固定されているので、C2のヒストグラムは表示されていない、

C.5のフォームを閉じると、各判断カテゴリの確率/比率を示すグラフが折れ線グラフで表示される(図C.6)。

C.6

 

データが破線で比率を表し、モデルが実線で各判断カテゴリの確率の中央値である。「シグナル刺激は第1位置である」判断が「カテゴリ1」、「多分シグナル刺激は第1位置である」判断が「カテゴリ2」、「多分シグナル刺激は第2位置である」判断が「カテゴリ3」、「シグナル刺激は第2位置である」判断が「カテゴリ4」で表されている。

C.6のフォームを閉じると、プログラムの実行終了となる。実行終了後、出力ファイルを適当なエディタで開くと、以下のようになっている。

Input Data File = Data4Cat.csv

 

<N, S>

[24, 9, 12, 55]

 

<S, N>

[74, 13, 7, 6]

 

Inference for Stan model: anon_model_f2c4de04275e32f42265169574310b77.

4 chains, each with iter=2000; warmup=1000; thin=1;

post-warmup draws per chain=1000, total post-warmup draws=4000.

 

           mean se_mean     sd   2.5%    25%    50%    75%  97.5%  n_eff   Rhat

mu_s       1.05  2.0e-3   0.12   0.81   0.97   1.05   1.14    1.3   4000    1.0

tau        0.43  2.0e-3   0.12   0.19   0.35   0.43   0.52   0.68   4000    1.0

theta[0]   0.51  1.1e-3   0.07   0.38   0.46    0.5   0.55   0.65   4000    1.0

C[0]      -0.51  1.1e-3   0.07  -0.65  -0.55   -0.5  -0.46  -0.38   4000    1.0

C[1]        0.0     0.0    0.0    0.0    0.0    0.0    0.0    0.0   4000    nan

C[2]       0.51  1.1e-3   0.07   0.38   0.46    0.5   0.55   0.65   4000    1.0

p_NS[0]    0.22  6.0e-4   0.04   0.15   0.19   0.21   0.24   0.29   4000    1.0

p_NS[1]    0.12  2.5e-4   0.02   0.09   0.11   0.12   0.13   0.15   4000    1.0

p_NS[2]    0.14  3.1e-4   0.02    0.1   0.12   0.14   0.15   0.18   4000    1.0

p_NS[3]    0.53  7.6e-4   0.05   0.44    0.5   0.53   0.56   0.63   4000    1.0

p_SN[0]    0.08  3.8e-4   0.02   0.04   0.07   0.08    0.1   0.13   3404    1.0

p_SN[1]    0.07  1.9e-4   0.01   0.05   0.06   0.07   0.07   0.09   4000    1.0

p_SN[2]     0.1  2.7e-4   0.02   0.07   0.09    0.1   0.11   0.13   4000    1.0

p_SN[3]    0.75  6.5e-4   0.04   0.67   0.73   0.76   0.78   0.83   4000    1.0

lp__     -209.9    0.03   1.22 -213.0 -210.4 -209.6 -209.1 -208.5   1661    1.0

 

Samples were drawn using NUTS at Wed Oct 23 15:01:23 2019.

For each parameter, n_eff is a crude measure of effective sample size,

and Rhat is the potential scale reduction factor on split chains (at

convergence, Rhat=1).

 

d':

Median = 1.052,   90%CI = [0.849, 1.264]

 

tau:

Median = 0.433,   90%CI = [0.227, 0.631]

 

C[1]:

Median = -0.503,   90%CI = [-0.623, -0.396]

 

C[2]:

Median = 0.000,   90%CI = [0.000, 0.000]

 

C[3]:

Median = 0.503,   90%CI = [0.396, 0.623]

 

 

次に、判断カテゴリ数が6個の場合(K=6)の例を示す。

データ例を図C.7に示す。

C.7 データファイル名Data6Cat.csv

 

プログラムを起動して、図C.8のように入力データファイル名と出力データファイル名を設定する。

C.8

 

入力データファイル名と出力データファイル名を設定すると計算が始まり、Stanによるサンプリングが終了すると、まずd’の事後分布が表示される(図C.9)。

C.9

 

C.9のフォームを閉じると、τの事後分布が表示される(図C.10)。

C.10

 

C.10のフォームを閉じると、カテゴリ境界の事後分布が表示される(図C.11)。

C.11

 

C.11のフォームを閉じると、判断カテゴリの比率と確率が表示される(図C.12)。

C.12

 

データが破線で比率を表し、モデルが実線で各判断カテゴリの確率の中央値である。例えば、「確かにシグナル刺激は第1位置である」判断が「カテゴリ1」、「シグナル刺激は第1位置である」判断が「カテゴリ2」、「多分シグナル刺激は第1位置である」判断が「カテゴリ3」、「多分シグナルは第2位置である」判断が「カテゴリ4」、「シグナルは第2位置である」判断が「カテゴリ5」、「確かにシグナル刺激は第2位置である」判断が「カテゴリ6」で表されている。

C.12のフォームを閉じると、プログラムの実行終了となる。実行終了後、出力ファイルをテキストエディタで開くと以下のようになっている。

Input Data File = Data6Cat.csv

 

<N, S>

[6, 23, 5, 4, 37, 25]

 

<S, N>

[42, 38, 2, 5, 11, 2]

 

Inference for Stan model: anon_model_f2c4de04275e32f42265169574310b77.

4 chains, each with iter=2000; warmup=1000; thin=1;

post-warmup draws per chain=1000, total post-warmup draws=4000.

 

           mean se_mean     sd   2.5%    25%    50%    75%  97.5%  n_eff   Rhat

mu_s       0.98  1.9e-3   0.12   0.75    0.9   0.98   1.06   1.21   3659    1.0

tau        0.36  1.8e-3   0.11   0.14   0.29   0.36   0.44   0.58   3867    1.0

theta[0]   0.19  7.1e-4   0.04   0.11   0.16   0.19   0.22   0.29   4000    1.0

theta[1]   1.42  1.9e-3   0.11    1.2   1.34   1.41   1.49   1.64   3720    1.0

C[0]      -1.61  2.0e-3   0.12  -1.83  -1.68   -1.6  -1.53  -1.39   3409    1.0

C[1]      -0.19  7.1e-4   0.04  -0.29  -0.22  -0.19  -0.16  -0.11   4000    1.0

C[2]        0.0     0.0    0.0    0.0    0.0    0.0    0.0    0.0   4000    nan

C[3]       0.19  7.1e-4   0.04   0.11   0.16   0.19   0.22   0.29   4000    1.0

C[4]       1.61  2.0e-3   0.12   1.39   1.53    1.6   1.68   1.83   3409    1.0

p_NS[0]    0.06  2.9e-4   0.02   0.03   0.05   0.06   0.07    0.1   3717    1.0

p_NS[1]    0.22  4.2e-4   0.03   0.17   0.21   0.22   0.24   0.28   4000    1.0

p_NS[2]    0.05  1.7e-4   0.01   0.03   0.04   0.05   0.05   0.07   4000    1.0

p_NS[3]    0.05  1.9e-4   0.01   0.03   0.04   0.05   0.06   0.08   4000    1.0

p_NS[4]    0.37  4.7e-4   0.03   0.32   0.36   0.37   0.39   0.43   3591    1.0

p_NS[5]    0.24  6.1e-4   0.04   0.17   0.22   0.24   0.27   0.33   4000    1.0

p_SN[0]    0.02  1.5e-4 8.1e-3 7.8e-3   0.01   0.02   0.02   0.04   2755    1.0

p_SN[1]    0.12  3.6e-4   0.02   0.08   0.11   0.12   0.14   0.16   3664    1.0

p_SN[2]    0.03  1.2e-4 7.5e-3   0.02   0.03   0.03   0.04   0.05   4000    1.0

p_SN[3]    0.04  1.5e-4 9.3e-3   0.02   0.03   0.04   0.04   0.06   4000    1.0

p_SN[4]    0.36  4.7e-4   0.03   0.31   0.34   0.36   0.38   0.42   4000    1.0

p_SN[5]    0.43  7.3e-4   0.05   0.34    0.4   0.43   0.46   0.52   4000    1.0

lp__     -298.2    0.03   1.48 -301.9 -298.8 -297.8 -297.1 -296.3   1982    1.0

 

Samples were drawn using NUTS at Wed Oct 23 15:26:01 2019.

For each parameter, n_eff is a crude measure of effective sample size,

and Rhat is the potential scale reduction factor on split chains (at

convergence, Rhat=1).

 

d':

Median = 0.981,   90%CI = [0.789, 1.178]

 

tau:

Median = 0.363,   90%CI = [0.177, 0.547]

 

C[1]:

Median = -1.605,   90%CI = [-1.799, -1.424]

 

C[2]:

Median = -0.187,   90%CI = [-0.271, -0.124]

 

C[3]:

Median = 0.000,   90%CI = [0.000, 0.000]

 

C[4]:

Median = 0.187,   90%CI = [0.124, 0.271]

 

C[5]:

Median = 1.605,   90%CI = [1.424, 1.799]

 

 

Up