おかげさまで多くのご協力をいただきました。
私はC#で以下のメソッドを実装しました。
public static Tuple<double, double, double> performLinearRegression(Series<double, double> series)
{
REngine.SetEnvironmentVariables();
REngine engine = REngine.GetInstance();
engine.Initialize();
var x = engine.CreateNumericVector(series.Keys);
var y = engine.CreateNumericVector(series.Values);
engine.SetSymbol("x", x);
engine.SetSymbol("y", y);
var result = engine.Evaluate("lm(y~x)");
engine.SetSymbol("result", result);
var coefficients = result.AsList()["coefficients"].AsNumeric().ToList();
double r2 = engine.Evaluate("summary(result)").AsList()["r.squared"].AsNumeric().ToList()[0];
double intercept = coefficients[0];
double slope = coefficients[1];
return Tuple.Create(intercept, slope, r2);
}
私はRDotNetを参照しました。
は、私は単に私のC#ソリューションにF#プロジェクト(FSharpInterop)を追加することによって、F#のを実装している:
今
namespace FSharpInterop
open System
open RDotNet
open RProvider
open RProvider.graphics
open RProvider.stats
open System.Linq
module myRProvider =
let performLinearRegression X Y =
let dataset =
namedParams [
"Y", box Y;
"X", box X; ]
|> R.data_frame
let result = R.lm(formula = "Y~X", data = dataset)
let coefficients = result.AsList().["coefficients"].AsNumeric().ToList()
let r2=R.summary(result).AsList().["r.squared"].AsNumeric().ToList().[0]
let inter=coefficients.[0]
let slope=coefficients.[1]
(inter, slope, r2)
、私ConsoleApplicationでFSharpInteropを参照し、私は、次の操作を行うことができます。
private static void Main(string[] args)
{
Series<double, double> series= //get a series
Tuple<double, double, double> deedleRes = myRProvider.performLinearRegression(series.Keys, series.Values);
Tuple<double, double, double> rDotNetRes=performLinearRegression(series);
}
私は「素早く汚れている」と感じています(特に、Deedleのおかげで簡単に.Net型の結果を得る良い方法があると思われますが、結果をタプルにフォーマットする方法が原因です)。それは私を得る必要があります。
ご意見やご提案がありましたら、お気軽にお知らせください。
出典
2016-12-13 10:55:59
CDM