静粛に、只今統計勉強中

仕事でデータ分析をすることになったバリバリ文系アラフィフのおっさんが、独学で統計の勉強を始めました。

Excel VBAでクロス表専用のシンプルなカイ二乗検定関数を作ってみた2

前回はCHITEST の改良版に挑戦しましたが、エクセルExcelにはカイ二乗値そのものを返す関数CHIINV (2010以降は CHISQ.INV.RT も)もあります。

カイ2乗値を求める計算式は、概念的には

f:id:cyclo-commuter:20171208100105j:plain

と表されるわけですが、エクセルExcelCHIINV は、なんとカイ二乗分布の右側確率(いわゆる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記法に直しました