跳转至

DNA甲基化检测方法比较


一句话说明

DNA甲基化是在DNA碱基(主要是胞嘧啶C)上加一个甲基(-CH3),就像给基因加了"消音器"——被甲基化的区域通常基因表达会被关闭。不同的检测方法各有优缺点,选对方法是做好甲基化研究的第一步。


核心知识点

要点1:DNA甲基化基础

  • 位置:主要发生在CpG位点(C后面紧跟G),人类基因组有~2800万个CpG位点
  • CpG岛:基因启动子区域富含CpG的区域(通常>200bp、CG含量>50%)
  • 生物学功能
  • 基因沉默:启动子区甲基化→基因关闭
  • 基因组印记:父母来源的等位基因差异表达
  • X染色体失活:女性一条X染色体被甲基化沉默
  • 转座子沉默:防止转座子跳来跳去
  • DNMT酶:DNA甲基转移酶,负责添加甲基(DNMT1维持型,DNMT3a/3b从头型)

要点2:主要检测方法比较

方法原理覆盖度分辨率成本适用场景
WGBS亚硫酸盐+全基因组测序全基因组单碱基很高金标准,全景分析
RRBS亚硫酸盐+酶切富集CpG富集区(~10%)单碱基中等启动子区域分析
450K/EPIC芯片探针杂交~85万位点指定位点大队列EWAS
MeDIP-seq抗体富集甲基化DNA全基因组~150bp中等粗略全基因组筛查
MBD-seqMBD蛋白富集全基因组~150bp中等高甲基化区域
Nanopore直接检测修饰碱基全基因组单碱基中高新兴方法,无需化学处理

要点3:亚硫酸盐转化原理(重点!)

  • 核心化学:亚硫酸氢钠(bisulfite)将未甲基化的C转化为U(测序时读为T),甲基化的C不变(仍读为C)
  • 读取方式:C→T = 未甲基化;C→C = 甲基化
  • 甲基化比例:某位点的甲基化水平 = C reads / (C reads + T reads)
  • 局限:不能区分5mC(甲基化)和5hmC(羟甲基化),DNA严重降解(>90%损失),PCR偏好性

要点4:Illumina甲基化芯片

  • EPIC v2(2023+):>93.5万个CpG位点(manifest含~93.7万探针,含重复探针),是大队列研究的首选
  • 原理:探针分为Type I(两个探针检测甲基化/未甲基化)和Type II(一个探针两个荧光)
  • β值:甲基化信号/(甲基化信号+未甲基化信号),范围0-1
  • M值:log2(甲基化信号/未甲基化信号),统计分析用M值更合适

实战代码

# === WGBS数据分析流程 ===
# 使用Bismark做比对,methylKit做差异分析

# --- Bismark比对流程(Shell命令) ---
# 1. 基因组准备
# bismark_genome_preparation --bowtie2 genome/  # 构建bisulfite转换后的索引

# 2. 比对
# bismark --genome genome/ -1 sample_R1.fq.gz -2 sample_R2.fq.gz  # 比对

# 3. 去重复
# deduplicate_bismark sample.bam  # 去PCR重复

# 4. 提取甲基化信息
# bismark_methylation_extractor --cytosine_report sample.deduplicated.bam

# --- methylKit差异甲基化分析(R) ---
library(methylKit)

# 1. 读取Bismark输出的CpG覆盖度文件
file_list <- list("sample1.cov", "sample2.cov", "sample3.cov",
                   "sample4.cov", "sample5.cov", "sample6.cov")
sample_ids <- c("disease1","disease2","disease3","ctrl1","ctrl2","ctrl3")
treatment <- c(1, 1, 1, 0, 0, 0)  # 1=疾病组,0=对照组

myobj <- methRead(
  file_list,
  sample.id = sample_ids,
  treatment = treatment,
  assembly = "hg38",       # 参考基因组版本
  context = "CpG",         # 只看CpG位点
  mincov = 10              # 最少10x覆盖度
)

# 2. 过滤和归一化
filtered <- filterByCoverage(myobj, lo.count=10, hi.perc=99.9)  # 过滤极端覆盖
normalized <- normalizeCoverage(filtered)  # 归一化覆盖度

# 3. 合并样本(只保留所有样本都有覆盖的位点)
meth <- unite(normalized, destrand=FALSE)

# 4. 差异甲基化分析
diff <- calculateDiffMeth(meth)  # 计算差异甲基化

# 5. 筛选差异甲基化位点(DMC)
dmc <- getMethylDiff(diff,
                     difference = 25,  # 甲基化差异>25%
                     qvalue = 0.01)    # FDR<0.01
print(paste("差异甲基化CpG数:", nrow(dmc)))

# 6. 注释到基因组区域
library(genomation)
gene_obj <- readTranscriptFeatures("hg38_genes.bed")
annotateWithGeneParts(as(dmc, "GRanges"), gene_obj)  # 看DMC在启动子/外显子/内含子的分布
# === Illumina EPIC芯片数据分析要点 ===
# 通常用R的minfi或ChAMP包,这里展示基本概念

import pandas as pd
import numpy as np

# 1. 理解β值和M值的转换
beta = 0.75   # β值=0.75表示75%的DNA分子在该位点被甲基化
M_value = np.log2(beta / (1 - beta))  # β→M值转换
print(f"β={beta} → M={M_value:.2f}")  # M=1.58

# β值直觉好理解(0-1),M值统计性质更好(正态分布)
# 差异分析用M值,可视化用β值

# 2. 简单的差异甲基化位点筛选
data = pd.read_csv("methylation_beta_values.csv", index_col=0)  # CpG × 样本
groups = pd.read_csv("sample_groups.csv", index_col=0)

# 计算组间β值差异
disease = data.loc[:, groups["Group"] == "Disease"].mean(axis=1)
control = data.loc[:, groups["Group"] == "Control"].mean(axis=1)
delta_beta = disease - control  # Δβ
print(f"|Δβ| > 0.2 的CpG数: {(abs(delta_beta) > 0.2).sum()}")

面试常问点

Q1: WGBS和RRBS怎么选?

参考答案:看研究目的和预算。WGBS是金标准,覆盖全基因组~2800万CpG位点,但需要深度测序(30x以上),成本很高。RRBS用MspI酶切富集CpG密集区域,只覆盖约10%的CpG但集中在启动子和CpG岛,成本只有WGBS的1/10-1/5。如果关心启动子区甲基化(如基因表达调控),RRBS够用;如果需要看增强子、基因体等全基因组范围的甲基化变化,必须用WGBS。大队列研究可以考虑EPIC芯片,成本更低。

Q2: 亚硫酸盐转化的缺点是什么?

参考答案:主要三个缺点:一是DNA降解严重,>90%的DNA会被破坏,所以需要较多的起始DNA量;二是不能区分5mC(甲基化)和5hmC(羟甲基化),两者都读为C;三是转化后序列复杂度降低(所有未甲基化的C变成T),比对困难,需要专门的比对工具(如Bismark)。现在Nanopore测序可以直接读取修饰碱基,不需要化学转化,是解决这些问题的新方向。


速查卡片

问题一句话答案
CpG岛在哪里?通常在基因启动子区域,约70%的基因启动子含CpG岛
亚硫酸盐转化原理?未甲基化C→U(T),甲基化C不变
β值范围?0-1,代表甲基化比例
M值是什么?log2(β/(1-β)),统计分析更合适
WGBS覆盖多少CpG?全基因组~2800万个CpG位点
EPIC芯片检测多少位点?>93.5万个CpG位点(EPIC v2,manifest含~93.7万探针)