简介这是一份面向微生物组研究者的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 installQIIME 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 参数直接决定你拿到多少 ASV3.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 / r0 到 20如果数据里还含有引物序列填引物长度如果测序公司已经去引物填 0--p-trunc-len-f240 到 280R1 质量开始下降的位置同时留足与 R2 的重叠--p-trunc-len-r180 到 220R2 质量通常衰减更快截断点要比 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 bptrunc-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 值。β 多样性样本间群落差异的组间检验用 PERMANOVAqiime 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 格式坑 1manifest 路径错误导致导入失败。现象是qiime tools import报No such file or directory或者导入成功但demux-summary.qzv里某些样本 reads 数为 0。原因通常是 manifest 里写了相对路径而命令是在另一个目录执行的Windows 用户还会有反斜杠路径问题的困扰。解决方法是统一用pwd确认工作目录后把 manifest 里所有路径改成绝对路径再用ls逐个验证 R1、R2 文件真实存在。还有一个隐蔽原因从 Excel 复制出来的 manifest 里可能带了看不见的换行符或全角空格用cat -A检查最稳妥。坑 2Phred 格式选错导致质量值整体失真。现象是导入不报错但打开demux-summary.qzv时质量曲线异常比如所有位置的碱基质量都显示成 0 或者整体偏移。原因是数据实际是 Phred64 编码但导入时用了 Phred33 格式去解析。老平台或经过某些预处理工具的数据会出现这种情况。解决方法是先确认数据来源的编码格式现代 Illumina 基本都是 Phred33如果确定是 Phred64把--input-format换成PairedEndFastqManifestPhred64V2重新导入。5.2 去噪阶段合并率与嵌合体坑 3merged 比例低得离谱。现象是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 多样性阶段采样深度与元数据匹配坑 5PCoA 图里只剩几个样本点。现象是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最后至少跑三个采样深度做交叉验证这套检查做完之前不出任何正式图。数据分析和实验一样过程不透明再好看的结果都可能翻车。希望帮到你。本文还有配套的精品资源点击获取