拷贝数变异(CNV)分析这个领域,我这两年被问得最多的问题其实只有一个:为什么同一个样本用aCGH和NGS两套数据跑出来,结果老是“差一点”?有时候是一段杂合缺失在微阵列芯片上看得清清楚楚,到了NGS里却只勉强够到阈值;有时候又反过来,测序数据里报出一个拷贝数扩增,荧光杂交验证却怎么都重现不了。做遗传病诊断的同事会拿着报告问技术员,做肿瘤检测的团队则往往为了一个低比例的局灶扩增争论半周。
这篇文章不是教科书,是我自己从样本处理、数据质控、算法参数到报告解读这条链路上实际踩坑攒下来的经验。核心围绕CNV的检测算法展开,重点讲清楚aCGH和NGS这两套数据源各自的信号逻辑、背后主流算法的数学直觉,以及真正容易翻车的参数设置和质控问题。适合刚开始接触CNV分析的生物信息同学、需要与生信团队对接的临床遗传咨询师,以及转岗做肿瘤基因组检测的研究人员。读完你不会变成算法专家,但至少能在下一次“真假拷贝数”争论里说出靠谱的判断依据。
1. 先搞清楚:CNV检测到底在找什么
1.1 一张染色体图里的“多”与“少”
CNV全称是拷贝数变异,指基因组里长度在1kb以上的DNA片段发生拷贝数的增加或减少。打个生活化的比方:正常人大多数基因区域每个基因出现两份,一份来自父方,一份来自母方。如果某一段区域只剩下一份,就叫杂合缺失;两份都没了是纯合缺失;多出一份是重复,再多几份就是扩增。这些“份数”的变化,就是拷贝数变异。
很多人刚接触时会把CNV和SNV混淆。SNV是单个碱基的改变,好比一篇文章里某个字被替换了;CNV则是整段话甚至整页被复印或撕掉,涉及的是“量”的逻辑。这个区别决定了检测思路完全不同:SNV要找“不同”,CNV要找“多少”。所以做CNV分析时,最核心的数学对象不是某个位点的碱基差异,而是一段连续区间的信号强度相对于预期的偏离程度。
从影响范围看,CNV与许多遗传病直接相关。一部分发育迟缓、智力障碍、先天性心脏病的病因就是微缺失或微重复综合征。肿瘤细胞里的癌基因扩增、抑癌基因缺失也是CNV的重要表现。产前诊断里常见的染色体数目异常,其实也是一类尺度更大的拷贝数变化。
1.2 为什么同一个临床问题要换两套技术
aCGH和NGS被放在一起讨论,是因为它们都能检测CNV,但探测的信号完全不同。
aCGH的全称是阵列比较基因组杂交。它的原理是把样本DNA和正常对照DNA分别标记成两种荧光,混合后与芯片上的探针杂交,然后比较每个探针位置的荧光比值。样本DNA在某区域的拷贝数越高,结合到探针上的样本DNA就越多,对应荧光信号就越强。最终输出的核心指标是log2比值,接近0表示拷贝数正常,正值表示增加,负值表示减少。
NGS则是把基因组打断成小片段后并行测序。对CNV检测来说,它利用的核心是“深度”:某段区域测到的读段数量与其在基因组中的拷贝数成正比。此外,NGS还能利用SNP位点的杂合性信息,通过等位基因比例的变化来识别杂合性缺失或拷贝数中性杂合性丢失。
这两套技术在临床实验并用的现象越来越常见。aCGH的分辨率取决于探针密度,芯片设计固定、实验流程成熟,适合作为高分辨率的筛选平台;NGS则在检测已知基因panel、全外显子组和全基因组层面的同时附带输出CNV信息,不需要额外增加实验成本。但问题恰恰出在这里:NGS附带的CNV分析如果算法没选对、参数没调好,很容易把真实信号淹没在技术噪声里。
1.3 检测“多少”远比检测“有没有”难
我常对刚入行的同事说,SNV检测是判断题,CNV检测是算术题。判断题只需要确认这个位置和参考基因组是否相同;算术题要求你先准确估计出这一段区域的总读段数,再找一套合适的基线来定义“正常”应该有多少,最后还得为每一个样本的波动范围划一个阈值。
这里面每一个环节都容易引入偏差。文库构建时的PCR偏好会导致某些GC含量高的区域被过度扩增;比对到重复序列区域的读段会因多映射而被丢弃;测序深度波动在样本内部也不是均匀分布。假如这些偏差没有被有效校正,你算出来的“拷贝数”很大程度是技术噪音的影子。
所以下面要进入正题:不同数据源和不同算法如何处理这些偏差,以及它们各自的优势和局限。
2. 两种数据源的底层逻辑:荧光比值与读段深度
2.1 aCGH信号里藏着的“参照系”问题
aCGH本质上是一个相对定量实验。芯片上每个探针给出的信号都是样本与对照的比值,可问题是,对照选谁、怎么选,直接影响GDH全局的基线水平。
多数商业化aCGH流程使用一组混合正常人DNA作为参考池(reference pool),目的是把个体间的多态性CNV平均掉。选参考池时要注意性别匹配,如果样本是男性而对照池来自女性,X染色体上的信号会整体偏低,直接表现为一个跨X染色体长臂的大型“缺失”假象。这听着不复杂,但实际项目中因为参考池性别不匹配导致的X染色体假阳性报告,我至少见过三四起。
还有一个容易忽略的点:aCGH探针信号本身也会受GC含量影响。不同的探针序列在杂交和洗脱效率上存在差异,荧光强度的绝对值并不完全与拷贝数线性对应。芯片厂商通常会在探针设计时做GC校正,但不同批次的数据仍可能出现基线漂移。所以正规流程会把每个样本的log2比值分布整体调整到以0为中心,这个步骤常被称为“中心化”。
aCGH在技术上的定位是稳健。杂交体系标准化程度高,背景噪声相对可控。在合适的实验条件下,它能稳定分辨单一探针级别的杂合缺失与重复。局限也很明显:只能检测探针覆盖区域范围内的拷贝数变化,无法发现拷贝数正常的平衡易位或倒位;另外,如果异常区域的断点落在探针之间,信号会被稀释,导致检出边界不干脆。
2.2 NGS的深度信号为什么需要更多“数学动作”
NGS数据做CNV检测,直觉逻辑很简单:把基因组按固定窗格划分,统计每个窗格内的比对读段数,然后寻找读段数偏高的窗格(对应扩增)和偏低的窗格(对应缺失)。实际操作中,这个看似简单的统计会受到多重因素干扰。
第一重干扰是GC偏好。测序和PCR扩增过程对不同GC含量的片段存在系统偏好,高GC和低GC区域的覆盖度天然偏低。如果不做校正,GC含量高或者低的区域会被误判为杂合缺失。第二重干扰是mappability。基因组里存在大量重复序列,比对时读段落在重复区域常常被丢弃,造成这些区域的深度系统性下降。第三重干扰是拷贝数状态的连续性:肿瘤样本中可能存在多个克隆,不同区域的拷贝数变化不是简单的整数倍。
为了处理这些干扰,NGS的CNV算法发展出了一套相当复杂的前处理和归一化流程。核心是找到“预期深度”:用同批次多个样本构建参考基线,或者利用样本内部的局部中位数做自归一化。然后计算每个窗格的观测深度与预期深度的比值,转换成类似aCGH的log2信号,再做分段和注释。
2.3 选平台不看“哪个更好”,要看“需要回答什么问题”
我用一张表把两套平台的差异列清楚,方便实际项目里直接对照。
| 维度 | aCGH | NGS(以全外显子和低深度WGS为例) |
|---|---|---|
| 信号来源 | 探针杂交荧光比值 | 比对读段深度、等位基因比例 |
| 分辨率 | 取决于探针间距,常规可达50kb以下 | 外显子级或数百kb级,取决于测序深度和窗格策略 |
| 对平衡性结构重排 | 无法检测 | 可尝试通过嵌合读段检测(但不是CNV分析主曲线) |
| 数据可重复利用 | 低,芯片信号无法重新计算新的区域 | 高,原始测序数据可反复分析 |
| 主要成本 | 芯片和杂交试剂 | 文库构建加测序机时 |
| 典型应用角色 | 高分辨率筛查与验证 | 与SNV/InDel分析共享一次测序 |
| 最大的坑 | 探针覆盖不完整、参考池不匹配 | 深度不均一、GC偏好、肿瘤纯度干扰 |
选择困难症的解法很简单:如果你有一个明确的临床指征,想高分辨地看全基因组范围内的CNV,aCGH是成熟路线;如果临床检测本来就需要做测序panel,那利用NGS数据附带产出CNV是最经济的;如果再往下挖,想知道拷贝数断点附近的序列结构变化,那就得上WGS级别的数据了。
3. 主流CNV检测算法拆解:从分段回归到隐马尔可夫
3.1 分段回归类算法:在噪声里找“均值显著改变”的边界
aCGH数据分析里最经典的算法思路之一是分段回归,其中被广泛使用的circular binary segmentation(CBS)方法尤其值得理解。它的核心问题可以描述为:给定一条染色体上一连串按位置排列的log2信号,如何自动识别出那些信号均值发生显著变化的断点位置。
CBS的工作方式是递归的:先把整条染色体的信号看作一个闭环,从头扫描找出某个连续子区间,其内部均值与整个染色体其余部分均值差异达到统计显著;找到一个显著区段后,把数据切割成两段或三段,再分别递归地继续找新断点。每次检测都伴随一个检验统计量,通过置换校核给出p值。这样一来,算法能够把一条染色体上的杂乱信号切分成若干段均一区域,每段就是一个推断的拷贝数状态。
理解CBS的关键是知道它在“对抗什么”。原始信号在真实断点附近的波动通常是渐变的,不是一步跳变的,因为探针的信号本身存在局部漂移和邻近杂交干扰。CBS之所以强调“显著”分割,就是避免把噪声明下的微小均值偏移切成一堆假区段。我在实际项目里常用调整分段显著性阈值来控制区段数量:阈值设太严,小片段的真实变异会被吞掉;设太松,又会切碎整条染色体,后处理很难看。
3.2 隐马尔可夫模型:把拷贝数状态当成一条“隐形链”
另一大类算法用隐马尔可夫模型(HMM)处理CNV。它的设定是把染色体看成一条由状态组成的链:状态包括二倍体正常、杂合缺失、纯合缺失、单拷贝重复、多拷贝扩增等。观测数据是每个窗格的读段深度或log2比值,而每个状态对应一种观测信号的分布。
HMM的优势在于它能利用相邻位置之间的转移概率。基因组上的真实拷贝数变化往往是连续的、可遗传的,一段区域很少孤零零地变化一个窗格然后立刻恢复。算法通过转移概率约束“状态”“切换”的频率,天然就对噪声起到了平滑作用。这也是为什么HMM在WES和靶向panel数据中表现不错——测序深度不高、信号较弱时,相邻信息能互相拉一把。
但HMM也不是没有代价。它需要用户设定状态数量、初始概率、发射分布参数和转移概率。一旦状态数目设得和真实情况不符,模型就会被别扭地硬凑出很多不需要的状态。比如把拷贝数正常样本强制按5状态模型拟合,就很容易出现偶尔一段两段“微重复”的假阳性。
3.3 读段深度模型:从泊松假定到局部Z分数
针对WGS和WES数据的CNV检测,很多算法并非直接跑CBS或HMM,而是先做一个统计变换。核心思想是:在某个窗口内,实际读段数近似服从泊松分布或负二项分布。正常区域的读段数在一个可预测的均值附近波动;当这段区域发生拷贝数变化时,读段数的均值按比例改变。
处理WES数据时有个特殊问题:捕获芯片的捕获效率在不同区域之间差异很大,所以各个目标区间的基线深度并不一致。因此多数算法先从所有样本的同一区间读段数构建基线,再用样本自身的测序总量归一化。这时候一个常见手法是计算每个区间的局部Z分数,即某个区间的读段数相对基线的偏离程度。z超过3或者4的区间,就会被标记成候选CNV。
读段深度模型的成败,很大程度在于窗格大小的选择。窗格太大,小片段变异被平均掉;窗格太小,单个窗格内读段太少,泊松波动会让假阳性满天飞。我在低深度WGS数据里通常会把窗格调小、阈值调高,再用相邻窗格合并来补灵敏度。
3.4 等位基因比例的妙用:看见“拷贝”看不到的杂合性信息
读段深度只看“总拷贝数”,但如果一段区域的拷贝数从两份变成两份但全部来自同一条染色体,也就是发生了LOH(杂合性缺失),深度信号完全无法区分。这个时候必须引入SNP位点的等位基因比例。
测序数据里,杂合SNP的两个等位基因按接近1:1的比例出现。拷贝数为正常二倍体时,杂合SNP的等位基因比例聚集在0.5附近。一旦一段区域发生单亲二倍体或拷贝数中性LOH,区域内杂合SNP的等位基因比例就会偏向0或1。把深度比例和等位基因比例放在一起观察,就能同时发现“拷贝数没变但基因型变了”的现象。
这个策略在肿瘤样本里尤其重要。许多抑癌基因的失活方式是一条染色体缺失、另一条染色体再复制,最终总拷贝数恢复正常但两条都来自同一个亲本。只看深度信号会漏掉这种关键事件。这也是为什么很多成熟的算法流程里会同时建模覆盖度和BAF(B等位基因频率)。
3.5 算法也不存在“万能药”
不同算法的适应面差异很大。分段回归类算法适合背景噪声控制得好的aCGH数据;HMM类方法适合状态相对简单的胚系样本;读段深度模型对文库均一性要求高;BAF相关的分析需要一定数量的杂合SNP作为支撑。不分数据形态直接套一个固定流程,是绝大多数CNV分析假阳性和假阴性问题的起点。
4. 实操工作流:从样本到报告的全链路要点
4.1 样本质量:一切算法的基础
NGS的CNV分析结果里,我最怕收到的不是测序深度不够,而是DNA已经严重降解的FFPE样本。FFPE样本的化学交联会让DNA片段化严重,片段越短,文库扩增的偏好越强,深度波动就越大。做肿瘤样本时还面临另一个问题:肿瘤细胞的比例不纯,正常细胞混入会把真实拷贝数信号的幅度往下拉。
所以每个样本进流程之前,我会先做基础的质控确认:DNA总量和降解程度是否在可接受范围,测序读段的重复率是否过高,目标区间的平均深度是否达到项目预设值。这些都不涉及高级算法,但它们决定了后面所有参数是否还有意义。
aCGH对样本的要求相对宽松,因为它的信号来自杂交而非PCR扩增,但同样需要警惕DNA降解。降解严重的样本会导致杂交信号整体减弱,背景升高,log2比值分布变宽。此时即使算法跑出“显著区段”,可靠性也不可轻信。
4.2 预处理细节:比对、去重和GC校正
如果你从原始测序数据开始做CNV,第一步是比对到参考基因组。比对工具的选择会影响mappability:把读段比对到重复区域时,很多比对工具默认丢弃次优比对记录。如果做CNV分析的区域恰好落在重复序列附近,深度就会掉下来。简单处理办法是保留唯一比对,但心里要清楚哪些区域天然是低覆盖的。
去重环节需要分场景对待。标准WGS流程通常去除PCR重复,因为重复是文库扩增产物而非真实片段;但目标是低深度WGS时,重复率本来就低,去重与否影响不大。我的经验是:建库起始量低、循环数多的样本,一定要做严格去重,否则高GC区域被过度扩增的产体会抬高局部深度,造成假性扩增。
GC校正几乎是必须的。做法可以是把每个窗格的深度除以同GC含量窗格的均值,也可以用更复杂的局部回归方法。核心逻辑是让“拷贝数信号”与“序列特性”解耦。我自己的习惯是先做GC校正,再看窗格深度的中位数归一化,最后再决定用什么算法做分段和状态注释。
4.3 参数设置:哪些是关键变量
一组可以参照的经验配置可以这样理解。对于30x以上深度的WGS数据,我常用25kb到100kb的窗格;对于0.1x到1x的低深度WGS,窗格要放大到250kb到1Mb,否则大部分窗格没有足够读段,噪声会让你什么都看不见。对于WES数据,直接以捕获target为窗格,但要额外做捕获效率的smoothing。
阈值的选择取决于样本类型。胚系样本中,杂合缺失的log2比值理论上在-1附近,纯合缺失在接近一个宽范围的负值,重复在+0.58附近。但实际数据会有压缩和膨胀,所以多数流程不会直接用理论值,而使用比正常样本分布更远的偏离值,例如要求log2比值小于-0.25或大于0.25作为候选。肿瘤样本因为纯度问题,信号幅度会被稀释,阈值则需要更灵活,不少项目直接用统计学显著性而不是固定倍数。
另一个容易被忽略的参数是“最小异常窗格数”。单独一个窗格的深度偏低,很可能只是比对死角或GC校正残余,而不是真实缺失。我一般会要求至少连续2到3个窗格同时偏离,再标记为候选。这个值不能设太大,否则短的真实小片段变异会被漏掉。
4.4 注释与报告:GRCh37和GRCh38不是小事
拿到分段结果后,下一步是注释。每一位读报告的人都要清楚,参考基因组版本不同,同一段坐标代表的基因名单可能不一致。GRCh37和GRCh38之间的坐标映射会让一个外显子级别的缺失在不经意间落到不同的基因注释上。我的习惯是全流程固定一个参考版本,从比对到注释都不混用,并在报告里明确写出所用版本。
报告里还需要标注变异类型、区间大小、影响的基因数量、附近是否有已知的剂量敏感基因或肿瘤相关基因。做临床报告时,经常需要结合遗传咨询需求讨论某个CNV是“明确致病”“意义未明”还是“可能良性”。这里一定不能只依赖自动注释,需要有人工复核关键候选区段的原始信号轨迹和目标区间的深度分布。
4.5 一个简化但完整的流程示例
我给自己团队常用的胚系WES-CNV流程画了一条线,按顺序执行:
- 原始数据比对到指定参考基因组,统计比对率和插入片段分布。
- 对比对结果做去重和QC过滤,排除低质量读段。
- 使用捕获kit提供的target区间作为窗格,统计每个target上的去重读段数。
- 对target深度做GC校正与各样本间的深度归一化。
- 计算每个样本每个target相对基线(同批次中位数或参考集合)的log2比值。
- 用分段算法识别连续异常区间,设置最小窗格数和log2切点。
- 输出候选区段,结合BAF信息判断LOH。
- 用数据库列出受影响基因、已知CNV综合征区域和肿瘤相关关系。
- 对关键候选区段,独立复核原始信号并安排正交验证实验。
每一步看起来都常规,但第5步和第6步的参数调整会对结果产生十倍差异。刚入行的同学如果在第6步得到一团糟的分段结果,不要急着怪数据,先回头查第4步有没有正确归一化。
5. 常见问题与排查技巧实录
5.1 低深度WGS检出的CNV特别碎
很多团队喜欢用低深度WGS做群体筛查,因为便宜,但要意识到低深度意味着每个窗格只有几条到几十条读段,泊松噪声非常大。碎成“千疮百孔”的候选区段多半是真噪音,不是CNV。我遇到过的最典型情况是:不同批次间测序深度差异达到三倍,没有做跨批次归一化,结果整个基因组都出现高高低低的段。
排查思路:先看同批次正常样本的log2比值分布是否足够集中,再看候选区段是否在GC极端区域或者重复序列附近。如果碎片集中在特定的基因组特征上,基本可以判断是系统偏差而非真实变异。筛选时可以加上“区段长度阈值”和“跨窗格一致性”两个条件,明显减少碎段。
5.2 肿瘤纯度把扩增信号打薄了
肿瘤样本中,肿瘤细胞和正常细胞是混合的。假如一个区域在肿瘤细胞里发生了纯合缺失,而肿瘤含量只有50%,那么该区域测序深度只会下降25%,log2只有-0.41左右,勉强够得上某些算法的阈值边缘;如果是杂合缺失,下降幅度更小。反过来,一个四拷贝扩增,如果肿瘤纯度只有30%,信号增幅也会缩水到不到一半。
实际项目中,我一般先用专门工具或历史体细胞突变信息估算肿瘤纯度,再决定要不要做纯度校正。如果肿瘤纯度低于20%,体细胞CNV分析的灵敏度会很差,此时报告要注意说明“低肿瘤纯度可能导致假阴性”。这是个很容易被忽视的坑:看到报告里没有CNV就以为真的没有,其实可能是信号被稀释了没有办法翻出来。
5.3 批次效应与参考样本不匹配
NGS平台差异、建库试剂的批号变化,甚至同一台机器不同时间跑出来的数据,都可能引起深度基线漂移。最稳妥的策略是“同批次样本共用一套基线”,至少也要在构建基线时纳入足够多样本,让个体差异平均掉。
有一个可复现的教训:某次项目里,一批样本中混入了一个性别与参考池不匹配的对照,结果整条X染色体所有样本都显示缺失,把实验结果搞得很混乱。从那以后,我在任何样本分组前都会先检查性别、族群背景和样本类型是否一致,避免因为基线选错导致全染色体假阳性。
5.4 验证方案怎么选
CNV分析结果不能只看生信就算完。aCGH本身已经是一种分子生物学检测,通常不需要再重复同一个平台验证;但从NGS数据里call出的候选CNV,尤其是低深度WGS或WES报告里那些没有预先设计目标探针的区域,建议用第二平台验证。
可选的方法包括:针对目标区域的qPCR或数字PCR、MLPA探针检测、FISH;如果是大片段的重复或缺失,用染色体微阵列复核是最稳妥的。小型panel区域内的缺失则可以用Sanger测序看缺口或者用长片段PCR跨越断点。验证方案的尺度要匹配异常区域的大小:3Mb的缺失用qPCR局部验证没有意义,而单外显子缺失靠FISH也看不出差异。
5.5 别忽略基因组版本和注释对齐
我遇到过一个很隐蔽的问题:项目数据噪音不大,阳性信号也很漂亮,但注释时发现基因列表和临床预期相差很远。最后排查发现,比对时用的GRCh38,而注释数据库用的GRCh37坐标,坐标没有转换,导致一段真实存在于9号染色体短臂的重复被注释成了12号染色体的一个无关基因。这个教训让我把“版本一致性检查”列为报告发布前的固定环节。
CNV分析这个方向,工具更新很快,但核心的洞察逻辑一直很稳定:理解信号来源,做好质控,再谈算法和参数。我自己有个习惯,每次拿到一个新的样本类型或者新的数据形态,都会先画一遍数据的分布直方图,观察主峰是否居中、拖尾是否严重。这个简单的习惯省了我大量调整参数的时间。如果你在做CNV分析时遇到结果异常,不要急着调阈值,更不要急着切换算法,先从信号质量和参考基线的角度回头看,大概率问题出在那里。