VB.NET は行列計算と同様、標準の回帰分析ライブラリを持っていないので、その対策として R を使用する例。
重回帰でも「c3 <- lm(y ~ x + x2 + x3);」といった感じで変数を並べればよいだけなので自作に比べるとかなりお手軽です。 また今回の場合、多項式の係数だけが欲しい場合を想定したので R のコードの最後に「c1$coefficients;」を書き、係数が戻り値として戻るようにしています。
以下コード例。
Imports RDotNet.SymbolicExpressionExtension
Module Module1
Sub Main()
' Rのインストールフォルダに PATH を通す (通っていればなくてもよい)
Environment.SetEnvironmentVariable("PATH", Environment.GetEnvironmentVariable("PATH") & ";C:Program FilesRR-3.0.2bini386")
' ---------------
' 初期化
' ---------------
Dim r = RDotNet.REngine.CreateInstance("RDotNet")
r.Initialize()
' ---------------
' データの入力
' ---------------
Dim yData = New RDotNet.NumericVector(r, {5, 8, 7, 8, 9, 11, 9, 11, 13, 12})
r.SetSymbol("y", yData)
Dim xData = New RDotNet.NumericVector(r, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10})
r.SetSymbol("x", xData)
' ---------------
' 計算
' ---------------
' 単回帰( y = a・x + b)
Dim c1 = r.Evaluate("c1 <- lm(y ~ x); " &
"c1$coefficients;")
' 重回帰( y = a・x^3 + b・x^2 + c・x + d )
Dim c3 = r.Evaluate("x2 = x ^ 2; " &
"x3 = x ^ 3; " &
"c3 <- lm(y ~ x + x2 + x3); " &
"c3$coefficients;")
' ---------------
' 結果の取得
' ---------------
Dim c1Data = c1.AsNumeric
Dim c3Data = c3.AsNumeric
' ---------------
' 結果の表示
' ---------------
Console.WriteLine("y = {0:0.00}x {1:+ 0.00;- 0.00;+0}",
c1Data(1), c1Data(0))
Console.WriteLine("y = {0:0.00}x^3 {1:+ 0.00;- 0.00;0}x^2 {2:+ 0.00;- 0.00;0}x {3:+ 0.00;- 0.00;0}",
c3Data(3), c3Data(2), c3Data(1), c3Data(0))
' ---------------
' 終了
' ---------------
r.Close()
r.Dispose()
End Sub
End Module
結果。
y = 0.75x + 5.20 y = 0.01x^3 - 0.11x^2 + 1.38x + 4.30 続行するには何かキーを押してください . . .