2013-02-14 53 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