欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【宏基因组入门教程】(一)

程序员文章站 2024-03-05 12:38:06
...

最近接手了宏基因项目,会在之后接着发一系列的宏基因组入门教程,学习资料大概来自国外的教程。
感谢Harriet Alexander, Phil *s, C. Titus Brown提供的学习资料和数据(2017-cicese-metagenomics.readthedocs.io/en/latest/)

数据下载及核查:

#开个多线程,几个可以一起下
wget -c -nd -r -np -k -L -p -nd https://s3-us-west-1.amazonaws.com/dib-training.ucdavis.edu/metagenomics-scripps-2016-10-12/SRR1976948_1.fastq.gz
wget -c -nd -r -np -k -L -p -nd https://s3-us-west-1.amazonaws.com/dib-training.ucdavis.edu/metagenomics-scripps-2016-10-12/SRR1976948_2.fastq.gz
wget -c -nd -r -np -k -L -p -nd https://s3-us-west-1.amazonaws.com/dib-training.ucdavis.edu/metagenomics-scripps-2016-10-12/SRR1977249_1.fastq.gz
wget -c -nd -r -np -k -L -p -nd https://s3-us-west-1.amazonaws.com/dib-training.ucdavis.edu/metagenomics-scripps-2016-10-12/SRR1977249_2.fastq.gz
# md5 check一下
$md5sum SRR1976948_1.fastq.gz SRR1976948_2.fastq.gz SRR1977249_1.fastq.gz SRR1977249_2.fastq.gz
#结果应该是这样的
37bc70919a21fccb134ff2fefcda03ce  SRR1976948_1.fastq.gz
29919864e4650e633cc409688b9748e2  SRR1976948_2.fastq.gz
ee25ae14f84308f972cebd42e55502dd  SRR1977249_1.fastq.gz
84b15b4f5975cd7941e211336ff27993  SRR1977249_2.fastq.gz
# 看看每个文件的具体情况
file                   format  type   num_seqs      sum_len  min_len  avg_len  max_len
SRR1976948_1.fastq.gz  FASTQ   DNA   1,000,000  251,000,000      251      251      251
SRR1976948_2.fastq.gz  FASTQ   DNA   1,000,000  251,000,000      251      251      251
SRR1977249_1.fastq.gz  FASTQ   DNA   1,000,000  251,000,000      251      251      251
SRR1977249_2.fastq.gz  FASTQ   DNA   1,000,000  251,000,000      251      251      251

质控

#fastqc 太简单 略

#可以试试multiqc,一次把fastqc的结果文件做整合
# 下载接头文件
$curl -O -L http://dib-training.ucdavis.edu.s3.amazonaws.com/mRNAseq-semi-2015-03-04/TruSeq2-PE.fa
#Trimmomatic
$for f in *gz
do 
base=$(basename $f _1.fastq.gz);echo $base;java -jar /data/apps/trimmomatic/Trimmomatic-0.36/trimmomatic-0.36.jar PE ${base}_1.fastq.gz \
     ${base}_2.fastq.gz \
     ${base}_1.PE.gz ${base}_1.SE.gz \
     ${base}_2.PE.gz ${base}_2.SE.gz \
     ILLUMINACLIP:TruSeq2-PE.fa:2:40:15 \
     LEADING:2 TRAILING:2 \
     SLIDINGWINDOW:4:2 \
     MINLEN:25
done
#再次fastqc 看上一步质控的结果

MEGAHIT /metaspades组装

# megahit软件安装 有编译好了的版本
#https://github.com/voutcn/megahit/releases/download/v1.1.4/megahit_v1.1.4_LINUX_CPUONLY_x86_64-bin.tar.gz
#下数据
$curl -O https://s3-us-west-1.amazonaws.com/dib-training.ucdavis.edu/metagenomics-scripps-2016-10-12/SRR1976948.abundtrim.subset.pe.fq.gz
$curl -O https://s3-us-west-1.amazonaws.com/dib-training.ucdavis.edu/metagenomics-scripps-2016-10-12/SRR1977249.abundtrim.subset.pe.fq.gz
#看看数据量
file                                  format  type   num_seqs      sum_len  min_len  avg_len  max_len
SRR1976948.abundtrim.subset.pe.fq.gz  FASTQ   DNA   2,926,154  680,423,034       32    232.5      251
SRR1977249.abundtrim.subset.pe.fq.gz  FASTQ   DNA   3,340,976  768,640,987       32    230.1      251
#组装,他们的代码
megahit --12 SRR1976948.abundtrim.subset.pe.fq.gz,SRR1977249.abundtrim.subset.pe.fq.gz -o combined
#我的代码
megahit --12 SRR1976948.abundtrim.subset.pe.fq.gz SRR1977249.abundtrim.subset.pe.fq.gz --k-min 23 --k-max 141 --k-step 10 --no-mercy --use-gpu -t 10 1>megahit.log 2>megahit.err &
#文档里说组装15分钟,我花了5分钟
#文档里的组装结果和我的组装结果
7713 contigs, total 13168567 bp, min 200 bp, max 54372 bp, avg 1707 bp, N50 4305 bp
6043 contigs, total 10908730 bp, min 200 bp, max 100560 bp, avg 1805 bp, N50 4024 bp

## metaspades组装 
#花费19分钟
metaspades.py -o metaspades --12 SRR1976948.abundtrim.subset.pe.fq.gz --12 SRR1977249.abundtrim.subset.pe.fq.gz --only-assembler -t 10 1>spade.log 2>spade.err &
#组装结果 contig
assembly:contigs.fasta
number of contigs/scaffolds:4959
assembly size:12259965
largest contig/scaffold:252026
N50:7937
N90:1533
#其他组装软件 Soapdenovo2 IDBA-UD等

总的来说,spades的组装结果是最理想的,但是spades在纠错那步又慢又耗内存,我的机器内存要跑超,所有先用了其他基因kmer的软件纠错,而不是让spades纠错,纠错后组装时选择--only-assembler,效率也可以保证

教程中提到一个问题 Illumina HiSeq, Illumina MiSeq, and PacBio技术在组装上有什么需要权衡注意的呢?
这篇文章给了一些结论“Accurate, multi-kb reads resolve complex populations and detect rare microorganisms”

这篇文章干了这么几件事:
a. 测试了用Moleculo 的reads进行组装,改善组装的contig
b. 评估短reads组装的准确性
c. 查看组装结果中低丰度的生物
d. 评估了序列变异和基因组含量水平,这些是短reads测序没办法解释的

结果作者干成了这些事:
a. 长reads揭示了很多许多非常丰富的生物,这些生物在短reads组装中完全弄丢的(missed ....)
b. 使用新的共线性方法重建了基因组结构和代谢潜力
c. 低丰度的“long tail”(暂时还不理解)属于高丰度生物代表的们
d. 关系密切的菌株和稀有生物的多样性占去了群体多样性的绝大部分

MEGAHIT 和其他几个软件使用时间和内存的比较:

评估宏基因组组装结果

#quast软件安装
$quast.py ../combined/final.contigs.fa -o megahit-report
# 下载metaspades组装的结果
$ curl -LO https://osf.io/h29jk/download
$mv download metaspades.contigs.fa.gz
$gunzip metaspades.contigs.fa.gz
$quast.py metaspades.contigs.fa -o metaspades-report
#比较一下megahit和metaspades的组装结果
$paste */report.txt | cut -f1-2, 4

基因组注释

#prokka安装
#注释,没啥好说的,prokka真的超级好用
prokka subset_assembly.fa --outdir prokka_annotation --prefix metagG --metagenome --kingdom Bacteria
# prokka可以看已经安装能哪些注释数据库
prokka --listdb
# 然后根据自己情况可自己生成数据库,流程是下载需要的蛋白质数据、cd-hit去冗余、makeblast建库、放到prokka db里面去,注释的时候选择特定的数据库就可以了

使用sourmash比较数据集

教程里面使用的是他们自己开发的sourmash软件(https://sourmash.readthedocs.io/en/latest/),他们对它的描述是快速进行核酸水平搜索和比较的工具。

原理是这样的:Kmer越长(大于31或更长),这种kmer更倾向于是物种特异性的,属水平一般kmer=40就可以鉴定物种特异性的kmer,如果想到species水平,Kmer就该是50左右吧。

所以用kmer可以比较基因组和基因组,一个reads数据集和另一个reads数据集:相似或相同的基因组,reads数据集之间都会有很多相同点

only k-mers in both samples
----------------------------
all k-mers in either or both samples

Jaccard距离1表示样本中相同,Jaccard距离0表示样本间完全不相同。
这样可以用来搜索数据库和数据集中未知的基因组和其他东西,不过基因组有太多的kmer这才是个问题,比如一个5M的大肠杆菌就有5m 的kmer(5 mil?)

##参考安装 sourmash 
sudo apt-get -y update && \
sudo apt-get install -y python3.5-dev python3.5-venv make \
    libc6-dev g++ zlib1g-dev
python3.5 -m venv ~/py3
. ~/py3/bin/activate
pip install -U pip
pip install -U Cython
pip install -U jupyter jupyter_client ipython pandas matplotlib scipy scikit-learn khmer
pip install -U https://github.com/dib-lab/sourmash/archive/master.zip
#我没有sudo,3.5以前已经装了,pip安装的时候自己加了--user

## 下载其他组装数据
$curl -L -o SRR1976948.abundtrim.subset.pe.fq.gz https://osf.io/k3sq7/download
$curl -L -o SRR1976948.megahit.abundtrim.subset.pe.assembly.fa https://osf.io/dxme4/download
$curl -L -o SRR1976948.spades.abundtrim.subset.pe.assembly.fa https://osf.io/zmekx/download
##运行sourmash 
#教程中提到,首先计算一下reads,这些reads是需要前期过滤、kmer修正的
sourmash compute -k51 --scaled 10000 SRR1976948.abundtrim.subset.pe.fq.gz -o SRR1976948.reads.scaled10k.k51.sig 
#比较组装结果 为宏基因组构建“signature”
sourmash compute -k51 --scaled 10000 SRR1976948.spades.abundtrim.subset.pe.assembly.fa -o SRR1976948.spades.scaled10k.k51.sig 
sourmash compute -k51 --scaled 10000 SRR1976948.megahit.abundtrim.subset.pe.assembly.fa -o SRR1976948.megahit.scaled10k.k51.sig
#评估有多少reads包含进入了各个组装版本中
sourmash search SRR1976948.reads.scaled10k.k51.sig SRR1976948.megahit.scaled10k.k51.sig --containment 
sourmash search SRR1976948.reads.scaled10k.k51.sig SRR1976948.spades.scaled10k.k51.sig --containment

会看到这样的结果:

loaded query: SRR1976948.abundtrim.subset.pe... (k=51, DNA)
loaded 1 signatures and 0 databases total.                                     
1 matches:
similarity   match
----------   -----
 48.7%       SRR1976948.megahit.abundtrim.subset.pe.assembly.fa

loaded query: SRR1976948.abundtrim.subset.pe... (k=51, DNA)
loaded 1 signatures and 0 databases total.                                     
1 matches:
similarity   match
----------   -----
 47.5%       SRR1976948.spades.abundtrim.subset.pe.assembly.fa

注意看:SRR1976948.reads.scaled10k.k51.sig来源于reads,而SRR1976948.megahit.scaled10k.k51.sig/SRR1976948.spades.scaled10k.k51.sig来源于组装版本,也就是说只有大约47-48%的reads在组装版本的中。

反过来计算呢,可是这些在基因组中99.x%的kmer在reads中,就是组装版本的kmer几乎完全来自reads。
这说明了测序错误的问题,Illumina 测序的测序错误造成了大量的低频Kmer。

$sourmash search SRR1976948.megahit.scaled10k.k51.sig SRR1976948.reads.scaled10k.k51.sig --containment
$sourmash search SRR1976948.spades.scaled10k.k51.sig SRR1976948.reads.scaled10k.k51.sig  --containment
loaded query: SRR1976948.megahit.abundtrim.s... (k=51, DNA)
loaded 1 signatures and 0 databases total.                                     
1 matches:
similarity   match
----------   -----
 99.8%       SRR1976948.abundtrim.subset.pe.fq.gz

loaded query: SRR1976948.spades.abundtrim.su... (k=51, DNA)
loaded 1 signatures and 0 databases total.                                     
1 matches:
similarity   match
----------   -----
 99.9%       SRR1976948.abundtrim.subset.pe.fq.gz

接下来比较一下signatures
首先安装osfclient 然后用osfclient下载一批数据

pip install osfclient

osf -p ay94c fetch osfstorage/signatures/SRR1977249.megahit.scaled10k.k51.sig SRR1977249.megahit.scaled10k.k51.sig
osf -p ay94c fetch osfstorage/signatures/SRR1977249.reads.scaled10k.k51.sig SRR1977249.reads.scaled10k.k51.sig
osf -p ay94c fetch osfstorage/signatures/SRR1977249.spades.scaled10k.k51.sig SRR1977249.spades.scaled10k.k51.sig
osf -p ay94c fetch osfstorage/signatures/SRR1977296.megahit.scaled10k.k51.sig SRR1977296.megahit.scaled10k.k51.sig
osf -p ay94c fetch osfstorage/signatures/SRR1977296.reads.scaled10k.k51.sig SRR1977296.reads.scaled10k.k51.sig
osf -p ay94c fetch osfstorage/signatures/SRR1977296.spades.scaled10k.k51.sig SRR1977296.spades.scaled10k.k51.sig
osf -p ay94c fetch osfstorage/signatures/subset_assembly.megahit.scaled10k.k51.sig subset_assembly.megahit.scaled10k.k51.sig

接下来对这些“signatures”进行比较

#比较及画图
$sourmash compare *sig -o Hu_metagenomes
#生成png图片
$sourmash plot --labels Hu_metagenomes
#jupyter 可视话
from IPython.display import Image
Image("Hu_metagenomes.matrix.png")

宏基因组分箱(bining)

宏基因组组装之后的一种常见方法是binning,就是将组装好的contig分配到组或“容器/箱子(bins)”中的过程,这些组或“容器/箱子”随后可能被分配到一些分类从属关系。

在这里将使用MaxBin和MetaBAT。为了使用这些软件,首先需要使用bwa将数据比对到宏基因上,然后通过contig估计相对丰度。然后,使用VizBin检查MaxBin和MetaBAT生成的组/容器/箱子。

软件下载及安装:

#MaxBin 最新版2.2.5
#下载地址 https://sourceforge.net/projects/maxbin/ 
#需要依赖软件FragGeneScan idba bowtie2 hmmer 
#MetaBAT 新版2.12.1
#下载地址https://bitbucket.org/berkeleylab/metabat/downloads/
#安装 看README.txt 略

运行分箱:

MaxBin时间花费更多,因此,在下面分析中,采取牺牲质量来换取速度:

  1. 这个项目的6个数据集只分析两个,大多数分箱软件依靠多个样本分析以提高分箱的准确性,下面操作只抽取两个数据。
  2. 限制MaxBin的最大化算法迭代次数(本次只迭代5次而不是50次),不过会对分箱质量造成一定影响,然而自己在具体实际做数据分析的时候不可以随便这么做。
    MaxBin:
    MaxBin会考虑每个contig的read覆盖度和四核苷酸频率,以记录每个bin的标志基因数量
    $ls ~/mapping/*coverage.tab > abundance.list
    $run_MaxBin.pl -contig ~/mapping/subset_assembly.fa -abund_list abundance.list -max_iteration 5 -out mbin
    # coverage.tab文件,这个我在后面的分析中会提到。。

结果会得到一系列*.fasta按数字排列的文件,这就是预测的基因组bins
接着将所有bin文件链接起来,将文件名作为序列名

for file in mbin.*.fasta
do
    num=${file//[!0-9]/}
    sed -e "/^>/ s/$/ ${num}/" mbin.$num.fasta >> maxbin_binned.concat.fasta
done

MetaBAT:
这个软件分箱考虑三个点:测序reads的覆盖度(read coverage)、覆盖度差异(coverage variance ),以及四碱基频率

#统计congtig覆盖度
ln -fs ~/mapping/*abundtrim*sorted.bam .
#运行
jgi_summarize_bam_contig_depths --outputDepth depth_var.txt *bam
metabat -i subset_assembly.fa -a depth_var.txt --verysensitive -o metabat -v > log.txt
#合并所有bin的结果
for file in metabat.*.fa
  do
    num=${file//[!0-9]/}
   sed -e "/^>/ s/$/ ${num}/" metabat.$num.fa >> metabat_binned.concat.fasta
done
#生成bin编号注释文件
echo label > metabat_annotation.list
grep ">" metabat_binned.concat.fasta |cut -f2 -d ' '>> metabat_annotation.list

可视化结果:
有了MaxBin, MetaBin 的结果,需要做质量评估,一般用CheckM,还可以用VizBin。
VizBin有 OSX, Linux, Windows 多个版本的,可自行选择,要求java (>7.0)

用Salmon评估基因丰度

salmon是一款快速转录组计数软件,与Kallisto、Sailfish类似,可以不用通过mapping获得基因的counts值。Salmon的结果可由edgeR/DESeq2等进行counts值的下游分析。
下面用它来计算预测蛋白质区的相对丰度分布。
软件安装与使用:

#最新版 0.12.0 下载地址
https://github.com/COMBINE-lab/salmon/releases/download/v0.12.0/salmon-0.12.0_linux_x86_64.tar.gz

准备文件:需要prokka注释的结果文件“.ffn”,“.gff”,“.tsv”,以及过滤后的双端reads文件。ffn文件即cds序列文件。Salmon需要双端文件在两个文件里面,也就是 pe1,pe2是当个文件,如果在一个文件里面,可以自己写脚本拆分,或者用推荐的khmer 中的split-paired-reads.py 处理,可用pip安装
Salmon建索引:

salmon index -t metagG.ffn -i transcript_index --type quasi -k 31

基于参考序列对reads进行定量:

for file in *.pe.1.fq
do
tail1=.abundtrim.subset.pe.1.fq
tail2=.abundtrim.subset.pe.2.fq
BASE=${file/$tail1/}
salmon quant -i transcript_index --libType IU \
      -1 $BASE$tail1 -2 $BASE$tail2 -o $BASE.quant;
 done

注意:–libType 参数需要在两个reads文件之前
结果会生成一批以样本名为开头的目录和文件,查看一下文件

find . SRR1976948.quant -type f

每个目录下的quant.sf 文件就是相对表达信息,文件第一列为转录本名称,第4列为标准化的相对表达值TPM。
下载脚本合并:

curl -L -O https://raw.githubusercontent.com/ngs-docs/2016-metagenomics-sio/master/gather-counts.py
python2 ./gather-counts.py

会生成一系列 .counts 的文件,我只测试了一个样品:

transcript      count
OGOKDOAG_00001  8.924135
OGOKDOAG_00002  16.883935
OGOKDOAG_00003  4.567547
OGOKDOAG_00004  6.574553
OGOKDOAG_00005  14.630552
OGOKDOAG_00006  2.207686
OGOKDOAG_00007  15.959923

合并所有的counts文件为丰度矩阵 :

for file in *counts
do
   name=${file%%.*}
   sed -e "s/count/$name/g" $file > tmp
   mv tmp $file
done
paste *counts |cut -f 1,2,4 > Combined-counts.tab

结果就得到基因丰度矩阵了

可视化

等待更新.....