8. 聚類Clustering
預處理和可視化使我們能夠描述我們的scRNA-seq數(shù)據(jù)集并降低其維度褂微。到目前為止,我們嵌入并可視化了細胞以了解數(shù)據(jù)集的基礎(chǔ)屬性园爷。然而宠蚂,它們的定義仍然相當抽象。單細胞分析的下一個步驟是識別數(shù)據(jù)集中的細胞結(jié)構(gòu)童社。
在scRNA-seq數(shù)據(jù)分析中求厕,我們通過查找與已知細胞狀態(tài)或細胞周期階段相關(guān)的細胞身份來描述數(shù)據(jù)集中的細胞結(jié)構(gòu)。這個過程通常稱為細胞身份注釋扰楼。為此呀癣,我們將細胞組織成簇,以推斷相似細胞的身份弦赖。聚類本身是一個常見的無監(jiān)督機器學習問題项栏。我們可以通過最小化表達空間中的簇內(nèi)距離來導出簇。在這種情況下蹬竖,表達空間決定了細胞相對于降維表示的基因表達相似性沼沈。例如,這種較低維度的表示是通過主成分分析確定的币厕,然后基于歐幾里德距離進行相似性評分列另。
在k最近鄰(KNN)圖中,節(jié)點反映數(shù)據(jù)集中的細胞旦装。我們首先在PC(主成分)縮減表達空間上計算所有細胞的歐幾里德距離矩陣页衙,然后將每個細胞連接到其K個最相似的細胞。通常同辣,K設(shè)置為5到100之間的值拷姿,具體取決于數(shù)據(jù)集的大小。KNN圖通過圖中的密集連接區(qū)域來反映表達數(shù)據(jù)的基礎(chǔ)拓撲結(jié)構(gòu)旱函。KNN圖中的密集區(qū)域是通過Leiden和Louvain等community檢測方法實現(xiàn)响巢。
Leiden算法是Louvain算法的改進版本,在單細胞RNA-seq數(shù)據(jù)分析方面優(yōu)于其他聚類方法棒妨。由于Louvain算法不再維護踪古,因此首選使用Leiden含长。
因此,我們建議在單細胞k最近鄰(KNN)圖上使用Leiden算法來對單細胞數(shù)據(jù)集進行聚類伏穆。
Leiden通過考慮簇中細胞之間的鏈接數(shù)量與數(shù)據(jù)集中的總體預期鏈接數(shù)量來創(chuàng)建簇拘泞。
起點是一個單例分區(qū)砾赔,其中每個節(jié)點都充當自己的社區(qū)(a)蝌箍。下一步,該算法通過將單個節(jié)點從一個社區(qū)移動到另一個社區(qū)來創(chuàng)建分區(qū)(b)暴心,隨后進行細化以增強分區(qū)(c)妓盲。然后將細化的分區(qū)聚合到網(wǎng)絡(luò)(d)。隨后酷勺,算法再次移動聚合網(wǎng)絡(luò)中的各個節(jié)點(e)本橙,直到細化不再改變分區(qū)(f)。 重復所有步驟脆诉,直到創(chuàng)建最終的聚類并且分區(qū)不再發(fā)生變化甚亭。
Leiden模塊具有分辨率參數(shù),可以確定分區(qū)簇的規(guī)模击胜,從而確定聚類的粗糙度亏狰。更高分辨率的參數(shù)會導致更多的簇。該算法還允許通過對KNN圖進行子設(shè)置來對數(shù)據(jù)集中的特定聚類進行有效的子聚類偶摔。子聚類使用戶能夠識別聚類內(nèi)的細胞類型特定狀態(tài)或更精細的細胞類型標記暇唾,但也可能導致僅由于數(shù)據(jù)中存在的噪聲而產(chǎn)生的結(jié)果。
前面提到辰斋,Leiden算法是在scanpy中實現(xiàn)的策州。
import scanpy as sc
sc.settings.verbosity = 0
sc.settings.set_figure_params(dpi=80, facecolor="white", frameon=False)
8.1 聚類人類骨髓來源細胞
首先,我們加載數(shù)據(jù)集宫仗。 我們對來自我們已經(jīng)預處理的NeurIPS人類骨髓數(shù)據(jù)集的預處理樣本site4-donor8
進行聚類够挂。
該數(shù)據(jù)集使用log1pPF、scran和scTransform 進行標準化藕夫。我們將按照預處理章節(jié)中的建議重點關(guān)注本筆記本中數(shù)據(jù)集的scran標準化版本孽糖,以更好地識別單個細胞的狀態(tài)枯冈。
adata = sc.read("s4d8_subset_gex.h5ad")
我們可以使用scanpy函數(shù)sc.pp.neighbors
計算低維基因表達表示的KNN圖。我們在前30個主成分上調(diào)用此函數(shù)办悟,因為它們捕獲了數(shù)據(jù)集中的大部分方差尘奏。
可視化聚類可以幫助我們理解結(jié)果,因此我們將細胞嵌入到UMAP中病蛉。有關(guān)UMAP可視化的更多信息可以在可視化部分找到炫加。
sc.pp.neighbors(adata, n_pcs=30)
sc.tl.umap(adata)
輸出結(jié)果:
/Users/anna.schaar/opt/miniconda3/envs/bp_pp/lib/python3.8/site-packages/tqdm/auto.py:22: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html
from .autonotebook import tqdm as notebook_tqdm
OMP: Info #276: omp_set_nested routine deprecated, please use omp_set_max_active_levels instead.
我們現(xiàn)在可以調(diào)用Leiden算法。
sc.tl.leiden(adata)
scanpy中默認的分辨率參數(shù)是1.0铡恕。然而琢感,在許多情況下,分析人員可能希望嘗試不同的分辨率參數(shù)來控制聚類的粗糙度探熔。因此,我們建議將聚類結(jié)果保存烘挫。
sc.tl.leiden(adata, key_added="leiden_res0_25", resolution=0.25)
sc.tl.leiden(adata, key_added="leiden_res0_5", resolution=0.5)
sc.tl.leiden(adata, key_added="leiden_res1", resolution=1.0)
我們現(xiàn)在可視化在不同分辨率下使用萊頓算法獲得的不同聚類結(jié)果诀艰。正如我們所看到的,分辨率很大程度上影響了我們的聚類的粗略程度饮六。較高的分辨率參數(shù)會導致更多的社區(qū)其垄,即更多的識別簇,而較低的分辨率參數(shù)會導致更少的社區(qū)卤橄。因此绿满,分辨率參數(shù)控制算法將KNN嵌入中的聚類區(qū)域分組在一起的密度。這對于注釋集群變得尤其重要窟扑。
sc.pl.umap(
adata,
color=["leiden_res0_25", "leiden_res0_5", "leiden_res1"],
legend_loc="on data",
)
我們現(xiàn)在可以清楚地檢查不同分辨率對聚類結(jié)果的影響喇颁。對于0.25的分辨率,聚類更加粗糙嚎货,算法檢測到的社區(qū)也更少橘霎。此外,與分辨率為1.0 時獲得的聚類相比殖属,聚類區(qū)域的密度較低姐叁。
我們想再次強調(diào),必須謹慎解釋顯示的簇之間的距離洗显。由于UMAP嵌入是二維的外潜,因此不一定能很好地捕獲所有點之間的距離。我們建議不要解釋UMAP嵌入上可視化的簇之間的距離挠唆。