跳转至

长读测序结构变异检测方法


一句话说明

结构变异(SV)是基因组上大块 DNA 的"搬家"(易位)、"复制粘贴"(重复)、"删除"(缺失)或"翻转"(倒位),短读测序像近视眼看不清大变化,长读测序才能完整"看到"这些大型变异。


核心知识点

要点1:什么是结构变异

  • 结构变异(SV)= 基因组上 ≥50bp 的变异
  • 五种主要类型:
  • 缺失(DEL):一段 DNA 丢失
  • 插入(INS):多了一段 DNA
  • 重复(DUP):一段 DNA 被复制
  • 倒位(INV):一段 DNA 翻转 180°
  • 易位(TRA/BND):DNA 片段搬到其他染色体
  • 人类基因组中每个人约有 ~20,000-30,000 个 SV,影响的碱基数远超 SNP

要点2:短读 vs 长读检测 SV 的差异

特征短读长读
检测范围50bp-几kb50bp-几Mb
断点精度模糊(±几十 bp)精确(±1-2 bp)
插入检测差(>300bp 几乎检不到)优秀
重复区域 SV极难可靠
嵌套 SV无法检测可检测
灵敏度~50-60%~90-95%

要点3:长读 SV 检测工具

工具适用数据方法特点
pbsvPacBio HiFi比对信号PacBio 官方,精度高
Sniffles2HiFi/ONT比对信号跨平台,支持群体分析
cuteSVHiFi/ONT比对信号速度快
SVIMHiFi/ONT比对信号类型全面
SVisionHiFi/ONT深度学习检测复杂 SV
Delly-LR长读配对信号Delly 的长读版本

要点4:分析策略

  1. 比对到参考基因组(minimap2)
  2. 用 ≥2 个 caller 检测 SV(降低假阳性)
  3. 取交集或用 SURVIVOR 合并多个 caller 的结果
  4. 过滤:最小支持 reads 数、最小 SV 大小、基因型质量
  5. 注释:基因影响、人群频率(gnomAD-SV)

实战代码

# ===== 长读测序结构变异检测流程 =====

# 1. 比对(已完成的话跳过)
minimap2 -a -x map-hifi -t 16 \
    hg38.fa hifi_reads.fastq.gz | \
    samtools sort -@ 8 -o aligned.sorted.bam
samtools index aligned.sorted.bam

# ===== 方法1:pbsv(PacBio 官方) =====
# 第一步:发现 SV 信号(signatures)
pbsv discover --tandem-repeats hg38_trf.bed \
    aligned.sorted.bam signatures.svsig.gz

# 第二步:根据信号调用 SV
pbsv call --ccs hg38.fa signatures.svsig.gz \
    pbsv_output.vcf

# ===== 方法2:Sniffles2 =====
sniffles --input aligned.sorted.bam \
    --vcf sniffles_output.vcf \
    --reference hg38.fa \
    --threads 16 \
    --minsvlen 50 \           # 最小 SV 长度 50bp
    --minsupport auto         # 自动确定最小支持 reads

# ===== 方法3:cuteSV =====
mkdir -p cutesv_tmp
cuteSV aligned.sorted.bam hg38.fa \
    cutesv_output.vcf cutesv_tmp/ \
    --threads 16 \
    --min_size 50 \            # 最小 SV 50bp
    --min_support 3 \          # 至少 3 条 reads 支持
    --sample sample_name \
    --max_cluster_bias_INS 1000 \
    --diff_ratio_merging_INS 0.9 \
    --max_cluster_bias_DEL 1000 \
    --diff_ratio_merging_DEL 0.5

# ===== 合并多个 caller 的结果 =====
# 使用 SURVIVOR 合并
# 参数:最大距离 1000bp,至少 2 个 caller 支持,最小 50bp
ls pbsv_output.vcf sniffles_output.vcf cutesv_output.vcf > caller_list.txt
SURVIVOR merge caller_list.txt \
    1000 \   # 断点距离 ≤1000bp 视为同一个 SV
    2 \      # 至少 2 个 caller 检测到
    1 \      # 考虑 SV 类型
    1 \      # 考虑链方向
    0 \      # 不考虑大小差异比例
    50 \     # 最小 SV 大小 50bp
    merged_sv.vcf

# 统计合并后的 SV 数量和类型
bcftools query -f '%INFO/SVTYPE\n' merged_sv.vcf | \
    sort | uniq -c | sort -rn
# 输出示例:
# 15234 DEL    (缺失最多)
# 12456 INS    (插入次多)
# 1523 DUP     (重复)
# 456 INV      (倒位)
# 123 BND      (易位/断裂)

# ===== SV 注释 =====
# 使用 AnnotSV 注释 SV 的基因影响
AnnotSV -SVinputFile merged_sv.vcf \
    -outputFile annotated_sv \
    -genomeBuild GRCh38 \
    -SVminSize 50
# ===== Python: SV 统计与可视化 =====
import pandas as pd
import matplotlib.pyplot as plt

# 读取 VCF 文件中的 SV 信息
sv_data = []
with open("merged_sv.vcf") as f:
    for line in f:
        if line.startswith("#"):
            continue
        fields = line.strip().split("\t")
        info = dict(item.split("=") for item in fields[7].split(";")
                    if "=" in item)
        sv_data.append({
            "chr": fields[0],
            "pos": int(fields[1]),
            "type": info.get("SVTYPE", "UNK"),
            "length": abs(int(info.get("SVLEN", "0").split(",")[0]))
        })

df = pd.DataFrame(sv_data)

# SV 长度分布(按类型)
fig, ax = plt.subplots(figsize=(10, 6))
for sv_type in ["DEL", "INS", "DUP", "INV"]:
    subset = df[df["type"] == sv_type]
    ax.hist(subset["length"].clip(upper=10000),  # 截断到 10kb
            bins=50, alpha=0.5, label=sv_type)
ax.set_xlabel("SV 长度 (bp)")
ax.set_ylabel("数量")
ax.set_title("结构变异长度分布")
ax.legend()
plt.savefig("sv_length_distribution.png", dpi=150)

面试常问点

★ 为什么长读测序检测 SV 比短读好那么多?

参考答案:两个核心原因——第一,长读能直接跨越 SV 的两个断点,reads 从正常区域一直延伸到变异区域再回到正常区域,变异信号非常清晰。短读太短,断点两侧的 reads 常常比对不上或比对模糊。第二,很多 SV 发生在重复区域(转座子、串联重复等),短读无法唯一比对到重复区域,长读可以。特别是插入变异(INS),短读几乎无法检测 >300bp 的插入,因为插入片段不在参考基因组上,短读比对不上。

★ 为什么推荐用多个 SV caller 然后取交集?

参考答案:不同的 SV caller 使用不同的检测算法和信号特征,各有优势和盲区。比如 pbsv 对 PacBio 数据优化好,Sniffles2 在复杂 SV 方面表现强。单个 caller 的假阳性率可能有 10-20%,取两个以上 caller 的交集可以大幅降低假阳性率。SURVIVOR 工具可以设定断点距离阈值来合并不同 caller 检测到的同一个 SV。


速查卡片

问题一句话答案
SV 定义基因组上 ≥50bp 的变异
五种 SV 类型DEL, INS, DUP, INV, TRA
人均 SV 数量~20,000-30,000 个
推荐工具组合pbsv + Sniffles2 + cuteSV
合并工具SURVIVOR
注释工具AnnotSV
比对工具minimap2
长读 SV 灵敏度~90-95%