微生物组16S rRNA数据分析小结: qiime2-2019.1

本次笔记内容:
qiime2-2019.1的16s分析流程,以没有barcode,以demultiplexed的fastq文件为input.
微生物组16S rRNA数据分析小结:从fastq测序数据到OTU table类似,主要步骤包括:

  • 安装qiime2-2019.1(没有详述)
  • import data: import没有barcode,已经demultiplexed的双端测序(pair-end)fastq文件。所以这里省略了demux的过程。
  • join paire-end及summary: 把双端测序数据的两端join在一起
  • quality control
  • deblur: sOTU
  • filter sOTU: 2019.09.18补充
  • 各个sOTU的代表序列及系统发育树的构建
  • alpha & beta diversity
  • 物种注释
  • 索引
  • 总结及几个注意

安装qiime2-2019.1

根据https://docs.qiime2.org/2019.1/install/安装。注意版本,最好下最新版本2019.1.
$ source activate qiime2-2019.1
命令行前面出现(qiime2-2019.1)

import data

无论如何,先把原始数据做fastqc, 结果放进multiQC,看原始数据质量如何,有没有adapter,参考微生物组16S rRNA数据分析小结:从fastq测序数据到OTU table
qiime2提供各种各样数据的import方法,详见import doc. import命令行的主体部分是

(qiime2-2019.1)$ qiime tools import --type 'import数据的类型,qiime提供一系列参数供你选择' 
                                    --input-path 'path/manifest_test' 
                                    --output-path 'path/file.qza' 
                                    --input-format '参数'` 
# qiime tools import --help  看一看,可以先概览一下有什么是必需的参数有什么是非必需的参数
# 通过以下这行来看--type可用的参数。具体用哪种数据用哪种参数,还是需要google一下或者查询tutorial.
# $ qiime tools import --show-importable-types
# 以下这行定义的是该输入的格式,因为这是一个qiime2输入数据的总入口,其中包括海量的格式,但是这里对于双端测序的数据的话
# 主要还是PairedEndFastqManifestPhred33 / 64,这里得手动指定33/64的质量分数的类型,我猜后续qiime2应该会补充一个自动检测的格式
# $ qiime tools import --show-importable-formats

本文中以demultiplexed的fastq文件为例。以下为一部分:
这里有3个样本,1-1, 1-2, 1-3,每个样本通过-1/-2来表示forward和reverse序列。所以这是个已经割库的文件,即已经按照样本分好了,没有primer和barcode,它们已经在下机后去掉了。如果手头的数据有primer和barcode,恐怕需要把barcode分出来单独作为一个fastq文件,并按照qiime2的格式输入。

对于已demultiplexed的数据,qiime2要求除了fastq文件,还需要一个manifest文件,txt格式。
注意这里的--input-path,需要是manifest的file path + file


manifest文件,可以很容易的自己写一个。一共3列,第一列为sample-ID, 第二列是绝对路径,如果是conda环境里的路径需要调整一下。第三列是序列文件对应的是reverse还是forward。格式是这样:

这里还需要一个--input-format的参数,一般为PairedEndFastqManifestPhred64PairedEndFastqManifestPhred33. Phred64或33是fastq文件存储quality score的方法,详见这里。...如果不知道是哪种,可以都试一试,不对会报错的。
顺便说一下,在之前版本的qiime2中,--input-format就是--source-format

(qiime2-2019.1)$ qiime tools import   --type 'SampleData[PairedEndSequencesWithQuality]'   
                                      --input-path manifest_test   
                                      --output-path ~/project/test/ZL/paired-end-demux_test.qza   
                                      --input-format PairedEndFastqManifestPhred33
# 我在这里运行的当前目录已经是~/project/test/ZL/
# import成功得到:Imported manifest_test as PairedEndFastqManifestPhred33 to /home/cs/project/test/paired-end-demux_test.qza

可以参考以下官方问答:
https://forum.qiime2.org/t/what-if-i-dont-have-the-barcodes-file/576
https://forum.qiime2.org/t/importing-demultiplexed-fastq-data-into-qiime2-2017-7/1064
https://forum.qiime2.org/t/manifest-is-not-a-n-pairedendfastqmanifestphred64-file/7654
import之后,存储为demux_test.qza。这个qza格式的文档可以转化为.qzv格式,从而让你drug and drop迅速又简单的进行可视化

# 转化不同类型的qza为qzv有不同的方法,这里对于单纯的序列
(qiime2-2019.1)$ qiime demux summarize --i-data ~/project/test/ZL/paired-end-demux_test.qza --o-visualization ~/project/test/ZL/paired-end-demux_test.qzv

join pair-end及summary

使用qiime2的vsearch接口做join pairs;使用demux summariz将jion好的pair-end序列转化为.qzv格式,可以直接可视化查看其join后的长度及质量。

(qiime2-2019.1)$ qiime vsearch join-pairs --i-demultiplexed-seqs paired-end-demux.qza --o-joined-sequences joined.qza
# 类似于上面的可视化
(qiime2-2019.1)$ qiime demux summarize --i-data joined.qza --o-visualization joined.qzv

visualization结果如下:
大多数样本都有50000以上的测序量,一共有4011555条序列。

在interactive quality plot里,横轴是一条序列从0到约250+对应的碱基位置,纵轴是每个碱基测序的quality score. 每个位置都有一个箱线图,表示在这个位置的碱基quality的分布情况(只纳入在所有序列中随机不放回的抽取10000条)。红色字体表示随机不放回抽取的10000条序列中,这10000的数量是个默认参数,可以通过demux summarize 中使用--p-n来进行控制,默认参数和不同的序列长度就直接导致了不是所有的序列都有到这个位置的碱基了,质量可能需要慎重对待。所以这一步是用于了解,join起来的质量有保障的序列大概有多长。官方文档中是建议记下这个从黑色变成红色字体的碱基位置(即质量有着明显差异的位置),在后面deblur的步骤中会用到。

quality control

质控以及质控前后序列数量比较的table的输出

(qiime2-2019.1)$ qiime quality-filter q-score-joined --i-demux joined.qza 
                                                     --o-filtered-sequences joined-filtered.qza 
                                                     --o-filter-stats joined-filtered-stats.qza

(qiime2-2019.1)$ qiime metadata tabulate --m-input-file joined-filtered-stats.qza 
                                         --o-visualization joined-filtered-stats.qzv

deblur:sOTU

这里使用deblur用于质控及OTU去噪(OTU denoising) 值得注意的是,denoising而不是clustering,这是为了明显地区分开传统的OTU与现在的ASV(amplicon sequence variant)。注意deblur只接受single-end的序列,如果你把没有jion的序列传递给deblur,它会只处理forward seqs。 deblur在denoising时需要输入整齐一样长度的序列,所以需要trim成相同的长度。这里需要用到前面join summary里我们记下来的join起来的质量有保障的序列大概有多长的数值。Deblur的开发者们建议设置一个质量分数开始迅速下降的长度(recommend setting this value to a length where the median quality score begins to drop too low)。于是本例中--p-trim-length为240。
另外这一步跑得时间可能稍微久一点,10多分钟。

这一步output为feature table,代表序列及每个sample的summary。这里feature table类似于之前我们用uparse算法聚类(把有97%相似性的序列聚集在一起成一个OTU,达到去重和聚类的目的)出OTU table类似,但是不论是DADA2还是Deblur, 都可以理解为用100%相似程度来聚类“OTU”,又称为sequence variants,或者sOTU,在qiime2的文档中,用ASV进行统一这些各种的叫法。

那么为什么用ASV呢?
首先它比用97%相似程度聚类的“OTU”更加精准,在后续的alpha diversity及物种注释中会更加准确,因为传统意义上的OTU的97%的相似程度是在genus水平上大家认可的,但如果需要到species甚至strain水平的话,使用传统的OTU是很不靠谱的。
另外,ASV相比于OTU最大的好处就是可以随时合并不同的数据跑出来的代表序列,因为使用的是100%的identidy,所以一样的序列就是一样的物种,不会受到不同数据、测序平台、文库建立、处理方法等等的误差影响。所以在qiime2中,它甚至不使用OTU或者ASV来命名,而是直接以一个基于字符串计算的哈希码来进行命名序列,这样子,只要是qiime2上跑出来的数据,即使是不同时间不同人的结果,也可以直接合并,甚至不需要接触到原始的测序数据,也大大方便了大数据之间的整合。
所以现在也越来越多的人倡导使用ASV以避免数据不可合并和难以合并的缺点。
当然了ASV不是只有好处,除了算法上的差异以外,该有的batch effect它也会遇到,不过那就是另外一个话题了。这里不加讨论。

利用--o-visualization将它们可视化在viewer平台上。同时生成了一个deblur的summary文件,可以查看原始reads数目,重复reads数目,嵌合体数目等细节。

(qiime2-2019.1)$ qiime deblur denoise-16S --i-demultiplexed-seqs joined-filtered.qza 
                                          --p-trim-length 240 
                                          --o-representative-sequences rep-seqs.qza 
                                          --o-table table.qza 
                                          --p-sample-stats 
                                          --o-stats deblur-stats.qza

(qiime2-2019.1)$ qiime deblur visualize-stats --i-deblur-stats deblur-stats.qza 
                                              --o-visualization deblur-stats.qzv # 可视化结果如下图所示

(qiime2-2019.1)$ qiime feature-table summarize --i-table table.qza 
                                               --o-visualization table.qzv 
                                               --m-sample-metadata-file meta_11.16.tsv


注意生成的这个table.qzv,我们需要通过它来了解,在测序深度选择多少合适。样本的分组是按照--m-sample-metadata-file来决定的,你也可以不设置meta data,output出所有的样本。调节左侧的sampling depth,了解在此测序深度下,有多少不够该深度的样本会被去掉(变成灰色的部分)

filter sOTU

可以通过qiime feature-table filter-features来Filter sOTU table. 但是根据一则官方问答“I don’t consider filtering features to be an essential step, especially given how well the modern denoisers (such as DADA2 and Deblur) work. ”官方似乎认为deblur和dada2得到的sOTU都是100%相度得到的,不必再做其它的过滤。但是也可以通过如下方式进行过滤:
When I do filter features, (a) by requiring them to show up in some minimum number of samples, or (b) if they don’t achieve some minimum level of taxonomy assignment.”

  • 一个feature中必须在n个samples中出现(即--p-min-samples),n为一个较小的数字,比方说2。以此过滤掉在极少样本中出现的features。
  • 根据qiime taxa filter-table来过滤,比方说过滤掉连pylumn都没有assign上的sOTU

各个sOTU的代表序列及系统发育树的构建

rep-seqs.qzv其实就是每个sOTU的序列内容,点击其序列连接可以直接blast,十分方便。rooted tree在后续的alpha diversity中可能会用到(如果需要计算PD value)。

(qiime2-2019.1)$ qiime feature-table tabulate-seqs --i-data rep-seqs.qza 
                                                   --o-visualization rep-seqs.qzv

(qiime2-2019.1)$ qiime alignment mafft --i-sequences rep-seqs.qza 
                                       --o-alignment aligned-rep-seqs.qza

(qiime2-2019.1)$ qiime alignment mask --i-alignment aligned-rep-seqs.qza 
                                      --o-masked-alignment masked-aligned-rep-seqs.qza

(qiime2-2019.1)$ qiime phylogeny fasttree --i-alignment masked-aligned-rep-seqs.qza 
                                          --o-tree unrooted-tree.qza

(qiime2-2019.1)$ qiime phylogeny midpoint-root --i-tree unrooted-tree.qza 
                                               --o-rooted-tree rooted-tree.qza

或者

(qiime2-2019.1)$ qiime phylogeny align-to-tree-mafft-fasttree --i-sequences masked-aligned-rep-seqs.qza 
                                                              --p-n-threads 0 
                                                              --output-dir masked-aligned-rep-aligned
# 注意这里的output-dir,其实很多命令都可以直接指定目录名而不用一一指定每个文件名。
# 另外这里的0代表所有threads,但qiime2似乎还有点问题,有的命令是用-1代表所有threads,需要注意

alpha & beta diversity

生成rarefaction curve,需要设置一个--p-max-depth参数,即在构建rarefaction curve时重新采样序列数目的最大值。一般来说比Maximum number of reads per sample/group小即可。在table.qzv里可以了解到。
关于rarefaction curve不懂的地方可以参考alpha diversity分析方法

(qiime2-2019.1)$ qiime diversity core-metrics-phylogenetic --i-phylogeny rooted-tree.qza 
                                                           --i-table table.qza 
                                                           --p-sampling-depth 18899 
                                                           --m-metadata-file meta_11.16.tsv 
                                                           --output-dir metrics
# 这里有生成13个qza和5个qzv
(qiime2-2019.1)$ qiime diversity alpha-rarefaction --i-table table.qza 
                                                   --p-max-depth 20000 
                                                   --i-phylogeny rooted-tree.qza 
                                                   --m-metadata-file meta_11.16.tsv 
                                                   --o-visualization rare.qzv

# 用以下两个命令可以根据metrics中的各项diversity table制图,并判断significance levels。
# (不截图了,真的很丑,建议自己画)
(qiime2-2019.1)$ qiime diversity alpha-group-significance --i-alpha-diversity metrics/faith_pd_vector.qza 
                                                          --m-metadata-file meta_11.16.tsv 
                                                          --o-visualization metrics/faith_pd_group_sig.qzv

(qiime2-2019.1)$ qiime emperor plot --i-pcoa metrics/weighted_unifrac_pcoa_results.qza 
                                    --m-metadata-file meta_11.16.tsv 
                                    --o-visualization metrics/weighted_unifrac_emperor.qzv

# 生成rarefaction curve.这里是按照meta data分组的,如果想看所有samples的,则去掉--m-metadata-file即可
# 还挺快的
(qiime2-2019.1)$ qiime diversity alpha-rarefaction --i-table table.qza 
                                                   --p-max-depth 36000  # 要根据table.qzv判断
                                                   --i-phylogeny rooted-tree.qza 
                                                   --m-metadata-file meta_11.16.tsv 
                                                   --o-visualization rare.qzv

结果是这样:

rarefaction curve可以选择根据各种不同alpha多样性指数,不同分组选择各种结果。

物种注释

qiime2中的物种注释给了user更大的自主权,可以下载用于比对的数据库,并提供3种不同的方法(两种alignment-based的方法和一种基于naive-bayes的方法),自己train一个classifer用于物种分类,也可以下载并使用官方已经train好的(pre-trained)classifer

不过一般推荐的还是使用基于naive-bayes的方法,之前的rdp、usearch的也是基于这个的方法。
本例中使用官方已经train好的classifergg-13-8-99-nb-classifier.qza(greengene),可以在官网上下载。

需要注意的是,常用的16s数据库有rdp、greengene、Silver,官网只可以下载后两个的,如果需要跟之前的数据进行合并genus,需要注意。另外即使测序测的是V3V4,也可以选择16s全长的数据库进行训练,对结果并没有什么影响(naive-bayes based method)。

(qiime2-2019.1)$ qiime feature-classifier classify-sklearn --i-classifier gg-13-8-99-nb-classifier.qza 
                                                           --i-reads rep-seqs.qza 
                                                           --o-classification taxonomy.qza

(qiime2-2019.1)$ qiime metadata tabulate --m-input-file taxonomy.qza 
                                         --o-visualization taxonomy.qzv

# 这是一个可以观察物种组成(优势物种)的bar图,可以选择不同的物种levels绘制。
(qiime2-2019.1)$ qiime taxa barplot --i-table table.qza 
                                    --m-metadata-file meta_11.16.tsv 
                                    --i-taxonomy taxonomy.qza  
                                    --o-visualization taxa-bar.qzv

结果是这样,表格都可以下载下来。

索引

由于官方文档太庞大,强行看很难下手。所以做个连接索引:

可视化地点:drag and drop
https://view.qiime2.org/

整个流程的tutorial,是个PPT,条理清楚。跟着跑一遍没毛病,比官方文档高效。
http://compbio.ucsd.edu/wp-content/uploads/2018/07/20180621_oslo_university_microbiome_analysis_with_qiime2_tutorial.pdf
官网流程连接
https://docs.qiime2.org/2019.1/tutorials/qiime2-for-experienced-microbiome-researchers/#data-processing-steps

import tutorial: 包括如何将已经割库的fastq导入
https://docs.qiime2.org/2019.1/tutorials/importing/

(对使用pair-end seqs的user来说,详细又重要)merge tutorial: 将pair-end序列的forward和reverse join在一起
https://docs.qiime2.org/2019.1/tutorials/read-joining/

filter table:
https://docs.qiime2.org/2019.1/tutorials/filtering/

物种注释reference库
https://docs.qiime2.org/2019.1/data-resources/#marker-gene-reference-databases
pre-trained classifier在这里下载
https://docs.qiime2.org/2019.1/data-resources/

train classifier或使用pre-trained classifer做物种注释的tutorial
https://docs.qiime2.org/2019.1/tutorials/feature-classifier/

meta data的格式(mapping file):
https://docs.qiime2.org/2019.1/tutorials/metadata/
如下所示:

如何根据metadata filtering samples(选择样本)
https://docs.qiime2.org/2019.1/tutorials/filtering/

官网tutorial大目录
https://docs.qiime2.org/2019.1/tutorials/

总结及几个注意

  1. 在import过程中报错,首先考虑是不是import的文件格式不对。qiime2对input的格式有严格且详细的要求,具体查询其tutorial文档。

  2. .qva格式的文件,本质上是个zip包。比方说这个OTU table。把table.qza打开,进入data文件夹,就可以找到biom格式的OTU table.

所以.qva和readable file之间的转化如下所示:

可以参考 https://forum.qiime2.org/t/importing-csv-to-qza/3920. 另外 Artifact API也有提供和定义了很多转化的方法。但现在qiime2目前为止还没很好的写完这个部分,我们这里不细讲

  1. 本次笔记中是在quality control之前join了pair end seqs, 并使用deblur来做quality control。如果要使用DADA2来做质控,则不需要事先join, DADA2会在流程中join并做质控。
    使用DADA2详见:https://docs.qiime2.org/2019.1/tutorials/atacama-soils/

  2. 当然你也可以不用DADA2和Deblur来生成sOTU, 像qiime1那样使用Uparse等算法生成的OTU,详见join-pair的tutorial

  3. 分析图表里rarefaction curve和物种构成的bar图还不错,其他的boxplot之类的最好还是根据研究需求自己画吧,毕竟也没法加上significant levels等。

  4. 另外物种注释好之后,对各物种levels的差异性分析(挑选marker物种),qiime2给出了与传统统计学方法(如t-test, anova)不同的ANCOM(Analysis of Composition of Microbiomes)。由于物种表格是“compositional”的,即每个样本由多个物种组成,且每个样本的sOTU数目是大致相同的(在前阶段分析中已经normalize),并不符合传统统计方法要求的符合正态分布,满足方差齐性等(...那你可以用非参数性检验啊..=_=)。于是就有了专门针对微生物物种构成差异性的统计检验方法。这个方法要求最好去掉在samples中及其少见的物种,variance极低的物种,在所有样本中,包含reads数极低的物种。而且不能出现0。详见索引中的PPT tutorial.

  5. qiime2有个非常棒的功能:provenance. 本质上是个一目了然的log。每个以qzv为扩展名的文件,都有这样一个页面,通过流程图记录这个文件是怎么来的——从原始数据import进来开始。流程图的末端就是当前.qzv文件本身。
    比方说以下这个table.qzv,是sOTU table.

  • 点击方块显示action details, 告诉你这个节点的数据是通过什么操作得到的,input和output的数据类型(format)是什么。注意这个 format,与import命令中的type参数用的是同一个数据类型代号。以及用到了什么插件,各项版本信息等。方便记录每一步用到的参数,方便debug。
  • 点击圆圈看到这个节点数据的信息。
  • 在Action Details 中也有python-packages的版本信息以方便不同结果之间的debug。
  1. Viewer可以方便并不使用qiime2来分析数据,但是需要把握结果的人(比方说你的老板)。把一个.qzv文件直接拖进Viewer的web端,不仅可以直接可视化,还能通过Provenance了解这个文件是怎么来的,中间数据都有什么,使用了什么参数等。

附本次笔记的版本信息(通过qiime info得到):

System versions
Python version: 3.6.7
QIIME 2 release: 2019.1
QIIME 2 version: 2019.1.0
q2cli version: 2019.1.0

Installed plugins
alignment: 2019.1.0
composition: 2019.1.0
cutadapt: 2019.1.0
dada2: 2019.1.0
deblur: 2019.1.0
demux: 2019.1.0
diversity: 2019.1.0
emperor: 2019.1.0
feature-classifier: 2019.1.0
feature-table: 2019.1.0
fragment-insertion: 2019.1.0
gneiss: 2019.1.0
longitudinal: 2019.1.0
metadata: 2019.1.0
phylogeny: 2019.1.0
quality-control: 2019.1.0
quality-filter: 2019.1.0
sample-classifier: 2019.1.0
taxa: 2019.1.0
types: 2019.1.0
vsearch: 2019.1.0

推荐阅读更多精彩内容