効果量(Cohen's d)と分布の重なり:RでCohen's dから共有面積への変換スクリプト
背景
効果量のCohen's dは2変数の分布の重なりの程度だとも解釈できる。
こういうこと。
くわしくは浦野先生(2013)など。
ただし,これは(想定上の)母集団についての話。
さらにCohen's dは,プールされた標準偏差を使う。これは実際のそれぞれの変数の標準偏差の値とは異なる。なので,母集団において,両変数が(同一の)プール化された標準偏差を持つとみなしたときに,という前提がつく。そうした条件下においてのみ,dは分布の重なりと一致する。具体的には以下のような関数になる。
もちろん,正規分布しないデータにこれを考えるのは不毛。そういうときは,Cliff's deltaなどを使用したらいいと思う。
dが大きくなると,共有された面積は単調に低下していく。
効果量の値を具体的にイメージするために,この面積を知りたい,ということとしよう。
Rでdから変換する
どうやったらこの面積をもとめられるだろう?
面積なんだから素直にグラフ上で考える。まず,1変数は標準正規分布N(0,1)。もう1変数はN(d, 1)。
ほい。次に2つの交点を考える。
これ,実はd/2。*1
なので,負の無限からこの交点までを2関数について数値積分でもして,実際に面積を…ってもとめなくともよいwww
結局は単にそれぞれの関数,交点についての累積確率を考える。
赤い面積はN(d, 1)の交点における累積確率。
黒い面積と赤い面積の和は,N(0,1)の交点における累積確率。
ここで,交点を境界にして左右対称だってことを考える。
左右対称なので,ここでは黒+赤面積に対する赤面積の比率のみを考えればよい。
これで共有面積が分かるってわけ。
文系にもわかるくらい単純だwww
これをRの関数にする。
d2area<-function(d){
intersection<-d/2 #交点
area<-pnorm(intersection,d,1)/pnorm(intersection,0,1) #共有面積
area #出力
}
なかにdを入れるだけで変換できる。
d2area(1)
[1] 0.4462101
もちろんベクトルいれてもいい。
d2area(seq(0,1,.25))
[1] 1.0000000 0.8190476 0.6702680 0.5475809 0.4462101
ほい。
記述統計から直接計算するときは,
area<-function(n1,n2,m1,m2,s1,s2){
md<-m2-m1 #平均差
pooledsd<-sqrt( ( ( (n1-1)*s1^2) + ( (n2-1) * s2^2) )/(n1+n2) ) #プール標準偏差
d<-md/pooledsd #d
intersection<-d/2 #交点
area<-pnorm(intersection,d,1)/pnorm(intersection,0,1) #面積
list("d"=d,"Area"=area) #dと面積をリストで出力
}
これを使えばいい。効果量と共有面積をリストでだす。
area(10,10,50,60,10,10)
$d
[1] 1.054093$Area
[1] 0.4266978
*1:嘘だと思ったら実際optimでもしろよー,10分くらいそれでやって馬鹿らしいって気づいた