羟甲基化检测 oxBS-seq¶
一句话说明¶
普通的亚硫酸盐测序分不清 5mC(甲基化)和 5hmC(羟甲基化),oxBS-seq 先用化学氧化把 5hmC 变成 5fC,再做亚硫酸盐处理,这样就能准确区分两种修饰了。
核心知识点¶
要点1:5mC 与 5hmC 的区别¶
- 5mC(5-甲基胞嘧啶):基因沉默标记,通常与基因关闭有关
- 5hmC(5-羟甲基胞嘧啶):由 TET 酶将 5mC 氧化产生,是去甲基化的中间产物
- 5hmC 在大脑中特别丰富,与基因激活有关
- 白话类比:5mC 是"停车标志",5hmC 是"正在拆除停车标志"——含义完全不同
要点2:为什么普通 BS-seq 分不清¶
- 亚硫酸盐处理中:
- 未修饰的 C → U → 测序读为 T
- 5mC → 不变 → 测序读为 C
- 5hmC → 也不变 → 测序读为 C(与 5mC 混淆!)
- 所以普通 BS-seq 测到的"甲基化"实际是 5mC + 5hmC 的总和
要点3:oxBS-seq 原理¶
- 样本分两份:同一份 DNA 分成 A、B 两组
- A 组:做普通 BS-seq → 测到 5mC + 5hmC(总量)
- B 组:先用 KRuO₄(高钌酸钾)氧化 → 5hmC 变成 5fC → 再做 BS-seq → 5fC 被转化为 T → 只测到 5mC
- 相减:A 组信号 - B 组信号 = 5hmC 水平
要点4:相关技术对比¶
| 方法 | 检测目标 | 原理 |
|---|---|---|
| BS-seq | 5mC + 5hmC | 亚硫酸盐转化 |
| oxBS-seq | 区分 5mC 和 5hmC | 氧化 + BS |
| TAB-seq | 直接检测 5hmC | TET 氧化 + 保护 + BS |
| ACE-seq | 直接检测 5hmC | APOBEC 脱氨 |
| EM-seq | 5mC + 5hmC | 酶法替代亚硫酸盐(更温和) |
实战代码¶
# ===== oxBS-seq 数据分析流程 =====
# 需要同时处理 BS 组和 oxBS 组
# --- 1. 两组数据分别质控和去接头 ---
for group in BS oxBS; do
trim_galore --paired -o trimmed/${group}/ \
${group}_R1.fastq.gz ${group}_R2.fastq.gz
done
# --- 2. 两组分别用 Bismark 比对 ---
for group in BS oxBS; do
bismark --genome /ref/hg38/ --bowtie2 -p 4 \
-1 trimmed/${group}/*_val_1.fq.gz \
-2 trimmed/${group}/*_val_2.fq.gz \
-o aligned/${group}/
done
# --- 3. 两组分别去重 ---
for group in BS oxBS; do
deduplicate_bismark --paired \
aligned/${group}/*_pe.bam
done
# --- 4. 两组分别提取甲基化 ---
for group in BS oxBS; do
bismark_methylation_extractor --paired-end --comprehensive \
--cytosine_report --genome_folder /ref/hg38/ \
-o methylation/${group}/ \
aligned/${group}/*_pe.deduplicated.bam
done
# --- 5. 用 R 计算 5hmC 水平 ---
# ===== R: 计算 5hmC 水平 =====
library(data.table)
# 读取 BS 组的 CpG 报告
bs <- fread("methylation/BS/CpG_report.txt",
col.names = c("chr", "pos", "strand", "meth_count",
"unmeth_count", "context", "trinuc"))
# 读取 oxBS 组的 CpG 报告
oxbs <- fread("methylation/oxBS/CpG_report.txt",
col.names = c("chr", "pos", "strand", "meth_count",
"unmeth_count", "context", "trinuc"))
# 计算甲基化水平
# BS 组测到的 = 5mC + 5hmC(总修饰水平)
bs$total_mod <- bs$meth_count / (bs$meth_count + bs$unmeth_count)
# oxBS 组测到的 = 仅 5mC(因为 5hmC 被氧化掉了)
oxbs$mc_only <- oxbs$meth_count / (oxbs$meth_count + oxbs$unmeth_count)
# 合并两组数据
merged <- merge(bs[, .(chr, pos, total_mod)],
oxbs[, .(chr, pos, mc_only)],
by = c("chr", "pos"))
# 5hmC = BS 信号 - oxBS 信号
merged$hmc <- merged$total_mod - merged$mc_only
# 负值设为 0(可能由测量误差导致)
merged$hmc[merged$hmc < 0] <- 0
# 查看高 5hmC 位点
high_hmc <- merged[hmc > 0.1] # 5hmC > 10% 的位点
cat("高羟甲基化位点数:", nrow(high_hmc), "\n")
面试常问点¶
★ 为什么需要区分 5mC 和 5hmC?¶
参考答案:虽然 5mC 和 5hmC 在普通 BS-seq 中都读为 C,但功能完全不同。5mC 通常与基因沉默相关,5hmC 是 TET 酶介导的去甲基化中间体,与基因激活有关。如果把两者混在一起分析,会错误解读基因调控方向。比如一个位点 5mC 下降但 5hmC 上升,总量没变,普通 BS-seq 看不出变化,但其实发生了重要的表观遗传重编程。
★ oxBS-seq 的局限是什么?¶
参考答案:主要两个局限——第一,需要两组平行实验(BS + oxBS),成本翻倍;第二,5hmC 水平是通过两组数据相减得到的,如果 5hmC 丰度低(比如大部分组织中 5hmC < 1%),误差会比较大。对于 5hmC 丰度高的组织(如大脑),oxBS-seq 效果很好。
速查卡片¶
| 问题 | 一句话答案 |
|---|---|
| oxBS-seq 全称 | Oxidative Bisulfite Sequencing |
| 检测目标 | 区分 5mC 和 5hmC |
| 氧化试剂 | KRuO₄(高钌酸钾) |
| 计算方法 | 5hmC = BS 信号 - oxBS 信号 |
| 5hmC 功能 | TET 酶介导的去甲基化中间体 |
| 5hmC 富集组织 | 大脑(可达 10-40%) |
| 替代技术 | TAB-seq、ACE-seq |
| 主要局限 | 成本翻倍,低丰度时误差大 |