読者です 読者をやめる 読者になる 読者になる

About connecting the dots.

statistics/machine learning adversaria.

施策の効果をどうやって測るか(3) - compute.esパッケージによる効果量の計算

前回までで説明した効果量について,実際にRで計算してみましょう.使用するのは{compute.es}パッケージです.基本は実験系の研究分野でメタ分析を実施する際に使われるパッケージだそうです.パッケージマニュアルはこちらにあるので,詳細はこちらを見てください.

適用可能な検定の種類

対象となる検定と,効果量を算出するメソッドを以下にまとめました.いろいろ種類がありますね.たとえば2*2のクロス表におけるカイ二乗検定は,chiesを使えば効果量が算出できます.またt検定における平均値の差は,mesを使って同様に効果を算出することができます.

検定 効果量を算出するメソッド
ANCOVA F-test a.fes()
ANCOVA means a.mes()
ANCOVA means (pooled sd) a.mes2()
ANCOVA p-value a.pes()
ANCOVA t-test a.tes()
Chi-squared (1 df) chies()
Correlation res()
d-statistic des()
Failure group (binary) failes()
F-test fes()
Log odds ratio lores()
Means mes()
Means (pooled sd) mes2()
Proportions (binary) propes()
p-value pes()
t-test tes()

具体的な計算例

カイ二乗検定

それでは実際にカイ二乗検定の効果量を計算してみましょう.ABテストを行って,以下のような結果が得られたとします.

条件 コンバージョンした コンバージョンしない
条件A 80 240
条件B 60 330

このときに,カイ二乗検定を行った結果は以下のようになります.p値は0.1%水準で有意だという結果が得られました.

> x <- matrix(c(80, 240, 60, 330), ncol=2, byrow=T)
> x
     [,1] [,2]
[1,]   80  240
[2,]   60  330
> chisq.test(x)

	Pearson's Chi-squared test with Yates' continuity correction

data:  x
X-squared = 9.6676, df = 1, p-value = 0.001875

では続いて,この有意な結果というのが,実際にどの程度の効果量を持っているのかを検討しましょう.使用するのはchies()です.chies()は第一引数に得られたカイ二乗値を,第二引数に総サンプル数を指定します.2*2のカイ二乗検定の場合は,得られた結果のうち$Correlationのrの値をみてあげればOKです.この値が,前回説明した\hat{\omega}の値に等しくなります.ここでは0.11668...ですので,前回の表から「効果量小」だといえます.

> chies(9.6676, 710)
$MeanDifference
          d       var.d           g       var.g 
0.234817882 0.005719629 0.234569046 0.005707514 

$Correlation
          r       var.r 
0.116689066 0.001372289 

$Log_Odds
    log_odds var.log_odds 
  0.42591252   0.01881683 

$Fishers_z
          z       var.z 
0.117223061 0.001414427 

$TotalSample
  n 
710 

平均値の差

続いてよく使われる平均値の比較,この場合の効果量をみていきます.以下のように,2群の間で平均値の違いが得られたとします.

条件 人数 平均 標準偏差
A 86 23.44 8.52
B 79 18.92 6.33

この場合はmes()を使って,順にmes(m.1, m.2, sd.1, sd.2, n.1, n.2)と入力してあげればOKです.得られた結果のdをみれば,0.5985...となっているので,前回の表から「効果量中」だといえます.ちなみに同様の計算はt等計量を用いることで,tes()でも実行することが可能です.

 mes(23.44, 18.92, 8.52, 6.33, 86, 79)
$MeanDifference
         d      var.d          g      var.g 
0.59854182 0.02537175 0.59578356 0.02513845 

$Correlation
          r       var.r 
0.286470078 0.004897153 

$Log_Odds
    log_odds var.log_odds 
   1.0856348    0.0834697 

$Fishers_z
         z      var.z 
0.29471650 0.00617284 

$TotalSample
  n 
165 

サンプル数の効果

この効果量,基本的には「どのくらい意味のある差があるか」といった事柄をみているため,サンプル数にはほとんど影響されません.検出力がサンプルサイズに大きく影響されるのとは対照的です.実際に例を使ってみてみましょう.先ほどのようなABテストのサンプルを用意しました.これに対して,全体の比率は買えずに,サンプル数だけを2倍,3倍,4倍,5倍と増やして同様にカイ二乗検定を行い,得られた値を使って効果量を算出してみます.

条件 コンバージョンした コンバージョンしない
条件A 10 30
条件B 8 40

結果をプロットすると,サンプル数が増える毎に(=カイ二乗値があがるために)p値は下がり続け,サンプル数がもとの5倍になった時点で5%水準で有意な結果が得られました.その一方で効果量はほとんど増えず,Cohenの効果量小の基準にすら達しませんでした.

ちょっと考えてみれば当たり前のことなんですが,全体の比率を変えずにサンプル数を増やしても,比率が変わっていないのですから効果の大きさが変わるわけはないのです.その一方で,サンプル数を増やせば,検出力があがるので,有意だとみなされやすくなるわけです.いつでもどこでも単純に有意であればいいのではなく,いくら差があるか(=効果量)というのを気にしておく必要がありますよね,ということでした.

f:id:SAM:20130817134139p:plain

data <- matrix(c(10, 30, 8, 40), ncol=2, byrow=T)
r <- matrix(c(1:5))
sample <- apply(r, 1, function(i) sum(data)*i)
chisq <- apply(r, 1, function(i) chisq.test(data*i)$statistic)
pvalue <- apply(r, 1, function(i) chisq.test(data*i)$p.value)
es <- apply(rbind(chisq, sample), 2, function(t) chies(t[1], t[2])$Correlation[1])
d <- as.data.frame(cbind(sample, pvalue, es))

ggplot(data=d, aes(x=sample, y=pvalue)) + 
  geom_line() + 
  geom_line(data=d, aes(x=sample, y=es), col="red") +
  ylab("p-value or effect size") + 
  geom_hline(yintercept = 0.05, linetype = "dotted")