本文首發(fā)于我的個人博客, http://xuzhougeng.top/
往期回顧:
- 使用ArchR分析單細(xì)胞ATAC-seq數(shù)據(jù)(第一章)
- 使用ArchR分析單細(xì)胞ATAC-seq數(shù)據(jù)(第二章)
- 使用ArchR分析單細(xì)胞ATAC-seq數(shù)據(jù)(第三章)
- 使用ArchR分析單細(xì)胞ATAC-seq數(shù)據(jù)(第四章)
- 使用ArchR分析單細(xì)胞ATAC-seq數(shù)據(jù)(第五章)
第6章: 單細(xì)胞嵌入
在ArchR中,類似于UMAP和t-SNE的嵌入方法被用于在降維空間中可視化展示單細(xì)胞數(shù)據(jù)。這些嵌入有各自的優(yōu)勢和缺陷。我們之所以稱它們?yōu)?嵌入"是因為他們只限于對聚類進(jìn)行可視化而非用于鑒定聚類(在LSI子空間中的聚類分析)。UMAP和t-SNE的主要區(qū)別在于對細(xì)胞和聚類間的距離解釋,t-SNE用于保留數(shù)據(jù)的局部結(jié)構(gòu),而UMAP則是保留局部結(jié)構(gòu)的同時盡可能保留全局結(jié)構(gòu)。從理論上來講,UMAP中細(xì)胞聚類間的距離存在意義,而t-SNE則沒有。也就是說,你不能說t-SNE中聚類A比聚類C更接近聚類B,而UMAP在設(shè)計的時候允許這種類型的比較。不過需要注意的是,由于UMAP是新出現(xiàn)的方法,因此使用UMAP的文章才剛剛興起。
需要注意的是,無論是UMAP還是t-SNE,兩個的運行結(jié)果都不是確定性的,也就是相同輸入會得到不完全相同的結(jié)果。盡管如此,我們使用樣本重復(fù)后發(fā)現(xiàn)t-SNE比UMAP更加的隨機。此外,使用uwot包里UMAP時,設(shè)置相同的隨機數(shù)種子會得到相同的結(jié)果。選擇使用UMAP還是t-SNE是有細(xì)微差別的,但在我們手中,UMAP非常適合各種應(yīng)用,這是我們對scATAC seq數(shù)據(jù)的標(biāo)準(zhǔn)選擇。UMAP的性能也比t-SNE快。也許最重要的是,使用UMAP可以創(chuàng)建一個嵌入并將新樣本投影到該嵌入中,而這在t-SNE中是不可能的,因為數(shù)據(jù)的擬合和預(yù)測是同時發(fā)生的。
無論您選擇哪種方法,輸入?yún)?shù)都會對結(jié)果嵌入產(chǎn)生劇烈影響。因此,了解各種輸入?yún)?shù)并調(diào)整這些參數(shù)以最好地滿足您自己的數(shù)據(jù)需要是很重要的。ArchR實現(xiàn)了一組默認(rèn)的輸入?yún)?shù),這些參數(shù)適用于大多數(shù)情況,但實際上沒有一組參數(shù)可以直接套用,我們要根據(jù)不同的細(xì)胞數(shù)、復(fù)雜度和質(zhì)量進(jìn)行調(diào)整。
6.1 Uniform Manifold Approximation and Projection (UMAP)
我們使用addUMAP函數(shù)運行UMAP
projHeme2 <- addUMAP(
ArchRProj = projHeme2,
reducedDims = "IterativeLSI",
name = "UMAP",
nNeighbors = 30,
minDist = 0.5,
metric = "cosine"
)
使用@操作符可以從ArchRProject中列出有哪些可用的embedding,如projHeme2@embeddings
我們使用plotEmbedding函數(shù)繪制UMAP圖,設(shè)置embedding="UMAP"。通過修改colorBy和name來告訴ArchR使用給定哪個元信息矩陣的列對細(xì)胞進(jìn)行上色。p1是按照樣本進(jìn)行上色
p1 <- plotEmbedding(ArchRProj = projHeme2, colorBy = "cellColData", name = "Sample", embedding = "UMAP")
除了根據(jù)"Sample"外,我們還可以根據(jù)上一張鑒定的"Cluster"進(jìn)行上色
p2 <- plotEmbedding(ArchRProj = projHeme2, colorBy = "cellColData", name = "Clusters", embedding = "UMAP")
使用ggAlignPlots將這兩個圖共同展示,"type=h"表示兩個圖是水平排列
ggAlignPlots(p1, p2, type = "h")

用plotPDF()可以將保存圖片的矢量版。
plotPDF(p1,p2, name = "Plot-UMAP-Sample-Clusters.pdf", ArchRProj = projHeme2, addDOC = FALSE, width = 5, height = 5)
我們還可以使用plotEmbedding()可視化之前用scran聚類的結(jié)果
p1 <- plotEmbedding(ArchRProj = projHeme2, colorBy = "cellColData", name = "Sample", embedding = "UMAP")
p2 <- plotEmbedding(ArchRProj = projHeme2, colorBy = "cellColData", name = "ScranClusters", embedding = "UMAP")
ggAlignPlots(p1, p2, type = "h")

同樣用plotPDF()可以將保存圖片的矢量版。
plotPDF(p1,p2, name = "Plot-UMAP-Sample-ScranClusters.pdf", ArchRProj = projHeme2, addDOC = FALSE, width = 5, height = 5)
6.2 t-Stocastic Neighbor Embedding (t-SNE)
t-SNE圖可以用addTSNE()函數(shù)運行得到
projHeme2 <- addTSNE(
ArchRProj = projHeme2,
reducedDims = "IterativeLSI",
name = "TSNE",
perplexity = 30
)
和之前UMAP一樣,我們同樣使用plotEmbedding()繪制t-SNE嵌入圖。這里不需要考慮嵌入的類型,可以繼續(xù)使用之前的colorBy和name參數(shù)
p1 <- plotEmbedding(ArchRProj = projHeme2, colorBy = "cellColData", name = "Sample", embedding = "TSNE")
p2 <- plotEmbedding(ArchRProj = projHeme2, colorBy = "cellColData", name = "Clusters", embedding = "TSNE")
ggAlignPlots(p1, p2, type = "h")

用plotPDF()可以將保存圖片的矢量版。
plotPDF(p1,p2, name = "Plot-TSNE-Sample-Clusters.pdf", ArchRProj = projHeme2, addDOC = FALSE, width = 5, height = 5)
和之前UMAP的操作類似,我們可以將scran的結(jié)果和Seurat::FindClusters()的結(jié)果進(jìn)行比較
p1 <- plotEmbedding(ArchRProj = projHeme2, colorBy = "cellColData", name = "Sample", embedding = "TSNE")
p2 <- plotEmbedding(ArchRProj = projHeme2, colorBy = "cellColData", name = "ScranClusters", embedding = "TSNE")
ggAlignPlots(p1, p2, type = "h")

用plotPDF()可以將保存圖片的矢量版。
plotPDF(p1,p2, name = "Plot-tSNE-Sample-ScranClusters.pdf", ArchRProj = projHeme2, addDOC = FALSE, width = 5, height = 5)
6.3 Harmony后降維
在第4章中,我們通過addHarmony調(diào)用Harmony對數(shù)據(jù)進(jìn)行批次校正,創(chuàng)建了一個名為"Harmony"的reducedDims對象。我們通過UMAP或t-SNE對結(jié)果進(jìn)行嵌入可視化,對迭代LSI結(jié)果和Harmony校正結(jié)果進(jìn)行比較,評估Harmony的作用。
保持和之前UMAP嵌入一樣的參數(shù),只修改reducedDims="Harmony"
projHeme2 <- addUMAP(
ArchRProj = projHeme2,
reducedDims = "Harmony",
name = "UMAPHarmony",
nNeighbors = 30,
minDist = 0.5,
metric = "cosine"
)
p3 <- plotEmbedding(ArchRProj = projHeme2, colorBy = "cellColData", name = "Sample", embedding = "UMAPHarmony")
p4 <- plotEmbedding(ArchRProj = projHeme2, colorBy = "cellColData", name = "Clusters", embedding = "UMAPHarmony")
ggAlignPlots(p3, p4, type = "h")

用plotPDF()可以將保存圖片的矢量版。
plotPDF(p1,p2,p3,p4, name = "Plot-UMAP2Harmony-Sample-Clusters.pdf", ArchRProj = projHeme2, addDOC = FALSE, width = 5, height = 5)
相同的方法用t-SNE進(jìn)行可視化
projHeme2 <- addTSNE(
ArchRProj = projHeme2,
reducedDims = "Harmony",
name = "TSNEHarmony",
perplexity = 30
)
p3 <- plotEmbedding(ArchRProj = projHeme2, colorBy = "cellColData", name = "Sample", embedding = "TSNEHarmony")
p4 <- plotEmbedding(ArchRProj = projHeme2, colorBy = "cellColData", name = "Clusters", embedding = "TSNEHarmony")
ggAlignPlots(p3, p4, type = "h")

用plotPDF()可以將保存圖片的矢量版。
plotPDF(p1,p2,p3,p4, name = "Plot-TSNE2Harmony-Sample-Clusters.pdf", ArchRProj = projHeme2, addDOC = FALSE, width = 5, height = 5)