跳转至

羟甲基化检测 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 原理

  1. 样本分两份:同一份 DNA 分成 A、B 两组
  2. A 组:做普通 BS-seq → 测到 5mC + 5hmC(总量)
  3. B 组:先用 KRuO₄(高钌酸钾)氧化 → 5hmC 变成 5fC → 再做 BS-seq → 5fC 被转化为 T → 只测到 5mC
  4. 相减:A 组信号 - B 组信号 = 5hmC 水平

要点4:相关技术对比

方法检测目标原理
BS-seq5mC + 5hmC亚硫酸盐转化
oxBS-seq区分 5mC 和 5hmC氧化 + BS
TAB-seq直接检测 5hmCTET 氧化 + 保护 + BS
ACE-seq直接检测 5hmCAPOBEC 脱氨
EM-seq5mC + 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
主要局限成本翻倍,低丰度时误差大