ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

16S扩增子属水平分析完整流程:从数据质控到注释与可视化

16S扩增子属水平分析完整流程:从数据质控到注释与可视化 一测序数据拿到手报告里从门到属列了一大串名字真正想回答的问题——比如这个菌属到底在两组之间有没有差异哪种属撑起了样本之间的差异——却往往卡在注释这一步。做微生物组分析的人都会经历这个过程从原始下机数据一路跑到属水平结果中间任何一步不小心都会让前面所有工作白费。这篇文章就是把genus综合流程从质控、注释到下游可视化完整串一遍适合刚入门生信的研究生、检测机构里天天跑流程的实验员也适合那些自学了很久但总在某个环节踩坑的人。1. 为什么要卡在属这一级分类分辨率的现实选择1.1 从界门纲目科属种说起生物分类系统从界到种有七个层级16S扩增子测序在门、纲、目、科这几个层级上通常都能给出比较稳定的注释结果但到了属这个级别问题就开始有意思了。属是能够被现有数据库相对可靠地注释、又能够保留足够生物学差异信息的最小分类单元。换句话说属水平分析是分辨率和可靠性的一个平衡点。很多初学者上来就问能不能直接跑到种理论上可以但16S的保守区域比如V4区或者V3-V4区序列长度只有250~500bp信息量有限很多亲缘关系很近的种在16S序列上根本分不开。强行注释到种会得到大量未分类种或者不准确的结果。而如果真的需要种水平分辨率应该考虑全长度16S或宏基因组测序而不是指望扩增子数据分析去硬撑。在实际项目中属水平分析能直接回答三类问题群落中有哪些核心属、不同样本之间优势属和稀有属的结构差异、以及特定条件疾病、处理组下有哪些属发生了显著丰度变化。绝大多数已发表的微生物组研究核心结论也是落在属这一层。1.2 属水平分析能回答什么问题举个例子。做肠道菌群与2型糖尿病关联研究时你可能会发现厚壁菌门和拟杆菌门的丰度比例F/B ratio在两组之间有差异——但门的层级太粗了门水平的变化往往掩盖了门内不同属的此消彼长。可能厚壁菌门整体没有变化但里面的梭菌属Clostridium多了、乳杆菌属Lactobacillus少了。这种内部置换是微生物组的常见现象只有到属水平才能看出来。再做临床样本分析医生最关心的是哪个属和疾病最相关。如果只停在科甚至门的层级给出的结论会让临床合作者觉得太笼统。属水平可以落到具体的益生菌或致病菌候选属后续支持动物实验或者临床验证时才会有方向。另外像普雷沃氏菌属Prevotella和拟杆菌属Bacteroides的比值在很多营养学和代谢病研究中是直接拿来当作肠型判别的指标。这些指标从定义上就要求属水平分类注释。1.3 什么时候不要死磕属水平属水平分析也有它的局限。第一如果参考数据库里某些属的16S序列本身很少注释器给出的置信度很低这时候硬要属的结果就会引入噪声。第二在宏基因组数据里如果用了属水平的标记基因分析基因拷贝数差异会造成丰度的系统偏差直接比较属间丰度会失真。第三如果样本采集或DNA提取环节引入了污染属水平会把污染源比如水里的假单胞菌属也识别出来分析解读时要格外小心。所以我的习惯建议是正式分析以属水平为主但必须同时检查门、纲、科级别的结果是否与属水平一致。如果某个属的变化在更高分类层级中完全看不到——甚至与门级趋势相反——就要重新审视这个属的注释质量。2. 流程总览和软硬件准备2.1 一条主线从原始数据到属水平丰度表完整的genus综合流程可以概括为八个环节原始数据质检、引物切除与质控过滤、合并双端序列、去噪聚类生成特征表、代表性序列分类注释、生成属水平丰度表、下游差异分析与可视化、结果解读验证。每一环的输出都是下一环的输入。这个链条中我特别想强调一个容易被忽略的问题你选择的不同参数会沿着链条传导下去。比如质控阶段切掉太长或者太短的序列直接影响后续特征表里的真实成员参考数据库版本变了注释结果就可能在同一份数据上出现明显差异。对刚接触的朋友我建议不要在分析刚开始就把所有高级选项全部打开先拿默认参数跑通整个流程再用少量样本做参数敏感性测试。等流程稳定了再铺开全部样本。2.2 软件选型QIIME2、DADA2还是自写pipeline目前主流方案有三种。第一种是QIIME2完整流程把质控、去噪、注释、多样性分析全部集成在一个环境里对新手最友好操作也比较标准化。但它也有问题QIIME2的版本更新很快不同版本之间的数据格式尤其是FeatureTable和分类器并不完全兼容而且它的中间产物格式比较特殊不喜欢跟外部工具互通的人可能会觉得别扭。第二种是R语言跑DADA2全流程。DADA2的优势在于R生态特别丰富从DADA2到phyloseq再到ggplot2可视化一条链下来全在R里完成。而且DADA2去噪得到了ASVAmplicon Sequence Variant而不是传统的OTU从原理上说更能反映真实的生物学序列差异。缺点就是数据库格式需要自己准备训练分类器也是个额外步骤对不熟悉R的人有门槛。第三种是混合方案用fastp或cutadapt做质控、用usearch或vsearch做聚类、再用自己训练的分类器注释。这种方式灵活性最高能针对特殊引物或特殊样本类型做精细调整但所有环节都得自己组装出错概率也高。我的个人建议是如果你从零开始选QIIME2或DADA2二选一先跑通再考虑优化。如果你有大量样本而且需要完全可控的分析选混合方案。2.3 参考数据库怎么选Greengenes2、SILVA、RDP数据库是注释的词典没有匹配的序列就永远注释不出来。目前常用的三个是Greengenes经典版和2024年新版Greengenes2、SILVA132/138版本和RDP。三个数据库各有特点。Greengenes在16S分析里用得最久很多历史文献的OTU表格也是按Greengenes注释的如果你要对标旧文献结果用Greengenes比较方便。SILVA的覆盖率更高覆盖细菌、古菌和真核微生物而且它的分类体系相对稳定是目前扩增子分析的首选数据库之一。RDP提供的分类器训练接口比较友好但整体覆盖率不如前两者。需要特别提醒的是数据库的选择会直接影响属水平注释率。我做土壤样本时用过Greengenes和SILVA对比同样的数据SILVA 138版本注释到属的比例比Greengenes 13_8高大概5到8个百分点。所以在正式跑全量分析之前先拿一组代表性样本做注释率对比实验选注释率较高的那个数据库作为正式分析基础。下表是我在实践中总结的数据库选择参考数据库覆盖范围版本建议适合场景SILVA细菌、古菌、真核138.1通用推荐尤其适合环境样本Greengenes细菌、古菌13_8旧/ Greengenes2需对标旧文献或使用QIIME2经典流程RDP细菌11.5针对特定物种精细分类时补充参考3. 从下机数据到OTU/ASV表的关键步骤3.1 质量控制与引物切除拿到下机数据的第一步永远是看质量。用fastqc跑一批样本看每个位置的碱基质量得分Q score重点关注两条信息序列长度的分布和末端质量是否急剧下降。如果用的是双端250bp测序而你的插入片段长度在460bp左右拼接后刚好能覆盖V3-V4区域这个设计是最理想的如果插入片段太短两端的引物序列会占据很大比例直接导致有效序列变少。引物切除我习惯用cutadapt切完引物之后再用trimmomatic或fastp做质量修剪。这里有个细节容易被忽略切除引物必须在质控之前还是之后我的顺序是先切引物再做质量修剪。原因是如果不先把引物切掉质量修剪可能会把引物所在的位置当作低质量区域直接裁掉反而把下游有效序列切短。设计引物切分时要注意允许一定比例的错配。cutadapt示例参数如下cutadapt -g ^GTGYCAGCMGCCGCGGTAA -G ^GGACTACNVGGGTWTCTAAT \ --discard-untrimmed -e 0.2 -m 200 -M 480 \ -o R1_trimmed.fastq.gz -p R2_trimmed.fastq.gz \ raw_R1.fastq.gz raw_R2.fastq.gz这个命令的含义是正向引物和反向引物必须在序列开头^表示锚定在5端允许20%的碱基错配率丢弃没能匹配引物的序列--discard-untrimmed且保留的序列长度范围在200~480bp。这些参数在正式上生产流程之前应该拿少量样本试跑并检查结果。3.2 去噪与聚类ASV和OTU怎么选QC完成后下一步就是把质量合格的序列聚成特征单元。传统方法是按97%相似度聚成OTU现在的DADA2方法是经过去噪denoising后直接得到ASVASV并不依赖于任意设定的相似度阈值理论上每个ASV只代表一个真实的生物学序列变体。在实际操作上DADA2去噪有两个关键参数maxEE期望错误数和truncLen截断长度。maxEE2是常用的默认值对于双端250bp的数据V4区域的truncLen我一般设置成240和200也就是每个读段在末端低质量区域被截掉10~50bp。这两个参数的组合需要根据你的数据质量去调没有万能答案。一个简单原则如果末尾20bp的质量图掉到了Q20以下就应该适当增大截断长度。library(dada2) fnFs - snakemakeinput$fq1 # 示例占位实际用你的文件路径 fnRs - snakemakeinput$fq2 filtFs - file.path(filtered, paste0(sample_names, _F_filt.fastq.gz)) filtRs - file.path(filtered, paste0(sample_names, _R_filt.fastq.gz)) out - filterAndTrim(fnFs, filtFs, fnRs, filtRs, truncLenc(240,200), maxN0, maxEEc(2,2), truncQ2, rm.phixTRUE, compressTRUE, multithreadTRUE) errF - learnErrors(filtFs, multithreadTRUE) errR - learnErrors(filtRs, multithreadTRUE) dadaFs - dada(filtFs, errerrF, poolpseudo, multithreadTRUE) dadaRs - dada(filtRs, errerrR, poolpseudo, multithreadTRUE)poolpseudo这个参数在多批次数据合并分析时特别有用它能在不显著增加计算量记忆量的前提下让来自不同样本的低丰度序列仍有被识别为同一变体的机会。ASV的优势是分辨率高、可重复性好不同研究之间的ASV可以直接比。但它也有代价ASV数量通常比97% OTU多很多在属水平注释时会产生大量低频ASV这些低频ASV往往连属都注释不上就变成了数据里的黑洞。实践上我的处理策略是正式分析以ASV为主但在做属水平差异分析前先按属水平合并并过滤掉那些总丰度非常低比如在全部样本中相对丰度总和低于0.01%的ASV。3.3 生成特征表和代表序列无论走DADA2还是vsearch聚类路线最后都会生成一张特征表Feature TableOTU/ASV × 样本的计数矩阵和代表序列每个OTU/ASV的一条代表性序列。这张特征表就是后续所有分析的输入基础。生成特征表时要记录清楚每个步骤过滤了多少条序列。我见过不少人最后只汇报最终得到N条有效序列但是如果中间QC步骤把80%的数据都扔掉了却没有记录下来等于把质量问题藏住了。建议每个环节都保留日志从原始序列开始每一步记录序列数变化形成一个清晰的数据漏斗。这不仅是为了自己检查投稿时审稿人问起数据质量时这个日志就是最有说服力的材料。4. 属水平注释的实现与坑4.1 训练朴素贝叶斯分类器注释这一步是整个流程中最影响最终结果质量的地方。QIIME2内置了对Greengenes和SILVA的预训练分类器可以直接下载使用但如果你用的是自己设计的目标区域引物比如只扩增ITS2或者特定的功能基因就必须自己训练分类器。训练分类器的原理是用参考数据库里的序列和对应的分类学信息训练一个朴素贝叶斯分类器然后对每个ASV/OTU的代表序列做分类。QIIME2的q2-feature-classifier模块是主流选择。训练分类器时有一个细节参考序列应该按你的目标区域来截取而不是直接用全长16S序列。原因是分类器学习的是目标区域内的序列特征如果你用全长序列训练而待分类的序列只是V3-V4区域两者特征分布不匹配分类准确率会下降。用SILVA 138.1训练V3-V4区域分类器的示例qiime feature-classifier extract-reads \ --i-sequences silva-138.1-ssu-nr99-seqs.qza \ --p-f-primer ACTCCTACGGGAGGCAGCA \ --p-r-primer GGACTACHVGGGTWTCTAAT \ --p-trunc-len 469 \ --o-reads ref_seqs_v34.qza qiime feature-classifier fit-classifier-naive-bayes \ --i-reference-reads ref_seqs_v34.qza \ --i-reference-taxonomy silva-138.1-ssu-nr99-tax.qza \ --o-classifier silva_v138_v34_classifier.qza这个过程在全长序列上可能要跑一两个小时但在目标区域截取之后的数据集上通常很快。如果样本是特殊环境如高盐、热泉建议在训练集中额外加入环境中新测序获得的序列能明显提升这些陌生序列的注释率。4.2 注释置信度阈值怎么定分类器输出每个分类层级时都会附带一个置信度confidence典型范围是0到1。默认的置信度阈值是0.7意味着当分类器判定这个序列属于某个属的置信度低于0.7时结果会被标为未分类。我实测过不同阈值的效果阈值设到0.8以上注释到属的序列比例下降10%左右但留下来的都是高置信度结果阈值降到0.5注释率上去了很多但明显会出现错分——比如把埃希菌属Escherichia跟志贺菌属Shigella相互掺混这种错误在16S短片段上本来就难以避免降低阈值等于给这类错误开了后门。我的经验是环境样本土壤、水体里有很多参考数据库里没有的序列阈值保持0.7合适临床肠道样本中已知菌属较多可以适当提高到0.8。所谓提高阈值提高准确性并不是绝对的因为阈值越高留给你做差异分析的有效属就越少统计功效会受影响。4.3 一个经常被忽略的问题多属注释当我们说这个ASV注释到属X默认是说它的最佳匹配是属X。但现实中经常出现一个ASV的序列既与属X匹配、又与属Y匹配得分相同或相近尤其当两个属在16S目标区域完全相似时。这种情况下分类器给出的单一最佳匹配就变得不可靠。我在分析时习惯统计注释结果中那些ambiguous模棱两可的条目。如果这一类条目占比超过5%就说明当前的目标区域或数据库确实无法支撑属水平的判断需要重新考虑是否把分析层级降低到科或者在该区域引入更加特异的参考序列。处理多属注释的常见做法是设置confidences-based filtering在给属水平丰度表算占比时把所有质量不够高的ASV归入未注释属这一类而不是强行分配。这样虽然会丢掉部分信息量至少在结论层面是诚实的。5. 下游分析属水平有哪些能做的5.1 从特征表到属水平丰度表拿到ASV/OTU特征表之后第一个动作就是把每个特征映射到属并按属水平合并。这一步在QIIME2里叫taxonomic collapse在R里用phyloseq的tax_glom函数就能完成。library(phyloseq) ps - readRDS(ps_ASV.rds) # 你的phyloseq对象 ps_genus - tax_glom(ps, taxrankGenus, NArmFALSE)注意这个NArm参数。默认是TRUE会把那些注释不到属的ASV直接丢弃但如果你关心的是注释率到底有多高建议先设成FALSE看看未注释的部分占了多少比例再决定要不要过滤。合并之后还有一个关键步骤是归一化。最常用的是总丰度归一化Total Sum ScalingTSS也就是把每个样本里的所有属的计数转换为相对丰度百分比。但要注意如果样本测序深度差异很大TSS归一化后低深度样本的相对丰度会不稳定——就像抽样件数太少时比例估算的波动会很大。更稳健的做法是使用CSSCumulative Sum Scaling或rarefaction抽平omegaQA。于比较简单和主流的表达习惯我一般先给出TSS归一化结果再针对关键属做均值-方差检查如果方差随均值变化明显就用DESeq2或ANCOM-BC的模型内置归一化方式重新算。5.2 堆叠柱状图与热图属水平可视化的两种常见形式属水平结果最经典的呈现是堆叠柱状图每个样本一根柱子不同颜色代表不同属柱子的高度表示相对丰度。制作时有一个容易踩的坑当属的数量超过20个时图右的图例就会变成一堆密密麻麻的小色块根本读不了。实际建议是把丰度低于某个阈值的所有属合并成Others其余通常以5%或2%为界。另一个更好用的图是分组堆叠柱状图每个处理组用多根柱子展示相当于把每个组的属水平组成并列对比。用ggplot2画这种图时排序很重要——如果按属名首字母排序图会非常杂乱建议先对属按照整体平均丰度排序或者按照主成分分析排序让视觉上最明显的变化方向如对照组到处理组自然凸显出来。热图适合展示样本和属的关系。行是属列是样本颜色代表相对丰度。用pheatmap画热图时我建议将丰度数据做log10(x1)转换否则丰度差异大的少数属会压掉所有其他属的颜色梯度极差大看得很累。在热图旁边一定要标注聚类树并且标注属的分类学信息——至少标注门或纲这样读者才能快速理解哪些门内部的属聚类在一起。5.3 差异分析LEfSe与ANCOM-BC找到哪些属在组间显著变化是属水平分析的核心输出。最常用的工具有LEfSe、DESeq2、edgeR、ANCOM-BC。LEfSe是经典的LDA Effect Size方法它在微生物组文献里用得非常多适合两组或多组比较。它的漂亮之处是先做非参数Kruskal-Wallis检验再做LDA评分把有显著差异和效应大小两个维度一起呈现出来。实际运行时的阈值通常是LDA score 2.0且p 0.05。LEfSe的输出图条形图加 cladogram很直观投稿时很多期刊都喜欢。DESeq2和edgeR本来是从转录组学引入的方法它们在处理高维稀疏数据时有统计模型支撑性能比简单的非参数检验更能处理小样本。但它们在微生物组数据上有过拟合风险尤其当样本量很少每组少于5个时容易把不太稳的差异也筛出来。ANCOM-BC是最近几年比较被看好的方法它显式地考虑了微生物组数据的组成性质并通过偏置校正来部分缓解相对丰度分析中此消彼长带来的伪差异。如果你的样本量足够每组10个以上我建议直接上ANCOM-BC结果的可信度会更高。实际操作中我建议至少跑两种方法比如ANCOM-BC LEfSe取交集只被一种方法检出的属在结论里标注某一种方法支持即可不要当作确凿结论。5.4 多样性分析注意分辨率问题属水平分析同样可以算alpha多样性如Shannon指数、Chao1指数和beta多样性如Bray-Curtis距离、UniFrac距离。alpha多样性方面属水平会损失一部分信息量因为很多稀有ASV在属水平合并后看不出多样性贡献。一般做法是在ASV水平算alpha多样性再考虑属水平单独展示。beta多样性方面属水平矩阵的PCoA图也常见发表但要注意如果属数量太少比如某些极端的单菌属样本PCoA结果的解释力会明显下降。一个实用建议在做PCoA时同时算weighted UniFrac和unweighted UniFrac两者结果可能相差很大——这本身就是一个重要信息说明样本间的差异到底是来自优势属的丰度变化还是来自稀有属的有无变化。这两种生物学解读在结论上可能完全不同。6. 常见问题与排查6.1 属水平注释率很低怎么办注释率低有几个常见原因。一是参考数据库覆盖不足尤其在土壤、深海或特殊宿主样本中二是目标区域本身保守不同属之间差异太小三是质控时过滤太严格剩下有效序列长度不足分类信息被切掉了。遇到注释率低第一步检查数据漏斗看看是不是在质控阶段把大量序引物序列被误认为接头序列处理掉了。第二步换个数据库试试Greengenes2有时能力挽狂澜。第三步如果还是不行考虑降低分类层级到科或者去更针对性的数据库做BLAST验证而不是强行用低置信度的属注释结果。6.2 样本量小但属数量太多这是高频问题样本每组只有3~5个但属水平特征有100多个直接做差异分析会产生多重检验问题假阳性率很高。解决方案有两条路。一条是预先过滤掉丰度过低、出现频率过低的属。比如设定在超过20%的样本中相对丰度都低于0.1%的属直接过滤。另一条是采用多重检验校正比如BH-FDR校正并把显著性阈值适当放宽。两者要结合使用单纯靠p.adjust在样本量很小时效果有限。6.3 同一属内不同的种差异很大有时候属水平分析会掩盖真实信号。比如拟杆菌属Bacteroides里脆弱拟杆菌B. fragilis和多形拟杆菌B. thetaiotaomicron的功能完全不同。如果你只在属水平观察到拟杆菌属无差异但临床特征有明显表现要怀疑是不是种水平发生了置换。此时有两个选择一是把关注的属单独提取出来调出该属内所有ASV的注释结果做种水平的展示和检验二是重新用更高的分辨率工具分析原始数据。很多研究中属水平无差异但种水平有差异就是这样被发现的。6.4 参考数据库版本不同导致结果对不上同一个样本用Greengenes 13_8和SILVA 138注释结果对不上的概率极大。不是因为你分析错了而是因为数据库的分类学修订本身在变。如果你的研究需要与历史文献对比建议用相同的数据库版本和相同分类器才能做真正的比较。如果已经用不同数据库跑了要对比结果最好的办法是只对比有同义名关系的属比如查一下SILVA里的Clostridium sensu stricto 1在旧Greengenes里是否标注为Clostridium。这些命名差异很容易让人误以为结果不一致但其实只是数据库重命名的问题。6.5 一个容易被忽略的额外问题基因拷贝数16S rRNA基因在细菌基因组中不总是一个拷贝有些菌属比如芽孢杆菌属可以有10个以上拷贝这会让基于16S的相对丰度在属之间产生偏差。对于肠道菌群领域通常不太做拷贝数校正因为校正需要种水平的拷贝数信息而这些信息在扩增子数据里本来就难以获得。但如果你做的样本以芽孢杆菌属等高频多拷贝菌为主建议到rrnDB数据库查一下相关属的拷贝数中位数在结果解读时说明潜在偏差方向。我在实际项目中遇到过这类情况先前某环境样本中芽孢杆菌属的相对丰度是30%拷贝数校正后可能只有8%这直接影响到了优势属的判定。如果读者对这类偏差敏感建议方法学部分明确写明未进行16S拷贝数校正结果以相对丰度呈现。7. 实操经验与内容扩展方向先分享几个我踩过不止一次坑的小技巧。第一流程跑完后一定要回到原始数据抽样检查几样本。我当时遇到过某个样本因为PCR扩增效率低短片段占比较高与正常样本明显不同但流程本身并不会报错。这种数据混在分析里属水平结果就是解读不出规律。手动抽看原始测序质量能救回一批伪坏样本。第二别把样本全放到一个筐里。同一研究里如果包含不同批次、不同提取方法、不同建库方式的样本这些技术差异会在属水平形成很强的批次效应。如果条件允许把样本按照实验批次单独跑一遍流程比较各批次中稳定属与差异属再决定是否合并分析。第三属水平不是终点可能是起跳板。在很多情况下属水平分析发现的关键菌属后续可以用实时荧光定量PCR或宏基因组测序做靶向验证。这是我目前项目里常用的做法先用扩增子测序找到候选属再用qPCR对特定属进行绝对定量验证投稿时审稿人对这套相对丰度绝对定量组合的认可度远高于单独一个相对丰度结果。最后再分享一个小技巧即便是属水平的结果一定不要忘记保存每个ASV的代表序列和注释信息。很多人在完成分析后只保留一个属×样本的矩阵后续如果想补充种水平分析、做进化树或者提交序列到公共数据库才发现原始的代表序列文件早就丢了。保存好这些中间产物对复现和深入分析都是最简单的保障。
返回列表