Excel VBAでクロス表専用のシンプルなカイ二乗検定関数を作ってみた2
前回はCHITEST の改良版に挑戦しましたが、エクセルExcelにはカイ二乗値そのものを返す関数CHIINV (2010以降は CHISQ.INV.RT も)もあります。
カイ2乗値を求める計算式は、概念的には
と表されるわけですが、エクセルExcelのCHIINV は、なんとカイ二乗分布の右側確率(いわゆるp値)と自由度から逆算する謎仕様。
p値がわかっている時点でカイ二乗値を求める意味がわかりません。
正直まだ使い道の分からないカイ二乗値ですが、勉強を兼ねて計算式どおりに値を求める関数を作ってみました。以下がそのソースコードになります。*1
'クロス表専用のシンプルなχ二乗検定(χ二乗値を返す)
Function x_ChiInv(Arg)
Dim o_Row As Integer
Dim o_Clm As Integer
Dim o_R_Sum() As Long
Dim o_C_Sum() As Long
Dim o_Sum As Long
Dim i As Integer
Dim j As Integer
Dim o As Double
Dim e As Double
Dim o_e2 As Double
o_Row = Arg.Rows.Count
o_Clm = Arg.Columns.Count
ReDim o_R_Sum(1 To o_Row)
ReDim o_C_Sum(1 To o_Clm)
For i = 1 To o_Row
For j = 1 To o_Clm
o_R_Sum(i) = o_R_Sum(i) + Arg(1).Offset(i - 1, j - 1)
o_C_Sum(j) = o_C_Sum(j) + Arg(1).Offset(i - 1, j - 1)
o_Sum = o_Sum + Arg(1).Offset(i - 1, j - 1)
Next
Next
For i = 1 To o_Row
For j = 1 To o_Clm
o = Arg(1).Offset(i - 1, j - 1)
e = o_C_Sum(j) * o_R_Sum(i) / o_Sum
o_e2 = o_e2 + ((o - e) ^ 2) / e
Next
Next
x_ChiInv = o_e2
End Function
使い方は前回と同じ。引数も前回と同じで[実測値範囲]のみになります。
関数名の INV は inverter の略語でしょうから今回の関数にはそぐわないですが、CHIINV関数 の亜種ってことで、あえてそのままにしました。
*1:2017/12/23 コード個所をpre記法に直しました