前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R语言的好与坏丨讲座中字视频丨附讲座PDF

R语言的好与坏丨讲座中字视频丨附讲座PDF

作者头像
CDA数据分析师
发布2018-02-08 14:43:08
1.8K0
发布2018-02-08 14:43:08
举报
文章被收录于专栏:CDA数据分析师

R是一种用于分析数据的领域特定语言。为什么数据分析需要自己的领域特定语言(DSL) ? R语言擅长些什么,不擅长什么?开发人员该如何利用R语言的优势并减轻其弱点? 在GOTO Conference中,统计学家John Cook将一一解答这些问题。

也许你会好奇标题的出处。你们有多少人看过这部电影,"黄金三镖客"(The Good, the Bad and the Ugly)?天呐,出乎意料。之前我都没看过这部电影,直到这次坐飞机过来。我是航班上用笔记本电脑上看的,但起码也是看过了。

这是一部1966年的意大利式西部片。意大利演员用意大利语说台词,美国演员用英语说台词。在各自国家公映的版本中,为对方的语言部分配音。所以我说的不好了,你们就当我在说意大利语然后用英语为我配音就好。

接下来是一些关于我的背景介绍,我从哪儿来,我的一些观点,我如何开始使用R语言。

最初我职业是在数学领域,之后离开了学术界,成为一名软件开发工程师。最近在做一些统计运算。我有作为局外人对统计学和R语言的一些看法。我写过一些代码,用过十几种编程语言。

R语言对我来说是最难学的。并不是说R语言本质上是很难的语言,如果你对编程零基础开始学R语言,跟着学就是了。但如果你学过其他编程语言,R语言显得有些奇怪的。你想把它作为别的语言,但它并不是的,这样就会比较难学。你不能按照学习Perl、Java或其他语言的方法来学R语言。

应该问的并不是要怎么做循环?有什么数据类型? 是怎么分类的?这不是学习R语言的方式。实际上这类信息也比较难以得知。经常使用R语言的人,可能也无法回答那些问题。

R语言是一种领域特定语言,因此你不得不了解该领域。把R语言纯粹当编程语言来学就类似,学习PHP语言而不去了解web开发。或者将SQL作为语言学习,有什么数据类型? 结构是怎样的?我不关心数据库,我只是把SQL作为编程语言来学习。

这有点类似我当时学习R语言的心态。我之前学过编程语言,我打算用我的标准模式来学R语言,但这并不适用。

R语言是什么?

R语言是一种开源的统计语言,你可能会好奇为什么统计学需要自己的编程语言,我们之后将说明。

这是统计研究的实际标准。并不是一般统计学,也不是统计实践,更多是统计研究。从事标准统计学的人们,将熟知的方法运用于熟知的问题,可能会使用其他的语言比方说SAS。但用统计方法做研究的人群是使用R语言的,R语言从S语言中产生,S代表统计学。这比R的名字更好理解,R代表什么呢?我猜可以是S--吧。

R语言产生于1976年的一个项目,贝尔实验室在88年做了修正版。R语言受到Scheme和Fortran的影响。这是比较奇怪的组合,怎么会同时受这两种语言的影响呢?

R语言一开始是用Scheme或Lisp语言写的,我忘了是哪一个了。具有类似Scheme语言的语法,但随后它变得必须与S语言兼容,而S语言的语法与Fortran的比较像,于是R语言接收了这些特征。你可以看到一些Fortran的影响。比如数组索引从1开始,矩阵按列存储,类似Fortran。

就像Dennis Ritchie对C语言的评价,”奇怪 有缺陷 却异常成功”。我觉得跟C语言比较,R语言更加奇怪,有更多缺陷,但在其专业领域非常成功。

R语言实际是什么?

我先前给出的是维基百科给出的标准定义。但如果解释一下的话,引用一段来自科幻小说《莱博维茨的赞歌》的话,"你没有灵魂,医生。你本身就是灵魂。而你拥有身躯,暂时的。"这是我试图理解R语言究竟是什么的领悟。

R语言并不是一门语言,而R语言有它的语言。R语言是处理统计工作的环境,而这个环境有其语言,这有点像VBA。Excel有编程语言,但若孤立地学习这个语言,想学习VBA但不为Excel编程就会有些奇怪。

另一个例子是Emacs,Emacs有其编程语言名叫Emacs Lisp。是Lisp里一个非常老的分支语言。我不认为很多人喜欢这个语言,这是个完全的编程语言。你也许能用Emacs Lisp编写web服务器,尽管我不认为有人这么做过。其实我不该这么说。

很多人都认为Emacs Lisp是,为了获取Emacs的功能而付出的代价。R语言在这点上有点相似。具有大量的功能,而R语言是粘合它们的方法。

R语言有多受欢迎?

这里是个数据分析竞赛的例子,人们用了什么语言。

使用R语言的人是最多的,你会注意到主流的系统语言中,如果你从左向右看,后面才能看到一些通用语言。比如Python差不多排在中间,C++和Java排在很后面。人们不用系统语言来做统计分析,他们甚至不用数学编程语言。Mathematica排在较后面的位置。

这是另一组数据,在生物信息学的一份调查中,R语言也排在第一位。我在解释一下,为什么Perl在这里的排名这么高。不同的人对生物信息学的理解不同,一些人认为它是计算机科学的一部分;一些人认为它是统计学的一部分,其他人可能还有别的见解。

从事生物统计学工作的人会涉及很多文档处理,因此很多人使用Perl,把DNA序列当作字符串来处理。我能想象这应该导致了,Perl在这个排名中的受欢迎度。而做生物信息学中做统计工作的人们,主要是使用R语言的。

使用R语言是怎样的体验?

这里有段引用,"实际上使用R语言有点像吸烟。开始不好受,会头疼,甚至前几次会令人窒息。但之后就变得愉悦, 甚至上瘾。但是实际上, 还是不太利于健康的"。

另一段来自Drew Conway和John Myles White的比喻,他们最近关于机器学习的书中写到的”R语言有独特且有些棘手的语法,跟其他语言相比学习过程更艰难“。

统计学家是什么样的?

那么如果R语言使人窒息并且语法棘手,那么为什么人们喜欢用呢?

谷歌上有人说过"R语言最大的优点是,它是由统计学家编写的,但这也是R语言最大的缺点"。

所以要理解R语言,你需要对统计学家有些了解。他们对于世界的看法跟程序员很不一样,他们也许是在编程。长时间在电脑前前输入语句,运行程序,但他们看世界的角度很不一样。

如果对编程时的程序员和统计学家,分别做脑部功能性核磁共振,会发现他们大脑中变亮的部分不同,因为他们对世界有不同的看法。

如果你对统计不熟悉,你可能会惊讶地发现统计和数学很不同。你可能认为统计只是数学的一个分支,但实际上非常不同。

作为一名身处统计系的数学家,我可以说将会花很长时间来学习不同的术语和行话,以及判断事物的不同观点,什么是可以接受的,什么是不可以的。

所以你不会看到统计学家使用像Mathematica这种语言,但这在数学系很常用,而像我们在之前的幻灯片上看到的。它在统计学中不怎么用到。

很多人在学统计的同时学习R语言。如果你想找本关于R语言的书,很可能会找到一本书即讲统计学 又含有R语言的内容。在结束时我会讲到,只有一本书仅将R语言作为编程语言来写。因为大多数人并不是这么看的,大部分人学习R语言来运用在统计中学到的概念。

因此一定程度上作为编程语言的R语言与统计概念同义。于是使用其他语言变成不可想象的事。

R语言是领域特定语言(DSL)

要理解一个领域特定语言,你必须了解这个领域。先了解这个领域开始,而不是语言。

R语言的替代语言,不是Python或C#这类语言,而是SAS。

大多数统计学家并不会考虑使用主流编程语言。如果他们不用R语言,他们会用其他统计语言。通常熟悉R语言,只熟悉R语言的人,他们热爱他们的领域特定语言,他们也在领域外使用它。

我很确定有人用R语言编写web服务器,就像有人会用Emacs Lisp编写web服务器一样。我回答过Stack Overflow上关于R语言的问题,当时我回答说"你永远不会用R语言来编写web服务器"。有人回复我"我就用R语言写过"。

统计学为什么需要领域特定语言(DSL)?

其中一个很基本的原因是想要方便的使用统计函数。你们可以想象,统计学家使用C#时是怎样的体验,每次取对数的时候都要写math.log。有点像需要在你们常用的编程语言中,每次要写conditional.if或branch.之类的,这是很烦人的。

数据一般组成表格的形式,所以表格操作是基础。需要融合到语言中去,因为它经常出现。还有向量操作,所有统计相关内容都被向量化了。因为对于多个事物有多个观测,比方说多个人、多只猫等等。这些都是你的向量,所有都是向量导向的。

缺失数据是生活常态,任何真实的数据集都有缺失数据。所以你想让你的语言能顺畅地处理它,而不是 "我的天啊,我们有缺失数据,我们该怎么做?"抛出异常,寻找帮助。你需要一种能很好地处理缺失数据的语言。就像Perl有文本处理的模式,R语言也有处理常规统计任务的模式,我们之后将看到。

R语言的优势

用Python的人会说Python自带电池。意思是一旦下载Python,你就有了能开始使用的所有必备物。对于某些Python编程,这么说是对的。但用Python做统计运算,就没有自带电池了。

你可以用Python语言开始,然后使用matplotlib来制图,如果需要数学函数则用SciPy,将IPython用作壳。这些基本构成了处理科学运算的典型Python环境。

而R语言不像那样。打开R语言之后,这些都在一个巨大的命名空间中。所有你需要的都在那里,如果你要进行相关操作。但如果不进行相关操作,你可能会纳闷为何有些不包含其中。

R语言被设计处理交互式数据分析。并不是用于运行海量数据集,它主要适合从某个数据集开始,进行操作,看看把两者对比作图会怎样之类的操作。R语言在这方面上非常好。

比起其他竞争对手语言,R语言更容易编程。我没试过用SAS编程,但根据我的了解,SAS跟DOS批处理文件一样复杂。它更像一种宏语言,而不太像传统编程语言。这就解释了为什么使用SAS的人,喜欢SAS的附带功能。而需要自己编写的人,则偏向使用R语言。当然R语言是开源的,这比你们想象的更重要。

例子

可以想象一下,如果你一直都在处理数据,你想要对操作进行优化,比如查询和筛选。我们将会说到一些线性回归的例子。比如 如何处理R语言中的向量。向量内没有元素,你会设置为0,可以有一个简洁的注解说明。数组x中的NA值设置为0,或者你的索引运算符中有更复杂的表达。比如Y指数对应的X元素,对应的Y值大于7的话,挑选这些数,求对数。所以这种标记法能够得出简洁的程序。如果你之前没接触过的话,可能会感到困惑。

另一个例子。线性回归在统计学中非常常见。你有一些数据,你想知道哪种线能够符合。那么想象一下,这里有个较复杂的情况。有三个独立变量XYZ,想生成合适的线性模型,并且有交互变量。意味着我们并不只单纯考虑XYZ这三个独立变量。还希望将XY、YZ也考虑进去,但出于一定原因不考虑XZ。因此我们想要构造这种线性等式,找到最小平方并得到不同的残差。这在R语言中是非常简洁的。

R语言的线性回归法符号类似进行文本处理的正则表达式。作为统计学家,我们常常做这类事,在语言中有子语言能够更好的表达。再详细讲解下,设置这一组六个变量,计算X Y Z相加和的平方。这不能按照字面理解为一个多项式的平方,完全不是这个意思。它表明的是一种简写,表示我想考虑变量X Y 和Z,以及包含两两乘积搭配形式。但不包括XZ这一对,也就是最后 - 所表示的意思,这里隐含有一个常数项a,这是对这个复杂问题的简洁表达。

简单回归

这是一个简单回归的例子,关于蝴蝶食物中摄入的单宁影响其生长的数据。

读取一个包含我的数据的文本文件,我告诉它标头参数等于真,意味着把文件的第一行作为每一列的名字。当我附着数据,意味着我想要把列名作为变量名称,确保该有的因素都在上面。让我调用names函数,然后打印出来。

通过数据拟合一条直线的所有代码,会得到一个模型。相当于构建一个增长对单宁回归的线性模型。完成之后如果你观察下总结部分,你得到了大量的数据。你不是仅仅得到内部的斜率和截距,会得到更多结果得到所有系数的p值,以及残差。你能得到所有想知道的信息,这个包含在一个对象中。所以当我调用总结时,会打印出一个对象。当我仅只对对象的某部分感兴趣时,我会使用$符号。当你想要点样分布的模型的时候,R使用$符。你可能以为会是点,用$符索引这个或那个得到部分结果,用来表示回归输出。

现在来看另一个例子,这个数据集是R语言自带的。当你下载R语言,会自带一些数据集。这类似于微软Northwind的数据库。众所周知,里面有人们在例子中用到的标准数据集。

其中之一是Moto Trend杂志1974年份的数据,包括里程数、重量,以及是否是手动或自动变速器。因此你可以通过这个数据集,寻求帮助。这个会为你展示一些东西。

如果你观察这些数据,可以看到有12列。其中3个事我们想知道的,重量里程油耗量,变速器是手动的还是自动的,这是分析该数据后的例子。

红线代表了自动变速器,更陡峭的蓝线代表了手动变速器。不仅拟合数据,还绘制数据。两条线周围的灰色部分代表了不确定性。这个带有白色网格线的灰色背景图,可以看到网格但是不是那么明显。在背景中逐渐变淡,从而不会影响数据。

这是得出图的代码,都是陈述语句。我告诉它我想要什么数据,我用的是ggplot2库,这是非常好用的库。我告诉它变速器是一个因素,意味着一些数据被我视为类别。当我在文档中看到0或1,并不意味没有或有一个变速器,它表明的是我所看到的是两个类别。

在绘图程序中,我想要绘制重量在每加仑英里数上的图。数据集中的mtcars,我想要用颜色区分数据,然后用点来表示。我想拟合线性模型即LM。y~x 指我想绘制关于x的y函数等等。

语言的特点

R是动态型的,具有第一级函数,具有闭包(closures),因此你可以将一个函数作为一个参数传递给另一个函数,诸如此类。

R语言还具有对象系统,事实上有两个对象系统。一个叫做s3,一个叫做s4。s3是比较老的系统有点像Perl,当中你有列表将其带入一个对象中。非常随意方便,且轻松。而s4对象系统更严格一些,需要明确类型。如果你输入的内容不对,会得到警告,在旧系统不会出现这种情况。

这两者并不会很快消亡。大部分对象用的是s3,比较老的系统。s4比较新,在对接其他语言时表现更好。比如C语言,两者都适用于日常运用,但是旧系统更加受欢迎一点。实际上如果你看到谷歌关于R语言的指南说明,上面讲到要避免s4。

R语言是向量导向的。无论好坏,这个语言中只有向量,没有数字。如果输入7,那会是个长度为1的向量,包含了数字7。所以一切都是用向量来表示,无论好坏。

优点是用起来很方便,只需要写出x加上y,然后将两部分加起来。缺点是当你拿到一个内容,这是数字吗?它的长度为1吗? 或者长度不止1那我要如何去处理呢?

一切都是按值传递的。这样可以减少错误,但是它也造成了很多重复的内容。

所有内容都可以变成空值,对统计学语言来说能够处理缺失数据是非常重要的。在R语言中你可以用两种方式处理缺失数据,有缺失值(NA)和空值(null)。缺失值意味着,我不知道,它有值,有意义,但我不知道值是多少。你需要理清这个三态逻辑。

你也会有空值,意味着假装我不存在。就像哈利波特中的一句台词,当中哈利说"我会呆在房间里,保持安静,假装我不存在"。

因此如果文本中,看到空值函数会忽略它,好像它不存在。但如果你看到缺失值,这取决于你告诉它如何做。我是忽略缺失值,还是需要考虑它。

向量化的例子

一个关于向量化的例子。假设我想产生一百万个,服从正态分布的随机变量。rnorm()可以实现这个功能。X包括从标准正态分布中,获得的一百万个样本,然后进行求和。这种对需要的向量进行预分配的方式,是很好的R语言方式。但是不适合C语言,因为浪费内存。所以如果你是一个从C语言转到R语言的程序员,你会觉得这种写法很糟糕。没错,这个代码很简洁。但要聪明一点。可以一次产生一个随机数,加到sum()上。保存分配的所有内存。

第二个例子比第一个运行速度慢25倍,所以在R语言里不好的操作代码,在C语言之类的语言中可能是好的代码,反之亦然。

和我工作过的一些人先学了R语言,然后去学了新的语言,他们的代码像第一个例子那样,做任何事之前先把所有的保存下来。在R语言中你不需要这么做,当然在这儿你不一定必须这样。但是你最好这样做,因为它更 高效。R语言中,for循环结构效率非常低。如果有天你抱怨R语言的效率,其他人要提醒你的第一件事可能就是你避免用for循环了吗。但一种编程语言不鼓励for循环,确实有点奇怪,不是说你不需要它。只是当你可以避免它时,你确实不想使用它。

R语言的缺点

R语言速度慢。给个数字的话,可能比C++慢100倍,但也不一定。如果你的代码非常幼稚,也可能慢1000倍,也有可能慢2倍,这极大地取决于你要做什么。

许多R语言在后端是用C语言写的,如果你向C语言中传递了大量的工作,在输出之前它会仔细消化。这样效率会高一些。但是如果大量工作在R语言中发生,效率可能很低。

工具支持是一个问题,如果你来自Visual Studio,你会期待语言工具应该是什么样子的,R语言大约晚20年。它也开始去获得一些工具,就像几十年前我们理所当然使用的那些工具一样。

安全性。R语言是为交互使用设计的,而不是为生产这是它的目的。让你侥幸成功,你认为你在交互地处理数据集,你做错了什么你自己会知道,那么我又抱怨什么呢?如果你这么说的话 ,那这就是你的意思,那你就这么做吧。如果你想给语言的关键字赋值,我猜这是你的意图。

带来的问题是,人们会在R不擅长的领域使用R,许多人只知道R语言,所以不管什么任务都使用R语言。

相关书籍

如果你想了解更多关于R语言的缺点,这里有一篇报告《The R Inferno 》。上面说 "如果你觉得你在R语言的深渊中挣扎,这是你的指南”。共126页,它有点模仿但丁的地狱当中有一些中世纪的艺术作品等等。它包含很多详细的知识,关于一些R语言的冷门知识,以及怎样解决它们。

我倒是希望有人能写一本书,名为《R The Good Parts》有关R语言好的一面。如果你熟悉这本书《JavaScript The Good Parts》,这是一本很不错的书。Crockford以一种严厉的视角审视它,这些都是不好的特点,但是JavaScript本质是一种很好的语言。JavaScript里包含的优秀语言。

希望有人能写一本像这样的关于R语言的书,R语言擅长很多内容,R语言中有陷阱,就像JavaScript中也有陷阱,它们在这方面是相似的。人们在学习之前会先去使用这两种语言,当中有不易察觉的陷阱。

每次说起这本书我都要展示这张图片,左边是《JavaScript》,右边是《JavaScript The Good Parts》这本小书。

R语言的启示

数据分析与系统编程有很大的不同,比你想象中的更加不同。人们为了完成工作需要构建很多基础。如果你指出R语言的一些问题,比如这里很奇怪。这里无声无息的失败了,这里不管用。人们会说 "是的,但是得我完成工作。我不在乎你的编程语言多么优雅,但我用它无法完成我的工作,所以我不会考虑它”。只要有可能,人们就会使用熟悉的工具。

R语言的资源

可以从r-project.org下载R。我写过一本入门书,从一个程序员的角度看R语言。如果你用过C++、Java、Perl这些常见的语言。它告诉你一些当你刚开始使用R语言时,可能觉得惊讶的事。

这是我之前提到过的书。我所知唯一一本把R语言当作编程语言的书《R语言编程艺术》(The Art of R Programming)。是由No Starch Press于一年前出版的一本书。这是一本很好的介绍性书籍。

如果你想知道一些程序员对R语言的视角,在Twitter上有一个账号 @RLangTip。我之前发起的,每天分享一个关于R语言的小窍门。然后我转给一些对R语言更了解的朋友,让他们管理,以及维护其发展。

好的,这就是我的一些介绍,谢谢大家。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-10-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CDA数据分析师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档