導言
構建生信分析流程是生物信息學從業人員必備的技能之一,對該項能力的評估常常是各大公司招錄人員的參考項目之一。
在進行ngsjs項目時,我做了一張示意圖來表示一些高通量測序數據分析項目重現性的要點(圖一)。
ngsjs: A set of command line tools, NGS data analysis workflows, and R shiny plugins/R markdown document for exploring next-generation sequencing data.
一個好的生物信息分析流程可以讓你事倍功半,有效減負,同時也有利於他人重複你的數據分析結果。
圖一 高通量測序數據分析項目重現性的要點
其中,使用統一的管道(pipeline)、工作流程(workflow)就是其中最重要的一環。
根據生信信息學數據分析流程(管道、工作流程序)構建的風格和方式,大致有以下幾大流派(注1):
- 腳本語言流
- Common Workflow language 語言流
- Makefile流
- 配置文件流
- Jupyter notebook和R markdown流
- ......
注1: 圍棋比賽中常用“流派”來形容各具特色的棋手/派系,參見資料,深度學習派代表AlphaGo現在在圍棋屆已經一騎絕塵。
生信分析流程構建的幾大流派
| 腳本語言流
腳本語言流的主要是通過簡單的腳本語言(如shell,R,Python,Perl)運行各類命令行腳本/程序。常見的幾種工作模式:
- 單個腳本就是一整個流程
- 多個腳本組成一個流程
- 封裝成可以輸入參數的命令行程序
- 封裝成函數/模塊/包(包含示例文件、文檔和測試)
前兩種(1和2)是大多數生物信息學初學者(不具備封裝和打包能力)最早開始接觸生信分析流程的方式。後兩種(3和4)是專業人員開發新工具、新流程的必備技能。
這裏使用htslib.org所給WGS/WES Mapping to Variant Calls (v1.0)
作爲工作模式1,2
的示例(已略去註釋):
# mapping bwa index <ref.fa> bwa mem -R '@RG\tID:foo\tSM:bar\tLB:library1' <ref.fa> <read1.fa> <read1.fa> > lane.sam samtools fixmate -O bam <lane.sam> <lane_fixmate.bam> samtools sort -O bam -o <lane_sorted.bam> -T </tmp/lane_temp> <lane_fixmate.sam> # Improvement java -Xmx2g -jar GenomeAnalysisTK.jar -T RealignerTargetCreator -R <ref.fa> -I <lane.bam> -o <lane.intervals> --known <bundle/b38/Mills1000G.b38.vcf> java -Xmx4g -jar GenomeAnalysisTK.jar -T IndelRealigner -R <ref.fa> -I <lane.bam> -targetIntervals <lane.intervals> --known <bundle/b38/Mills1000G.b38.vcf> -o <lane_realigned.bam> java -Xmx4g -jar GenomeAnalysisTK.jar -T BaseRecalibrator -R <ref.fa> -knownSites >bundle/b38/dbsnp_142.b38.vcf> -I <lane.bam> -o <lane_recal.table> java -Xmx2g -jar GenomeAnalysisTK.jar -T PrintReads -R <ref.fa> -I <lane.bam> --BSQR <lane_recal.table> -o <lane_recal.bam> java -Xmx2g -jar MarkDuplicates.jar VALIDATION_STRINGENCY=LENIENT INPUT=<lane_1.bam> INPUT=<lane_2.bam> INPUT=<lane_3.bam> OUTPUT=<library.bam> samtools merge <sample.bam> <library1.bam> <library2.bam> <library3.bam> samtools index <sample.bam> java -Xmx2g -jar GenomeAnalysisTK.jar -T RealignerTargetCreator -R <ref.fa> -I <sample.bam> -o <sample.intervals> --known >bundle/b38/Mills1000G.b38.vcf> java -Xmx4g -jar GenomeAnalysisTK.jar -T IndelRealigner -R <ref.fa> -I <sample.bam> -targetIntervals <sample.intervals> --known >bundle/b38/Mills1000G.b38.vcf> -o <sample_realigned.bam> samtools index <sample_realigned.bam> # Variant Calling bcftools mpileup -Ou -f <ref.fa> <sample1.bam> <sample2.bam> <sample3.bam> | bcftools call -vmO z -o <study.vcf.gz> bcftools mpileup -Ob -o <study.bcf> -f <ref.fa> <sample1.bam> <sample2.bam> <sample3.bam> bcftools call -vmO z -o <study.vcf.gz> <study.bcf> tabix -p vcf <study.vcf.gz> bcftools stats -F <ref.fa> -s - <study.vcf.gz> > <study.vcf.gz.stats> mkdir plots plot-vcfstats -p plots/ <study.vcf.gz.stats> bcftools filter -O z -o <study_filtered..vcf.gz> -s LOWQUAL -i'%QUAL>10' <study.vcf.gz>
工作模式3
和4
是開發生物信息工具的標準方式。很多生物信息學分析工具本身就是涉及到各類複雜計算和命令的集成式流程,如:
- deepvariant:A universal SNP and small-indel variant caller using deep neural networks. Nat Biotechnol. 2018 Nov;36(10):983-987. doi: 10.1038/nbt.4235. Epub 2018 Sep 24.
- DeepSVR:A deep learning approach to automate refinement of somatic variant calling from cancer sequencing data. Nat Genet. 2018 Nov 5. doi: 10.1038/s41588-018-0257-y.
- diseasequest:An integrative tissue-network approach to identify and test human disease genes. Nat Biotechnol. 2018 Oct 22. doi: 10.1038/nbt.4246.
- bcbio-nextgen:Validated, scalable, community developed variant calling, RNA-seq and small RNA analysis.
- chipseq_pipeline:The AQUAS pipeline implements the ENCODE (phase-3) transcription factor and histone ChIP-seq pipeline specifications (by Anshul Kundaje).
- deepTools:Tools to process and analyze deep sequencing data. Nucleic Acids Research. 2016 Apr 13:gkw257.
- ......
使用和開發這類工具/流程的主要原因:
- 只需要掌握原生編程語言的語法和命令行工具的用法就可以開始構建工具/流程
- 其他流程化語言/框架也可以直接調用這些腳本/函數/模塊/包/命令行程序
- 封裝和打包可以減少代碼的冗餘程度、降低維護難度
- 通過使用各類編程語言自帶的包管理器解決依賴問題,便於其他用戶安裝和調用
我目前主要是R語言、Python寫命令行程序、函數、R包/模塊,同時用CRAN、PyPI以及GitHub分發。
同時,因爲R語言目前還沒有提供一個原生機制直接部署命令行可執行程序(Python、Node包均提供),我現在做了兩手準備:
- 在ngstkR包中增加
rbin
函數、以及ngsjs增加rbin
命令行程序一鍵收集R包中inst/bin
下面的文件。 - 以npm包的形式開發相應的R命令行程序,參見正在開發中的ngsjs包,初期目標是開發、收集200+和數據分析相關的命令行程序。
目前的體驗來看,JavaScript提供的npm和yarn包管理工具速度非常快和方便,很適合R語言用戶同時使用(只需要會寫一個package.json文件即可)。
| Common Workflow language(CWL)語言
Common Workflow language語言流是近幾年興起的,專門用於數據分析流程構建的一類語言/工具。
這類語言/工具最核心的部分:定義每一個計算過程(腳本)的輸入和輸出,然後通過連接這些輸入和輸出,構成數據分析流程(圖二,圖三)(如Galaxy, wdl,cromwell,nextflow,snakemake,bpipe等)。
圖二 CWL流程示意圖一
圖三 CWL流程示意圖二
示例項目:
- chip-seq-pipeline2:ENCODE Transcription Factor and Histone ChIP-Seq processing pipeline (chipseq_pipeline的WDL版).
- ngsjs-wkfl-wdl: A library of next-generation sequencing data analysis workflow (WDL).
- biowdl: BioWDL is a collection of pipelines and workflows usable for a variety of sequencing related analyses. They are made using WDL and closely related to BIOPET.
- snakemake-workflows: An experimental repo for common snakemake rules and workflows.
- ......
使用和開發這類工具的主要原因:
- 程序每一步的輸入輸出參數一目瞭然
- 有圖形化流程設計器的支持
- 自帶日誌和運行狀態監控功能
- ......
擴展閱讀:
- A review of bioinformatic pipeline frameworks. Brief Bioinform. 2017 May 1;18(3):530-536. doi: 10.1093/bib/bbw020.
- Data Harmonization for a Molecularly Driven. Health System. Cell. 2018 Aug 23;174(5):1045-1048. doi: 10.1016/j.cell.2018.08.012.
| Makefile流
Makefile流主要是基於軟件開發工具Makefile的rule、target語法運行流程。在snakemake工具出現之後(使得數據分析流程支持CWL),使用Makefile
式Rule文件構建生物信息學分析流程的用戶迅速增加。
pyflow-ATACseq項目提供的ATAC-seq數據分析流程:
圖五 ATAC-seq Snakemake示例流程圖
snakemake示例文件:
rule targets: input: "plots/dataset1.pdf", "plots/dataset2.pdf" rule plot: input: "raw/{dataset}.csv" output: "plots/{dataset}.pdf" shell: "somecommand {input} {output}"
| 配置文件流
配置文件流(和CWL不衝突)主要是基於JSON、YAML、TOML等類型的配置文件,然後開發相應的解析器解析和執行流程。如Galaxy、華爲公司最近開源的Kubegene(基於谷歌開發並開源的容器調度技術kubernetes)、bashful的流程文件。
很多計算機軟件自動測試流程和構建工具也主要基於配置文件來構建和執行:如circleci、travis。
這裏給出一個基於配置文件的工具示例(圖六):
圖六 bashful執行輸出
bashful 輸入文件格式及部分字段:
config: show-failure-report: false show-summary-errors: true max-parallel-commands: 6 show-task-times: true x-reference-data: all-apps: &app-names - some-lib-4 - utilities-lib - important-lib - some-app1 - some-app3 tasks: - name: Cloning Repos parallel-tasks: - name: "Cloning <replace>" cmd: example/scripts/random-worker.sh 2 <replace> ignore-failure: true for-each: *app-names - name: Building Repos parallel-tasks: - name: "Building <replace>" cmd: example/scripts/random-worker.sh 1 <replace> ignore-failure: true for-each: *app-names
複雜度較高的生物信息學流程/工具一般至少會提供一個配置文件來管理參數。用戶目前也大多接受使用配置文件統一管理變量。
命令行參數也常常結合配置文件同時使用,這麼做的主要原因:
- 可以有效減少動態更新和管理配置文件的次數
- 通過命令行修改參數也更加透明和便於日誌記錄
| Jupyter notebook和R markdown流
Jupyter notebook和R markdown分別由Python語言和R語言社區貢獻,均可以用於整合文檔、代碼、以及代碼的輸出,構建動態、交互式文檔和報告系統。
這兩個工具已經風靡全世界的數據科學社區,同時也佔據了生物信息分析流程中的下游統計分析、建模、以及可視化。
這兩個工具興起的主要原因:
- 機器學習、高通量測序數據等數據科學的興起
- 大量機器學習、生物信息學分析項目經常需要同時查看文檔、即時查看輸出、調試代碼、進行可視化、撰寫報告等
- 高質量可視化視圖的興起(顏值的時代)
- 已有工具使用起來有諸多不便之處,使用門檻相對較高
Jupyter notebook示例:
圖七 Jupyter notebook
R markdown示例:
圖八 Jupyter notebook
以R語言爲例,在一個R包開發過程中,常常集成R markdown文件來動態更新文檔、教程和項目主頁。
比如其中我開發的兩個項目configr、BioInstaller:
圖九 configr 說明文檔
圖十 BioInstaller 項目主頁
相關的R包:
- blogdown:輔助個人博客創建和維護
- bookdown:輔助數據科學書籍的構建
- xaringan:輔助創作Web PPT
- pkgdown:一鍵生成R項目主頁
- shiny:輔助R markdown構建更復雜的交互式文檔
- future:簡化R語言用戶的並行化操作
我在這裏設想了一個R markdown的應用場景:
- 用戶使用R markdown並通過連接數據庫、訪問網頁APIs的方式提交數據分析任務
- 構建文檔即重新檢查數據分析進程和狀態、生成相應的運行狀態可視化、表格等監控結果
- 完成上游數據分析之後可以直接開始進行下游個性化的數據統計分析和可視化、同時撰寫結題報告
- 同時使用Shiny應用/其他通過網頁服務展示分析結果
| 其他
軟件和科學社區一直會有新的工具、思想、範式出現,生物信息學數據分析流程也不例外,我在這篇文章中所列的幾種方式只能大致涵蓋目前比較主流的幾種方式。
還有一些”非主流“流程構建方式:
- 博導流: ”A同學你過來一下,我們討論一下你的課題,你可能需要寫一個Pipeline,輸入病人DNA、RNA的測序fastq文件、表型數據,輸出所有可以完成的生物信息數據分析結果“
- AI流: **你好,Siri,幫我寫一個Pipeline,輸入...;輸出....
- 公式流
output (multi_omics) ~ input(2 * DNA@wgs@fq + 2 * DNA@wes@fq + DNA@chip_seq + 2 * RNA@rnaseq@fq + n * RNA@scrna + ...) output (paper) ~ input(patient@survive + patient@habits_and_customs + mutation@proteinpaint +