长读测序结构变异检测方法¶
一句话说明¶
结构变异(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-几kb | 50bp-几Mb |
| 断点精度 | 模糊(±几十 bp) | 精确(±1-2 bp) |
| 插入检测 | 差(>300bp 几乎检不到) | 优秀 |
| 重复区域 SV | 极难 | 可靠 |
| 嵌套 SV | 无法检测 | 可检测 |
| 灵敏度 | ~50-60% | ~90-95% |
要点3:长读 SV 检测工具¶
| 工具 | 适用数据 | 方法 | 特点 |
|---|---|---|---|
| pbsv | PacBio HiFi | 比对信号 | PacBio 官方,精度高 |
| Sniffles2 | HiFi/ONT | 比对信号 | 跨平台,支持群体分析 |
| cuteSV | HiFi/ONT | 比对信号 | 速度快 |
| SVIM | HiFi/ONT | 比对信号 | 类型全面 |
| SVision | HiFi/ONT | 深度学习 | 检测复杂 SV |
| Delly-LR | 长读 | 配对信号 | Delly 的长读版本 |
要点4:分析策略¶
- 比对到参考基因组(minimap2)
- 用 ≥2 个 caller 检测 SV(降低假阳性)
- 取交集或用 SURVIVOR 合并多个 caller 的结果
- 过滤:最小支持 reads 数、最小 SV 大小、基因型质量
- 注释:基因影响、人群频率(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% |