予測名人の心臓部、重回帰クラスの使い方
●はじめに
●準備
●クラスインスタンスの取得
●簡単な使用例
●元データの形式
●推定値(.Estimation)
●計算結果概略(.OutputSummary)
●計算結果全て(.OutputAll)
●計算結果個別取得例(.Value)
●残差の表示(.Residual)
◆クラス.Calculate メソッド
◆クラス.Estimation メソッド
◆クラス.Estimate, EstimateU, EstimateL プロパティ
◆クラス.ErrorMessage プロパティ
◆クラス.OutputSummary プロパティ
◆クラス.OutputAll プロパティ
◆クラス.Dimension メソッド
◆クラス.Value メソッド
◆クラス.Residual プロパティ
◆クラス.DataSetName プロパティ
◆クラス.Labels プロパティ
◆クラス.OriginalData プロパティ
◆クラス.Tag プロパティ
●はじめに Top
現在公開している重回帰分析ソフトである「予測名人」ですが、マニュアルには記載してありませんが
実はその心臓部である重回帰クラスは、外部から使用できるように公開しています。
以下でその使用方法をご紹介します。
●準備 Top
対象のブックから予測名人(重回帰.xlam/prjMultipleRegression)を参照設定します。
●クラスインスタンスの取得 Top
クラスcMultipleRegressionは、GetMultipleRegressionメソッドで取得します。
Dim cMR As cMultipleRegression
Set cMR = prjMultipleRegression.GetMultipleRegression
●簡単な使用例 Top
元データを配列で与え、推定値と信頼区間95%の値を得る例
Sub Sample0()
    Dim cMR As cMultipleRegression
    Dim X(1 To 3, 0 To 1) As Double '元データ
    Dim X1(1 To 1) As Double        '推定用(新たなX)
    Dim Est As String
    
    'Y値
    X(1, 0) = 1
    X(2, 0) = 2
    X(3, 0) = 3
    
    'X値
    X(1, 1) = 2
    X(2, 1) = 3.9
    X(3, 1) = 5.6
    
    '新たなX
    X1(1) = 6
    
    '重回帰クラスのインスタンス取得
    Set cMR = prjMultipleRegression.GetMultipleRegression
    
    '重回帰計算
    If cMR.Calculate(X, Limits:=95, Confidence:=True) Then
        '推定計算
        If cMR.Estimation(X1) Then
            Est = cMR.Estimate & "(推定値)"
            Est = Est & vbCrLf & cMR.EstimateU & "(上限)"
            Est = Est & vbCrLf & cMR.EstimateL & "(下限)"
            MsgBox Est, vbInformation
        Else
            MsgBox cMR.ErrorMessage, vbExclamation
        End If
    Else
        MsgBox cMR.ErrorMessage, vbExclamation
    End If
End Sub
●元データの形式 Top
二次元配列で一列目が従属変数Y、二列目以降が独立変数Xです。
一行目に項目名は無しで、一行目からデータです。
(※クラス内での各変数はY,X1,X2,…と表現されます。)
例1
1 2
2 3.9
3 5.6
例2
419.3784 5.2 46
-570.924 0.2 49
1192.994 9.1 75
221.7575 5 86
1723.209 6.9 6
-189.429 1.4 30
1173.989 8.5 80
1731.319 9.9 56
◆クラス.Calculate メソッド Top
重回帰計算を実行します。計算結果はクラス内に保持されます。
正常終了するとTrueを、エラーがあった時はFalseを返します。
引数
X 計算元データ、二次元配列で指定します。
Logs 各変数の対数指定、一次元配列(True, False)で指定します。省略可能です。
Limits 推定の幅を%で指定します。省略時は95%です。
Confidence Trueとすると「信頼区間」の指定になります。省略時はFalse「予測区間」です。
◆クラス.Estimation メソッド Top
推定値を計算します。結果は.Estimate, .EstimateU, .EstimateL プロパティに保持されます。
正常終了するとTrueを、エラーがあった時はFalseを返します。
引数
X 推定に使用する新たなXを一次元配列で指定します。配列インデックスは1から独立変数Xの数までです。
◆クラス.Estimate, EstimateU, EstimateL プロパティ Top
推定値、推定幅上限(信頼区間or予測区間)、推定幅下限(信頼区間or予測区間)を返します。
(※信頼区間か予測区間かは、Calculateメソッドの引数、Confidenceで指定します。)
◆クラス.ErrorMessage プロパティ Top
エラーメッセージを返します。
(CalculateまたはEstimationメソッドのエラーメッセージが保持されています。)
★使用例の共通プロシージャ
以下の使用例でCallしている共通プロシージャです。
A1のアクティブセル領域を元データとして計算し、結果をクラスインスタンスとして返しています。
Function MRCalc() As cMultipleRegression
    Dim cMR As cMultipleRegression
    Dim RR As Range
    Dim VV As Variant
    
    '元データ(Y,X1,X2,...の順、項目名無しデータのみ)
    Set RR = Range("A1")
    Set RR = RR.CurrentRegion
    'タイトル行を除く
    Set RR = Intersect(RR, RR.Offset(1))
    VV = RR.Value
    '重回帰クラスのインスタンス取得
    Set cMR = prjMultipleRegression.GetMultipleRegression
    '計算
    If cMR.Calculate(VV, Array(0, 0, 0)) Then
        Set MRCalc = cMR
    Else
        Debug.Print cMR.ErrorMessage
        Stop
    End If
End Function
●推定値(.Estimation) Top
Sub CallSample1()
    Dim cMR As cMultipleRegression
    Dim X(1 To 2) As Double
    
    '重回帰計算
    Set cMR = MRCalc
    
    X(1) = 5.2: X(2) = 46   '推定に使用するX値を指定する
    
    With cMR
        If .Estimation(X) Then
            Debug.Print .EstimateL, .Estimate, .EstimateU
        Else
            Debug.Print .ErrorMessage
        End If
    End With
End Sub
●計算結果概略(.OutputSummary) Top
Sub CallSample2()
    Dim cMR As cMultipleRegression
    Dim Res As Variant, V As Variant
    
    '重回帰計算
    Set cMR = MRCalc
    
    '計算結果概略
    Res = cMR.OutputSummary
    For Each V In Res
        Debug.Print V
    Next
    Debug.Print
End Sub
◆クラス.OutputSummary プロパティ Top
計算結果の概略を一次元配列で返します。
●計算結果全て(.OutputAll) Top
Sub CallSample3()
    Dim cMR As cMultipleRegression
    Dim VV As Variant
    Dim T As String, V As Variant
    Dim P As Integer
    Dim Dm As Long
    Dim i As Long, j As Long, K As Long
    
    '重回帰計算
    Set cMR = MRCalc
    '計算結果詳細の取得({Title,Value}の配列)
    VV = cMR.OutputAll
    P = cMR.Value(独立変数Xの数p)
    For i = 0 To UBound(VV)
        T = VV(i, 0): V = VV(i, 1)  'T:Title  V:Value
        
        'Valueの次元で分岐
        Dm = cMR.Dimension(V)
        
        '配列以外の時
        If Dm = 0 Then
            If TypeName(V) = "Double" Then
                Debug.Print T, CSng(V)
            Else
                Debug.Print T, V
            End If
        
        '一次元配列の時
        ElseIf Dm = 1 Then
            Debug.Print T
            If T = "標準残差" Then
                For j = LBound(V) To UBound(V)
                    Debug.Print j, CSng(V(j))
                Next
            ElseIf TypeName(V) = "Double()" Then
                For j = LBound(V) To P
                    Debug.Print CSng(V(j)),
                Next: Debug.Print
            Else
                For j = LBound(V) To P
                    Debug.Print V(j),
                Next: Debug.Print
            End If
        '二次元配列の時
        ElseIf Dm = 2 Then
            Debug.Print T
            For j = LBound(V) To P
                For K = LBound(V, 2) To P
                    Debug.Print CSng(V(j, K)),
                Next: Debug.Print
            Next
        End If
    Next
    Debug.Print
End Sub
◆クラス.OutputAll プロパティ Top
クラス内に保持している計算結果全てを二次元配列で返します。
データ形式は、第0列がタイトル、第1列が値で、値には配列以外、一次元配列、二次元配列があります。
第0列 第1列
独立変数Xの数p 2
データ数n 8
信頼区間 FALSE
推定幅 95
対数指定 FALSE FALSE FALSE
相関係数 1 0.920143 -0.05887
0.920143 1 0.309671
-0.05887 0.309671 1
標準回帰係数 1.037904 -0.38028
◆クラス.Dimension メソッド Top
引数の次元を返します。
-1 未初期化配列
0 配列以外
1 一次元配列
2 二次元配列
3 三次元以上の配列
●計算結果個別取得例(.Value) Top
Sub CallSample4()
    Dim cMR As cMultipleRegression
    Dim V As Variant
    Dim P As Integer
    Dim i As Long, j As Long
    
    '重回帰計算
    Set cMR = MRCalc
    
    '値が配列以外の例
    P = cMR.Value(独立変数Xの数p)
    Debug.Print "独立変数Xの数p"; P
    Debug.Print "データ数n"; cMR.Value(データ数n)
    
    '値が二次元配列の例
    Debug.Print "相関係数"
    V = cMR.Value(相関係数)
    For i = 0 To P          '※UBound(V)ではNG、必ず事前にPを取得する
        For j = 0 To P
            Debug.Print CSng(V(i, j)),
        Next: Debug.Print
    Next
    
    '値が一次元配列の例
    Debug.Print "係数検定値t"
    V = cMR.Value(係数検定値t)
    For i = 1 To P
        Debug.Print V(i),
    Next: Debug.Print
    
    '値が配列以外の例2
    Debug.Print "補正R2"; cMR.Value(補正R2)
    Debug.Print "検定値F"; cMR.Value(検定値F)
    Debug.Print "F99.99%値"; cMR.Value(F99_99値)
End Sub
◆クラス.Value メソッド Top
クラス内に保持している計算結果を個別に取得します。
引数
Key 次の定義済み値(VKeys)のいずれかを指定します。
VKeys
独立変数Xの数p
データ数n
信頼区間
推定幅
対数指定
相関係数
標準回帰係数
平均
回帰係数_直
逆行列_直
係数検定値t
重相関係数
補正R2
検定値F
不偏誤差分散Ve
t99値
t95値
t90値
F99.99値
F99.9値
F99値
F95値
tAlph値
t検定結果
t検定総合判定
標準残差
生データMin
生データMax
.Valueメソッドで取得した値には、配列以外、一次元配列、二次元配列があります。
配列の場合、従属変数Yを含む時、インデックスは0から、独立変数Xのみの時は1からになります。
配列の場合で変数に関する値の時、インデックスの最大値は52固定です。
(例えば「相関係数」や「標準回帰係数」など。)
●残差の表示(.Residual) Top
Sub CallSample5()
    Dim cMR As cMultipleRegression
    Dim D As Range
    Dim VV As Variant
    Dim N As Long
    
    '重回帰計算
    Set cMR = MRCalc
    '残差取得(配列)
    VV = cMR.Residual
    N = UBound(VV)
    '新規ブックに書き込み
    Set D = Workbooks.Add.Worksheets(1).Range("B1")
    Set D = D.Resize(N)
    D.Value = Application.WorksheetFunction.Transpose(VV)
    '左列に連番
    Set D = D.Offset(, -1)
    D.Range("A1").Value = 1
    D.Range("A2").Value = 2
    D.Range("A1:A2").AutoFill D
    '上記データをグラフ表示
    ActiveSheet.Shapes.AddChart2(240, xlXYScatter).Select
    ActiveChart.SetSourceData Source:=D.Resize(, 2)
End Sub
◆クラス.Residual プロパティ Top
標準化残差を一次元配列で返します。
(但し一般のそれとは少し違います、 詳しくは予測名人の説明書参照。)
◆クラス.DataSetName プロパティ Top
データに付ける名前を保持するプロパティで、計算には無関係です。
◆クラス.Labels プロパティ Top
変数名を保持する(受け渡す)為のプロパティで、計算には無関係です。
利用時は、データとの不整合が生じないように注意してください。
◆クラス.OriginalData プロパティ Top
Calculateメソッドで渡した元データをそのまま返します。
これは、プロシージャ間の引数を出来る限りクラスインスタンスのみとする為のものです。
◆クラス.Tag プロパティ Top
汎用のタグプロパティで、計算には無関係です。
予測名人では、自動選択された独立変数Xの、元配列内に於けるインデックス配列の保持・授受に使用しています。
以上