源:Bioconductor: open software development for computational biology and bioinformatics,Genome Biology 2004, 5:R80
Bioconductor的产生是计算生物学及生物信息学(computational biology and bioinformatics, CBB)发展的产物,其目的是有效降低CBB的门槛。当前,随着计算生物学的发展,越来越多的数学方法及模型被引入到生物学当中来,另一方面,随着生物技术的发展,实验可以产生前所未有的高通量生物信息。如何方便而准确地使用数据工具来处理海量的生物信息,成为Bioconductor最直接的目的。
面对如此海量的生物信息,单兵作战是无法应对的它给生物学家及统计学家带来的各方面挑战:数据获取,管理,转换,模型化,多元数据整合,以及使用智能学习手段(machine learning methods)发展新的模型与方法。合作才是有效应对这些挑战的手段。Bioconductor强调透明开源,可重复以及高效开发来应对这些挑战。
透明
高通量数据分析是非常复杂的,往往需要很多个步骤才能完成。从原始数据(比如说图片)的处理到统计学方法的应用,到总结出生物学意义,中间往往需要经过多步数据及其结构的转换。小的误差甚至错误会影响整个下游的分析。只有高度透明才能让最有价值的工作被广泛使用。
追求可重复
生物学家最熟悉的可能就是实验方法(protocol)了。它是一个详细地具体说明每一步操作的规范,以帮助其它的人可以重复。而这也是Bioconductor的追求。在文章发表时,人们可以从文章中提供的数据重复出其结果,是Bioconductor努力追求实现的。
高效开发
这里的开发并不简单的某一计算资源的开发,而是整个CBB计算方法的全面开发。软件与数据资源都可以在开源环境中获取,改进并进尔开发出新的功能。这就要求高质量的说明文档以及良好的开源环境。如此,也有利于对下一代科学家及软件开发者进行培训,使更多的人可以参与进来。
为了实现以上三个目标,Bioconductor制定了良好的开发策略,对当前优秀的开源开发平台进行整合。在上世纪80年代中期,Richard Stallman创建了自由软件基金以及GNU工程,以期为Unix操作系统提供一个开源的软件平台。他的一个重要思想就是:每个计算科学的研究发现与创新都应该公开给他人进行测试,评价,重复,并刺激新的发现与创新的产生。直到今天,开源不再受到排斥,因此我们可以享受大量开源资源。
linux正是自由软件的产物。在linux内核开发过程中,很重要的成功因素就是开发者可以独立开发自己的领域并对自己开发的软件进行维护。而Bioconductor的基础R就已经包含了这一思想,所Bioconductor无疑会继承这一思想。
在此基础上,Bioconductor还在语言的选择,基础资源,设计理念,招募共同开发者,资源再利用,代码的发布与授权,以及说明文档诸多方面做了考虑。
语言的选择
任何一门语言都有它的优势和目的,Bioconductor选择什么样的语言才合适呢?最初的考虑是一门适合解决DNA芯片数据分析及管理的工具语言,它要有良好的数据处理能力,灵活的绘图功能,可以读取数据库,以及丰富的数学统计工具及算法工具。Bioconductor的设计者们有丰富的R编程经验,感觉R是一门非常合适的工具语言,满足上述所有的要求。同时,R这种脚本式语言易学易用,容易推广。当时,在CBB领域很多工程都由R来完成,有广泛的用户。这其中包括Spot system,MAANOVA以及dChip都是使用R的成功典范。以下列举一些R适合Bioconductor的特点:
原型构造能力(prototyping capabilities)
R是一门高级语言,可以容易快速地构建出新的结构与方法。其中很多结构和方法并不一定是最优化的,但是它是开放的,给人们不断改进算法的可能。人们也可以容易地使用那些比较成功的算法。
包装策略(packaging protocol)
R环境包括了一个成熟地包装与扩展的平台,它有很好的说明文档方案,以及管理众多组件的能力。在R中,将其称为包(package)。R为包提供了创建,测试,发布的一整套完整的方法。使用这些方法可以方便有效地进行目的明确的包的开发及验证,版本以及包与包之间的依赖关系管理等工作。这些方法得到了来自于不同的开发者开发的千百个扩展包的考验,证明它的合理性及有效性。而且它的开放性使得它在统计分析和数据的图形化展示方面进展神速。
支持面向对象的编程(Object-oriented programming support)
面向对象的编程可以使用程序更加健壮,易读。R使用了’S4’系统以后对面向对象支持得更加完美。Bioconductor努力地应用并推广面象对象地编程这一概念,使它的扩展包更加合理与易用。
互联网接口(WWW connectivity)
对于CBB而言,可以读取在线的资源是非常重要的。R提供了一系列不同的策略用于读写大型数据库及网络在线资源(比如http资源)。R还可以处理XML结构化的数据,提供了SOAP客户端,支持SSOAP。有了这些,可以帮助用户方便地读写不同来源的数据,注释以及分析资源。
支持统计模拟以及建模(Statistical simulation and modeling support)
R提供了各种随机数,以及机器学习算法。这些算法都是久经考验的。Bioconductor可以直接地继承及使用这些优秀的工具。
图形化展示(Visualization support)
R的一个强项就是其绘图功能。同时它还在不断地壮大。Bioconductor可以轻松地使用这些工具绘制基因在染色体中位置,基因表达热图,等等。
并行计算(Support for concurrent computation)
并行计算可以合理利用资源大大的提高效率。其中snow包及rpvm包等为并行计算提供了便捷地解决方案,支持并行虚拟机以及消息传递机制,可以让程序在诸如cluster以及grid上方便地运行。
社区(Community)
这也许是R的一个重要方面。R不再是一门静止的语言。你的学习的同时可以和包的原作者直接交流,明了算法,改正错误,面向需求补充及发展包。
有了以上这些优势,使得Bioconductor从一个高的起点飞跃发展。
Bioconductor基础
在最初的两年内,Bioconductor的核心开发人员花费了大量精力来构建Bioconductor的基础。这些软件和说明文件都是Bioconductor其它包的基础,它们被反复使用,不断强健。这些包都是为了解决特定的问题而产生的,虽然它尽可能地考虑到各种可能,但它们并不是那种最基础的数据结构,不能随意地使用。因为很多生物信息学的一些基础数据结构总是不断地被生物信息从业者们重复开发,Bioconductor期待这些基础包可以基本上解决这一类的重复开发,并且提供给人们一个结构完美,可移植性强的基础资源。这些基础资源是跨平台的,高效的,文档完备的。
比如最初的exprSet类就是这样一个基础的数据结构。exprSet使用array来存放基因表达数据,使用基于data.frame及list的数据结构方便人们对基因芯片的数据进行注释,管理,以及分析。exprSet的设计成为了affy, marray以及limma的基础。
hgu95av2是一个大型的基因芯片注释包。它包括了比如序列,基因功能,代谢途径,以及基因本体学的信息。它成为了注释包的一个典范。可以方便高效地使得基因芯片的探针ID来获取它相关的生物学注释。
Bioconductor设计标准与理念
一个好的科学软件应该是低数据复杂度,完备的建模工具及多元数据源的整合。Bioconductor基础包应该应该致力于为科学实践(他人可以很容易地重复报导的结果)和创新提供基础。
Bioconductor强调简洁规范,编程面向对象,模块化,多层次可执行的说明文档以及自动发布等等多项特性。
简洁规范
虽然Bioconductor并没有明确什么是简洁规范,但是每一个Bioconductor包都会经过Bioconductor核心工作人员的评判,给出合理的修发意见,以期达到简洁规范的标准。比如说在描基因表达数据时,一定会要求使用exprSet类。当你熟悉并了解了这些规范之后,你会发现,这些要求有利于不同软件包之间的交流,也降低了人们接受新的扩展包的难度,因为做为基础的数据结构基本保持不变。
编程面向对象
并不是每个扩展包都是面向对象的。但是Bioconductor鼓励开发者学会使用所谓的S4面向对象的编程系统。R中的S4是由Chambers倡导的,它非常类似Lisp和Dylan。在S4系统中,类被定义为拥有特殊结构(通常指slots)和继承关系,及方法的集合。这里的方法有两种,一种是为某个类特定的,一种是不同的类使用相同的方法名。S4系统被证明非常有效地面向对象的编程系统。
模块化
模块化是个知易形难的概念,它可以在多个层次上实现。Bioconductor主要在三个层次上追求模块化:数据结构,R函数以及R扩展包。数据结构化可以使用最小的代价获得更多的信息。比如exprSet类,它不但包含了表达量(exprs slot),多样性(se.exprs),相关数据(phenoData slot)以及其它的描述信息诸如(slots description, annotation, and notes)。函数的模块化是指一个函数只实现一个功能,它的说明文档要求带有实现这一功能的范例。这样做可以简化修正错误及测试的时间。而在扩展包模块化上,是指包通常都有自己独立的程序和文档,包与包之间有联系,但是却分开存放。
多层次可执行的说明文档
准确而全面的说明文档是一款高效软件的基础,统一的格式是它获得最大影响的保证。Bioconductor继承了R的高效而灵巧的文档系统。它要求对每一个函数都进行说明,并且说明文档中可包含用于教学及测试的代码。Bioconductor还导入了一个大型的文档说明系统:vignette。vignette除了注重单个的函数说明之外,它更注重介绍如何使用多个函数,甚至来自于多个不同的扩展包的不同函数,来实现一个生物信息分析任务。而vignette还提供了不同包之间互相访问的机制。
在制作说明文档时会使用到Sweave系统来生成及转换vignette。通常这种转换是从说明文档转换成可供打印的PDF文档。
自动发布
Bioconductor会自动检测更新及维护扩展包。在升级扩展包时,Bioconductor会检测下载包的MD5值来确认包的完整性。
综上所述,Bioconductor是CBB发展的时代产物。它很好地体现了S语言的核心思想:“everything is an object”。Bioconductor中的一切都是R的一个个对象,它们以包的形式出现。它的模块化,面向对象编程,以及自动发布等等,处处体现着对象的概念。
分布式开发以及开发者招集
分布式开发是指在地理上位于不同位置的独立开发最终汇总成一个软件工程的开发模式。在这个模式已经被R成功实践了约18年。开发者可能来自于不同的领域,在开发水平上也会良莠不齐,他们与Bioconductor核心开发团队一起致力于扩展Bioconductor。
分布式开发要求不同的开发者可以同时开发工程中相同的组件。这就需要良好的文档系统以及开放的源代码。Bioconductor使用的是Concurrent Versions System来控制开发版本。。通过这一系统,所有的开发者都可以接触到整个工程的源代码。
分布式开发的另一个要求是不能因为个别开发者地形为引发系统其它部分的崩溃。在R中使用了包的概念。通常开发者将自己开发的部分整理成扩展包的形式。每个包都应该有它特定的主题。通过包的区别来控制发生错误的范围。
Bioconductor依赖R系统构建的包自检系统来对每一个包进行测试以确定其稳定性与健壮性。每一个开发者都要对其开发的包中的每一个公共函数进行说明,并且提供示例代码用于检测其功能可以准确实现。开发者在每次提交新包或者升级之前都必须保证所提交的部分可以正常运行。除此之外,在提交升级之前,必须考虑升级的部分不会影响其它包的正常运行。有些时候升级包会影响依赖它或者导入它的相关包的运行。
开发者通过一个只对开发者开放的论坛来交流。在那里,开发者会提交自己的电子邮件,电话等用于交流思想以及更新知识。有时也会通过开会的方式来交流。
外部资源地再利用
这主要有三个方面的考虑。第一,尽量直接使用或者稍加改编将已有的程序化为Bioconductor的一部分,而不是重新编写一遍。对于已有的成熟算法基本上只是对其原代码进行整合以融入Bioconductor,而不重写。对于那些标准工具,在充分理解的情况,适当加入新的功能。对于那些好用而且流行但是存在bugs的软件尽量不整合。
第二,由于CBB是一个复杂的领域,可能需要多个方面的专业知识来完成一个功能,所以Bioconductor提供了整合其它代码的手段。最初被整合的例子比如说graph, RBGL以及Rgraphviz等。graph提供了关于图运算的基本方法,而RBGL提供了许多关于图的算法,最后Rgraphviz提供了许多关于图的显示的算法。而后两者就是从C中的BOOST库和Graphviz库直接整合而来。Bioconductor并不想重写一遍这些代码,只是希望提供一个平台可以让其它的开发者方便地使用这些代码。
第三,可以读写多元数据。比如说XML之类的数据。
发表及授权
现代杂志一般都会有两个独立的审稿人来审核稿件,以确认是否可以发表。但是就软件的发表来说大多数情况还不是如此。Bioconductor的基本原则是审核后发表,最重要的手段是开源,利用开源的优势来促进发表的质量。Bioconductor希望开源可以更好地提高可重复性,可扩展性以及对科学研究的紧密性。开源使得软件的源码完全暴露在公众面前,它会有如下好处:
- 鼓励可重复性,可扩展性以及对科学研究的紧密性
- 公众可以对代码进行仔细审核以及评论
- 算法和实现方法完全开放
- 大家可以不需要等待开发者来改正错误,扩展和提高软件
- 鼓励表现优秀的工具和完善的指导文档是一个好的科学计算及统计软件的必备条件
- 为研究人员比较和扩展生物数据分析方法提供实验平台
- 确保Bioconductor是生物学家实践其研究的软件的集合
- 领导及鼓励成功软件的商业化支持及开发
- 推动研究方法的可重复性
对于软件的发表来说另一个需要考虑的事情是软件的改进。无论是R还是CBB研究,都是快速发展的,Bioconductor必须适应这一需求而不断改进自己。Bioconductor也希望开发者能够意识到Bioconductor更是一个发现与创造的平台,而不是一个传统的静止的软件。
Bioconductor使用R做为基础是一个谨慎地考虑,因为包的发布方式更容易,它有良好的版本控制策略及API定制手段。Bioconductor一年会发布两次。而在正式版发布之间,允许各个扩展包修补错误,改进说明文档。这样可以避免用户在升级软件时出现错误或者理解上的差异。
在正式发表前的六周,Bioconductor会确保所有的扩展包可以协同工作。在那个时期,每一个扩展包都会有两个Bioconductor的核心工作人员来审核扩展包的工作状态。扩展包一旦发表,它的分枝版本都会被删除。之后的开发必须以发表的版本为基础。有时候Bioconductor会修改扩展包的版本号,并对不同版本的扩展包进行文件管理。而开发者需要自己维护多个分枝版本的开发,以确保最优。
有时候一个算法会有多个扩展包同时实现。Bioconductor是鼓励竞争的。Bioconductor并不会去评价哪一个扩展包在实现算法时更优秀。而事实是人们往往会选择不同的扩展包以适应不同的需要。
Bioconductor不同于普通软件的其它方面
对于Bioconductor来说,最主要的挑战就是如何提高实验的可重复性,对复杂数据及其变化的把握,对用户的培训以及快速响应用户的需求。
实验的可重复性
Bioconductor非常强调研究的可重复性,这是CBB研究的基础,是科学发现的基础,也是进一步研究与发展的基础。在科学研究的任何领域,可重复都是第一要义,然而在科学研究软件来说,却并不是这样。Bioconductor致力于打破这一特例。
Buckheit和Donoho曾经说过,
An article about computational science in a scientific publication is not
the scholarship itself, it is merely advertising of the scholarship. The actual scholarship is the complete software development environment and that complete set of instructions that generated the figures.
一篇计算科学相关的文章并不是学识本身,它只是这一学识的推广。真正的知识在于如何完善软件的开发环境以及完整的生成文章中图像的指导。
发表文章只是向他人公布自己研究的一个手段。但Bioconductor不局限于此。Bioconductor希望的是发表更是欢迎他人来试用的信号。为此,Bioconductor做了相应的准备。
在以往的计算科学相关的文章中,人们往往只是对自己的算法进行描述,因为文章这种发表媒介局限了人们发布实验数据,运行参数以及程序本身。其后果就是他人在重复或者使用这一知识时往往会痛苦于再次实现作者的算法,读者往往需要花费不小的精力去重现那些作者已经优化的细节,而这个时候读者往往无法与作者进行有效的沟通。
在CBB文章发表中,同时发表数据已经成为一种趋势。这为他人重复实验提供了可能。而重复实验还需要软件和每一步的执行命令。只有两者都同时发表,才被认为是CBB一个成功地发表。现在主流的可品质杂志都会提供相应的哪怕是非常基础的工作的细节以及计算方法。可重复这一要求被同时提供的数据以及计算代码满足。
通过整合R的优秀平台,Biocondoctor扩展包及文档标准为CBB研究的可重复性提供了最优秀的引用平台。哪怕是如何生成一个图形,一个表格,都可以通过Sweave文档系统来获得帮助。任何一个R用户都可以很轻松地修改代码,重现CBB文章中的研究成果,甚至可以体会使用不同算法的结果。
有理由相信,R、Bioconductor给CBB研究可重复性带来的革命。人们还可以从其它环境中调用R,比如Perl,Python等。这样,不同的平台可以有机的结合在一起。人们更可以平衡不同平台之间的优势。
动态的生物注释
生物信息的注释资源是不断变化的。随着生命科学的发展以及生物技术手段的提高,新的发现及错误的修正总是不停地出现。另一方面,这些资源的复杂程度也不断变化。Bioconductor是如何来适应这些变化的呢?
Bioconductor中的注释资源必须与原注释资源一样不断地保持同步更新。用户往往希望使用最新的注释数据。Bioconductor采用一种半自动更新的方法(自动提醒,用户确认而后更新),使用户在不同的分布源上得到最新的注释数据。注释数据有版本管理,以方便人们可以获得以前的注释版本进行一些特定工作。当然用户还可以自己从原注释资源那里生成自己需要的注释数据。
Bioconductor中的注释资源是以包的形式进行封装的。如此模块化了之后会带来很多好处。因为注释包有自己的规范,所以,首先,人们在学习和掌握地过程中熟悉了一个包之后触类旁通。第二,注释包的创建便捷快速。第三,使用这些注释包的工具的扩展性强。第四,用户可以自己增加注释信息。
使用包的形式,方便了Bioconductor对注释信息的管理。用户无需对注释包的细节做过多的了解,他们只需要对自己感兴趣的包进行下载,安装及使用就可以了。
在另一方面,Bioconductor还考虑到了如何利用在线的注释资源。这样用户可以更及时地与原注释资源进行同步。有些时候,Bioconductor包可能不能最及时地做到更新,可以直接使用在线资源可以有效地避免这样的时间差。但是使用包的形式也有它的优势,比如用户不可以一直在线,用户可能对在线的数据源并不是十分地了解,而用户却希望在缩小学习的时间成本。还有就是在线资源的版本维护方面也存在差异,有时候无法保证可以重复已经发表的结果。因为在线资源及包各有优势,如何选择还在于用户自身。
当然Bioconductor是鼓励开发者使用AnnBuilder来创建注释包的。这一过程可能比较复杂,涉及很多细节,在使用是可以查看相关的文章与帮助。
培训
CBB是多门学科综合,它要求工作人员有生物学背景,有计算机学知识,以及统计学理论。所以Bioconductor必须十分重视培训工作。对于Bioconductor来说,很多潜在的用户并没有R的编程经验,他们可能是生物学家,或者统计学家,也有可能他们有很丰富的R经验,但是却缺少生物学背景。这也是Bioconductor如此重视文档系统的原因。同时,Bioconductor还推出了其它的举措来丰富文档系统。在R的基础上推出vignette,在其中有充分的示例说明以及生物学解释。每年都会有大量的培训资料在Bioconductor的官方网站上。
这些课程资料已经持续了十多年了。他们多是由Bioconductor的开发者主讲的,并且依据反馈不断改进。这些资源当然也是公开的。课程的主要目的还是介绍和使用扩展包。
Bioconductor也发现,有文档写作经验的开发者会带来很多优秀的点子。他们在写作策略,概念以及方法学方面都有显著的特征。Bioconductor也依据一些成功的文档例子不断完善自身的文档写作规范。
人们在使用Bioconductor的过程中不知不觉地会逐渐地转变成开发者的身份。所以在文档写作的过程中,也必须考虑这一类人的需要。在考虑了他们的需要之后,会提高软件合作开发的成功率。
响应用户需求
一个软件的成功很大程度上取决于它与用户的交流。当前最有效的响应用户的方式可能就是e-mail通讯组了。Bioconductor在建立初始就启动了相当的邮件组。同时,对以往的交流邮件要做到可搜索,以方便新用户以及遇到相同问题的用户。同时也对其它开发者避免或者修正错误提供了参考。Bioconductor的邮件组为mailto:bioconductor@stat.math.ethz.ch。邮件组可以提供给用户更及时的培训,同时也可以了解到新的需要,甚至可以刺激开发者产生新的创意。
另一方面的响应用户需要就是GUI(图型化用户界面)。GUI比命令行形式可以更好的实现人机交互。它可以减少人们对命令行的敬畏感,同时可以有效帮助人们自动完成复杂的操作,比如众多参数的设置,复杂函数名的拼写等等。
用户在下载及安装方面也会遇到不同程度的困难。有些时候可能是用户本地配置的问题,有时候可能是由软件的bug引起的。及时地了解及修正这些错误是提高用户体验的一个手段。另外,不同扩展包之间的依赖关系的管理也尽可能由系统自动完成,人们不需要为下载某个扩展包的依赖包而烦恼。
在下载安装Bioconductor之后,人们就可以开始他的探索了。用户可以从vignette中的帮助开始,一步一步学习如何使用一个扩展包。
其它开源资源
在CBB领域,Bioconductor并不一唯一的开源软件,也不是这方面开源的先驱。BioPerl, BioPython以及BioJava都做得很优秀,其它的还有GMOD以及MOBY。Bioconductor期待的是可以方便地从这些平台转换到Bioconductor平台,也可以从这些平台中学习提高。
下面,我们参见R绘图基础(四)热图 heatmap来快速了解一下Bioconductor的代码。