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-seq | MBD蛋白富集 | 全基因组 | ~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万探针) |