この記事はStan Advent Calendar 2017の24日目の記事です。
世間はクリスマスムードで賑わっておりますが,そんな喧騒とは全く無関係かつ超ニッチな記事を書きます。興味のある方は気の利いた導入などなくとも読んでくださるでしょうし,興味のない方はタイトルを見てすでに読むのをやめてると思うので,さっそく本題です。
Stanで信号検出理論
信号検出理論(TSD:Theory of Signal Detection)は,無視すべき刺激と反応すべき刺激に対する,実験参加者の弁別力や反応バイアスを測定するための理論であり,参加者の反応が2値(反応する/しない, Yes/No など)になるような多くの実験事態に適用することができます。
信号検出理論をStanで実行する方法については,『実践ベイズモデリングー解析技法と認知モデルー』の15章についてまとめたこちらのスライドもご参照ください。
上記のスライドの7枚目にもあるように,信号検出理論においては,
・N分布とSN分布は正規分布である (正規性の仮定)
・N分布とSN分布は等分散である (等分散の仮定)
という2つの仮定をおきます。
あまり強い仮定を使うなよ,(一般化の可能性が)弱く見えるぞ,ということで,今回はこれらの仮定が満たされない場合の信号検出理論の指標をStanに実装していきたいと思います。
ノンパラメトリックなTSDの指標
信号検出理論において,参加者がノイズと信号を見分ける力は信号検出力d’として定義されます。このd’を正確に求めるためには,
・試行は300回〜500回以上
・参加者の反応バイアスを段階的に変化させて測定する
(または,反応を2値ではなく段階評定にする)
という条件が必要であるといわれています(石田, 2001※1)。
しかしながら,実験事態によっては,どうしてもこれらの条件を満たせない場合があります。例えば記憶実験において,参加者に数百もの単語を記憶させるのは現実的ではありませんし,幼児さんを対象とした実験では,段階的な評定を求めるのが難しい可能性があります。
このように,試行回数が少ないなどの事情で,正規性の仮定・等分散の仮定が満たされていることが確認できない場合に使える指標として,ノンパラメトリックな信号検出理論の指標A’が提案されています。この指標は,試行のhit率とFA率をもとに算出され,反応バイアスを取り除いた,修正された正答率を表します(詳細は石田先生の資料※1※2を参照してください)。
計算式は単純で,FA率をx,hit率をyとすると
$$A’=1/2+\frac{(y−x)(1+y−x)}{4y(1−x)}$$
となります。
また,このときのバイアスの指標B”は,
$$B”=\frac{y(1−y)−x(1−x)}{y(1−y)+x(1−x)}$$
で算出されます。
ということで,これらの計算式をStanのgenerated quantities{}ブロックに追記していきます。
Stanコード
data {
int h;
int f;
int MI;
int CR;
}
transformed data{
int s;
int n;
s = h + MI;
n = f + CR;
}
parameters {
real d;
real c;
}
transformed parameters {
real thetah;
real thetaf;
thetah = Phi(d / 2 - c);
thetaf = Phi(-d / 2 - c);
}
model {
d ~ normal(0, sqrt(2));
c ~ normal(0, inv_sqrt(2));
h ~ binomial(s, thetah);
f ~ binomial(n, thetaf);
}
generated quantities {
real aprime;
real bwprime;
aprime = (thetah >= thetaf) ?
0.5 + ((thetah - thetaf)*(1 + thetah - thetaf) / (4*thetah*(1 - thetaf))) :
0.5 - ((thetaf - thetah)*(1 + thetaf - thetah) / (4*thetaf*(1 - thetah))) ;
bwprime = (thetah*(1-thetah) - thetaf*(1-thetaf)) / (thetah*(1-thetah) + thetaf*(1-thetaf));
}
data{}ブロックからmodel{}ブロックまでは,実践ベイズモデリングー解析技法と認知モデルーのp.133~134のモデル(code33_1.stan)と同様です。
generated quantities{}ブロックで,上述のA’およびB”の式を追記しています。A’は,hit率がチャンスレベル以下であったり,FA率がhit率より高くなると正しく計算されません。現実のデータではまず生じ得ませんが,Stanでhit率とFA率を生成すると稀にありえない組み合わせになってサンプリングが止まるので,その場合でも正しく計算されるように (thetah >= thetaf) ? で条件分岐しています。
Rコード
#データ(hit, FA, miss, CRの報告数)
h <- 169
f <-25
MI <- 71
CR <- 215
#通常のTSDの指標(関数はPallier, 2002より)
#d'
dprime <- function(hit,fa) {
qnorm(hit) - qnorm(fa)
}
dprime(h/240,25/240)
#A'
aprime <-function(hit,fa) {
a<-1/2+((hit-fa)*(1+hit-fa) /
(4*hit*(1-fa)))
b<-1/2-((fa-hit)*(1+fa-hit) /
(4*fa*(1-hit)))
a[fa>hit]<-b[fa>hit]
a[fa==hit]<-.5
a
}
aprime(h/240,25/240)
#Bayesian TSD
dataTSD <- list(h=h, f=f, MI=MI, CR=CR)
par <- c("thetah", "thetaf", "d", "c","aprime","bwprime")
war <- 5000
ite <- 10000
see <- 1969
dig <- 3
cha <- 4
fit_TSD <- stan(file="tsd_aprime01.stan", data=dataTSD, pars=par, verbose=F,
seed=see, chains=cha, warmup=war, iter=ite)
print(fit_TSD, pars=par, digits_summary=dig)
データとして,過去に行った虚記憶の実験データを使用しています。8項目に対する再認課題のデータ30名分が集計されています。虚記憶の実験では,「学習してないけど参加者がold反応しがち」な項目を扱うため,等分散性が怪しくなると言われています(e.g., Miller & Wolford, 1999※3)。
このデータに対して,通常通りTSDの指標を算出すると,d'=1.14,A'=0.79という値が得られます(関数はPallier, 2002※4より)。
Stanでの推定結果は以下です。
結構ずれている...ような?バイアスの指標cとB"は近い値なので,こんなものかもしれません。今後,もっと色々なデータに当てはめて,確かめていきたいと思います。
また,今回はシンプルに,全参加者分のデータを集計したものを使いましたが,『実践ベイズモデリング』のp.134~135のモデルのように,参加者ごとの信号検出力と反応バイアスを推定する階層モデルへの拡張もしていきたいです。
信号検出理論は,”ノイズ”と”信号”の定義次第で幅広い場面に適用できるモデルなので,ノンパラメトリックな指標を使うことでモデルの一般化の可能性が広がると,より面白いことがいえるようになるのではないかと思っています。
※1 石田 翼 (2001). 信号検出理論について — 数式と実践 (http://www5e.biglobe.ne.jp/~tbs-i/psy/tsd/tsdrev.pdf)
※2 石田 翼. 信号検出理論の指標をめぐって (http://www5e.biglobe.ne.jp/~tbs-i/psy/tsd/tsd.pdf)
※3 Miller, M. B., & Wolford, G. L. (1999). The role of criterion shift in false memory. Psychological Review, 106, 398-405.
※4 Pallier, C. (2002). Computing discriminability and bias with the R software (http://www.pallier.org/pdfs/aprime.pdf)