简介:这是一份面向微生物组研究者的QIIME 2实战教程文档,主题聚焦16S rRNA基因扩增子测序数据的标准分析流程。文档基于已发表的Bio-protocol方案撰写,适合缺乏生物信息学背景、希望在Linux或Windows环境下快速上手QIIME 2的初学者与进阶用户。内容覆盖四种安装环境选择、从数据导入到特征表生成、α/β多样性、物种组成与差异分析、可视化等核心环节,并对中间步骤和参数进行解读,同时总结了软件安装与使用中的常见问题和解决策略。压缩包内包含1个docx文档,仅约578KB,便于下载后随时查阅。文档中梳理了分析所需的服务器或虚拟机配置、Miniconda及GreenGenes数据库部署、标准分析命令与代码框架,并提供配套视频、分析代码、测序数据和预期结果的获取说明,方便读者按步骤复现实验。目前已有2793人学习,适合作为微生物组扩增子分析的入门参考和操作手册。
1. 从 FASTQ 到 PCoA 图:QIIME 2 是怎么把 16S 扩增子流程串成一条线的
从测序仪下机的 FASTQ 到一张能放进论文补充材料的 PCoA 图,中间隔着一整条数据处理链。QIIME 2 是目前把这条链做得最完整的开源工作流:质量查看、引物切除、DADA2 去噪、ASV 特征表、分类学注释、α/β 多样性和差异丰度统计,全部在同一个环境里串起来,每一步都有可复现的中间产物。对做 16S rRNA 基因扩增子测序的团队来说,这套流程最大的价值是告别“各跑各的脚本再手动拼接结果”的混乱状态。下面的内容按我第一次完整跑通的路径来写,把环境搭建、核心参数、结果判断和踩过的坑位讲清楚,适合正要处理第一批数据的同学,也适合被流程报错反复折腾过的熟手。
2. 环境与数据导入:conda、manifest 和元数据的一次性踩对
2.1 用 conda/mamba 装环境:为什么不能直接 pip install
QIIME 2 表面上是个 Python 工具,实际上是由几十个插件组成的系统,底层依赖大量原生二进制库,比如序列比对用的 MAFFT、建树用的 FastTree、各种 C 扩展模块。用 pip 直接装只能把 Python 层装上,原生依赖大概率缺胳膊少腿,最后会在某个插件调用时报出晦涩的ImportError或libstdc++错误。常见做法是通过 conda 或 mamba 管理环境,让 QIIME 2 和它的原生依赖一起装进一个干净的环境,跟系统里的其他软件互不干扰。
mamba 的解析速度比 conda 快很多,尤其在这种依赖非常多的安装场景下感受明显。我一般会先建一个独立环境,激活后再装 QIIME 2。
# 方式一:用官方发布的 conda 环境文件,最省心 mamba env create -n qiime2-env -f qiime2-<版本号>-linux-conda.yml conda activate qiime2-env # 方式二:手动创建环境后从通道安装 mamba create -n qiime2-env conda activate qiime2-env mamba install -c conda-forge -c bioconda -c qiime2 qiime2 # 安装完成后验证 qiime --help参数说明:-c指定通道,后写的通道优先级更高,所以-c qiime2放在最后,让官方通道拥有最终解释权;<版本号>要去官方发布渠道查当前稳定版再填,不建议装预览版。装完先跑qiime --help,能正常打印插件列表就说明环境没坏。如果连qiime都找不到,大概率是环境没有激活,先检查conda activate这一步。
2.2 manifest 文件:V2 格式与绝对路径的约定
QIIME 2 导入双端 FASTQ 之前,要先给一份 manifest 清单,告诉它“每个样本的 R1、R2 文件在哪”。早期版本用的是旧格式,列名和校验逻辑比较松散,现在官方主推 V2 格式,列名固定为sample-id、forward-absolute-filepath、reverse-absolute-filepath,并且严格要求绝对路径。
两种格式的主要差别不需要背,直接记住用 V2 就行:
| 对比项 | 旧格式 | V2 格式 |
|---|---|---|
| 样本名列 | 各种命名都可能 | 固定为 sample-id |
| 路径要求 | 支持相对路径 | 必须绝对路径 |
| 校验严格度 | 宽松,容易踩坑 | 严格,报错信息更明确 |
| 导入时指定的格式 | PairedEndFastqManifestPhred33 等 | 对应加 V2 后缀 |
manifest 本身是一个 tab 分隔的 tsv 文件,没有额外的表头说明,第一行就是列名。一个最小可用的例子长这样:
# manifest-v2.tsv sample-id forward-absolute-filepath reverse-absolute-filepath sample-A /home/user/data/sample-A_S1_L001_R1_001.fastq.gz /home/user/data/sample-A_S1_L001_R2_001.fastq.gz sample-B /home/user/data/sample-B_S2_L001_R1_001.fastq.gz /home/user/data/sample-B_S2_L001_R2_001.fastq.gz注意上面用 tab 分隔,不是空格。很多人在这一步翻车:从 Excel 里复制出来变成逗号分隔,或者表头带了全角字符,导入时直接报格式错误。我习惯用cat -A manifest-v2.tsv检查,tab 会显示为^I,逗号则是普通逗号,一眼就能看出问题。样本 ID 里不要带空格、中文或-以外的特殊符号,后续所有命令都会拿它跟元数据做匹配,ID 越干净越省事。
2.3 元数据文件与第一个 qza:导入并查看质量概览
数据导入的同时必须准备好元数据文件,也就是每个样本的分组、时间点、临床信息等。元数据同样用 tab 分隔的 tsv,第一列是样本 ID,后续列是变量,比如分组列Group写case或control。列名不要带空格和括号,QIIME 2 对列名大小写敏感,Group和group会被当成两个不同的列。
# sample-metadata.tsv sampleid Group Days sample-A case 0 sample-B control 14准备好这两个文件后,执行导入:
qiime tools import \ --type 'SampleData[PairedEndSequencesWithQuality]' \ --input-format PairedEndFastqManifestPhred33V2 \ --input-path manifest-v2.tsv \ --output-path demux-paired-end.qza逻辑说明:--type声明数据类型是“带质量值的双端测序数据”,--input-format告诉导入器 manifest 是 Phred33 编码的 V2 格式。现代 Illumina 平台基本都是 Phred33,老平台或某些预处理工具可能是 Phred64,那种情况要换成PairedEndFastqManifestPhred64V2。导入成功后会生成一个.qza文件,这是 QIIME 2 的核心产物格式,后续所有步骤都吃这种格式。
导入后立刻做一个质量概览,这一步不要跳过:
qiime demux summarize \ --i-data demux-paired-end.qza \ --o-visualization demux-summary.qzv生成的.qzv是可视化报告,可以用qiime tools view demux-summary.qzv打开,也可以直接解压查看内部的网页文件。报告里有每个样本的 reads 数量和逐碱基质量箱线图,这是下一步 DADA2 参数的唯一依据。如果你的样本很多,这个可视化文件会比较大,网络不好时直接解压demux-summary.qzv看里面的index.html,效果一样。
提示:
.qza和.qzv本质上都是 zip 包,怀疑文件损坏时可以用unzip -l先看看内部结构,很多“无法读取”的问题其实只是下载或拷贝过程中文件被截断。
3. DADA2 去噪:trunc-len、chimera 参数直接决定你拿到多少 ASV
3.1 先看质量图再定参数:两个截断值的判断方法
DADA2 是 QIIME 2 里最核心的去噪步骤,它通过误差模型纠正测序引入的碱基错误,最终输出单碱基分辨率的 ASV(扩增子序列变异体),替代了传统的按 97% 相似度聚类 OTU 的做法。ASV 的好处是可跨实验比较、不需要重新聚类,但也意味着它对输入质量更敏感,参数设错了,后面的多样性分析全都会跟着偏。
打开第二步生成的demux-summary.qzv,找到 per-base quality 的交互图,重点看两个位置:R1 和 R2 分别在哪个碱基位置开始,中位质量掉到 30 以下。这个位置就是你截断的参考点。16S 扩增子的插入片段长度是已知的,比如 V4 区大约 250 bp,所以截断值的上限也被读长和插入片段长度双重限制。
我一般的判断方法是这样的:
| 参数 | 常见范围 | 判断依据 |
|---|---|---|
| --p-trim-left-f / r | 0 到 20 | 如果数据里还含有引物序列,填引物长度;如果测序公司已经去引物,填 0 |
| --p-trunc-len-f | 240 到 280 | R1 质量开始下降的位置,同时留足与 R2 的重叠 |
| --p-trunc-len-r | 180 到 220 | R2 质量通常衰减更快,截断点要比 R1 短 |
| 最小重叠长度 | ≥ 20 bp | 低于 20 bp 会导致大量序列无法合并 |
注意一个反直觉的点:trunc-len不是越大越好。R2 尾部低质量碱基如果不截掉,DADA2 的误差模型会把它们当成真实变异,产生大量单样本特有的假 ASV。宁可多截一点,保证合并率,也不要留着低质量尾巴。这个参数在 16S 分析里多少带点玄学,但判断依据永远是质量图而不是别人的教程。
3.2 跑通 denoise-paired 并解读去噪统计
确定了截断参数后,执行去噪命令。这是一个计算密集步骤,样本多时要等很久,建议把n-threads设为服务器物理核心数减 2,给系统留余量。
qiime dada2 denoise-paired \ --i-demultiplexed-seqs demux-paired-end.qza \ --p-trim-left-f 19 \ --p-trim-left-r 20 \ --p-trunc-len-f 240 \ --p-trunc-len-r 200 \ --p-n-threads 8 \ --p-chimera-method consensus \ --o-table table.qza \ --o-representative-sequences rep-seqs.qza \ --o-denoising-stats stats.qza参数说明:trim-left填的是引物长度,因为我的数据没去引物,R1 用 19 bp、R2 用 20 bp;trunc-len按上表的判断方法定;chimera-method默认是consensus,它把每个样本的序列做共识比对来筛嵌合体,速度较快,一般不需要动。
跑完后先看去噪统计,这一步能告诉你参数是否合理:
qiime metadata tabulate \ --m-input-file stats.qza \ --o-visualization stats-tabulated.qzv打开stats-tabulated.qzv,里面每个样本一行,重点看四列:input(输入 reads 数)、filtered(质量过滤后)、merged(双端成功拼接)、non-chimeric(去除嵌合体后最终留下的)。判断标准很简单:merged除以input如果低于 50%,说明截断太长或重叠太短,序列拼不上;non-chimeric相对merged如果掉了 20% 以上,说明嵌合体比例偏高,要考虑改用更严格的pooled方法。
3.3 特征表统计与低深度样本过滤
去噪产物里最关键的是table.qza,也就是 ASV 丰度表:行是样本,列是每个 ASV,单元格是 reads 计数。先对它做一次总结,了解数据的基本盘。
qiime feature-table summarize \ --i-table table.qza \ --m-sample-metadata-file sample-metadata.tsv \ --o-visualization table-summary.qzvtable-summary.qzv里能看到三个关键数:总 ASV 数量、每个样本的 reads 数分布、最低 reads 样本是谁。很多人直接拿着这个表就往下跑多样性,结果在计算 β 多样性时发现半数样本被剔除,原因就是没有提前过滤低深度样本。
常见的做法是先按绝对频次过滤:
qiime feature-table filter-features \ --i-table table.qza \ --p-min-frequency 2 \ --p-min-samples 2 \ --o-filtered-table table-freq-filtered.qza这个命令的逻辑是:一个 ASV 在全部样本中至少要出现 2 次,且至少在 2 个样本中出现,否则认为是单样本噪声或测序假阳性。min-frequency设得越高,删掉的稀有 ASV 越多,建议从 2 开始,不要一上来就设 10,那会把稀有但真实的低丰度物种全删光。如果一个样本的 reads 数明显低于其他样本,后面还要单独用feature-table filter-samples把它剔掉,而不是靠提高全局阈值来硬凑。
4. 分类学注释与多样性分析:从特征表到能写进论文的结论
4.1 分类器选型与注释:预训练还是自己训
DADA2 输出的rep-seqs.qza是每个 ASV 的代表序列,下一步要告诉这些序列“你是谁”,也就是分类学注释。QIIME 2 里最常用的是classify-sklearn,它对每个 ASV 序列用朴素贝叶斯模型比对参考数据库,输出从界到属(有时到种)的分类结果和置信度。
qiime feature-classifier classify-sklearn \ --i-classifier silva-138-99-nb-classifier.qza \ --i-representative-sequences rep-seqs.qza \ --p-confidence 0.7 \ --o-classification taxonomy.qza--p-confidence默认 0.7,意思是分类置信度低于 70% 的层级会被标为未分类。调低到 0.5 能提高注释率,但也会引入更多错误注释;正式分析我一般保持默认。分类器的选择很关键,官方提供的预训练分类器都是针对特定扩增区域训练的,比如 V4 区分类器不能直接用于 V3-V4 引物跑出来的数据,否则注释结果会大面积出现Unclassified。数据库方面常用 SILVA 138 或者 GreenGenes 13_8,前者覆盖范围广,后者是老牌参考,看你的研究领域习惯用哪个。
如果手上数据用的引物比较冷门,或者预训练分类器注释率明显偏低,就自己训练一个分类器。步骤是先用参考序列按引物区域提取片段,再做训练:
# 第 1 步:按自己的引物提取参考序列片段 qiime feature-classifier extract-reads \ --i-sequences silva-138-99-seqs.qza \ --p-f-primer GTGCCAGCMGCCGCGGTAA \ --p-r-primer GGACTACHVGGGTWTCTAAT \ --p-min-length 100 \ --p-max-length 400 \ --o-reads ref-seqs-v4.qza # 第 2 步:用提取的片段训练新分类器 qiime feature-classifier fit-classifier-naive-bayes \ --i-reference-reads ref-seqs-v4.qza \ --i-reference-taxonomy silva-138-99-tax.qza \ --o-classifier v4-custom-classifier.qza这里--p-f-primer和--p-r-primer填的是你建库时的引物序列,示例里是 V4 区常用的 515F/806R。自己训练的 classifier 在正式项目里很值得做,尤其是跨批次数据,注释率提升往往非常明显。注释完别忘了把线粒体和叶绿体序列从特征表里剔掉,否则它们会占掉大量比例,干扰后续所有分析:
qiime taxa filter-table \ --i-table table-freq-filtered.qza \ --i-taxonomy taxonomy.qza \ --p-exclude mitochondria,chloroplast \ --o-filtered-table table-final.qza4.2 系统发育树与核心多样性指标
计算 UniFrac 距离之前需要一棵系统发育树。QIIME 2 提供的是一站式命令:先用 MAFFT 做多序列比对,再屏蔽高变区,最后用 FastTree 建树并输出有根树。
qiime phylogeny align-to-tree-mafft-fasttree \ --i-sequences rep-seqs.qza \ --o-alignment aligned-rep-seqs.qza \ --o-masked-alignment masked-aligned-rep-seqs.qza \ --o-tree unrooted-tree.qza \ --o-rooted-tree rooted-tree.qza建树这一步对 ASV 数量多的数据集会比较耗时,属正常现象。拿到rooted-tree.qza后,就可以一次性计算所有核心多样性指标:
qiime diversity core-metrics-phylogenetic \ --i-phylogeny rooted-tree.qza \ --i-table table-final.qza \ --p-sampling-depth 1000 \ --m-metadata-file sample-metadata.tsv \ --output-dir core-metrics--p-sampling-depth是采样深度,它的含义是“把每个样本的 reads 随机抽到同样的深度再计算多样性”,用来消除测序深度差异。这个参数是多样性分析里最容易被问住的:取值太小,会丢弃大量数据,多样性被低估;取值太大,会剔除低深度样本。常见做法是先看table-summary.qzv的每个样本 reads 分布,取最小值可以保留全部样本,取中位数会牺牲低深度样本。我一般会跑三个深度做敏感性验证,比如样本深度分别是 800、1500、3000 时各跑一次,如果分组结论一致再采用中位数的结果。
输出目录里会有大量文件:shannon_vector.qza、bray_curtis_distance_matrix.qza、unweighted_unifrac_pcoa_results.qza,以及对应的*_emperor.qzv三维主坐标图。这些.qzv文件可以直接用于报告和论文补充材料。
4.3 组间差异检验与 ANCOM-BC 差异丰度
多样性指标算出来只是开端,研究问题通常是“两组之间是否有显著差异”。α 多样性(样本内部多样性)的组间比较用非参数检验:
qiime diversity alpha-group-significance \ --i-alpha-diversity core-metrics/shannon_vector.qza \ --m-metadata-file sample-metadata.tsv \ --o-visualization shannon-group-significance.qzv这个命令对元数据里每一列都会单独做检验,输出箱线图和检验 p 值。β 多样性(样本间群落差异)的组间检验用 PERMANOVA:
qiime diversity beta-group-signature \ --i-distance-matrix core-metrics/bray_curtis_distance_matrix.qza \ --m-metadata-file sample-metadata.tsv \ --m-metadata-column Group \ --p-pairwise \ --o-visualization bray-curtis-group-significance.qzv--p-pairwise会在多组情况下做两两比较;结果里会给出整体 p 值和每个组对的 p 值。如果只有两组,这个命令就相当于回答“两组微生物群落结构是否有显著差异”。
最后是差异丰度分析,找具体哪些物种在组间有差异。QIIME 2 的composition插件提供两种方法,我推荐用 ANCOM-BC,它自带偏差校正,对零值多的稀疏特征表更友好:
qiime composition ancombc \ --i-table table-final.qza \ --m-metadata-file sample-metadata.tsv \ --p-formula Group \ --o-differentials ancombc-differentials.qza输出结果里能看到每个 ASV 或分类单元的效应量和 p 值。如果你想用更基础的 ANCOM 方法,需要先对特征表做伪计数处理,再加composition ancom,但 ANCOM-BC 在绝大多数场景下是更好的选择。差异丰度这一步跑完,整个标准分析流程就闭环了:从原始 FASTQ 到分类组成、多样性和差异物种,全都有可复现的产物。
5. 跑 QIIME 2 常见问题排查:五条值得写进笔记的翻车记录
5.1 导入阶段:路径与 Phred 格式
坑 1:manifest 路径错误导致导入失败。现象是qiime tools import报No such file or directory,或者导入成功但demux-summary.qzv里某些样本 reads 数为 0。原因通常是 manifest 里写了相对路径,而命令是在另一个目录执行的;Windows 用户还会有反斜杠路径问题的困扰。解决方法是统一用pwd确认工作目录后,把 manifest 里所有路径改成绝对路径;再用ls逐个验证 R1、R2 文件真实存在。还有一个隐蔽原因:从 Excel 复制出来的 manifest 里可能带了看不见的换行符或全角空格,用cat -A检查最稳妥。
坑 2:Phred 格式选错导致质量值整体失真。现象是导入不报错,但打开demux-summary.qzv时质量曲线异常,比如所有位置的碱基质量都显示成 0 或者整体偏移。原因是数据实际是 Phred64 编码,但导入时用了 Phred33 格式去解析。老平台或经过某些预处理工具的数据会出现这种情况。解决方法是先确认数据来源的编码格式,现代 Illumina 基本都是 Phred33;如果确定是 Phred64,把--input-format换成PairedEndFastqManifestPhred64V2重新导入。
5.2 去噪阶段:合并率与嵌合体
坑 3:merged 比例低得离谱。现象是stats.qza里merged / input只有 20% 到 30%,甚至更低。原因几乎总是trunc-len设得太长,把 R1 和 R2 本该重叠的区域截掉了,两条序列拼不起来;也有可能是trim-left太大,把插入片段切掉了一部分。解决方法是重新打开质量图,缩短trunc-len-f和trunc-len-r,保证 R1 和 R2 至少有 20 bp 重叠。我给自己的兜底公式是:重叠长度 = 读长 + 读长 − 截断长度 − 截断长度 − 两端引物长度,算出来小于 20 bp 就说明参数必然出错。
坑 4:嵌合体比例高。现象是non-chimeric比merged掉了 30% 以上。原因是样本复杂度高或者 PCR 扩增循环数偏多,嵌合体本身产生的就多,consensus方法漏检了。解决方法是把--p-chimera-method改成pooled,它会用所有样本的序列联合检测嵌合体,灵敏度更高,但耗时明显增加。跑完后对比两次的 ASV 总量和注释率,如果pooled明显更合理就采用它的结果。
5.3 多样性阶段:采样深度与元数据匹配
坑 5:PCoA 图里只剩几个样本点。现象是core-metrics-phylogenetic跑完了,但打开emperor.qzv时发现绝大多数样本被排除,图里只有零星几个点。原因是--p-sampling-depth设得太大,超过了大部分样本的 reads 数,这些样本在抽平时被直接丢弃。解决方法是先看table-summary.qzv的 per-sample frequency 分布,取一个能保留 80% 以上样本的深度值;如果某些样本确实太浅,就单独用filter-samples剔掉并说明剔除标准,不要硬凑一个深度。
坑 6:元数据和特征表样本 ID 对不上。现象是运行任何涉及--m-metadata-file的命令时,报错类似Sample metadata does not contain...。原因最可能是元数据第一列和 manifest 里的sample-id不完全一致:多了空格、大小写不同、或者表头带 BOM 头。解决方法是先head -3 sample-metadata.tsv看列名,再用cut -f1 sample-metadata.tsv | sort和导入时的样本 ID 集合做对比;差异一目了然。全角空格这类问题在文本编辑器里肉眼很难看见,建议直接写脚本把非 ASCII 空白替换掉再重新上传。
6. 进阶:把质量评估和参数联调养成固定习惯——一个最值得复用的验证套路
跑完一轮完整流程只是开始,真正让结果经得起推敲的是“参数敏感性验证”。我强烈建议在正式出结果之前,做一次多采样深度的稳定性检查。做法很简单,把core-metrics-phylogenetic包进一个循环,分别用小、中、大三个深度跑,然后对比分组检验的 p 值是否一致。
for depth in 1000 2000 3000; do qiime diversity core-metrics-phylogenetic \ --i-phylogeny rooted-tree.qza \ --i-table table-final.qza \ --p-sampling-depth $depth \ --m-metadata-file sample-metadata.tsv \ --output-dir core-metrics-$depth done跑完之后分别打开三个目录里的bray_curtis_emperor.qzv对比样本聚类结构,如果三个深度下分组模式基本一致,这个结论才敢写进论文;如果某个深度下原本显著的两组差异消失了,说明差异本身很脆弱,需要回到特征表检查是不是低深度样本在干扰。这套验证花不了多少时间,但能避免最尴尬的返工。
另一个值得养成习惯的是把去噪统计导出成表,用最简单的文本工具算通过率。去噪跑完后qiime tools export --input-path stats.qza --output-path denoise-stats-export,导出的 tsv 文件直接丢进 Excel 或者用awk就能算中位通过率,这个数低于 50% 时我会回到质量图重新调参数,直到通过率稳定在 60% 以上才继续往下走。
我吃过一次亏:从同事那里接了一个已经跑好的特征表,直接做了多样性和差异分析,结果两组差异非常漂亮,结果复核时才发现他用的是全 0 截断参数,R2 低质量尾巴全部进了最终 ASV 表。后来重跑全流程,显著结果少了一半。从那之后我给自己定了一条死规矩:拿到任何一批新数据,先看demux-summary.qzv,再定trunc-len,最后至少跑三个采样深度做交叉验证,这套检查做完之前不出任何正式图。数据分析和实验一样,过程不透明,再好看的结果都可能翻车。希望帮到你。
本文还有配套的精品资源,点击获取