2016-12-11 6 views
0

上の線形回帰私はdeedleタイプのシリーズを構築しています。私はRの関数「LM」を使用して(まだこのソリューション内の)線形回帰を実行しようとしています(yは予測因子で応答であり、xはその構文はLMがある(Y〜X、データ))C#のdeedleシリーズ

public static void performLinearRegression(Series<DateTime, double> series) 
{ 
} 

誰かが私の手伝いをすることができたら、私は感謝しています - それが可能ならば!私はRProvider.RInterop.callFuncを使用しなければならないと思うが、私はそうすることはできなかった。

多くのありがとうございます。

答えて

1

Rプロバイダのページにhow to call the lm functionというF#の例がありますが、これは悲しいことにC#でサポートされていないRタイプのプロバイダを使用しています。 C#からRを呼び出すときは、おそらくRプロバイダを参照することであまり得られないので、R.NETを使用して直接サンプルを書き直す必要があります。

lmHow to Use lm function in r.net?にコールする方法の例がありますが、これはデータをディスクに保存しますが、関数がアクセスできるデータフレーム(F#サンプルのように)を作成するだけで済みます。 Creating a Data.Frame using R.NETでカバーされています。

だから、もしあなたがこれらの2つを一緒に置くと、これを行うことができるはずだと思います.Deedleは悲しいことに、ここではあまり役に立たないでしょう。

0

おかげさまで多くのご協力をいただきました。

私は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型の結果を得る良い方法があると思われますが、結果をタプルにフォーマットする方法が原因です)。それは私を得る必要があります。

ご意見やご提案がありましたら、お気軽にお知らせください。

関連する問題