Linux shell/ python/ R: 生物信息的三把斧头

生物信息是一门典型的交叉学科,主要涉及分子生物学(基因组学)/ 计算机 / 统计。生物信息主要处理大规模测序数据,本质上是纯文本的字符串。人类基因组的参考序列就是一个由ATCG四种碱基排列的巨长字符串(3G bases)。很多时候, 生物信息分析要解决的问题是:
1、给定一条序列,就是一个短一点的字符串,比如50bp,150bp或800bp,需要知道该子字符串在总字符串中的位置,用生物的语言描述就是其在基因组中的染色体坐标。
2、给定很多条短序列,需要拼接成比较长的序列。因为参考基因组往往极长,不大可能通过一次实验从头测定到尾,所以只能通过构建大片段的重叠群,再把大片段继续打断成更小的片段进行测序,通过多重覆盖从而拼接成完整的基因组。这也是一种典型的Divide and Conquer策略。

相对于计算机科学可以处理的类型丰富多样的数据类型,比如图像,视频,声音,网页等等,生物信息的处理对象相对要纯粹和简单的多。但是,生物信息和其他计算机科学相比有个很大不同。就是生物信息的软件开发和数据分析绝大部分时候都是在Linux操作系统下进行。不同于主流的Windows系统电脑操作主要靠在图形界面下点击鼠标,Linux操作系统用的是纯命令行(在终端中敲命令)。生物信息的这个特点使得很多初学者入门比较困难。这就好比不会滑雪的人,即便给了他滑雪工具,他也会操作的很笨拙。但是一旦真正掌握滑雪工具,就会在雪地环境如履平地,挥洒自如。Linux操作系统就是这样方便和强大的系统,能提供异常丰富的文字处理命令,还可以通过管道(|)将前一个命令的输出传给下一个命令做输入,通过这样的命令组合可以实现非常强大的功能。此外,Linux系统还有一个重要特性是系统非常干净和简洁,不像Windows那么臃肿笨拙,那么消耗内存。

所以说,生物信息的从业人员的必备技能是要熟悉Linux操作系统,熟练使用常用的几十个命令,深刻理解Linux用户权限和文件管理。因为往往需要几百G甚至数T的数据,生物信息的从业人员还学要了解并行计算,熟悉常用的job提交系统比如Oracle Grid Engine (从前的SGE)。Linux命令的组合除了可以直接在终端里面一边敲一遍看结果外,也可以写成一个脚本(shell 脚本)以.sh为后缀名命名,然后进行执行。这个shell脚本在现有工具(软件)齐备的情况下可以完成大部分的原始数据预处理工作。数据分析的需求往往是个性化,因为实验设计不大可能千篇一律,否则科研的创新无从谈起。个性化的数据分析就意味着需要写程序,这个时候python就上场了。

当然,编程的语言五花八门,不过生物信息领域常用的主要有:python/ perl/ java/ C/ C++,这些语言都各有自己的用户和支持者。一般来讲,底层的算法比如大规模的序列比对或全基因组组装,这些任务计算量极大,往往需要用C/ C++来写,因为C是编译后执行的而且可以直接操控硬件,使得同样的算法用C/ C++实现时速度最快。但是,底层算法往往很早就被生物信息领域的顶尖专家(比如bwa的作者Heng Li)写好了,一个普通的生物信息从业人员需要写底层算法的机会并不常有。更多的时候,他需要写一些程序去收集,提取和总结shell脚本预处理好的数据和结果,在这个时候python可以非常好的解决此类问题。python是一种跨平台的解释型脚本语言,所有的Linux系统都自带python。而且,安装了python语言的Window电脑,也可以在CMD中运行python脚本。python的可读性强,学习时更容易上手。现在好多课堂都在尝试将python作为主要的教学语言,这个教学语言过去曾经是pascal/ basic/ VB/ C。此外python在科学计算,机器学习和深度学习领域都有非常强的社区支持。众多基于python开发的模块和程序包,都可以通过pipconda等工具轻松安装和卸载。写程序本质上是像搭积木一样的活,只有站在前人工作的基础上灵活使用别人的包才能提高程序的开发效率。

最后一把必备的工具是R。R其实是脱胎于S-plus的统计编程语言,有强大的统计分析和数据可视化(画图)的功能。但python也有一些可以做统计分析和画图的模块(如matplotlib),但是统计分析和可视化是R最擅长的领域。R的语法相对比较奇怪和不够直观,因此能用进入R console里面敲几个命令画画图并不难,但是要掌握着这么语言写大段的代码就没有那么容易了。不过,R的强大之处在于很多统计方法都封装好了,因此往往几行代码就可以实现非常酷的功能。R有非常强大的社区支持,在CRAN和Bioconductor上可以下载安装很多功能各异的算法包。

生物信息的这三把斧头各有分工,一个生物信息的数据分析项目最终所有的软件(python or R)和命令都可通过一个shell脚本一以贯之,从头跑到尾,成为一个流程 (pipeline)。