2014-06-09

多変量回帰

今日から新しい内容に入ります。

前回の解答を今後の講義で使うのでブログ本文に書いておきます。
先月載せたものと基本的に同じですが、引数の引き渡しだけが違っています。
Sub 前回の課題()
Dim x()
Sheets(1).Select
i = 1
Do While Cells(i, 1) <> ""
  i = i + 1
Loop
p = i - 1
ReDim x(p, p + 1)
For i = 1 To p
  For j = 1 To p
    x(i, j) = Cells(i, j)
  Next j
Next i
Sheets(2).Select
For i = 1 To p
  x(i, p + 1) = Cells(i, 1)
Next i
Sheets(3).Select
場所 = 0
For i = 1 To p
  For j = 1 To p
    Cells(場所 + i, j) = x(i, j)
  Next j
Next i
Call 連立一次方程式(x(), p)
場所 = 場所 + p + 1
For i = 1 To p
 For j = 1 To p + 1
  Cells(場所 + i, j) = x(i, j)
 Next j
Next i
End Sub

Sub 連立一次方程式(係数行列(), r)
Rem (c) 2014 Kaoru Fueda
Dim 最大値()
ReDim 最大値(r)
For i = 1 To r
  If i < r Then
    最大比 = 0
    最大行 = i
    For j = i To r
      最大値(j) = 0
      For k = i To r + 1
        If Abs(係数行列(j, k)) > 最大値(j) Then
          最大値(j) = Abs(係数行列(j, k))
        End If
      Next k
      If 最大値(j) > 0 Then
        If 最大比 < Abs(係数行列(j, i) / 最大値(j)) Then
          最大比 = Abs(係数行列(j, i) / 最大値(j))
          最大行 = j
        End If
      End If
    Next j
    If 最大行 > i Then
      For k = 1 To r + 1
        temp = 係数行列(i, k)
        係数行列(i, k) = 係数行列(最大行, k)
        係数行列(最大行, k) = temp
      Next k
    End If
Rem ここは講義では説明していません。
Rem ピボットが0の場合は最も0=0に近い行を第i行に移動して、後に無視する
    If 最大比 = 0 Then
      最小値 = 最大値(i)
      最小行 = i
      For j = i + 1 To r
        If 最小値 > 最大値(j) Then
          最小値 = 最大値(j)
          最小行 = j
        End If
      Next j
      If 最小行 > i Then
        For k = 1 To r + 1
          temp = 係数行列(i, k)
          係数行列(i, k) = 係数行列(最小行, k)
          係数行列(最小行, k) = temp
        Next k
      End If
    End If
  End If
Rem ピボットを1に
  If 係数行列(i, i) <> 0 Then
    For k = i + 1 To r + 1
      係数行列(i, k) = 係数行列(i, k) / 係数行列(i, i)
    Next k
  Else
Rem ここは講義では説明していません。
    MsgBox ("解けないので解の一つを0とします。")
    For k = i + 1 To r + 1
      係数行列(i, k) = 0
    Next k
  End If
  係数行列(i, i) = 1
Rem ピボット以外を0に
  For j = 1 To r
    If j <> i Then
      For k = i + 1 To r + 1
        係数行列(j, k) = 係数行列(j, k) - 係数行列(i, k) * 係数行列(j, i)
      Next k
      係数行列(j, i) = 0
    End If
  Next j
Next i
End Sub

今日使うデータです。

都市番号 都市 気温y緯度x1経度x2標高x3
1稚内-8.0 45.42 141.68 2.8
2旭川-13.6 43.77 142.37 111.9
3札幌-9.5 43.05 141.33 17.2
4青森-5.4 40.82 140.78 3.0
5盛岡-6.7 39.70 141.17 155.2
6仙台-3.2 38.27 140.90 38.9
7金沢-0.1 36.55 136.65 26.1
8長野-5.5 36.67 138.20 418.2
9高山-7.6 36.15 137.25 560.2
10軽井沢-10.0 36.33 138.55 999.1
11名古屋-0.9 35.17 136.97 51.1
12飯田-4.7 35.52 137.83 481.8
13東京-0.4 35.68 139.77 5.3
14鳥取0.5 35.48 134.23 7.1
15京都-0.6 35.02 135.73 41.4
16広島0.2 34.37 132.43 29.3
17福岡1.5 33.58 130.38 2.5
18鹿児島2.0 31.57 130.55 4.3
19高知0.1 33.55 133.53 1.9
20那覇13.5 26.23 127.68 34.9
出典:坂元慶行、石黒真木夫、北川源四郎著「情報量統計学」共立出版株式会社

0 件のコメント: