写给生物信息初学者

Nanguage BaseOverflow 2022-09-29 10:29
点击蓝字,关注我们






新的学期开始了,有很多新生陆续进入到生物信息学的研究当中,最近比较多新生向我咨询问题。这里集中分享一些个人经验供参考,希望能够给你带来一些帮助。


一些基础问题


Q: 从事生物信息学研究需要学习哪些知识技能?

A: 生物信息学大致上属于一门数据科学,因而需要学习数据科学所需的一些通用的知识技能,以及特定生物学问题相关的领域特定知识。数据科学所需的知识技能,我在网上看到过一张图,感觉总结的很好:

图片

Data science landscape. From:A Guide On How To Become A Data Scientist

这张图中的内容,基本上都会有所涉及,但是根据研究方向的不同,实际中可能会有所侧重。上图中没有提到的是领域特定知识。对生物信息学而言就是对应的生物学相关知识,至于掌握什么样的生物学知识以及需要掌握到什么程度,这比较依赖于具体的课题。


Q: 在生物信息学分析中,什么是分析的上游与下游?

A:与生物学实验直接相关、处理过程依赖于实验细节的分析称之为上游分析,之后不依赖于具体实验细节的分析称之为下游分析。上游分析的目的主要是从实验数据中提取到主要的信息,下游分析的目的是分析这些信息,从中得到统计学规律,回答生物学问题等。以最常见的 RNA-Seq 数据分析为例,从下机的 FASTQ 文件到拿到基因表达量表,这一过程为上游分析。后续基于基因表达量表进行的差异基因分析、GO 富集分析等为下游分析。



关于如何解决技术问题

这是老生常谈的话题了,但它对于依然非常重要,直接影响到我们解决问题的速度和质量。

根据我以及很多人的经验,在技术上遇到问题的时候,请依次尝试以下途径:

搜索:搜索引擎永远是你最好的朋友!

a. 搜索引擎:尽量使用 Google 搜索。由于某些原因不能用,请自行解决。一般来说优先级是这样:Google > Bing 国际版 > Bing 国内版 > Baidu

b. 搜索关键词描述:尽量使用英文描述问题,在计算机技术和生物信息领域,英文资料无论在深度广度上还是正确性上都远好于中文资料。其他问题描述层面的注意事项后面还会提。

c. 判断信息质量:记住一句话:一手资料总是(在绝大多数情况下)好于二手资料。一手资料包括:官方软件说明文档、文献、源代码等。二手资料如网上的问答、个人博客上的内容、第三方网站上的使用教程等。

找类似问题、看源代码等:这个就需要一点点发散思维了,比如在解决一个问题 A 的子问题 X 的时候,会联想到做 A 相关的问题 B 的人应该也会遇到类似的问题 Y,那么他们的经验能否用来帮助解决 X 呢?然后就可以去搜索关于问题 Y 的资料。如果是代码上的问题,那么可能需要阅读一些关于问题 Y 的源代码。

提问:包括线上提问和线下提问,但无论是哪种,为了更加有效、高效的解决你所遇到的问题,这里面有很多技巧和常识是需要注意的:

a. 提问的智慧: Eric S. Raymond, Rick Moen 撰写的How-To-Ask-Questions-The-Smart-Way一文非常推荐每一个初学者阅读,真的非常有用,可以说是必读资料。文末有中文版链接:提问的智慧

b. 问题的上下文信息:提问的智慧一文中已经提到了很多,这里只再强调一点。就是提问的时候应当给出尽可能多的关于问题的上下文信息,因为初学者经常会陷入到错误的提问中,问题本身是错误的当然也不可能解决。这种现象被称之为X-Y Problem,是我们应当避免的。

c. 构建 Minimal reproducible example(最小可复现示例):这一点非常重要,当遇到一个程序报错时,如果想让别人能够快速的帮到你。最好的办法就是建立一个让别人可以复现的例子,并且这个例子越简单越好。简化,一方面能够让他人更快的复现出你遇到的错误。另一方面,在对问题简化的过程中,更能看到这个问题的本质。很多时候,在简化的过程中就已经发现了错误,并解决掉了。

d. 学术领域提问还包括向文章作者写邮件这一途径,当对论文中涉及到的问题难以理解时,别忘了还有这条路。写邮件时应当注意邮件礼仪,问题描述要简洁、精确。



关于编程语言学习

不同的语言有不同的最佳使用场景,具体表现为语法构造、基础设施以及第三方生态上对某一使用场景的适配。如 JS/TS 适合做 Web front end,Go 适合 Web back end,等等。

针对不同的场景应当尽量选择最为合适的语言。生物信息领域比较推荐的有:

    Bash: 这几乎是每个生信人的保底技能,和 Linux 系统打交道的必须途径。掌握一些稍微进阶一点的用法,如 while read loop, process substitution 等会让你敲命令行时的工作效率大幅提升。但是由于 Bash 对于命令行的特化,使得它的语法结构有些奇怪。所以不建议编写超过 30 行或者包含复杂逻辑的脚本。复杂的脚本请使用 Python 编写,配合 subprocess 包可以做的比 Bash 好很多。另外不建议用 Bash 或者 Python 编写 pipeline,更不要把 script 称之为 pipeline。一般意义上我们说的 Pipeline 应该有很多其他功能,应当使用 Snakemake,Nextflow 等软件构建。Meme 一则:

图片

https://twitter.com/BioMickWatson/status/1423184301739347969

    Python:语法简单,动态性极强,能够通过拿到运行时的信息完成很多神奇的操作。生态也非常好,特别是涉及到 Deep Learning 的生态,几乎没有其他的选择。它的定位是一个万能接线板。只要是不涉及需要高性能 Low level 操作(如高性能的 for loop,按需并行的 thread等)的场景基本上都可以使用。另外,很方便作为胶水衔接 Rust, C/C++ 等 Low level 的高性能语言。

    R:统计、绘图以及生物信息下游分析的生态非常好,并且由于一些 R 社区的审核机制,R 包的平均质量非常高。它的定位可以理解为是一个 Data science 的 DSL(Domain Specific Language),新一代的 R tidyverse 高度适配 Data science,能够以非常轻巧的操作进行数据分析。

    C:语法简单,但是比较 Low level,想要用好的话,需要对操作系统、内存管理等知识有比较清晰的理解。在生物信息领域,适合做比较轻量级的 CLI 工具,这方面有比较完备的生态,参考 lh3(Heng Li) 的一些项目。

    其他:上述是所有生物学信息人员都应该有所了解或者至少应该知道的,其他的就看特定的项目需求。比如开发带有前端 Web 页面的项目,就肯定绕不过 JavaScript/TypeScript。再比如,如果是编写有较高性能需求的 CLI 序列处理程序,如今 Rust 是一个很好的选择。

掌握一门语言的最好途径

我认为没有比在实践中学习更好的途径了。确实,现在网络上各种各样的教程、书籍非常之多,但是如果不进行实践,其实很难理解学到的东西它们为什么存在,很难真正理解,也很快就会忘记。所以对于语言学习建议是:

a. 找到一个好的项目,或者是你手头紧急需要解决的问题。没有一个需要完成的目标去驱动你,仅仅依靠资料和刷题硬学往往效果都不会很好。

b. 分析项目需求,做调查,找到一个最为合适的语言。这方面如果难以自己判断可以咨询身边有经验的人,或者在网络上提问。

c. 了解该语言最基本的构造

回答下面三个问题:1.这个语言最基本元素(语句,数据类型等)有哪些?如 int, float,表达式,赋值语句等。2.如何组合这些基本元素?如复合数据结构(list, set, dict),控制流(if else, for loop)。3.这个语言如何对过程和数据进行抽象?如函数,类等。

这个阶段可以看书或者教程,但适可而止,不要耽误太多时间,如果可以回答以上三个问题,就可以暂时停下来了。

d. 开始实践:应用学到的知识去解决问题吧,如果遇到问题,去搜索、去提问(参考文中相关章节)。但这样持续一段时间后你也许会陷入一个瓶颈,感觉问题无从下手,这时候可以再去学习这门语言的进阶知识,这个阶段就不建议去看一般的教程了。比较建议去阅读语言官方的文档(虽然在任何阶段都建议,但是这时候尤其建议),或者从优秀开源项目的源代码中寻找答案,相信我,你会学到很多。



其他应该掌握的工具

Computational NoteBook:这里泛指所有在其中可以混写文档与代码,并能够在其中执行代码,然后看到结果的工具。比如常用的 Jupyter notebook, Jupyter Lab, RMarkdown 等等。数据科学的一大特点是需要灵活、动态的对数据进行挖掘,从中提取有效信息,需要进行快速、大量的修改代码、运行来完成试验。而传统的编写脚本,再运行的方式不能满足这一需求。而在 Notebook 里面可以快速的编写、修改代码进行试验。还能通过文档把当下的想法和关键信息记录在合适的位置。并且,整个过程产生的代码、结果、注释文档可以直接保存下来,方便日后对实验结果进行重复。

环境管理工具:进行生物信息学研究,会用到大量的软件,并且这些软件都有自己所依赖的软件库。到头来,搭建一个能够完成任务的软件环境可能需要花费很多功夫。甚至,有时候不同软件的依赖之间还存在冲突的情况。对于新手而言,这是一个非常令人头疼的问题,会花费掉大量的时间。为了解决这些问题,我们需要对不同用途的软件环境进行隔离,来方便我们管理。就像准备旅行时把行李都打包在一个箱子里一样,我们会把软件给整理在一个个的环境之中。

    Conda:最为常见的环境管理工具,大多数常见的生物信息软件你都可以通过 conda 进行安装,它的优点是,可以在不需要管理员权限的情况下安装一些 C 语言相关的库比如 libcurl, libgcc 等等,有时候这能解决大问题。也可以将自己常用的环境依赖提取出来形成一个叫做 environment.yml 的文件,这样可以在别的机器上安装这个的环境,或者将它分享给别人。

    Docker:提供了操作系统级别的封装,每个 docker 镜像可以理解是一个虚拟机。当你实在是为安装某个环境而苦恼时,你可以去看看软件开发者是否提供了 docker 镜像。另外也可以把你的某个软件环境给打包成一个镜像,一般来说这样是能够完全保证打包的软件在另外一台机器上也能够顺利的运行。


版本控制工具:做生物信息,虽然不是每个方向都需要编写复杂的程序,但或多或少,一定少不了和代码打交道。如何保存和管理代码和配置文件就是一个应当考虑的问题。

    Git目前最为流行的版本控制工具,使用它可以轻松管理代码、配置文件,还可以将仓库托管在一些平台上,比如 GitHub,Gitee

    GitHub身为一名生物信息人员,我想你最好了解 GitHub,并注册一个账号,它是今后寻找、学习、参与开源项目的一个入口。并且,一个漂亮的 GitHub 账号会在今后面试的时候加不少分。


流程搭建工具:这里再次强调,为了流程的可用性和可扩展性以及开发难度来考虑,对于需要多个程序配合执行的流程,不要试图使用单个脚本进行代替。你需要学习专用的流程搭建工具,以下推荐两个:

    Nextflow:目前最为推荐的流程搭建工具,设计、实现的都非常好,透露着工业软件的气息。并且生态丰富,它的一个相关项目 nf-core 中集成了大量生物信息学中常用的 pipeline,可供直接使用。

   Snakemake:相较于 Nextflow,个人认为在设计和实现上都差一点,但是它基于 Python,相较于 Nextflow 使用的 Groovy 脚本语言了解的人可能更多一些,所以门槛更低。



关于文献阅读

首先,聊一聊为什么要阅读文献,根据目的的不同,我们检索、阅读文献的方式也是不一样的。

就我个人而言,一般是有以下三种目的:

a. 课题调研:在开始一项课题之前,首先要确认其他人有没有做过类似的工作,以及他们做到了什么样的程度。在对相关的研究有了比较全面的了解之后,才能对自己的课题有一个较为明确的规划,清楚重点应该放在什么地方。这时候就要大量的检索,并阅读相关文献。这一步如果没有做好,可能会大大削弱你之后工作的价值。MEME一则:

图片

https://twitter.com/shenwei356/status/1479833925199740929

b. 解决问题:当研究陷入到一些困境时,比如其中的某种技术问题难以解决,或者没有思路时,阅读文献是我们最应该做的。去学习、了解相关的课题中别人是怎么做的,极大可能会给你带来一些灵感。

c. 鉴赏学习:对于相关领域中经典和前沿的工作,我们应该对它有敏锐的嗅觉,并认真地阅读,这对于个人专业性的提高非常有帮助。

学习的闭环:好的学习应该是有输入,也有输出的,往往这样才能做到真正的理解。所以无论是以上述哪种目的进行的阅读,我们都应该有所输出。比如对于调研阅读,调研完成之后可以对调研结果进行记录形成调研报告。对于解决问题为目的的阅读,应该对找到的方法予以实践,试验其能否解决相关问题而对于鉴赏学习,你可以把这篇文献在组会上进行讲解,或者写一篇阅读笔记。

关于文献检索:踏入研究生涯后,会在各种地方学习到各种各样的检索技巧,可以说是纷繁复杂。你可能会觉得眼花缭乱,但本质上,不管什么样的工具,文献检索的逻辑无非是以下三种:

a. 通过关键词找文献:这是最直接的一种,往往也是检索过程的起点。各种搜索引擎、数据库大多数是基于这种检索逻辑。

b. 通过文献找文献:以一篇我们认为比较相关的文献为线索,我们可以找到很多相关的文献。最简单的是,这篇文献引用的文献,但是这样只能找到这篇文献发表之前的工作。再进一步,我们可以想到,可以去找引用了这篇文献的工作。这样就能看到时间线上靠后的相关文献,这个使用 Google Scholar就能做到。再进一步,我们还可以通过阅读完这篇文献后,再从这篇文章中提取出一些关键字进行检索。这样做的好处是,从文章中摘出的关键字往往是更加准确,更符合学术界主流说法的,所以能更有利于检索。

c. 通过作者找文献:同一个人的研究一般来说是具有很强的连续性的。因而,往往通过查询某篇文章的通讯作者、第一作者的资料,我们能找到非常相关的研究工作。这在操作上也非常容易,这里就不再赘述。

d. 问题导向的阅读:在阅读论文时,很重要的一点是我们要不断地去问自己问题,然后尝试在文章中寻找解答。这样,在阅读中才能提取到我们最为关心的信息,并且真正读懂一篇工作,甚至发现其中存在的不足。



关于发表论文

对于刚刚接触科研的研究生或者本科生来说,首先我们需要知道为什么要发表文章,这里有功利和非功利两种角度来看待这个问题


从功利角度来讲:

a. Peer review 的文章是目前学术体系下最直接量化个人产出的途径,与个人奖励、晋升、后续发展紧密相关。

b. 就算不打算做学术,打算进入工业界,也能够使得简历更加好看。并且有利于个人声望的建立。


从非功利角度,也可以有很多原因:

a. 锻炼写作表达能力,清晰、准确的将自己的工作展示出来,这是作为一名研究者的基本素养。

b. 发表文章是一种对于自己工作的整理和重新审视:在整理文章的过程中能够对工作进行一次概览,发现工作上存在的不足之处,予以改进提升。在 Peer review 的过程中审稿人都是领域专家,他们提出的意见往往会比较有价值,这个过程中你会加深对于领域的理解。

c. 将自己的工作告诉全世界:启发后来的研究者,为人类的智慧添砖加瓦!影响力越强的杂志看的人会越多,越能够达到这一点。

其次我们需要知道生物信息学相关领域内哪些工作可以发文章,根据我目前了解,主要有这些类型:


生物学问题类

    a. 实验数据分析

    b. 开放数据挖掘

方法学

    a. 算法

    b. 算法比较

工具类

    a. 解决特定生物学相关问题的工具

    b. 数据库

    c. 其他工具


这些类型的论文也对应了不同的课题以及相应的研究范式。在研究生开始阶段选择课题的时候,如果自己有选择空间的话,不妨看看这些不同类型的文章,想象一下如果自己来做类似的研究应该如何进行。来对各种研究范式有一些基本的理解,来选择一个适合自己的方向。



书籍、视频、教程推荐

这里再次声明,对于书籍、教程的学习要掌握好度,知识永远是学不完的。所以这个清单也只是推荐,不代表要使用某一项技术或者开始某个领域的工作,就一定要把对应的所有教程都完整的进行学习。学习和实践是相辅相成的,单独执着于某一个方面往往效果都不会很好,所以请把他们结合起来。


• 编程语言

Real Python:非常全面的教程网站,适合各个阶段的学习者,深度、广度都非常好。

Python cookbook 3rd edition对于 Python 进阶学习非常有用的一本书籍,现在每次翻阅都有新的收获。

R语言编程艺术:这本是个人认为讲解的最为清晰,符合正常编程思路的 R 语言书籍。它将 R 作为一门编程语言来介绍(基本元素、如何组合、如何抽象)。而不是一开始在基本概念没有清楚的情况下,就去混杂各种库用法、统计学概念等等,让人摸不着头脑。

数据科学中的R语言:这本主要是介绍 R 如何应用在数据科学之中,对做生物信息学来说,也是十分有用的一本书。


• 生物信息学

Bioinformatics data skill:对于生物信息学新手而言非常有用的一本书,介绍了很多工作中常用的 Tips,能让新手少走很多弯路。

计算生物学与生物信息学课程STAT115by 刘小乐教授: 涵盖了生物信息学特别是组学相关的方方面面的基础知识。

MIT《面向生命科学的深度学习》课程(2021) by Manolis Kellis:对于如今(2022)的生物信息学而言,深度学习绝对是需要学习的内容。这个课程介绍了深度学习在生物信息学中的应用。


• 机器学习

李宏毅2021/2022春机器学习课程:最推荐的 deep learn 课程,李宏毅老师讲解的十分生动有趣。


• 生物图像处理

Introduction to Bioimage Analysis:适合生物图像处理入门的一本书籍,其中描述的方法都附带了 Python ImageJ 的实现。


参考资料

提问的智慧:

https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/main/README-zh_CN.md

X-Y Problem:

https://coolshell.cn/articles/10804.html

Real Python :

https://realpython.com/

Python cookbook 3rd edition:

https://python3-cookbook.readthedocs.io/zh_CN/latest/index.html

数据科学中的 R 语言:

https://bookdown.org/wangminjie/R4DS/index.html

Bioinformatics Data Skills:

https://www.oreilly.com/library/view/bioinformatics-data-skills/9781449367480/

计算生物学与生物信息学课程:

https://www.bilibili.com/video/BV1Dt4y1B7rU?vd_source=35febd2c3f45513282a4838f60d56925

MIT《面向生命科学的深度学习》课程:

https://www.bilibili.com/video/BV1wV411q7RE?spm_id_from=333.337.search-card.all.click&vd_source=35febd2c3f45513282a4838f60d56925

李宏毅2021/2022春机器学习课程:

https://www.bilibili.com/video/BV1Wv411h7kN?spm_id_from=333.337.search-card.all.click&vd_source=35febd2c3f45513282a4838f60d56925

Introduction to Bioimage Analysis

https://bioimagebook.github.io/README.html






微信扫一扫
关注该公众号