张金龙的博客分享 http://blog.sciencenet.cn/u/zjlcas 物种适应性、分布与进化

博文

为什么生态学家要学习Python或者R? 精选

已有 13485 次阅读 2018-1-9 00:31 |个人分类:科研笔记|系统分类:教学心得|关键词:学者

 最近有几位老师在微信里面分享了学习Python的一些资料。与R相比,Python是一门真正意义上的编程语言,除了编写脚本,用于数值计算之外,还可以编写命令行程序,编写带用户界面的应用程序,编写网站,绘图,调用C,C++以及Fortran等语言的函数库等等。Python比R的应用领域更广阔,除了为黑客提供各种黑科技外,还广泛应用在化学、物理、天文、生物信息等领域,当然也非常好玩儿。这么强大的语言,当然非常值得了解和学习。更难能可贵的是,很多Python的项目是开源的,也就是源代码可以下载,供好事者仔细研究。Python的另外一个好处就是可以在不同的平台上使用,也可以编译为独立的程序运行。Python脚本也可以用来驱动MySQL,sqlite, ArcGIS, Adobe Indesign等软件,进行二次开发,用途极广。 Python资源极为丰富,有数以万计的程序包, 其中不乏生物信息学软件包。Biopython就是其中之一。BioPython程序包的一些函数可以对DNA序列进行复杂操作,实现对GenBank的访问和查询等。Python的语法简洁,通俗易懂, 很容易上手。 Python用户不需要捣腾层次复杂的花括号,只需要留意缩进。Python还有pip程序包管理系统,编写程序包也极为方便。掌握了Python,就掌握了这些资源。看了上面的介绍, 还没有学Python的朋友,是不是动心了呢?

 然而还有一个选择,那就是R语言,也叫R软件,R语言是驱动R软件工作的命令。其实R语言的本质是S语言,S语言诞生于美国贝尔实验室。不过实现S语言的软件Splus售价太高,新西兰奥克兰大学的两个老师在教学过程中山寨了一下SPlus,他们用C语言和Fortran编写了一个软件,用来实现S语言,于是R软件就诞生了。自从这两个老师开放了R的源代码之后,R受到了学术界的关注。因为S语言语法简单,接近于很多人熟悉的C语言,在进行统计分析以及绘图上有出色的表现。不仅如此,R秉承了UNIX的传统,所有的命令, 包括程序包中的函数,都有非常详细的帮助文件,这是很多语言和软件所望尘莫及的。Python的很多程序包都没有做到这一点。近几年来,R语言成为生态学研究最流行的软件,特别是在森林样地数据处理、地理信息和空间处理、统计绘图以及在系统发育比较分析,经济学,贝叶斯统计等很多领域,都有一流的学者坚持使用R,一些新的统计方法也用R开发。从Springer以及Wiley,O'Reilly等著名出版商R相关图书的出版情况,就可以了解到R的热度。Tiobe编程语言热度排名,R蹿升到第8位,对于一门应用领域狭窄的脚本语言实属不易。还有很多研究论文直接在附录中给出了R代码。英国生态学会的Methodsin Ecology and Evolution 杂志更是开设专栏介绍生态学与进化分析的软件包,其中R程序包占绝大多数。在过去,研究人员可能提供MatLab代码或者SAS程序,然而最近几年, 这种情况逐渐减少了。相比之下,提供Python代码的生态学研究还不是很多。

 对于生态研究来说,R与Python都是非常好的语言,R则更胜一筹。任何一门编程语言, 从入门到精通都需要很长时间练习,普通人即使花费很多时间, 也未必能够掌握一门计算机语言的精髓,更别提能使用得出神入化。Python的语言的覆盖面很广,几乎是我们能想到的脚本语言能做的事情,Python都是可以做到的。

 但是,一门计算机语言, 能够在一个学科中占据绝对优势,其实主要是看运气,更重要的是取决于在这门脚本语言的发展过程中,有没有足够牛的牛人, 能够做出一些开创性的工作,奠定良好的发展基础。 例如, 之所以R软件在系统发育比较分析(PhylogeneticComparative Methods)能占绝对优势,根本原因在于法国进化生物学家E.Paradis编写的APE程序包,因为这个程序包定义了phylo这种数据类型,设计了进化树在R中储存的格式以及基本的操作。这样一来, 你想提取物种名, 就可以用 $tip.label提取;想为进化树重新排序,就用ladderize(); 想绘图,就用plot.phylo();Paradis创造了APE,在Analysisof Phylogenetics and Evolution一书中介绍了相应的操作。APE对进化树的操作简单易行,因此很快吸引了大量用户,其中不乏一流学者,很多人在APE的基础上开发了程序包,如laser,phytools, picante等等,引入了众多新的分析方法,从此用R进行进化分析一发而不可收拾。对于群落生态来讲,类似的例子是vegan程序包。这个程序包主要用来进行多元统计,对于群落生态学数据分析有举足轻重的作用,例如计算alpha和beta多样性,CCA,DCA排序以及方差分解,物种多度曲线等等只需要一个函数就完成了。 生成的结果,可以直接绘图或者进行其他分析,极为方便。vegan也是众多一流生态学者合作完成的。进行生物多样性分析, vegan是绕不开的,而且越来越多的人开始使用vegan做群落数据分析,这也是很多人学习R的驱动力。在此之前,群落生态学家主要是用CANOCO或者TWINSPAN或者其他一些多元统计分析软件进行数据处理,数据格式千差万别,甚至每个软件都有自己的数据格式。那时候, 就连Numerical Ecology的作者,大名鼎鼎的Pierre Legendre都也只能自己用Fortran写程序。

 R语言目前在中科院以及国内大学的生态和进化研究中已经非常重要。植物研究所赖江山博士的R语言培训班和课程进行的如火如荼,次次爆满。很多人学习R,不但是为了掌握一门技术, 更是为了了解资源。学习了一门语言,就打开了一门看世界的窗户,其实编程语言也是如此,至少可以看看用这门编程语言能做什么以及现有的资源有哪些。不过,学习的诀窍,就在于不要一下子学很多东西,而是要学得深入。虽然R语言或者Python已经入门,但是学的不够精,即使代码和程序包在就在那里,自己也不清楚怎么用。 ggplot2的作者Wickham在《Rfor Data Science》一书里面说,作者建议读者先学好一门语言,学到很熟很深的程度,然后自然就容易融会贯通,这种说法我十分赞同。

 对于学过R语言的学生,什么学到比较熟练了呢? 这里说说自己编写R程序包的感受。

 其实学习R语言,并不一定非要求编写什么程序包。编写程序包还涉及到一些Latex语言文档,有时候涉及到调用C语言或者C++或者Fortran代码,涉及到其他程序包的依赖以及编写Description文件的格式以及UTF-8编码等许许多多问题,需要一段时间去认真学习。而且随着R的升级,R程序包编写的要求也经常改变,原来能够正常工作的程序包因为不符合要求就从CRAN下架了。还有不同操作平台编译的限制,数据大小的限制等等。例如在检查R程序包过程中有几十项内容,不能有一条出错,否则就不能提交到CRAN。对程序包的质量严格控制,并不是R管理团队太苛刻了。最近昆明植物所一位老师就抱怨说,安装一个R程序包,要依赖十个其他的包, 然后其中有些包又要依赖若干程序包,不过有一个二次依赖的程序包,因为不合格已经从CRAN移除了,这就导致程序包不能正常安装。程序包没有人好好维护的情况之下, 如果出现错误,就难免影响用户的心情, 影响CRAN以及R的声誉。当然, 你可以说, CRAN上的程序包都是作者负责的,出错也是难免的,R核心团队对此没有任何责任。道理是如此,可是谁也不希望不靠谱的程序包太多。

 2017年年底,我忽然收到维也纳大学KurtHornik教授发来的email,让我修改phylotools,原因是该程序包一些函数的例子里读取用户工作路径之外的路径,这违反了CRAN的规定。phylotools程序包主要是用来构建DNA序列的超级矩阵supermatrix的。2009年年底,我到华南植物园葛学军研究员的实验室补充浙江古田山大样地DNA条形码的数据,做了一些实验之后,要把140多个种,每个种的rbcLa, matK,trnH-psbA基因分别比对,然后再拼成supermatrix。在计算机程序里,这是很容易实现的,但是如果用手工,就非常麻烦。当时还不熟悉R的我,编写了一些R脚本,用来创建supermatrix,这些函数后来就成了phylotools的主体。2015年,重新检查这个程序包后,我觉得很多函数写得不够好,于是将函数重新写了一遍, 放到github托管了。这次收到email通知,让我修改phylotools,我干脆就把github上的新版本改了改,然后提交到CRAN。新版本很快就就在CRAN接收了,不过代价也是有的: 因为重写了一些函数, 参数和旧版本不同,基于旧版本的R脚本其实已经不能用了。虽然如此,作为软件包的作者,我还是觉得新版本的代码优雅一些,函数设计更合理一些。相比之下,虽然对HK80以及spaa这两个程序包都不太满意,但是精力有限,就一直没有修改。另外两个R包,查询植物科属的plantlist以及打印植物标签的herblabel一直都托管在r-forge以及github上,没有在CRAN上那么费心。

 能够编写R程序包,是否代表具有很高的R编程水平?答案是否定的。 因为编写程序包这件事, 只要是能编写R函数的用户,学习一点儿编写程序包的技巧,都是可以弄出来的。能够写程序包,确实说明相当熟悉R语言了,至少是能编写R函数了。能编写函数是区分入门水平和较为熟悉一门语言的分水岭。学习编程,入门阶段熟悉的是语法,如赋值、调用函数、写循环,如何查询帮助;之后是数据操作,字符串操作与正则表达式,编写函数,再之后就是各种算法。有人说,算法是函数的灵魂,很多情况下确实如此。因为函数就是为了实现一些功能,算法告诉你应该怎样实现这些功能。对算法的理解不够深入,函数就很难解决更深层次的问题,比如,要编写一个用于CCA排序的函数或者进行方差分解的函数,没有对相应理论很好掌握是不可能做到的。这些是真正考验基础理论和水平的地方,国内数量生态学家与国际同行核心竞争力的差距也就是在这里。

 学习计算机语言,无论是Python还是R,都是有助于培养好的思维习惯与严谨的态度。在编程过程中,错一个标点符号都是不行的。与此同时, 学习编程还要理解很多抽象的概念,比如S3、S4方法,面向对象、继承、多态性,也需要理解一些数学和统计学的内容,最小二乘法、极大似然、贝叶斯统计、非参数统计以及线性和混合模型等等。

 将一个问题分解为能用程序解决的问题,需要化整为零,一步一步思考,然后步步为营,这样从技术上问题也许就解决了。然而真正解决生态学与进化上的问题,发现新知识,提出新观点,已经不是技术问题,是编程所不能回答的。这时候就需要将各种信息进行整合,深刻把握问题的本质,进行深入思考。编程的能力再强,如果没有纵深的思考,没有对问题的全局性把握,没有从具体的学术问题出发,就很容易停留在技术层面,难有深刻的见解。无论是学习Python还是R,这个问题都需要仔细考虑的。

2018年1月9日 于 香港大埔




https://m.sciencenet.cn/blog-255662-1093799.html

上一篇:CTPL2通过中文名批量查询植物学名
下一篇:一个中文Latex幻灯片模版

22 王凯 卢元 张麟 靳少非 宋春林 白珍建 张钫 高建国 胡涛 李建国 柳文山 张宁 刘名信 王栋 张智才 梅卫平 李心诚 袁丹妮 戎可 覃伟 刘景欣 金超

该博文允许注册用户评论 请点击登录 评论 (15 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2022-9-30 20:59

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部