SAS与R优缺点讨论 从工业界到学界

Python015

SAS与R优缺点讨论 从工业界到学界,第1张

SAS与R优缺点讨论:从工业界到学界

尽管在工业界还是被 SAS 所统治,但是R在学术界却得到广泛的应用,因为其免费、开源的属性使得用户们可以编写和分享他们自己的应用。我们的目的就是展示这两种差异巨大的语言各自优点,并且共同发挥他们的优势,我们同时还要指出那些不使用SAS 好多年的、现在正在使用 R语言的人们的一些误解和偏见,因为他们已经很少关注 SAS 的发展和进步了。

前言

我们选取 SAS 和 R的原因是因为他们是目前在统计领域中最有统治地位的两个编程语言。现在我们注意到一个不好的现象,就是在学术界重度使用R的用户认为R在被SAS霸占的工业界有具有相当优势的,然而熟练掌握这两个软件对于想在数据分析领域取得小有成就的年轻人来说很关键。

SAS经常有一些更新,非SAS程序员由于没有技术跟进往往并不知情。SAS绘图模块就是一个快速发展并成长的例子,然而许多人并不注意到这些升级以至于他们仍然固执的使用R画图。SAS另一个不广为人知的例子是SAS可以轻松自定义函数,这正是 R的强项。这个SAS过程步(PROC)有全面的语法检查、翔实的文档和技术支持然而一个新的使用者很可能不知道这些工具可用,或者根本不知道它们的存在。另外,SAS还拥有卓越的培训课程,网络及用户组分享资源,不同相关主题的大量书籍。知道并合理的使用这些技术以及工具有助于减少使用SAS的畏惧之心。

统计方法的新进展

SAS:

优点:SAS 的软件及算法都是经过检验的,SAS 有技术支持去快速解决用户的需求。如果需要的话,SAS会尝试在已存在的步骤中嵌入新的方法,例如增加一个选项或者新增一个语句(statement),因此用户不需要学习另外一个过程步。SAS也会发布最新通讯来详细说明软件的更新。

缺点:更新升级较慢。

R:

优点:用户可以快速实施新方法,或者寻找已经存在的软件包。很容易学习和理解新方法,因为学生们可以看到代码中的函数。

缺点:R文档的更新都是通过用户进行的,所以新的方法并没有被很好调试和检验。开发者们散布于各地,而并没有在一起来进行团队合作的开发。

在这个问题上,SAS 和 R 的优缺点是互补的。对于 R,有人认为它的代码是开放的,可以看到 R是如何工作的,这对于拥有相关背景的人是比较容易理解的。然而对于SAS,它的过程步是预装的,文件中对不同的语句(Statement)及选项( Option)存储了大量的数学公式。如果用户真的想看到底层程序,这个也是很容易实现的。对两种语言的使用着者来说,不管是学生还是其它用户,只是运行代码的话对于两种语言是没有什么不同的。你运行SAS,不需要知道它在干什么,类似的是,你运行R时,也不需要知道它在后台调用的函数。你所做的就是按章操作而已。

画图

SAS:

优点:SAS画图模块正变得越来越灵活、精良和易于使用。在一些分析过程步(PROCs) 中,ODSGraphics可以自动的生成一些图形,而不需要额外的代码。这使得用户多了一个选择,即可以使用默认的图表生成图表,也可以自己来创造个性化的图表。

缺点:图形背后的模板语言(TL)是庞大及不易使用的,特别是对于新手来说。新的高级功能如交互式绘图功能( interactivegraphs),对于新手来说也是难以掌握的。

R:

优点:可以简单的生成漂亮的图表,还可以使用循环语句来生成动画。

缺点:在 R中图表功能与统计分析无关,绘图和分析是相互独立的。用户必须自己来决定什么样的图形是合适的,使用效果的好坏取决于用户们的统计背景和喜好。尽管改变图形去达到特别的维度或角度并不是一个简单事儿。

SAS9.2 之前版本的图表功能不足是 R更吸引人的一个主要原因之一。R的一个最好的特性之一就是其图表功能的高质量性和易用性。但是,当前 SAS/GRAPH 搭配 ODSGraphics 及 SG 过程在软件中增加了制图的能力。联合使用 ODS graphics 和 PROCS可以使用户简单地生成与分析相关的展示图表。特定的绘图过程步如PROCSGPLOT,SGPANEL和SGSCATTER等越来越多,当然需要的一定代码来实现。另外,SAS 中还有一些其他不错的绘图选择,如SGDESOGNER 和 SAS Enterprise Guide。

函数及可重复使用的代码

SAS:

优点:SAS有可在 DATA 和 PROC步使用的大量函数和自定义函数。另外强大无所不能的、也可以被DATA步和PROC步使用的宏语言。宏变量可定义为局部或者全局类型。

缺点:编写自定义函数和详细的宏代码需要深厚的编程知识来确保正确性。

R:

优点:在 R 中编写函数很简单,用户也可以通过上传自己的函数到 R-CRAN 上与其它用户分享。

缺点:编写自定义函数需要深厚的编程知识来确保正确性。变量是严格的局部变量。在这一点上两种软件拥有类似的利弊。SAS的早期用户运行自己的定制函数主要取决于宏程序的编写,这也是 R 用户认为其低效及笨重的原因。然而,SAS 9 版本的 PROCFCMP允许用户编写个性化的函数,SAS 9.2 版本又允许用户在 DATA 及 PROC步中调用这些函数。这对于简单的统计函数是很有用的,对于更加复杂的统计函数也可以通过 IML 语言来实现。

SAS 及 R两种语言都面临着怎样有效地、正确的使用函数,这就需要用户在函数编写的过程中拥有深厚的编程背景。从好的角度来说,一个程序员需要知道他们编写的是什么危险的是,其它人可以下载一个SAS 宏或者 P程序包来使用,尽管他们不知道其内在工作原理,甚至不知道其正确性。所以,有了对宏及函数适当的了解,再来分享它们并应用于具体的需求是很方便的。

用户支持

SAS:

优点:SAS 有丰富的网上参考资料,专业的技术支持,专业的培训课程,许多优秀的出版书籍,一个紧密的用户组及网络社区。SAS的问题可以直接反映给技术支持部门,他们会与用户一起来解决。

R:

优点:R 有很好的示例手册,网上参考材料,R 邮件列表和 R 聚会。

缺点:用户们取决于其它用户对于软件的看法及建议。因为 R的开发者散布于全球各地,所以全球的用户是缺乏联系的。程序包(Package)并不是由 R软件的开发核心团队来编写的,所以导致了程序的不完善甚至有时候会对结果的正确性有所怀疑。另外,很难去直接寻找一个针对具体问题的人员或者团队。

数据处理

SAS:

优点:SAS 可以处理任意类型和格式的数据。DATA 步的设计纯粹就是为了数据的管理,所以 SAS擅长处理数据。利用丰富的选项,SAS 可以将大数据处理的很好,拼表以及 PROC SQL 也可以减少运行时间。

缺点:在 DATA 步骤中 SAS中的DATA步有非明示的循环算法,因此使用者的编程思维需要改变以符合SAS的运行逻辑。

R:

优点:R 在最初就被认为是更加适合大数据的。它对于矩阵的操作和排序的设计是非常高效的。R也可以很好的进行各种基于分析的数据模拟。

缺点:R 的设计更加关注统计计算以及画图功能,所以数据的管理是比较耗时的,而且不如在 SAS中那么明晰。其中一个主要的原因就是:对于各种不同类型的数据,在 R 中进行很好的数据处理是比较难以掌握的。

数据处理的重要性经常在统计编程中被忽视了,但是它确实是非常关键的,因为实际的数据非常糟糕,不能直接应用于分析。纯粹地使用 R的学生们对于得到的数据往往有不切实际的期望,而学习 SAS是一个有效的方法去解决怎样整理原始的数据。SAS可以对大而繁杂的数据集进行管理和分析,而 R更着重于进行分析。

当处理复杂数据时,R的面向对象的数据结构会遇到很多问题,并且R还缺乏一个内在的循环过程。在SAS中,应用标准化工具经常会进行如下操作:合并含有大量缺失数据的复杂数据集,再生成及修改其中的变量。而在R中,进行复杂的数据处理操作是没有标准化的,而且经常会导致更加复杂的过程。

SAS与R软件运行时间的快慢对比取决于任务。如SAS可以通过设置MEMLIB,从而像R一样使用内存(而非硬盘)来提升运行速度。但在R中,没有这样的硬件驱动,只能使用内存来执行。

报表

SAS:

优点:SAS 通过很多有用的过程步来生成详细漂亮的报表。

缺点:能提供更详尽报表的过程如 TABULATE、REPORT等,在能正确而有效的使用前,将为有一个艰难的学习曲线等待你跨越。

R:

优点:报表方面,R拥有诸多利器。Sweave包可以创造包含文字、表格和图形的 PDF 文件,其中图形可以LaTeX 和 R命令来装扮。另一个新的程序包 Knitr 可以快速生成格式限制较少的网页内容。

缺点:R 没有一个模式化的方式来生成报表,所以需要在编程上花一些功夫。报表的生成对于 R 来说是一个比较新的方向,所以它不如 SAS来的简单和快速。在 R 中,Sweave 和 Knitr 是报表这方面的领先的程序包,但是学习起来也比较困难。

重度报表使用用户应该了解这些以上不同,尽管学习 SAS的报表功能需要花费一些时间,但是一旦掌握了就很有价值并有很高的灵活性。而从最基础学习 R 的报表功能也许不需要像 SAS那样花那么多时间。

结论

我们可以看到解决 R 与 SAS的辩论是三合一的。第一,就像在任何一个统计编程社区一样,我们知道这个PK是没有一个最终赢家。两种软件各有优缺点。他们有共存的必要,而学术上的教学中,他们也有共存的必要。如果学生们能够明确他们的需求并合理的应用,那样会获得更好的效果。如果只给学生教授一种软件是有局限性的,这样会使他们难以发挥学习另外一种软件的潜力。第二,用户们需要保持他们的工具箱与时俱进。SAS和 R 都有一些很不错的学习网站去介绍最新的技术上的进步。第三,最理想的是学习两种软件并将其融合于分析中。对于 R 的用户们,通过转化R 到SAS 的用户界面,可以同时使用 2种软件。通过使用两种软件可以使处理及分析数据变得事半功倍,而且使所有的用户都满意。

众所周知,英文是以词为单位的,词和词之间是靠空格隔开,而中文是以字为单位,句子中所有的字连起来才能描述一个意思。例如,英文句子I am a student,用中文则为:“我是一个学生”。计算机可以很简单通过空格知道student是一个单词,但是不能很容易明白“学”、“生”两个字合起来才表示一个词。把中文的汉字序列切分成有意义的词,就是中文分词,有些人也称为切词。我是一个学生,分词的结果是:我 是 一个 学生。

中文分词技术属于自然语言处理技术范畴,对于一句话,人可以通过自己的知识来明白哪些是词,哪些不是词,但如何让计算机也能理解?其处理过程就是分词算法。

现有的分词算法可分为三大类:基于字符串匹配的分词方法、基于理解的分词方法和基于统计的分词方法。

1、基于字符串匹配的分词方法

这种方法又叫做机械分词方法,它是按照一定的策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行配,若在词典中找到某个字符串,则匹配成功(识别出一个词)。按照扫描方向的不同,串匹配分词方法可以分为正向匹配和逆向匹配;按照不同长度优先匹配的情况,可以分为最大(最长)匹配和最小(最短)匹配;按照是否与词性标注过程相结合,又可以分为单纯分词方法和分词与标注相结合的一体化方法。常用的几种机械分词方法如下:

1)正向最大匹配法(由左到右的方向);

2)逆向最大匹配法(由右到左的方向);

3)最少切分(使每一句中切出的词数最小)。

还可以将上述各种方法相互组合,例如,可以将正向最大匹配方法和逆向最大匹配方法结合起来构成双向匹配法。由于汉语单字成词的特点,正向最小匹配和逆向最小匹配一般很少使用。一般说来,逆向匹配的切分精度略高于正向匹配,遇到的歧义现象也较少。统计结果表明,单纯使用正向最大匹配的错误率为1/169,单纯使用逆向最大匹配的错误率为1/245。但这种精度还远远不能满足实际的需要。实际使用的分词系统,都是把机械分词作为一种初分手段,还需通过利用各种其它的语言信息来进一步提高切分的准确率。

一种方法是改进扫描方式,称为特征扫描或标志切分,优先在待分析字符串中识别和切分出一些带有明显特征的词,以这些词作为断点,可将原字符串分为较小的串再来进机械分词,从而减少匹配的错误率。另一种方法是将分词和词类标注结合起来,利用丰富的词类信息对分词决策提供帮助,并且在标注过程中又反过来对分词结果进行检验、调整,从而极大地提高切分的准确率。

对于机械分词方法,可以建立一个一般的模型,在这方面有专业的学术论文,这里不做详细论述。

2、基于理解的分词方法

这种分词方法是通过让计算机模拟人对句子的理解,达到识别词的效果。其基本思想就是在分词的同时进行句法、语义分析,利用句法信息和语义信息来处理歧义现象。它通常包括三个部分:分词子系统、句法语义子系统、总控部分。在总控部分的协调下,分词子系统可以获得有关词、句子等的句法和语义信息来对分词歧义进行判断,即它模拟了人对句子的理解过程。这种分词方法需要使用大量的语言知识和信息。由于汉语语言知识的笼统、复杂性,难以将各种语言信息组织成机器可直接读取的形式,因此目前基于理解的分词系统还处在试验阶段。

3、基于统计的分词方法

从形式上看,词是稳定的字的组合,因此在上下文中,相邻的字同时出现的次数越多,就越有可能构成一个词。因此字与字相邻共现的频率或概率能够较好的反映成词的可信度。可以对语料中相邻共现的各个字的组合的频度进行统计,计算它们的互现信息。定义两个字的互现信息,计算两个汉字X、Y的相邻共现概率。互现信息体现了汉字之间结合关系的紧密程度。当紧密程度高于某一个阈值时,便可认为此字组可能构成了一个词。这种方法只需对语料中的字组频度进行统计,不需要切分词典,因而又叫做无词典分词法或统计取词方法。但这种方法也有一定的局限性,会经常抽出一些共现频度高、但并不是词的常用字组,例如“这一”、“之一”、“有的”、“我的”、“许多的”等,并且对常用词的识别精度差,时空开销大。实际应用的统计分词系统都要使用一部基本的分词词典(常用词词典)进行串匹配分词,同时使用统计方法识别一些新的词,即将串频统计和串匹配结合起来,既发挥匹配分词切分速度快、效率高的特点,又利用了无词典分词结合上下文识别生词、自动消除歧义的优点。

到底哪种分词算法的准确度更高,目前并无定论。对于任何一个成熟的分词系统来说,不可能单独依靠某一种算法来实现,都需要综合不同的算法。笔者了解,海量科技的分词算法就采用“复方分词法”,所谓复方,相当于用中药中的复方概念,即用不同的药才综合起来去医治疾病,同样,对于中文词的识别,需要多种算法来处理不同的问题。