R统计语言与C#.NET:基础






4.81/5 (33投票s)
在C#.NET应用程序中使用R语言。
引言
十多年前,我的同事和我写了两本书,关于在单变量和多变量环境中检验时间序列分析假设的不同测试。那时,执行这些测试的程序是Basic、C以及RATS、SHAZAM和TSP等商业软件包中的一些批处理程序的混合体。
- Cromwell, J.B., M.J. Hannan, W.C. Labys, and M. Terraza. 1994. Multivariate Testing for Time Series Models. New York: Sage Publication.
- Cromwell, J.B., W.C. Labys and M. Terraza. 1994. Univariate Testing for Time Series Models. New York: Sage Publications.
如今,其他软件包,如SAS、SPSS、Ox、Matlab和S-Plus,可以用于完成类似的工作。然而,我最喜欢的开源统计软件包过去是并且现在仍然是由卡内基梅隆大学的研究人员开发的,它被称为统计语言R。R语言可以从这里下载。安装后,进入R的“包”菜单,选择所有包,然后按Enter键。这将安装所有库,使基础Splus和R保持一致。R使用S语言,Fox (2002)和Farnsworth (2006)为我两本书中提到的时间序列分析提供了优秀的参考资料。在一系列论文中,我计划演示如何使用R和C#.NET进行各种统计和分析应用程序的构建,这些应用程序可以在典型的3-4小时内完成。
背景
除了使用图1所示的GUI,我还希望能够将R作为我的研究应用程序中的智能组件。在大学里,应用工作的出版总是需要最新的统计技术,为此需要一种编程语言。由于我在.NET和Java方面都有背景,我选择使用C#.NET作为接口语言来构建这些中间件。我下载了Microsoft Visual C# 2008 Express Edition,并希望附加R .NET组件的引用,以开始这个中间件应用程序的工作。由于R没有捆绑.NET组件,我使用了R-(D) COM接口进行自动化。
R在.NET中 - R(D) COM接口
R-(D) COM接口是一个COM服务器,可以连接到Microsoft Excel等应用程序,以利用R版本中不断添加的统计技术。此外,还可以将ActiveX控件包含在应用程序中。因此,数据可以在R之间传输,Visual Basic、C#和Perl可以作为COM客户端,使人们能够将R用作计算引擎,同时也能渲染图形。COM服务器可以通过以下步骤下载和安装:
- 访问 cran.r-project.org
- 从“软件”菜单中选择“其他”项
- 选择 R-(D) COM Interface (for Windows)
- 选择 RServer250.exe
- 安装应用程序
安装完成后,您可以将以下COM引用添加到您的C#.NET项目,以及将这些命名空间添加到您的类中
//
// COM References
//
using STATCONNECTORCLNTLib;
using StatConnectorCommonLib;
using STATCONNECTORSRVLib;
这些类型库都使用.NET互操作性特性进行操作。在代码中使用using
语句。
使用.NET组件作为R接口的代码非常简单,只有几条语句可以输入数据、处理数据,然后提取数据。例如,要生成二十个随机正态数,可以使用
object o1;
int n=20;
StatConnector sc1 = new StatConnectorSRVLib.StatConnectorClass();
Sc1.Init(“R”);
Sc1.SetSymbol(“n1”,n);
Sc1.Evaluate(“x1<-rnorm(n1)”);
O1=sc1.GetSymbol(“x1”);
Xrnd=(double) o1;
一旦我们用`sc1`实例化类并初始化R,我们就可以通过将`n1`声明为R中的对象类型,`n`声明为整数类型(我们要生成的正态随机数的数量)来生成数据。`SetSymbol()`函数用于将C#类型转换为R类型。然后,我们可以使用`GetSymbol()`函数获取变量,并将其转换为对象进行处理。有关R数据类型的更多理解,请查阅R附带的帮助文档。
导入数据
虽然我们可以在R中生成数据,但将数据导入R也很有指导意义。例如,您可以从多种数据格式读取数据。最常见的格式是文本文件,数据分隔成列,每列都有一个标题。我在记事本中创建了一个数字列表,每行一个,以便导入到R中。这将通过对话框选择文件。
>mydata = read.table( file.chooseO, skip = 1 )
`file.choose()`函数提供了选择文本文件的对话框,`skip=1`参数表示跳过第一行作为`Header`值。R变量是`mydata`,值的名称是`V1`。要查看数据,请执行以下操作:
>mydata
在对话框窗口中,显示了变量`V1`的值。假设我想将这些数据值读入一个代表股票值的年度时间序列变量中
>zl <-ts(mydata,start=c(1992,8), 1)
>plot(zl)
我可以使用`ts()`函数,它从1999年开始,频率为每年。当然,我也可以绘制这些数字进行验证,并查看`z1`的值。现在我们可以在R应用程序中完成这项工作,那么我们如何在C#.NET中实现,而不使用R Windows界面呢?当直接将表达式转移到C#时,导入可能会出现问题,所以我使用传统的文本文件或数据库操作来填充变量,然后使用`SetSymbol()`函数将值导入R,然后进行转换。但是,我们可以使用`EvaluateNoReturn()`函数来读取数据,如下所示:
Sc1.EvaluateNoReturn(“m1=read.table(file.choose())”);
`Evaluate()` 和 `EvaluateNoReturn()` 的区别在于,前者返回对对象的引用,这在从 R 环境中进行类型转换和提取数据时是必要的。通常,我就是这样原型设计和测试我的统计组件的:先在 R Windows 界面中编写并执行它们,然后保存到文本文件,再逐行使用一个评估函数读取文件。之后,您可以修改文本文件,或者组合多个文本文件进行统计处理。这提供了一个非常有创造性的建模和分析环境。除了前面提到的计算方面,还可以通过 using
语句渲染图形
using STATCONNECTORCLNTLib;
R 图形设备
生成二十个正态随机变量的直方图的代码由以下提供:
StatConnector test1= new STATCONNECTORSRVLib.StatConnectorClass();
test1.Init("R");
test1.Evaluate("x<-rnorm(20)");
test1.EvaluateNoReturn("hist(x)");//
R图形设备在自己的对话框窗口中填充直方图结果。这个不错的功能自动提供了额外的图形资源和库,用于进行2D和3D图表绘制。对话框窗口允许以各种图形格式保存、打印和保存到剪贴板。此外,您可以检查历史记录和调整大小选项。再次,请参考R文档以获取必要的表达式和包。
正如大家所看到的,理解R语言和使用捆绑的软件包,可以快速构建一个商业预测或分析应用程序。从Yahoo!下载一些股票数据,将其放入SQL Express并使用LINQ进行OEM,引用R COM组件,下载一些软件包,然后使用时间序列分析中的最新方法预测一些股票。这将是本系列第二部分的主题。
结论
使用开源的R统计语言是将最新统计研究融入您的商业智能原型和应用程序的好方法,因为它为预测分析统计算法的开发和实现提供了一种低成本的替代方案,这些算法在标准商业软件包中是不可用的。我以这种方式使用R进行价格分析的小波分析、酸性矿山排水的流域建模以及使用贝叶斯马尔可夫链蒙特卡罗(MCMC)技术进行股票的随机波动率建模。在未来的文章中,我计划展示如何在3-4小时的编程工作中构建这些类型的应用程序。
参考文献
- Farnsworth, G.V. (2006), R中的计量经济学。
- Fox, J. (2002), An R and S-Plus Companion to Applied Regression, Thousand Oaks, CA: Sage Publications。