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

頻度差の検定の効果量としてファイ係数とクラメールのVを用いる

corpus r stat

 この記事は、頻度差の検定の効果量としてオッズ比を用いるという記事の続編です。今回は、効果量としてのファイ係数クラメールのVについて書きたいと思います。
 最初の分析データとしては、前回と同じ言語項目の正用と誤用の頻度を集計した分割表を使います。

# 分割表の作成
dat <- matrix(c(700, 1002, 14, 51), nrow = 2)
rownames(dat) <- c("Corpus A", "Corpus B")
colnames(dat) <- c("Correct", "Error")
# 作成した分割表の確認
dat

 上記のスクリプトを実行すると、以下のような結果が表示されます。

         Correct Error
Corpus A     700    14
Corpus B    1002    51

 まずは、この2×2の分割表からファイ係数を求めるには、psychパッケージを用いて、以下のようにします。

# パッケージの読み込み
library(psych)
# ファイ係数
phi(dat, digits = 3)

 上記のスクリプトを実行すると、以下のような結果が表示されます。

[1] 0.075

 ファイ係数やオッズ比は、基本的に2×2の分割表に対して用いるもので、それよりも大きい(m×nの)分割表に対しては、そのまま用いることができません。そのようなときには、クラメールのVを用いるのが一般的です。
 ここでの分析データは、3段階の習熟度の学習者コーパスから集計した正用と誤用の頻度とします。

# 分割表の作成
dat2 <- matrix(c(805, 414, 226, 99, 38, 12), nrow = 3)
rownames(dat2) <- c("Level 1", "Level 2", "Level 3")
colnames(dat2) <- c("Correct", "Error")
# 作成した分割表の確認
dat2

 上記のスクリプトを実行すると、以下のような結果が表示されます。

        Correct Error
Level 1     805    99
Level 2     414    38
Level 3     226    12

 このような2×3の分割表からクラメールのVを求めるには、vcdパッケージを用いて、以下のようにします。*1

# パッケージの読み込み
library(vcd)
# クラメールのV
(V <- assocstats(dat2))

 上記のスクリプトを実行すると、以下のような結果が表示されます。

                    X^2 df  P(> X^2)
Likelihood Ratio 9.2592  2 0.0097588
Pearson          8.4224  2 0.0148289

Phi-Coefficient   : 0.073 
Contingency Coeff.: 0.072 
Cramer's V        : 0.073 

 この結果を見ると、クラメールのVは0.073です。水本・竹内 (2008) によれば、ファイ係数やクラメールのVが0.1以上であれば「効果量小」、0.3以上であれば「効果量中」、0.5以上であれば「効果量大」であるとみなされます。*2
 次に、クラメールのVの信頼区間を計算します。そのためには、MBESSパッケージのconf.limits.nc.chisq関数を使って、非心度の信頼区間を先に求める必要があります。*3

# パッケージの読み込み
library(MBESS)
# 非心度の95%信頼区間
(nc.chisq <- conf.limits.nc.chisq(Chi.Square = V$chisq_tests[2, 1], df = V$chisq_tests[2, 2], conf.level = .95))

 上記のスクリプトを実行すると、以下のような結果が表示されます。

$Lower.Limit
[1] 0.3010138

$Prob.Less.Lower
[1] 0.025

$Upper.Limit
[1] 22.34111

$Prob.Greater.Upper
[1] 0.025

 続いて、上記の$Lower.Limitの値と$Upper.Limitの値からクラメールのVの信頼区間を計算します。*4

# クラメールのVの信頼区間(下限値)
sqrt((V$chisq_tests[2, 2] + as.numeric(nc.chisq[1])) / ((V$chisq_tests[2, 2] - 1) * sum(dat2)))
# クラメールのVの信頼区間(上限値)
sqrt((V$chisq_tests[2, 2] + as.numeric(nc.chisq[3])) / ((V$chisq_tests[2, 2] - 1) * sum(dat2)))

 上記のスクリプトを実行すると、以下のような結果が表示されます。

# クラメールのVの信頼区間(下限値)
[1] 0.03799404
# クラメールのVの信頼区間(上限値)
[1] 0.1235737

 最後に、効果量としてのオッズ比、ファイ係数、クラメールのVに関しては、以下のまとめも参照してください。

(追記)クラメールのVの信頼区間を計算するためのRの関数も存在します。詳しくは、こちらの記事を参照してください。

*1:assocstats関数は、2×2の分割表からファイ係数を計算するのに使用することもできます。

*2:このような閾値は、学問分野によって異なる可能性があります。また、「もともと『p<.05ならいい』の批判として出てきた効果量を『効果量>何々ならいい』にしないほうがいい」という意見もあります。

*3:conf.limits.nc.chisq関数を使うには、カイ二乗値と自由度の値が必要となります。それらの値は、assocstats関数の実行結果の中に、$chisq_tests[2, 1]と$chisq_tests[2, 2]として、それぞれ格納されています。また、非心度の95%信頼区間の下限値が負になって求められない場合には、nc.chisq <- conf.limits.nc.chisq(Chi.Square = V$chisq_tests[2, 1], df = V$chisq_tests[2, 2], conf.level = NULL, alpha.lower = 0, alpha.upper = .025) とし、下限値を0とした区間を求めます。

*4:計算方法に関しては、南風原 (2014) を参考にしました。