简介:这份资源面向缺乏生物信息学背景的微生物组研究者与初学者,提供使用QIIME 2流程分析16S rRNA基因扩增子测序数据的完整学习材料,帮助读者快速掌握从数据导入到可视化呈现的标准分析路径。资源包为单个docx文档,约578KB,内容涵盖软件安装环境选择、特征表生成、α与β多样性分析、物种组成与差异物种分析等核心环节,并附有配套视频、分析代码、测序数据与预期结果,便于对照复现。文档还系统总结了安装与使用中的常见问题及解决策略,对参数优化和硬件配置给出具体建议,例如推荐4核CPU、16GB内存及大于原始数据三倍的硬盘空间。目前已有2792人学习下载,适合希望系统入门微生物组扩增子分析、需要可复现操作指引的研究人员参考。
1. 从一份能跑通的 QIIME 2 流程说起:16S 扩增子分析到底难在哪
如果你刚拿到一摞 Illumina 双端 fastq,样本表还没整理,导师又催着要 α 多样性箱线图和门水平堆叠柱状图,那 QIIME 2 大概率是你绕不开的一站。它用 Python 3 重写,插件化、可交互、结果可复现,是目前 16S rRNA 基因扩增子分析里引用量最高的流程之一。但真上手你会发现两个现实问题:一是它压根不支持 Windows 直接装,二是官方文档十万字起步,新手光看安装就能劝退。这份资源的价值就在这——它把从 Miniconda 装环境、GreenGenes 建分类器,到 DADA2 降噪、Alpha/Beta 多样性、ANCOM 差异分析整条链路串成了一份可复现的脚本,还配了示例数据和视频。适合谁?做微生物组、植物根系、肠道菌群这类课题,手里有双端测序数据、想自己跑一遍完整流程的人。下面我按实际拆包顺序讲,重点放在参数怎么定、哪一步最容易翻车。
2. 环境部署与数据库准备:Miniconda、QIIME 2 与 GreenGenes 分类器
2.1 为什么优先选 Linux 服务器或 WSL,而不是虚拟机
QIIME 2 官方只发 Linux 和 Mac 的 conda 包,Windows 用户只有两条路:WSL(Windows Subsystem for Linux)或 VirtualBox 虚拟机。资源里明确推荐 WSL 的 Ubuntu 20.04 LTS,虚拟机标了“不推荐,效率低”。原因很直接:DADA2 降噪和分类器训练都是吃 CPU 和内存的活,虚拟机多一层硬件抽象,同样的数据可能多花一倍时间。我一般建议:数据量小于 20G、样本几十个,WSL 足够;上百样本或要反复训练 V 区分类器,直接上 4 核 16G 起的 Linux 服务器,硬盘留原始数据 3 倍以上,因为中间 qza 文件会膨胀。
WSL 安装本身在微软商店搜 Ubuntu 20.04 LTS 即可,装完在开始菜单启动就是命令行。Mac 用户系统自带终端能直接 ssh 远程服务器,但资源里对 Mac 本地安装标了“兼容性问题较多”,我的经验是 Mac 本地跑小数据可以,大数据还是连服务器稳。
2.2 Miniconda 与 QIIME 2 2020.6 的安装命令逐行拆解
整个安装的核心是 conda 环境隔离。先装 Miniconda3,再下载 QIIME 2 的 yml 环境文件,最后 create 环境。命令如下:
# 下载并安装 Miniconda3(已装 conda 可跳过) wget -c https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh ~/miniconda3/bin/conda init # 下载 QIIME 2 2020.6 的环境依赖列表 wget -c https://data.qiime2.org/distro/core/qiime2-2020.6-py36-linux-conda.yml # 新建名为 qiime2-2020.6 的环境并安装 conda env create -n qiime2-2020.6 --file qiime2-2020.6-py36-linux-conda.yml # 每次分析前激活环境 conda activate qiime2-2020.6逻辑说明:conda init把 conda 写进 shell 配置,之后新开终端才能直接用conda activate。conda env create会按 yml 里的版本号拉取所有依赖,这一步网络不稳容易断,断了重跑即可,conda 有缓存。参数上,环境名qiime2-2020.6建议和版本号一致,以后装新版本不会互相覆盖。注意:激活环境后命令行提示符前会出现(qiime2-2020.6),没出现说明没激活成功,后面所有qiime命令都会报 command not found。
2.3 GreenGenes 数据库导入与全长/V 区分类器训练
分类器是物种注释的“字典”,训练一次可以反复用。资源里给了两条路:全长通用分类器和指定 V 区分类器。全长耗时约半小时,V 区(以 V5-V7 为例)约 9 分钟提取序列加 8 分钟训练。先导入参考序列和物种分类:
# 下载并解压 GreenGenes 13_8 wget -c ftp://greengenes.microbio.me/greengenes_release/gg_13_5/gg_13_8_otus.tar.gz tar -zxvf gg_13_8_otus.tar.gz # 导入 99% 聚类代表序列 qiime tools import \ --type 'FeatureData[Sequence]' \ --input-path gg_13_8_otus/rep_set/99_otus.fasta \ --output-path 99_otus.qza # 导入物种分类信息 qiime tools import \ --type 'FeatureData[Taxonomy]' \ --input-format HeaderlessTSVTaxonomyFormat \ --input-path gg_13_8_otus/taxonomy/99_otu_taxonomy.txt \ --output-path ref-taxonomy.qza--type指定数据类型,FeatureData[Sequence]是序列,FeatureData[Taxonomy]是分类表。--input-format HeaderlessTSVTaxonomyFormat是因为 GreenGenes 的分类文件没有表头,不写这个参数导入会报格式错。导入完成后训练全长分类器:
time qiime feature-classifier fit-classifier-naive-bayes \ --i-reference-reads 99_otus.qza \ --i-reference-taxonomy ref-taxonomy.qza \ --o-classifier classifier_gg_13_8_99.qzatime是看耗时的,不是必须。fit-classifier-naive-bayes用的是朴素贝叶斯分类器,这是 QIIME 2 默认也是 16S 最常用的。如果你的引物是特定 V 区,强烈建议训练特异分类器,精度会明显提升。以 V5-V7 为例:
# 按引物提取对应区段序列 time qiime feature-classifier extract-reads \ --i-sequences 99_otus.qza \ --p-f-primer AACMGGATTAGATACCCKG \ --p-r-primer ACGTCATCCCCACCTTCC \ --o-reads ref-seqs.qza # 基于提取序列训练特异分类器 time qiime feature-classifier fit-classifier-naive-bayes \ --i-reference-reads ref-seqs.qza \ --i-reference-taxonomy ref-taxonomy.qza \ --o-classifier classifier_gg_13_8_99_V5-V7.qza--p-f-primer和--p-r-primer必须和你实验用的引物完全一致,这里 V5-V7 用的是 799F/1193R。写错引物会导致提取不到序列或提取错区段,分类结果全乱。这一步的坑我后面单独讲。
3. 从原始 fastq 到特征表:数据导入与 DADA2 降噪
3.1 manifest 文件的生成与数据导入
QIIME 2 不直接吃一堆 fastq,它要一个 manifest 文件,里面三列:sample-id、forward-absolute-filepath、reverse-absolute-filepath。资源里用 awk 从 metadata 批量生成:
# 根据 metadata 生成 manifest,注意 $PWD 是当前绝对路径 awk 'NR==1{print "sample-id\tforward-absolute-filepath\treverse-absolute-filepath"} \ NR>1{print $1"\t$PWD/seq/"$1"_1.fq.gz\t$PWD/seq/"$1"_2.fq.gz"}' \ metadata.txt > manifestNR==1处理表头,NR>1处理数据行。$PWD必须用绝对路径,QIIME 2 对相对路径支持不好,容易报找不到文件。生成后导入:
qiime tools import \ --type 'SampleData[PairedEndSequencesWithQuality]' \ --input-path manifest \ --output-path demux.qza \ --input-format PairedEndFastqManifestPhred33V2--input-format选PairedEndFastqManifestPhred33V2,对应 Illumina 的 Phred33 质量值编码,这是目前最常见的。资源里提到 1G 的 fq 导入要 7 分钟,但 fq.gz 压缩格式只要 34 秒,所以原始数据别解压,直接导 gz。注意:如果你的数据是混池测序没拆样本,得先让测序公司拆分,或者用 QIIME 1 的脚本拆,QIIME 2 不负责拆分。
3.2 DADA2 降噪参数:trim 和 trunc 怎么定
DADA2 是 QIIME 2 里生成特征表(ASV 表)的核心,它不聚类,直接去噪。关键参数是--p-trim-left-f/r和--p-trunc-len-f/r。资源里给的示例是 trim-left-f 29、trim-left-r 18、trunc-len 都设 0:
time qiime dada2 denoise-paired \ --i-demultiplexed-seqs demux.qza \ --p-n-threads 8 \ --p-trim-left-f 29 --p-trim-left-r 18 \ --p-trunc-len-f 0 --p-trunc-len-r 0 \ --o-table dada2-table.qza \ --o-representative-sequences dada2-rep-seqs.qza \ --o-denoising-stats denoising-stats.qza--p-trim-left-f 29是切掉正向引物及前面碱基,--p-trim-left-r 18切反向。这两个值取决于你引物长度,不是固定值。--p-trunc-len设 0 表示不截断,但实际项目中我一般会看质量分布图,在质量掉到 Q20 以下的位置截断,否则末端错误碱基会进 ASV。--p-n-threads是线程数,资源里给了实测:96 线程 34 分钟,24 线程 44 分钟,8 线程 77 分钟,1 线程 462 分钟。线程不是越多越快,超过物理核数反而有调度开销,一般设物理核数的 80% 左右。
跑完把 dada2 结果复制成主流程用的名字:
cp dada2-table.qza table.qza cp dada2-rep-seqs.qza rep-seqs.qza3.3 特征表统计与抽平阈值的确定
feature-table summarize生成 table.qzv,用 view.qiime2.org 打开看每个样本的测序量分布:
qiime feature-table summarize \ --i-table table.qza \ --o-visualization table.qzv \ --m-sample-metadata-file metadata.txt资源里示例数据最小值 27060,第一分位数 28581,中位数 30867,分布很均匀,所以抽平阈值直接取最小值 27060。但如果最小值是个别样本的异常低值,和第一分位数差很多,就得在最小值和第一分位数之间选,尽量保留更多样本和更多数据。注意:低于阈值的样本会被丢弃,不参与多样性分析,所以阈值定太高会丢样本,定太低会浪费数据。资源里特别提醒,抽平最小值 1000 是 454 时代的标准,现在 Illumina 通量高,最小值一般不低于 5000,推荐 1 万起。
4. 多样性与物种组成分析:Alpha、Beta、注释与差异
4.1 进化树构建与 core-metrics 多样性计算
Alpha 和 Beta 多样性里,Faith's PD 需要进化树,所以先建树:
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.qzaalign-to-tree-mafft-fasttree一步完成比对、屏蔽高变区、建树、生根。输出里rooted-tree.qza后面要用。然后跑核心多样性:
qiime diversity core-metrics-phylogenetic \ --i-phylogeny rooted-tree.qza \ --i-table table.qza \ --p-sampling-depth 27060 \ --m-metadata-file metadata.txt \ --output-dir core-metrics-results--p-sampling-depth就是抽平阈值,这里用 27060。这一步会生成 4 种 Alpha 指数(faith_pd、shannon、observed_features、evenness)和 4 种 Beta 距离矩阵(unweighted_unifrac、bray_curtis、weighted_unifrac、jaccard),还有对应的 PCoA 结果。抽平是随机重采样,所以每次跑结果会有微小差异,但样本量够大时不影响结论。
4.2 Alpha 多样性组间显著性检验
以 observed_features 为例:
index=observed_features qiime diversity alpha-group-significance \ --i-alpha-diversity core-metrics-results/${index}_vector.qza \ --m-metadata-file metadata.txt \ --o-visualization core-metrics-results/${index}-group-significance.qzv结果里有箱线图和 Kruskal-Wallis 两两比较的 p 值和 q 值。资源示例里 KO vs WT 的 p=0.010139,q=0.030417,显著;OE vs WT 的 p=0.054241,q=0.081362,不显著。这里要注意 q 值是 FDR 校正后的,比 p 值严格,报告时优先看 q 值。index变量可以换成 faith_pd、shannon、evenness,命令结构一样。
4.3 Beta 多样性 PCoA 与 PERMANOVA 检验
Beta 多样性先看 PCoA 图,再做成对 PERMANOVA:
distance=weighted_unifrac column=Group qiime diversity beta-group-significance \ --i-distance-matrix core-metrics-results/${distance}_distance_matrix.qza \ --m-metadata-file metadata.txt \ --m-metadata-column ${column} \ --o-visualization core-metrics-results/${distance}-${column}-significance.qzv \ --p-pairwise--p-pairwise开启两两比较,不开启只做整体检验。资源示例里三组两两比较 p 值都小于 0.05,q 值也小于 0.05,说明组间群落结构差异显著。PCoA 图在weighted_unifrac_emperor.qzv里,可以调颜色、形状、透明度,导出 SVG 矢量图。注意:PERMANOVA 的置换检验很耗时,指定--m-metadata-column只比较关心的分组能省不少时间。
4.4 物种注释、堆叠柱状图与 ANCOM 差异分析
物种注释用之前训练的分类器:
qiime feature-classifier classify-sklearn \ --i-classifier classifier_gg_13_8_99_V5-V7.qza \ --i-reads rep-seqs.qza \ --o-classification taxonomy.qza qiime metadata tabulate \ --m-input-file taxonomy.qza \ --o-visualization taxonomy.qzvclassify-sklearn对每个代表序列做分类,输出特征 ID、分类结果和置信度。堆叠柱状图:
qiime taxa barplot \ --i-table table.qza \ --i-taxonomy taxonomy.qza \ --m-metadata-file metadata.txt \ --o-visualization taxa-bar-plots.qzv在 qzv 里可以切分类级别、改配色、按分组和丰度排序,导出 SVG 和 CSV。差异分析用 ANCOM:
# 添加伪计数,ANCOM 要求无零值 qiime composition add-pseudocount \ --i-table table.qza \ --o-composition-table comp-table.qza # 在属水平合并后再做 ANCOM qiime taxa collapse \ --i-table table.qza \ --i-taxonomy taxonomy.qza \ --p-level 6 \ --o-collapsed-table table-l6.qza qiime composition add-pseudocount \ --i-table table-l6.qza \ --o-composition-table comp-table-l6.qza time qiime composition ancom \ --i-table comp-table-l6.qza \ --m-metadata-file metadata.txt \ --m-metadata-column Group \ --o-visualization ancom-Group-l6.qzv--p-level 6是属水平(界门纲目科属,第 6 级)。ANCOM 输出火山图,显著 ASV 或属可以在 taxonomy.qzv 里查分类。资源示例里组间差异小,只有 1 个显著 ASV,属水平结果更适合结合生物学讨论。
5. 避坑与常见问题排查:从安装到分析的 5 个血泪教训
5.1 conda 环境创建卡在 solving environment
现象:conda env create跑很久不动,或者报Solving environment: failed。原因:conda 默认源在国外,网络不稳,或者 yml 里某个包版本冲突。解决:换国内镜像源,或者用mamba替代 conda 解依赖,mamba 快很多。实在不行,下载 yml 后手动删掉版本号太死的包,让 conda 自己解。
5.2 分类器训练报内存不足
现象:fit-classifier-naive-bayes跑到一半被 kill,日志显示 OOM。原因:全长 GreenGenes 99% 序列约 100 万条,朴素贝叶斯训练吃内存,16G 机器跑全长容易爆。解决:优先训练 V 区特异分类器,序列数少很多;或者加内存到 32G;或者用 97% 聚类而非 99%,序列数少一个量级,但分辨率会降。
5.3 DADA2 输出特征数异常少或异常多
现象:denoising-stats 里大部分 reads 没进 ASV,或者 ASV 数量几千上万。原因:trim/trunc 参数不对。trim-left 切多了切到保守区,切少了引物没去干净;trunc-len 设 0 不截断,末端错误碱基被当成真实变异,ASV 虚高。解决:先看 demux.qzv 里的质量分布图,正向在质量掉到 Q20 的位置截断,反向同理;trim-left 按引物长度加 1-2 个碱基设。资源里示例 trim-left-f 29、r 18 是匹配它引物的,别照抄。
5.4 抽平后样本丢失
现象:core-metrics 跑完发现样本数比原来少。原因:--p-sampling-depth设得比某些样本的测序量高,那些样本被丢弃。解决:在 table.qzv 的 Interactive Sample Detail 里看每个样本的测序量,阈值设在最小值和第一分位数之间,兼顾样本保留和数据利用。如果丢的样本是关键组,宁可降低阈值。
5.5 qzv 文件打不开或显示空白
现象:view.qiime2.org 上传 qzv 后一直转圈或空白。原因:qzv 本质是 zip,里面是网页和图表,浏览器兼容性或文件损坏。解决:先确认文件大小正常,没下完的重新生成;换 Chrome 或 Firefox;本地解压 qzv 看里面 index.html 能不能打开。注意:qzv 不要用文本编辑器改,会破坏结构。
6. 进阶技巧:用 V 区特异分类器把物种注释精度再提一档
如果你已经跑通全长分类器,下一步最值得投入的就是训练实验特异的 V 区分类器。原理不复杂:GreenGenes 全长序列里,不同 V 区的保守程度不一样,用全长训练时,分类器学到的特征有一部分来自你根本没扩增的区域,反而引入噪声。用extract-reads按你的引物把参考序列切成对应区段,再训练,分类器只学你测到的那段,精度通常能提升几个百分点,尤其是属水平。
具体操作上,引物序列必须和实验完全一致,正向反向都不能错。资源里 V5-V7 用的是 799F(AACMGGATTAGATACCCKG)和 1193R(ACGTCATCCCCACCTTCC)。提取时如果引物有简并碱基,QIIME 2 支持 IUPAC 简并符号,直接写就行。提取完先看ref-seqs.qza的序列长度分布,正常应该在目标区段长度附近,如果长度分布很散,说明引物匹配有问题,得检查引物方向或序列。
训练完的分类器,建议用一小批已知物种的序列做个 sanity check:拿几条代表序列跑classify-sklearn,看注释结果和预期是否一致。我一般会留一个全长分类器做对照,如果 V 区分类器结果反而更差,说明引物或提取参数有问题,别硬用。
还有一个容易被忽略的点:ANCOM 在属水平做差异分析时,taxa collapse的--p-level 6对应属,但 GreenGenes 的分类层级里界门纲目科属种是 7 级,第 6 级是属,第 7 级是种。如果你要种水平,设 7,但种水平注释置信度通常很低,不建议。ANCOM 的伪计数步骤不能省,表里有零值会直接报错。
最后说个习惯:每次跑完 DADA2,我都会把 denoising-stats.qzv 打开,看 input、filtered、denoised、merged、non-chimeric 五个数字的漏斗。如果 filtered 掉太多,说明 trim/trunc 太狠;如果 non-chimeric 掉太多,说明嵌合体比例高,可能是 PCR 循环数太多。这个漏斗比最终 ASV 数更能反映数据质量。从那以后我每次拿到新数据,都强制先跑一遍 denoising-stats 再决定后续参数,希望帮到你。
本文还有配套的精品资源,点击获取