2013-02-14 48 views
5

我使用R.Net 1.5來嘗試使用ARIMA進行簡單預測。我已經嘗試使用R 2.14和R 2.15。我使用的Visual Studio 2012的目標.NET 4中,雖然我也試了.NET 4.5和Visual Studio 2010使用R.Net檢索R評估結果

以下是一段代碼我已經寫了:

string rhome = System.Environment.GetEnvironmentVariable("R_HOME"); 
     if (string.IsNullOrEmpty(rhome)) 
      rhome = @"C:\Program Files\R\R-2.14.0"; 

     System.Environment.SetEnvironmentVariable("R_HOME", rhome); 
     System.Environment.SetEnvironmentVariable("PATH", System.Environment.GetEnvironmentVariable("PATH") + ";" + rhome + @"\bin\x64"); 
     using (REngine engine = REngine.CreateInstance("RDotNet")) 
     { 

      engine.Initialize(); 

      NumericVector testGroup = engine.CreateNumericVector(submissions); 
      engine.SetSymbol("testGroup", testGroup); 
      engine.Evaluate("testTs <- c(testGroup)"); 
      NumericVector ts = engine.GetSymbol("testTs").AsNumeric(); 

      engine.Evaluate("tsValue <- ts(testTs, frequency=1, start=c(2010, 1, 1))"); 
      engine.Evaluate("library(forecast)"); 
      engine.Evaluate("arimaFit <- auto.arima(tsValue)"); 
      engine.Evaluate("fcast <- forecast(tsValue, h=36)"); 
      engine.Evaluate("plot(fcast)"); 

      NumericVector nv = engine.GetSymbol("fcast").AsNumeric(); 

它失敗當我試圖檢索數字向量。 TI會在這裏發現一些錯誤。第一個是「錯誤:對象不能被強制輸入'double'」,第二個是「錯誤:發現訪問衝突 - 繼續照顧」

如果我檢索預測爲GenericVector,我會得到一個RDotNet列表。 SymbolicExpressions。我瀏覽了那些內容,看看它們包含了什麼,它似乎與ARIMA函數有關,但我無法找到實際的預測輸出。我可以找到輸入和其他相關的值以及一系列數字,我無法確定它們是什麼。

如果我在Revolution中運行腳本,我可以看到輸出應該是什麼,這就是我如何確定R.Net的輸出是否準確。我想有可能R.Net在執行預測時不同於革命(雖然我認爲不太可能),並且通用向量中的輸出之一確實是正確的輸出。

這是GenericVector初始化。爲了調試的目的,我用一條毯子試一下,抓住它:在DynamicVector內部,我可以真正檢查細節。

GenericVector newVector = engine.GetSymbol("fcast").AsList(); 

      foreach (var vector in newVector) 
      { 
       try 
       { 
        DynamicVector dv = vector.AsVector(); 
       } 
       catch (Exception) 
       { 
       } 

回答

5

這不是R.Net問題,你只是嘗試運行一個錯誤的腳本。讓我們在純的R運行代碼:

> testTs <- c(1, 2, 3) 
> tsValue <- ts(testTs, frequency=1, start=c(2010, 1, 1)) 
> library("forecast") 
> arimaFit <- auto.arima(tsValue) 
> fcast <- forecast(tsValue, h=36) 
> plot(fcast) 

現在class(fcast)等於forecast

> class(fcast) 
[1] "forecast" 
> as.numeric(fcast) 
Error: (list) object cannot be coerced to type 'double' 

fcast strucure:

> str(fcast) 
List of 11 
$ method : chr "Mean" 
$ level : num [1:2] 80 95 
$ x  : Time-Series [1:3] from 2010 to 2012: 1 2 3 
$ xname : chr "object" 
$ mean  : Time-Series [1:36] from 2013 to 2048: 2 2 2 2 2 2 2 2 2 2 ... 
$ lower : mts [1:36, 1:2] -0.177 -0.177 -0.177 -0.177 -0.177 ... 
    ..- attr(*, "dimnames")=List of 2 
    .. ..$ : NULL 
    .. ..$ : chr [1:2] "80%" "95%" 
    ..- attr(*, "tsp")= num [1:3] 2013 2048 1 
    ..- attr(*, "class")= chr [1:2] "mts" "ts" 
$ upper : mts [1:36, 1:2] 4.18 4.18 4.18 4.18 4.18 ... 
    ..- attr(*, "dimnames")=List of 2 
    .. ..$ : NULL 
    .. ..$ : chr [1:2] "80%" "95%" 
    ..- attr(*, "tsp")= num [1:3] 2013 2048 1 
    ..- attr(*, "class")= chr [1:2] "mts" "ts" 
$ model :List of 4 
    ..$ mu : num 2 
    ..$ mu.se: num 0.577 
    ..$ sd : num 1 
    ..$ call : language meanf(x = object, h = h, level = level, fan = fan) 
$ lambda : NULL 
$ fitted : Time-Series [1:3] from 2010 to 2012: NA 1 1.5 
$ residuals: Time-Series [1:3] from 2010 to 2012: NA 1 1.5 
- attr(*, "class")= chr "forecast" 
+0

感謝您指出了這一點,但我不完全理解。如果我在R中輸入值「fcast」,它將返回預測結果。這些值必須存儲在「fcast」中的某個位置。我如何檢索它們?它繪製的數字很好...... – Chase 2013-02-14 20:23:22

+0

fcast是具有不同數據的複雜對象。你可以使用$這個對象的字段。例如:as.numeric(fcast $ level)是數字向量[80 95],as.numeric(fcast $ mean)是數字向量rep(2,36)等。您可以使用C#中的這些數據,像NumericVector nv = engine.GetSymbol(「fcast $ mean」)。AsNumeric(); – AndreyAkinshin 2013-02-14 20:26:59

+0

fcast $ mean返回空值。這在R中完美地工作,其中fcast $意味着僅返回沒有誤差餘量的預測。我仍然試圖挖掘通用向量中的一些數據。我感覺好像它在某處我不知道在哪裏。 – Chase 2013-02-18 01:35:32