如何从零开始掌握生物信息学分析(新手宝典)

【字体: 时间:2015年08月13日 来源:生物通

编辑推荐:

  目前其实也不乏现成的计算工具,而且不少都是免费的,但对于门外汉来说还是有些难。通常情况下研究人员还是需要深入了解这些界面并未友好的程序,才能运行,而这需要计算运行的深厚知识。

  

生物通报道:今天的世界大不同,表现在生命科学研究领域,就是一切都开始进入了大数据时代,无论是DNA序列,显微图片,还是质谱数据,研究人员都越来越需要对这些庞大的信息进行收集、整合、处理和诠释。

对于许多生物学家们来说,这并不容易完成,传统的科研培训方式主要集中于科学的基础原理和实验方法,而不是计算机编程和数据统计,因此当不少研究人员发现自己需要面对大量的数据量时,他们不知道如何处理这些问题。

目前其实也不乏现成的计算工具,而且不少都是免费的,但对于门外汉来说还是有些难。通常情况下研究人员还是需要深入了解这些界面并未友好的程序,才能运行,而这需要计算运行的深厚知识。

这就会导致研究人员在进行大数据研究的时候,不得不自己编写一些程序来进行可重复和得到证实的信息处理。然而这些过程也需要小心处理,一不留意犯错了,就有可能危及数据本身。

近期The Scientist杂志联系了几位科学程序员,了解他们所使用的工具是什么,如果是菜鸟需要进行哪些训练等。

选择一种语言

生物学家可以从各种各样的编程语言中选择一种,对于许多应用来说,随便选择一种都可以,不过目前最流行的可能就是Python 和 R。“就目前而言,这就像是科学研究的二重奏”,来自加州大学戴维斯分校的生物信息学家Vince Buffalo说,他刚完成了一本名为《生物信息学数据分析技巧》(O’Reilly Media Inc.)的新书。

Python 和 R相对来说都比较好用,但前者能完成多项任务,而后者主要针对的是统计方面的内容,两种语言都有其各自的使用用户群,因此具有特定功能预生成代码(prebuilt code)数据文库,比如以R语言为基础的Bioconductor Project (www.bioconductor.org),能为显微,测序和芯片数据提供模块。另外Python 公共文库也有:Anaconda (continuum.io/downloads)。

来自华盛顿大学基因组科学系的助理教授Cole Trapnell利用R语言完成了单细胞基因组数据集的处理,“单一细胞基因组学问题牵涉到许多的统计学方面的内容,R语言很适合。”

此外,还有一种受到大家认可的语言,那就C/C++(Julia (www.julialang.org)),这种语言特别合适用于那些相对较慢或内存密集型任务,Trapnell说。

如果能将Python的语法,R语言的图形灵敏性和C++的速度结合在一起,那就完美了,“这也就是说,这种代码很好编写,而且也很快,”,来自加州大学戴维斯分校的遗传学副教授Titus Brown说,但这需要你花费大量经历掌握这些语言,他建议,可以选择你同事已经在应用的语言,这样他就能帮助你解惑。

所需的工具

UNIX 和 Linux系统都有预安装软件,如果你没有,那么通过操作系统管理员也很容易获取。Macs系统包含一个现成的Python 解释器和C/C++ 编译器,但必须单独安装 R(www.r-project.org)。Windows系统在默认状态下,不包含任何一种编程语言,因此你可能需要自己安装。

程序员还需要的一个工具就是一个好用的文本编辑器,这是用于处理纯文本文件的程序,与之相对的就是处理特殊格式的程序,如Microsoft Word。核心程序员通常喜欢使用命令行编辑器 vi 或 emacs,在Linux 和 Mac系统中这两者都有预装。现在也有一些很强大的可配置程序,但是对于新手来说很难掌握,“这要求你自己想代码,因此我还是建议使用自己擅长的方法,”Trapnell说。

同时你还需要找到一种能够用特定颜色标记特殊语言关键词(“syntax highlighting”),语法检查 (比如说要能找到错误的方括号和圆括号),代码格式,以及处理多种文件的编辑器。

常用的两种就是Windows系统的Notepad++ (notepad-plus-plus.org),以及Mac和Windows、Linux系统通用的Sublime Text (www.sublimetext.com)。同时还有一种Mac界面可用的AquaMacs (aquamacs.org)。

“我向我的学生强调的关键一点就是,尽量少用鼠标,”威斯康辛大学麦迪逊分校生物统计学和医学信息学教授Karl Broman说,“每当你将手从键盘中移开的时候,就在减慢速度。”

另外,如果你计划在某个平台(如 Mac 或 Windows)上从一种特殊语言开始的话,那么也许你应该尝试一下集成开发环境(IDE,integrated development environment),这是用于程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面工具,这能简化你的工作。

Mac C/C++程序员可以用免费的Xcode (developer.apple.com/xcode), Windows 用户可以使用Microsoft Visual Studio (www.visualstudio.com)。而对于 R 编程来说,常用的一种选择就是RStudio (www.rstudio.com)。Eclipse IDE (eclipse.org/ide)是一种支持多种语言的模块化工具,所有这些平台的基本版本都是免费下载,有些适用于高级用户的附加功能也可以获取。

如何使用命令行

并不是每次遇到问题都需要编程的,可以尝试调用一些已经完成的命令行简单脚本,也就是Bash,“Bash可以用于处理文件,”Brown解释说,“移动文件,循环访问,重命名等”。使用Bash可以将预生成的工具组装成自动化工作流程,例如可以利用Bash从一组测序数据中筛选高质量读长数据,然后链接到一个新文件中,将这一文件传递到一组预定义参数分析程序中。

值得参考的命令行工具:cli.learncodethehardway.org/book/.

调试工具

新手程序员通常会避免使用复杂的调试工具,如用于描述程序所处的某个点(X代表现在进入这段代码)的一些代码。但是调试工具能帮助程序员在某个特殊的代码上停止软件运行,看看情况,调整错误代码,这在寻找bug的时候尤为关键,“每种语言都有一个调试器,这些工具总是值得学习如何使用的,”来自加州大学欧文分校生态学和进化生物学副教授Kevin Thornton说,目前也有一些在线教程,“因此Google会是你最好的朋友。”

使用版本控制程序

Rachel Slaybaugh是来自加州大学伯克利分校的一位核工程学助理教授,她使用C++ 和Python 开发了一种能模拟中子传递的计算方法,同时她也研发了他们实验室最好用的一套代码训练方法,但她表示这需要确认实验室中的版本控制。

版本控制程序(Version-control software),如最受欢迎的 Git (git-scm.com)软件,能帮助程序员精确的了解一个程序版本与另外一个版本之间的区别,而且关键在于,如果需要的话还能调转回去。Git程序是一种免费的开放程序,方便团队之间的合作,可以分享代码,利用“fork”,程序员能在无需破坏现有代码的前提下就能验证新的运算法则,追踪并融合这些版本差异等等功能。

Git托管服务器GitHub提供无成本分享,分发和在线存档代码的服务,而且也能为你提供指向你软件的稳定链接。如果需要升级,那么就需要每月付出7美元(当地价格)。

虽然Git只是一段复杂的程序,但是这“极为重要”,Buffalo说,“而且更重要的是,这种程序有时能力挽狂澜,如果我的程序中出现了一个bug,我就会去旧的版本中找出它来,然后一个一个版本测试,看看它什么时候出现的。”

还有一些研究人员倾向于选择版本控制程序Mercurial (mercurial.selenic.com) ,其服务器是BitBucket (bitbucket.org),这对前五位使用者免费,其中包括无限制private repositories.

自动化与归档

加州大学戴维斯分校的C. Titus Brown近期在PLoS Biology杂志上发表了一篇经典论文:“Best Practices for Scientific Computing”,被不少本领域同行称为最佳软件开发实践指导指南,这篇文章不仅提到了程序运用的一个关键问题,也指出了程序员的一些基本概念,如给人写程序,而不是给计算机;只在软件能正确的工作后才可优化;文档里描述的应该是设计思路和目的,而不是技术细节等等。

其中还有一个基本准则就是让重复性的工作自动化,“让一切都自动化,”他说。换句话说,就是每次运行程序的时候不用手动输入参数,可以将参数输入到命令行脚本,自动执行程序。这样就能无误的操作数据,将数据从一个文件移动到另外一个文件,同时也可实现可重复性。

假设你在运行一个本地建模算法,“如果需要运行10遍,那么就可以写一个shell脚本,让它自动运行10遍。最好不要用手动输入,因为你有可能会忘了运行的内容,而且也有可能会漏掉部分内容,”Brown解释道,这些脚本也需要是版本控制程序,这样你可以将其与几周前的结果进行比对。

另外一个重要的方面就是不要忘记记录一切,Slaybaugh 说,在你的代码上加上批注,告诉同事也提醒你自己相关的内容。如果你计划与你的同事共享这些代码,那么可以用一种称为“doxygen” (www.stack.nl/~dimitri/doxygen)的工具进行记录。doxygen可以根据正确注释的各种语言源代码自动创建程序档案,或者研究人员也可以使用Jupyter Project (jupyter.org, 之前称为 the IPython Project),以在线注释的方式交换代码,数据和文件(Python、R 和其它语言)。

测试你的代码

Slaybaugh 为新手程序员提出了一个建议:开发一个测试包,其组成成分就是简单的一套能确保程序按你所想的那样进行操作的函数和数据。这样当你编写好自己的程序的时候,就能确保不会改变基底的运算法则,比如引入hard-to-track bug时,“你就能检测系统,看看是否能通过,”她解释道,这个过程就像是使用了基准线上的阴性和阳性对照。

Buffalo则说了一个简单的例子“假设你有一个函数(“add”) ,也就是加合两个数字,那么就可以设置一个“test_add”的函数来确保在程序改变的时候,2+3依然等于5。

将数据保存为“只读”

对于你来之不易的数据,保存时需要额外谨慎,Buffalo说,“可以将数据保存为只读,”也就是说不要用原始数据进行后续工作,可以拷贝一份,“比如你在Excel电子表格中保存了数据,后来又做一些改动,那么原始数据就永久不在了。”

寻求帮助

新手程序员可以首先找到一个丰富的在线资源,从中寻找帮助,选择自己想要的代码语言。Software Carpentry project (software-carpentry.org) 就是这样的一个免费工作交流组,主要用于科学编程的交流,其中大部分教学材料都可以在线获取。

Brown也是其组织者之一,他表示这样的交流组可以安排在一些“成本不是很高”的地点,这样你就只需要支付旅行和食宿的费用。同时也有一些在线的网站,如Codecademy (www.codecademy.com),还有一些在线的大学教程(例如,lifehacker.com/tag/lifehacker-u)。StackOverflow Web site (stackoverflow.com) 也值得推荐,在上面你可以找到一些答案。此外,你也可以请教你的同事。

寻找好的项目

最后请记住,编程并不是雾里看花的技能,而是需要解决特定的问题。因此,当你第一次坐下来学习编程的时候,一定是要有需要解决的问题,否则进步会很慢,而且也会缺乏动力。

Buffalo说,如果没有,那么也可以尝试在使用的开放源码软件上增加缺失的功能,“找到了想要做的事,就可以挑战自我,用一种新语言来尝试,这确实能让人进步。”

 

(生物通:张迪)

附:Best Practices for Scientific Computing文章要点(来自中国政法大学)

给人写程序,而不是给计算机。
1. 一个程序,对于阅读它的人来说,不应该要求读者一次性的在大脑里加载过多的背景/相关知识。
2. 命名需要一贯、明确、有意义
3. 代码风格和格式要统一一致
4. 软件开发中的各种工作都要分割成1小时左右的任务

重复性的工作自动化。
1. 让计算机去做重复性的工作
2. 把最近使用过的命令存到一个文件里,以备复用
3. 使用编译工具来自动化系统流程

用计算机做历史记录
1. 用软件工具来自动跟踪计算机的工作

逐步改进。
1. 每次做一小步,及时获得反馈,及时纠正

使用版本控制。
1. 使用一个版本控制系统
2. 所有由手工创建的东西都要放到版本控制系统里

不要重复自己(或他人)。
1. 系统中的每一段数据都要有一个权威的单一的存在
2. 代码应该模块化复用,而不是考来粘去
3. 复用代码,而不是重写代码

准备好对付错误的方法
1. 在程序中增加断言,检查它们的各种操作
2. 使用现成的单元测试框架
3. 测试程序时借鉴所有的可用的经验
4. 把bug做成测试用例
5. 使用一个有代码指令的调试工具

只在软件能正确的工作后才可优化。
1. 使用监控工具找到瓶颈
2. 尽可能的用高级语言写程序

文档里描述的应该是设计思路和目的,而不是技术细节。
1. 描述接口和原因,而不是实现
2. 重构代码,而不是注释解释运行原理
3. 引用其它程序时嵌入其它程序的文档

协作
1. 代码合并前进行代码审查
2. 当帮带新成员或解决特别诡异的问题时使用结对编程

维新旧代码。
 

相关新闻
生物通微信公众号
微信
新浪微博
  • 搜索
  • 国际
  • 国内
  • 人物
  • 产业
  • 热点
  • 科普
  • 急聘职位
  • 高薪职位

知名企业招聘

热点排行

    今日动态 | 人才市场 | 新技术专栏 | 中国科学人 | 云展台 | BioHot | 云讲堂直播 | 会展中心 | 特价专栏 | 技术快讯 | 免费试用

    版权所有 生物通

    Copyright© eBiotrade.com, All Rights Reserved

    联系信箱:

    粤ICP备09063491号