前言
DNA
甲基化在许多细胞进程中扮演重要的角色,例如胚胎发育、基因印迹、X
染色体失活和维持染色体稳定性。
在哺乳动物中,DNA
甲基化很少见,其产生位置分布在整个基因组中的确定的 CpG
序列中,但是却很少在 CpG
岛上发生甲基化。
CpG
岛(CGI
)是富含 GC
碱基的短间隔 DNA
序列。这些 CpG
岛通常位于转录起始位置,它们的甲基化会导致基因沉默。
DNA
甲基化会抑制转录,因此,对 DNA
甲基化的研究对于理解癌症中调控基因网络至关重要。所以,差异甲基化区域(DMR
)的检测有助于我们研究调控基因网路。
差异甲基化分析
1. 样本甲基化均值
我们首先对 DNA
甲基化数据进行预处理,450k
平台的 DNA
甲基化数据有三种探针:
-
cg
:CpG
位点 -
ch
:非CpG
位点 -
rs
:SNP
芯片
最后一种探针可用于识别和跟踪样本,应该在差异甲基化分析中被排除,所以要删除 rs
探针。同时为了消除性别的影响,X
、Y
染色体也应该排除在外。最后,去除包含 NA
值的探针。
在本示例中,我们分析的是结直肠癌的两个亚型:
- 结肠癌:
COAD
- 直肠癌:
READ
library(TCGAbiolinks)
library(SummarizedExperiment)
library(tidyverse)
#------------------------------------
# 获取 DNA 同时检测甲基化和表达的样本
#------------------------------------
# 结肠和直肠数据
coad.samples <- matchedMetExp("TCGA-COAD", n = 10)
read.samples <- matchedMetExp("TCGA-READ", n = 10)
samples <- c(coad.samples, read.samples)
#------------------------------------
# 1 - Methylation
# -----------------------------------
query <- GDCquery(
project = c("TCGA-COAD", "TCGA-READ"),
data.category = "DNA methylation",
platform = "Illumina Human Methylation 450",
legacy = TRUE,
barcode = samples
)
GDCdownload(query)
met <- GDCprepare(query, save = FALSE)
# 我们以 chr9 为例
met <- subset(met,subset = as.character(seqnames(met)) %in% c("chr9"))
# 删除包含 NA 值的探针
met <- subset(met,subset = (rowSums(is.na(assay(met))) == 0))
# 去除重复样本
met <- met[, substr(colnames(met), 14, 16) != "01B"]
我们根据 project_id
对样本进行分组,并使用 T
检验计算样本甲基化值之间的差异
TCGAvisualize_meanMethylation(
met,
groupCol = "project_id",
group.legend = "Groups",
filename = NULL,
print.pvalue = TRUE
)
==================== DATA Summary ====================
groups Mean Median Max Min
1 TCGA-COAD 0.4670816 0.4682460 0.5076270 0.4222167
2 TCGA-READ 0.4730700 0.4758822 0.4904898 0.4498025
整体看,两组样本之间的 P
值并不显著
2. 识别差异甲基化 CpG 位点
获取并处理完数据之后,我们要识别两组之间的差异甲基化 CpG
位点。
我们使用的是 TCGAanalyze_DMR
函数,该函数首先计算每个探针在分组之间的平均甲基化值(mean of the beta-value
)差异,然后,使用 wilcoxon
检验两组之间的表达差异,并使用 BH
方法矫正 P
值。
默认的最小均值差为 0.15
,FDR
值为 0.05
#------- 识别差异甲基化位点 ----------
res <- TCGAanalyze_DMC(
met,
# colData 函数获取的矩阵中分组列名
groupCol = "project_id",
group1 = "TCGA-COAD",
group2 = "TCGA-READ",
p.cut = 0.05,
diffmean.cut = 0.15,
save = FALSE,
legend = "State",
plot.filename = "~/Downloads/COAD_READ_metvolcano.png",
cores = 1
)
从这个火山图的结果中,我们可以看到有 6
个低甲基化位点
最后,我们使用热图来显示这些探针在所有样本中的 DNA
甲基化水平
#--------------------------
# DNA Methylation heatmap
#--------------------------
library(ComplexHeatmap)
# 获取临床数据
coad_clin <- GDCquery_clinic(project = "TCGA-COAD", type = "Clinical")
read_clin <- GDCquery_clinic(project = "TCGA-READ", type = "Clinical")
use_cols <- c("bcr_patient_barcode", "disease","gender","vital_status","race")
clinical <- coad_clin %>%
dplyr::select(use_cols) %>%
add_row(dplyr::select(read_clin, use_cols)) %>%
subset(bcr_patient_barcode %in% substr(samples, 1, 12))
# 获取 Hypermethylated 和 Hypomethylated 的探针
sig_met <- filter(res, status != "Not Significant")
# 获取探针的表达值
res_data <- subset(met,subset = (rownames(met) %in% rownames(sig_met)))
# 添加注释
ta <- HeatmapAnnotation(
df = clinical[, c("disease", "gender", "vital_status", "race")],
col = list(
disease = c("COAD" = "grey", "READ" = "black"),
gender = c("male" = "blue", "female" = "pink")
))
ra <- rowAnnotation(
df = sig_met$status,
col = list(
"status" =
c("Hypomethylated" = "orange",
"Hypermethylated" = "darkgreen")
),
width = unit(1, "cm")
)
heatmap <- Heatmap(
assay(res_data),
name = "DNA methylation",
col = matlab::jet.colors(200),
show_row_names = FALSE,
cluster_rows = TRUE,
cluster_columns = FALSE,
show_column_names = FALSE,
bottom_annotation = ta,
column_title = "DNA Methylation"
)
# 保存结果
png("~/Downloads/heatmap.png",width = 600, height = 400)
draw(heatmap, annotation_legend_side = "bottom")
dev.off()
模体分析
在识别出了差异甲基化区域之后,我们可能希望能从这些区域中找出某些独特的特征。从这些受到累积或缺失 DNA
甲基化作用影响的位点中识别出候选的转录因子。
模体(motif
)分析的目的是提取隐藏在大部分非功能性基因间序列中的小序列信号,这些小序列核苷酸信号(6-15bp
)可能具有调控基因表达的生物学意义。这些序列被称为调控模体。
我们对差异甲基化区域前后 100
个碱基的序列进行模体分析,然后使用 motifStack
包来生成多个具有不同相似性得分的模体
Bioconductor
中的 rGADEM
包为大规模基因组序列的数据分析提供了一种高效的 de novo
模体识别算法。
#---------------------------
# motif 分析
#---------------------------
library(rGADEM)
library(GenomicRanges)
library(BSgenome.Hsapiens.UCSC.hg19)
library(motifStack)
probes <- rowRanges(res_data)
# 获取差异的探针并设置 200bp 大小的窗口
sequence <- GRanges(
seqnames = as.character(seqnames(probes)),
ranges = IRanges(start = start(ranges(probes)) - 100,
end = start(ranges(probes)) + 100),
strand = "*"
)
# 识别模体
gadem <- GADEM(sequence, verbose = FALSE, genome = Hsapiens)
嗯...很不走运,运行上述代码,并没有找到模体。
# 获取模体的数量
> nMotifs(gadem)
[1] 3
由于我们识别出的位点较少,发现模体的可能性较低,为了让我们能够继续下面的步骤,只能换两种癌型再试试了
我们使用 GBM
和 LGG
两种癌型各十个样本,运行上述代码,首先从 DNA
甲基化均值可以看出这两种癌型的差异具有显著性
而从下面的火山图我们也可以看出差异位点明显增加了很多
从这些差异甲基化位点来寻找模体,看来是很有希望的了
> nMotifs(gadem)
[1] 3
找到了三个,再看看这三个模体出现的次数
> nOccurrences(gadem)
[1] 187 110 143
查看模体的一致性序列
> consensus(gadem)
[1] "nrrAGrrArArrrrrnrArr" "nCTTCCTsn" "sCCCnsmnCCCn"
展示模体 logo
图
pwm <- getPWM(gadem)
pfm <- new("pfm",mat=pwm[[1]],name="Novel Site 1")
plotMotifLogo(pfm)
一个序列的 logo
图展示的是多序列比对之后可能的碱基堆积标记,logo
的高度与序列的保守程度有关,碱基或氨基酸的保守程度越高,字母越高大,每个位置的碱基根据频率从高到低进行堆叠显示,可以从序列的顶端读取一致性序列
序列的 IUPAC codes
对照表
在 rGADEM
获取到结果之后,还可以使用 MotIV
进行模体配对分析
library(MotIV)
# motif 配对分析
> analysis.jaspar <- motifMatch(pwm)
Ungapped Alignment
Scores read
Database read
Motif matches : 5
> summary(analysis.jaspar)
Number of input motifs : 3
Input motifs names : TGGGGTGAGGGGAAGGCGGA TCTTCCTGG CCCCGCCTCCCC
Number of matches per motif: 5
Matches repartition :
SPI1 SPIB ELF5 EWSR1-FLI1 FEV IRF1 IRF2 Klf4 Pax4
2 2 1 1 1 1 1 1 1
PLAG1 SP1 Stat3 TFAP2A
1 1 1 1
Arguments used :
-metric name : PCC
-alignment : SWU
绘制配对分析的结果
plot(analysis.jaspar, ncol=2, top=5, rev=FALSE, main="", bysim=TRUE, cex=0.4)
查看比对结果的质量
> alignment <- viewAlignments(analysis.jaspar)
> print(alignment[[1]])
EWSR1-FLI1 IRF1 SPIB SPI1
seq "NRGAGRNANARRRRNNNARN-" "NRGAGRNANARRRRNNNARN" "NRGAGRNANARRRRNNNARN" "NRGAGRNANARRRRNNNARN"
match "---GGAAGGAAGGAAGGAAGG" "----NAAANYGAAACC----" "-------ASMGGAA------" "---AGGAAGT----------"
evalue "3.0277e-06" "1.4371e-03" "6.4823e-03" "1.5616e-02"
IRF2
seq "NRGAGRNANARRRRNNNARN-"
match "---SGAAAGYGAAASYNWWNN"
evalue "1.9415e-02"