本文首發于我的個人博客, http://xuzhougeng.top/
往期回顧:
- 使用ArchR分析單細胞ATAC-seq數據(第一章)
- 使用ArchR分析單細胞ATAC-seq數據(第二章)
- 使用ArchR分析單細胞ATAC-seq數據(第三章)
- 使用ArchR分析單細胞ATAC-seq數據(第四章)
- 使用ArchR分析單細胞ATAC-seq數據(第五章)
- 使用ArchR分析單細胞ATAC-seq數據(第六章)
- 使用ArchR分析單細胞ATAC-seq數據(第七章)
- 使用ArchR分析單細胞ATAC-seq數據(第八章)
- 使用ArchR分析單細胞ATAC-seq數據(第九章)
- 使用ArchR分析單細胞ATAC-seq數據(第十章)
- 使用ArchR分析單細胞ATAC-seq數據(第十一章)
第12章 使用ArchR進行motif和特征富集分析
在鑒定到可靠的peak集之后,我們也會想預測有哪些轉錄因子參與了結合事件(binding events),從而產生了這些染色質開放位點。在分析標記peak或差異peak時,這能幫助我們更好的理解為什么某組的peak會富集某一類轉錄因子的結合位點。舉個例子,我們想在細胞特異的染色質開放區域中找到定義譜系的關鍵轉錄因子。同樣,我們也想根據其他已知特征對不同的peak進行富集分析。比如說,我們像知道是否細胞類型A的細胞特異性ATAC-seq peak對于另一組基因組區域(如ChIP-seq peak)也富集。這一章會詳細介紹ArchR中的富集分析原理。
12.1 差異peak中的motif富集
繼續上一章的差異peak分析,我們可以尋找在不同類型細胞富集的peak中的motif。我們需要先將motif的注釋信息加入到我們的ArchRProject
中。我們調用addMotifAnnotations()
函數分析ArchRProject
的peak中是否存在motif。運行結束后會在ArchRProject
對象中加入一個新的二值矩陣,用于判斷peak是否包括motif。
projHeme5 <- addMotifAnnotations(ArchRProj = projHeme5, motifSet = "cisbp", name = "Motif")
接著我們使用上一章差異檢驗得到的markerTest
分析motif的富集情況,這是一個SummarizedExperiment
對象。我們用peakAnnoEnrichments()
函數分析這些差異開放peak是否富集某一類moitf。可以設置cutOff
來過濾peak,例如PDR <= 0.1 & Log2FC >=0.5
記錄的是"Erythroid"比"Progenitor"更開放的peak。
注: peakAnnoEnrichment()
能用于多種差異富集檢驗,在后續章節還會介紹。
motifsUp <- peakAnnoEnrichment(
seMarker = markerTest,
ArchRProj = projHeme5,
peakAnnotation = "Motif",
cutOff = "FDR <= 0.1 & Log2FC >= 0.5"
)
輸出的peakAnnoEnrichment()
是一個SummarizedExperiment
對象,里面存放著多個assays
, 記錄著超幾何檢驗的富集結果。
motifsUp
# class: SummarizedExperiment
# dim: 870 1
# metadata(0):
# assays(10): mlog10Padj mlog10p … CompareFrequency feature
# rownames(870): TFAP2B_1 TFAP2D_2 … TBX18_869 TBX22_870
# rowData names(0):
# colnames(1): Erythroid
# colData names(0):
然后,我們創建一個data.frame
對象用于ggplot
作圖,包括motif名,矯正的p值和顯著性排序。
df <- data.frame(TF = rownames(motifsUp), mlog10Padj = assay(motifsUp)[,1])
df <- df[order(df$mlog10Padj, decreasing = TRUE),]
df$rank <- seq_len(nrow(df))
正如我們所預期的那樣,"Erythroid"里開放的peak富集的motif主要是GATA轉錄因子,符合以往研究中"GATA1"在erythroid分化中發揮的作用。
head(df)
使用ggplot
展示結果,以ggrepel
來標識每個TF motif名。
ggUp <- ggplot(df, aes(rank, mlog10Padj, color = mlog10Padj)) +
geom_point(size = 1) +
ggrepel::geom_label_repel(
data = df[rev(seq_len(30)), ], aes(x = rank, y = mlog10Padj, label = TF),
size = 1.5,
nudge_x = 2,
color = "black"
) + theme_ArchR() +
ylab("-log10(P-adj) Motif Enrichment") +
xlab("Rank Sorted TFs Enriched") +
scale_color_gradientn(colors = paletteContinuous(set = "comet"))
ggUp
通過設置Log2FC <= 0.5
我們可以挑選出在"Progenitor"里更加開放的peak,然后分析其中富集的motif。
motifsDo <- peakAnnoEnrichment(
seMarker = markerTest,
ArchRProj = projHeme5,
peakAnnotation = "Motif",
cutOff = "FDR <= 0.1 & Log2FC <= -0.5"
)
motifsDo
準備繪圖所需數據框
df <- data.frame(TF = rownames(motifsDo), mlog10Padj = assay(motifsDo)[,1])
df <- df[order(df$mlog10Padj, decreasing = TRUE),]
df$rank <- seq_len(nrow(df))
此時,我們會發現在"Progenitor"細胞更加開放的peak中,更多富集RUNX, ELF和CBFB。
head(df)
# TF mlog10Padj rank
# 326 ELF2_326 88.68056 1
# 733 RUNX1_733 64.00586 2
# 801 CBFB_801 53.55426 3
# 732 RUNX2_732 53.14766 4
# 734 ENSG00000250096_734 53.14766 5
# 336 SPIB_336 52.79666 6
使用ggplot
展示結果。
ggDo <- ggplot(df, aes(rank, mlog10Padj, color = mlog10Padj)) +
geom_point(size = 1) +
ggrepel::geom_label_repel(
data = df[rev(seq_len(30)), ], aes(x = rank, y = mlog10Padj, label = TF),
size = 1.5,
nudge_x = 2,
color = "black"
) + theme_ArchR() +
ylab("-log10(FDR) Motif Enrichment") +
xlab("Rank Sorted TFs Enriched") +
scale_color_gradientn(colors = paletteContinuous(set = "comet"))
ggDo
plotFDF()
函數能夠以可編輯的矢量版本保存圖片。
plotPDF(ggUp, ggDo, name = "Erythroid-vs-Progenitor-Markers-Motifs-Enriched", width = 5, height = 5, ArchRProj = projHeme5, addDOC = FALSE)
12.2 標記Peak的motif富集分析
和之前利用差異peak的motif富集分析類似,我們同樣能用getMarkerFeatures()
分析標記peak里富集的motif。
我們向函數peakAnnotationEnrichment()
傳入存放標記peak的SummarizedExperiment
對象,即markersPeaks
enrichMotifs <- peakAnnoEnrichment(
seMarker = markersPeaks,
ArchRProj = projHeme5,
peakAnnotation = "Motif",
cutOff = "FDR <= 0.1 & Log2FC >= 0.5"
)
輸出的peakAnnoEnrichment()
是一個SummarizedExperiment
對象,里面存放著多個assays
, 記錄著超幾何檢驗的富集結果。
enrichMotifs
# class: SummarizedExperiment
# dim: 870 11
# metadata(0):
# assays(10): mlog10Padj mlog10p … CompareFrequency feature
# rownames(870): TFAP2B_1 TFAP2D_2 … TBX18_869 TBX22_870
# rowData names(0):
# colnames(11): B CD4.M … PreB Progenitor
# colData names(0):
直接用plotEnrichHeatmap()
函數繪制不同細胞組的富集的motif。通過設置參數n
限制每個細胞分組中展示的motif。
heatmapEM <- plotEnrichHeatmap(enrichMotifs, n = 7, transpose = TRUE)
使用ComplexHeatmap::draw()
函數展示結果
ComplexHeatmap::draw(heatmapEM, heatmap_legend_side = "bot", annotation_legend_side = "bot")
plotFDF()
函數能夠以可編輯的矢量版本保存圖片。
plotPDF(heatmapEM, name = "Motifs-Enriched-Marker-Heatmap", width = 8, height = 6, ArchRProj = projHeme5, addDOC = FALSE)
12.3 ArchR富集分析
除了分析peak中富集motif, ArchR還能進行個性化的富集分析。為了方便這類數據探索,我們已人工確定了一些特征數據集,它們能比較容易地在我們感興趣的peak區間進行檢驗。我們接下來將會逐個介紹這些特征數據集。該分析最初受LOLA啟發。
12.3.1 Encode TF 結合位點
ENCODE協會已經將TF結合位點(TFBS)匹配到多種細胞類型和因子中。我們可以利用這些TFBS去更好地理解聚類結果。例如,我們可以根據富集結果去判斷未知細胞類型的可能類型。為了能夠使用ENCODE TFBS特征集進行分析,我們需要調用addArchRAnnotations()
函數,設置collection = "EncodeTFBS"
. 和使用addPeakAnnotations()
類似,這會創建一個二值矩陣,記錄我們的標記peak是否和ENCODE TFBS有重疊。
projHeme5 <- addArchRAnnotations(ArchRProj = projHeme5, collection = "EncodeTFBS")
我們接著使用peakAnnoEnrichment()
函數分析這些 ENCODE TFBS是否在我們的peak中富集。
enrichEncode <- peakAnnoEnrichment(
seMarker = markersPeaks,
ArchRProj = projHeme5,
peakAnnotation = "EncodeTFBS",
cutOff = "FDR <= 0.1 & Log2FC >= 0.5"
)
和之前一樣,該函數返回一個SummarizedExperiment
對象。
enrichEncode
# class: SummarizedExperiment
# dim: 689 11
# metadata(0):
# assays(10): mlog10Padj mlog10p … CompareFrequency feature
# rownames(689): 1.CTCF-Dnd41… 2.EZH2_39-Dnd41… …
# 688.CTCF-WERI_Rb_1… 689.CTCF-WI_38…
# rowData names(0):
# colnames(11): B CD4.M … PreB Progenitor
# colData names(0):
我們可以使用plotEnrichHeatmap
函數從富集結果中創建熱圖。
heatmapEncode <- plotEnrichHeatmap(enrichEncode, n = 7, transpose = TRUE)
然后用ComplexHeatmap::draw()
繪制熱圖
ComplexHeatmap::draw(heatmapEncode, heatmap_legend_side = "bot", annotation_legend_side = "bot")
plotFDF()
函數能夠以可編輯的矢量版本保存圖片。
plotPDF(heatmapEncode, name = "EncodeTFBS-Enriched-Marker-Heatmap", width = 8, height = 6, ArchRProj = projHeme5, addDOC = FALSE)
12.3.2 混池ATAC-seq
和ENCODE TFBS類似,我們還可以使用混池ATAC-seq實驗鑒定的peak,分析兩者的重疊情況。通過設置collection="ATAC"
來調用混池ATAC-seqpeak數據集。
projHeme5 <- addArchRAnnotations(ArchRProj = projHeme5, collection = "ATAC")
接著通過設置peakAnnotation = "ATAC"
檢驗我們的標記peak是否富集了混池ATAC-seq的peak。
enrichATAC <- peakAnnoEnrichment(
seMarker = markersPeaks,
ArchRProj = projHeme5,
peakAnnotation = "ATAC",
cutOff = "FDR <= 0.1 & Log2FC >= 0.5"
)
和之前一樣,該函數會輸出SummarizedExperiment
對象,記錄著富集結果
enrichATAC
# class: SummarizedExperiment
# dim: 96 11
# metadata(0):
# assays(10): mlog10Padj mlog10p … CompareFrequency feature
# rownames(96): Brain_Astrocytes Brain_Excitatory_neurons … Heme_MPP
# Heme_NK
# rowData names(0):
# colnames(11): B CD4.M … PreB Progenitor
# colData names(0):
我們用plotEnrichHeatmap()
函數基于SummarizedExperiment
繪制富集熱圖
heatmapATAC <- plotEnrichHeatmap(enrichATAC, n = 7, transpose = TRUE)
使用ComplexHeatmap::draw()
繪制結果
ComplexHeatmap::draw(heatmapATAC, heatmap_legend_side = "bot", annotation_legend_side = "bot")
plotFDF()
函數能夠以可編輯的矢量版本保存圖片。
plotPDF(heatmapATAC, name = "ATAC-Enriched-Marker-Heatmap", width = 8, height = 6, ArchRProj = projHeme5, addDOC = FALSE)
12.3.3 Codex TFBS
相同類型的分析還能用于 CODEX TFBS,只要設置collection = "Codex"
即可
projHeme5 <- addArchRAnnotations(ArchRProj = projHeme5, collection = "Codex")
enrichCodex <- peakAnnoEnrichment(
seMarker = markersPeaks,
ArchRProj = projHeme5,
peakAnnotation = "Codex",
cutOff = "FDR <= 0.1 & Log2FC >= 0.5"
)
heatmapCodex <- plotEnrichHeatmap(enrichCodex, n = 7, transpose = TRUE)
ComplexHeatmap::draw(heatmapCodex, heatmap_legend_side = "bot", annotation_legend_side = "bot")
于是我們就保存圖片了
plotPDF(heatmapCodex, name = "Codex-Enriched-Marker-Heatmap", width = 8, height = 6, ArchRProj = projHeme5, addDOC = FALSE)
12.4 自定義富集
除了之前這些經過人工審核的注釋數據集,ArchR還能處理用戶自定義注釋信息來執行富集分析。接下來,我們會介紹如何根據ENCODE ChIP-seq實驗來創建自定義的注釋信息。
首先,我們先提供后續將被使用并下載的數據集,也可以提供本地文件。
EncodePeaks <- c(
Encode_K562_GATA1 = "https://www.encodeproject.org/files/ENCFF632NQI/@@download/ENCFF632NQI.bed.gz",
Encode_GM12878_CEBPB = "https://www.encodeproject.org/files/ENCFF761MGJ/@@download/ENCFF761MGJ.bed.gz",
Encode_K562_Ebf1 = "https://www.encodeproject.org/files/ENCFF868VSY/@@download/ENCFF868VSY.bed.gz",
Encode_K562_Pax5 = "https://www.encodeproject.org/files/ENCFF339KUO/@@download/ENCFF339KUO.bed.gz"
)
然后,我們用addPeakAnnotation()
函數在ArchRProject
函數中增加自定義注釋。我們這里將其命名為"ChIP"
projHeme5 <- addPeakAnnotations(ArchRProj = projHeme5, regions = EncodePeaks, name = "ChIP")
和之前一樣,我們使用peakAnnoEnrichment()
函數根據自定義的注釋信息執行peak注釋富集分析
enrichRegions <- peakAnnoEnrichment(
seMarker = markersPeaks,
ArchRProj = projHeme5,
peakAnnotation = "ChIP",
cutOff = "FDR <= 0.1 & Log2FC >= 0.5"
)
并以相同的步驟生成注釋熱圖。
heatmapRegions <- plotEnrichHeatmap(enrichRegions, n = 7, transpose = TRUE)
ComplexHeatmap::draw(heatmapRegions, heatmap_legend_side = "bot", annotation_legend_side = "bot")
plotFDF()
函數能夠以可編輯的矢量版本保存圖片。
plotPDF(heatmapRegions, name = "Regions-Enriched-Marker-Heatmap", width = 8, height = 6, ArchRProj = projHeme5, addDOC = FALSE)