尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

NGS下游分析实战:从原始数据到变异检测全流程详解

NGS下游分析实战:从原始数据到变异检测全流程详解 1. 从原始数据到可靠变异一个完整的NGS下游分析实战如果你刚拿到一批高通量测序NGS的原始数据面对动辄几十甚至上百G的fastq文件是不是有点无从下手从一堆看似杂乱的序列中最终得到可信的基因变异位点SNV这中间的路该怎么走今天我就以一个实战项目为例带你完整走一遍从原始测序数据拆分、合并、质控到最终进行变异检测call SNV的全流程。这个过程是几乎所有NGS下游分析无论是肿瘤外显子、全基因组还是单细胞转录组虽然单细胞分析流程如Scanpy有其特殊性但底层数据处理的逻辑是相通的都必须经历的“标准动作”。很多人觉得生物信息分析门槛高其实拆解开来每一步都有成熟的工具和明确的逻辑。关键在于你是否理解每个步骤在做什么以及为什么要这么做。这篇文章我会把我在实际项目中反复验证过的流程、踩过的坑以及一些关键参数的设置逻辑毫无保留地分享给你。整个流程可以概括为四个核心阶段数据拆分与合并、数据质量评估与控制、序列比对与处理、变异检测与过滤。听起来简单但每个阶段都藏着不少细节。比如数据拆分时遇到barcode不匹配怎么办质控报告里每个指标到底说明了什么比对后为什么要进行标记重复序列最后call出来的SNV怎么判断哪些是真正的生物学变异哪些是测序或比对引入的噪音别急我们一步一步来。我会尽量用“说人话”的方式解释原理并提供可以直接“抄作业”的命令行代码。无论你是刚开始接触生信分析的湿实验人员还是想巩固流程的初级分析师相信都能从中获得可以直接上手的干货。2. 数据拆分与合并理清数据的“身份”拿到测序公司返回的数据最常见的是压缩的fastq文件.fastq.gz。但很多时候一次测序运行一个Lane会同时测多个样本为了区分它们会在建库时给每个样本的序列加上独特的标签这就是Barcode或Index。所以第一步就是根据这些标签把混合在一个文件里的数据按照样本“拆分”开来。相反有时同一个样本可能因为上机量不足分在了多个Lane中测序为了提高数据量和分析的稳健性我们又需要将这些来自同一样本的数据“合并”起来。这个“分分合合”的过程是保证后续分析样本独立性的基础。2.1 理解数据拆分从混池到独立样本测序中心提供的原始数据往往是一个包含所有样本序列的庞大fastq文件对于双端测序则是两个文件R1和R2。拆分的本质就是根据每条读段Read的Barcode序列将其归类到对应的样本名下。这里常用的工具是bcl2fastq适用于Illumina官方BaseCalling后的数据或bcl-convert更新版的工具。但很多时候测序中心已经帮我们做完了这一步直接给出了每个样本独立的fastq文件。如果没做你就需要自己来。自己动手拆分需要注意什么首先你必须有一份准确的“样本索引对应表”也就是Sample Sheet。这是一个CSV文件严格定义了每个样本的名称、所在的Lane、以及其对应的Index序列。格式错误或序列拼写错误都会导致拆分失败或样本错位。其次要关注拆分后的数据量平衡性。用bcl2fastq拆分后一定要检查每个样本产出数据量通常以reads数或数据量G为单位是否与预期相符。如果某个样本数据量异常低可能是1Index跳读Index Hopping即一个样本的读段被错误地分配给了另一个样本2样本本身浓度低3Index序列设计有交叉误配。对于Index Hopping在双Index设计中更为常见可以通过在比对后使用Picard Tools的MarkIlluminaAdapters等工具进行一定程度的识别和标记。注意Sample Sheet的编辑务必谨慎。我曾遇到过因为Sample Sheet中Index序列的字母大小写不一致如“ATCG”写成了“atcg”导致bcl2fastq无法识别最终拆分出大量“未识别”读段的情况。建议直接从建库记录表中复制粘贴Index序列。2.2 数据合并化零为整的策略对于同一个样本在不同Lane或不同批次测序的数据合并是常规操作。合并的目的有两个一是增加该样本的总数据量提高测序深度这对于低频变异的检测至关重要二是合并后作为一个整体进行分析比分开分析后再整合结果更简单、更一致。合并操作非常简单在Linux命令行下使用cat命令即可# 合并同一样本的多个R1文件 cat sample_A_L001_R1.fastq.gz sample_A_L002_R1.fastq.gz sample_A_R1.fastq.gz # 合并同一样本的多个R2文件 cat sample_A_L001_R2.fastq.gz sample_A_L002_R2.fastq.gz sample_A_R2.fastq.gz是的就这么简单直接。但这里有一个关键细节直接cat合并的前提是这些文件来自相同的测序文库并且测序条件如读长、Index类型完全一致。如果是不间批次、建库方法略有差异的数据盲目合并可能会在后续分析中引入批次效应Batch Effect。例如不同批次的测序在碱基质量值Phred Score的系统偏向上可能有细微差别。因此更严谨的做法是先不合并分别进行到比对甚至初步变异检测的步骤观察关键指标如比对率、插入片段长度分布、变异位点在各批次间的重叠率是否一致。如果一致性很高再合并原始数据进行最终分析如果发现明显批次效应则可能需要使用生物信息学方法如在使用GATK进行变异检测时加入批次作为协变量进行校正或者避免合并分开分析后再谨慎地整合结果。这就像处理Excel表格时你不会把两个结构完全不同、表头含义模糊的表格直接用“填充数据合并单元格”的方式硬拼在一起而是先检查每个表格的列名、数据类型是否一致。3. 质控给你的数据做一次全面“体检”数据合并好后千万别急着进行比对。质控Quality Control, QC是保证分析结果可靠性的生命线。它的目的是系统评估原始测序数据的质量发现潜在问题并决定是否需要以及如何进行数据过滤修剪。很多人把质控报告当成一个“过关文件”只看一眼总reads数就跳过了这其实浪费了其中蕴含的大量信息。3.1 读懂FastQC报告每个图背后的故事FastQC是目前最流行的质控工具它会生成一个包含十多个模块的HTML报告。我们挑几个最关键的说Per base sequence quality各位置碱基质量这是最重要的图之一。它展示了测序读段上每一个位置碱基的平均质量分数。理想情况是一条所有位置都在高质量区域绿色通常Q30的平稳直线或缓慢下降的曲线。如果开头几个位置质量很低常见于早期Illumina平台可能需要截掉trim开头几bp。如果中间或末尾质量断崖式下跌可能表明测序反应进行到后期试剂消耗或信号衰减需要根据下跌位置决定截断长度。Per sequence quality scores每条序列的质量分布展示所有读段平均质量的分布。理想情况是一个尖锐的单峰且峰值在高质量区如Q30以上。如果出现双峰或拖尾到低质量区说明有一部分读段整体质量很差需要考虑是否在后续步骤中整体剔除这些低质量读段。Per base sequence content各位置碱基组成显示每个位置A/T/C/G四种碱基的百分比。在测序起始的几个位置由于非随机性例如随机引物或转座酶序列碱基比例可能不平衡这是正常的。但如果整个读段上碱基比例严重偏离比如A远多于T或者出现交叉的“彩虹”图案则可能提示有测序或文库制备的污染如残留的接头或引物二聚体。Adapter Content接头含量直接告诉你测序读段中检测到的已知接头序列的比例。如果比例过高比如超过5%说明文库片段过短测序读长超过了插入片段长度读到了另一端的接头。这部分含有接头的序列必须被修剪掉否则会严重影响比对。Overrepresented sequences过表达序列列出在数据集中出现频率异常高的序列。这通常是污染的标志可能是测序引物、接头、或某种高丰度的污染物如核糖体RNA污染。需要根据序列内容判断来源并在后续去污染或分析中予以考虑。3.2 质控后处理用Trimmomatic进行修剪与过滤看完FastQC报告我们知道了数据有哪些“毛病”下一步就是用工具来“治病”。Trimmomatic是一个功能强大且灵活的质量修剪工具。它的核心逻辑是滑动窗口扫描读段当窗口内的平均质量低于设定阈值时将窗口之后的部分切除同时去除头尾的低质量碱基并裁剪掉检测到的接头序列。一个典型的双端数据修剪命令如下java -jar trimmomatic-0.39.jar PE \ -threads 8 \ -phred33 \ sample_R1.fastq.gz sample_R2.fastq.gz \ sample_R1_paired.fq.gz sample_R1_unpaired.fq.gz \ sample_R2_paired.fq.gz sample_R2_unpaired.fq.gz \ ILLUMINACLIP:TruSeq3-PE-2.fa:2:30:10:2:keepBothReads \ LEADING:3 \ TRAILING:3 \ SLIDINGWINDOW:4:15 \ MINLEN:36我们来拆解一下关键参数ILLUMINACLIP:指定接头序列文件并设置参数。2:30:10的含义是允许接头序列有2个碱基的错配当比对得分一个内部计算的指标达到30时认为检测到了接头当接头与读段序列有至少10个碱基的重叠时执行裁剪。keepBothReads表示即使一条读段被完全裁剪掉也保留其配对读段放入unpaired文件供某些支持单端比对的流程使用。LEADING:3/TRAILING:3从读段的开头/末尾开始切除质量值低于3的碱基。SLIDINGWINDOW:4:15这是核心的滑动窗口修剪。窗口大小为4个碱基滑动这个窗口如果窗口内4个碱基的平均质量值低于15则从此窗口起始位置切断该读段保留前面部分。MINLEN:36修剪后如果读段长度小于36bp则丢弃该读段。因为过短的读段比对特异性差容易造成误判。实操心得参数不是一成不变的。对于高质量的数据SLIDINGWINDOW的阈值可以设高些如20对于数据质量一般或项目对精度要求极高的情况可以设得更严格。修剪后务必再次运行FastQC与修剪前的报告对比确认问题如低质量碱基、接头污染是否已被有效解决。同时关注Trimmomatic输出的日志查看有多少比例的读段被保留Both Surviving通常85%以上是可以接受的如果过低则需要回溯检查建库或测序环节。4. 序列比对与预处理将读段“锚定”到参考基因组质控后的干净读段只是一段段短的DNA序列。我们需要知道它们来自基因组的哪个位置这个过程就是比对Alignment。比对是整个分析中计算最密集、也是最关键的步骤之一比对的质量直接决定了后续变异检测的准确性。4.1 比对工具选择与BWA-MEM实战目前最主流的比对工具是BWA-MEM它特别适用于70bp到1Mbp长度的读段且在处理结构变异信号方面也有不错的表现。它的基本命令很简单但隐藏了许多影响结果的参数。# 首先需要为参考基因组建立索引只需做一次 bwa index reference_genome.fa # 进行比对生成SAM格式的中间文件 bwa mem -t 8 -R RG\tID:sample1\tLB:lib1\tPL:ILLUMINA\tSM:sample1 \ reference_genome.fa \ sample_R1_paired.fq.gz sample_R2_paired.fq.gz \ sample_aligned.sam-t 8使用8个CPU线程加快速度。-R这个参数极其重要它添加了读组Read Group信息。RG是固定开头ID是读组唯一标识LB是文库名PL是测序平台SM是样本名。后续几乎所有工具如GATK都依赖SM字段来区分样本。如果这里写错或遗漏会导致后续分析无法进行或结果混乱。ID通常可以设为与SM相同但如果同一样本有多个不同文库如不同插入片段长度则需要用LB和ID来区分。输出是SAM格式一种文本格式的比对结果可读但体积庞大。为什么是BWA-MEM相比于老版本的BWA-ALN和BWA-SWMEM算法在速度和精度上取得了更好的平衡。它使用种子延伸Seed-and-Extend策略能高效地处理较长的读段并且能识别出更长的缺失/插入Indel这对于后续的变异检测至关重要。对于单细胞测序数据如10x Genomics虽然其分析流程如Cell Ranger内置了经过优化的比对器但底层原理也是将测序读段比对到参考基因组只是额外考虑了细胞Barcode和UMI信息。4.2 SAM到BAM排序、去重与索引生成的SAM文件需要经过一系列处理才能用于变异检测。1. 格式转换与排序使用samtools将文本格式的SAM转换为二进制压缩的BAM格式以节省空间并按照基因组坐标排序。坐标排序是后续所有分析如下游工具访问特定区域、标记重复的基础要求。# 转换SAM为BAM并按坐标排序 samtools view - 8 -bS sample_aligned.sam | samtools sort - 8 -o sample_sorted.bam # 建立索引生成 .bai 文件便于快速随机访问 samtools index sample_sorted.bam2. 标记重复序列Mark DuplicatesPCR扩增是建库的必要步骤但会导致完全相同的DNA片段被多次测序产生重复的读段。这些PCR重复不是独立的生物学证据如果不处理会在变异检测时错误地提高某些位点的测序深度导致假阳性或频率估算偏差。Picard或GATK的MarkDuplicates工具可以识别这些重复。java -jar picard.jar MarkDuplicates \ Isample_sorted.bam \ Osample_marked_duplicates.bam \ Mmarked_dup_metrics.txt \ CREATE_INDEXtrue这个过程并不会删除读段而是在BAM文件的FLAG字段中做标记后续工具如GATK在计算覆盖度时会忽略这些被标记的读段。查看输出的marked_dup_metrics.txt文件可以了解重复率。外显子测序的重复率通常在5%-20%之间如果过高如30%可能提示起始DNA量不足或PCR循环数过多。3. 碱基质量重校正Base Quality Score Recalibration, BQSR这是GATK最佳实践流程中的一步。测序仪给出的原始碱基质量值存在系统误差例如某些特定上下文如前一个碱基是A下的碱基其错误率可能被系统性低估或高估。BQSR利用已知的变异位点集如dbSNP作为“真相”通过机器学习模型对每个碱基的质量值进行重新校准使其更接近真实的错误概率。这能显著提高后续变异检测的准确性。# 第一步根据已知位点集建立重校正模型 gatk BaseRecalibrator \ -R reference_genome.fa \ -I sample_marked_duplicates.bam \ --known-sites dbsnp.vcf.gz \ -O recal_data.table # 第二步应用模型生成最终处理好的BAM文件 gatk ApplyBQSR \ -R reference_genome.fa \ -I sample_marked_duplicates.bam \ -bqsr recal_data.table \ -O sample_final.bam至此我们得到了一个高质量的、经过完整预处理的BAM文件sample_final.bam它是我们进行变异检测的“原料”。5. 变异检测从比对结果中寻找“不同”变异检测Variant Calling是终极目标其任务是在处理好的BAM文件中找出样本基因组与参考基因组不同的位置主要包括单核苷酸变异SNV和小片段的插入缺失Indel。5.1 变异检测的核心原理与工具选择主流工具是GATKGenome Analysis Toolkit的HaplotypeCaller。它的工作原理不是简单地统计每个位置的碱基而是采用了更先进的局部重新组装Local De-novo Assembly策略活性区域检测扫描基因组找出可能存在变异的区域活性区域这些区域通常表现为比对质量下降、覆盖度异常或存在多个错配。局部重新组装在这些活性区域HaplotypeCaller会忽略原有的线性比对而是将覆盖该区域的所有读段重新进行组装构建出可能的单倍型Haplotype。配对重新比对将读段与重新组装出的单倍型进行比对这比直接与线性参考基因组比对能更准确地识别Indel。统计检验与调用基于重新比对的结果使用贝叶斯统计模型如PairHMM计算每个位点出现每种基因型的概率最终决定是否调用变异以及其基因型。对于单个样本命令如下gatk HaplotypeCaller \ -R reference_genome.fa \ -I sample_final.bam \ -O sample_raw_variants.vcf.gz \ -ERC GVCF这里使用了-ERC GVCF模式它输出的是一个包含每个位点可能性信息的gVCF文件而不是仅包含变异位点的VCF。这种模式特别适合后续进行多样本联合基因分型GenotypeGVCFs可以提高跨样本变异检测的一致性尤其是对于低深度区域。5.2 变异过滤去伪存真的艺术HaplotypeCaller直接输出的VCF/gVCF中包含大量原始变异其中混杂着许多假阳性。这些假阳性可能来源于测序错误尤其在读段末端、比对错误在重复区域或同源区域、以及文库制备中的假象。因此必须进行严格的过滤。GATK推荐使用Variant Quality Score Recalibration (VQSR)方法进行过滤。这是一种基于机器学习的方法它需要一个高质量的“真相集”Truth Set 如HapMap, OMNI, 1000G项目中的高置信度位点和一个已知但可能包含错误的“资源集”如dbSNP。VQSR利用这些训练数据为每个变异位点计算一个VQSLOD值然后根据这个值设定阈值将变异分为“PASS”通过和低质量。# 对SNV进行VQSR需要大量已知数据集适用于人类等有丰富公共数据的物种 gatk VariantRecalibrator \ -R reference.fa \ -V raw_snps.vcf.gz \ --resource:hapmap,knownfalse,trainingtrue,truthtrue,prior15.0 hapmap.vcf.gz \ --resource:omni,knownfalse,trainingtrue,truthtrue,prior12.0 omni.vcf.gz \ --resource:1000G,knownfalse,trainingfalse,truthfalse,prior10.0 1000G.vcf.gz \ --resource:dbsnp,knowntrue,trainingfalse,truthfalse,prior2.0 dbsnp.vcf.gz \ -an QD -an MQ -an MQRankSum -an ReadPosRankSum -an FS -an SOR \ -mode SNP \ -O snps.recal \ --tranches-file snps.tranches gatk ApplyVQSR \ -R reference.fa \ -V raw_snps.vcf.gz \ --recal-file snps.recal \ --tranches-file snps.tranches \ --truth-sensitivity-filter-level 99.0 \ -mode SNP \ -O filtered_snps.vcf.gz对于没有完善公共真相集的物种或小规模项目可以使用硬过滤Hard Filteringgatk VariantFiltration \ -R reference.fa \ -V raw_variants.vcf.gz \ -O filtered_variants.vcf.gz \ --filter-expression QD 2.0 --filter-name LowQD \ --filter-expression FS 60.0 --filter-name HighFS \ --filter-expression MQ 40.0 --filter-name LowMQ \ --filter-expression MQRankSum -12.5 --filter-name LowMQRankSum \ --filter-expression ReadPosRankSum -8.0 --filter-name LowReadPosRankSum \ --filter-expression SOR 3.0 --filter-name HighSOR关键过滤参数解读QD (Quality by Depth)变异质量值除以覆盖深度。低QD值可能表示该位点虽然有一些支持变异的读段但深度很低或质量不高可靠性差。FS (Fisher Strand Bias)衡量支持变异读段正负链平衡性的指标。极高的FS值如60表示变异几乎只来自一条链这常是测序或比对假象如靠近引物端的标志。MQ (Mapping Quality)比对质量的平均值。低MQ表示该区域比对模糊可能位于重复序列区。MQRankSum和ReadPosRankSum这两个是U检验统计量用于检验支持参考碱基和支持变异碱基的读段其比对质量MQRankSum和在读段中的位置ReadPosRankSum分布是否一致。显著偏离0的值如-12.5或12.5提示可能存在系统性偏差。SOR (Strand Odds Ratio)另一个衡量链偏倚的指标对于高GC区域更稳健。过滤后在VCF文件的FILTER列中通过的变异会标记为“PASS”未通过的会标记出触发的过滤条件。你需要仔细检查被过滤掉的变异理解过滤原因必要时可以调整阈值。最终这份标记为“PASS”的VCF文件就是你这批测序数据经过千锤百炼后得到的相对可靠的SNV/Indel候选集。后续就可以根据你的研究目的进行注释、筛选和生物学解读了。整个流程走下来你会发现从原始数据到变异位点每一步都环环相扣。质控不好比对就受影响比对不准变异检测全是噪音过滤不严结果假阳性泛滥。我个人的体会是生信分析没有“一键搞定”的神器真正的功夫在于理解每个步骤的意义看懂每个参数和指标并能根据自己数据的实际情况做出合理的调整和判断。这个流程框架是通用的但具体到你的项目比如是肿瘤体细胞变异检测还是遗传病胚系变异检测在变异过滤的严格程度上、在对照样本的使用上还会有更细致的策略差异。掌握了这个基础流程你就有了应对各种NGS数据分析任务的底气。
返回列表