SingleR如何使用自定義的參考集


在我之前的帖子單細胞分析實錄(7): 差異表達分析/細胞類型注釋里面,我已經介紹了如何使用SingleR給單細胞數據做注釋,當時只講了SingleR配套的參考集。這次就講講如何使用自己定義/找到的基因集做注釋,使用場景還是比較多的,比如想根據某篇論文里面的注釋結果,給自己的數據做注釋。本文配套的視頻講解已上傳到B站,新手UP: TOP菌。gongzhong號后台回復20211023可獲取本文所用到的示例數據和代碼。

本次演示用到的數據集來自2020年發表在Nature Genetics的一篇結直腸癌研究。文中用到了韓國患者(SMC)和比利時患者(KUL3)兩套數據集,兩套數據平行分析,相互印證。

我以里面的髓系細胞為例,用KUL3數據集中的髓系細胞為參考,來注釋SMC里面的髓系細胞

兩套數據集中髓系細胞部分的數據,已經跑完Seurat標准流程並整理成rds文件:SMC_mye.rdsKUL3_mye.rds。代碼存放在0.R中,這里就不展示了,很簡單。代碼中fread()用於快速讀取4G矩陣文件是可以學習的地方。

mat=fread("GSE132465_GEO_processed_CRC_10X_raw_UMI_count_matrix.txt",select = c("Index",SMC.mye.anno$Index))

之后就是創建參考集,被存儲為SummarizedExperiment對象

library(Seurat)
library(tidyverse)
library(SummarizedExperiment)
library(scuttle)

KUL3_mye=readRDS("KUL3_mye.rds")

屬性數據框中主要用到cell index和cell annotation這兩個信息,此外還需導入表達矩陣

KUL3_mye_count=KUL3_mye[["RNA"]]@counts

pdata=KUL3_mye@meta.data[,c("Index","Cell_subtype")]
rownames(pdata)=pdata$Index
pdata$Index=NULL
colnames(pdata)="ref_label"

KUL3_mye_SE <- SummarizedExperiment(assays=list(counts=KUL3_mye_count),colData = pdata) 
#創建SummarizedExperiment對象

KUL3_mye_SE <- logNormCounts(KUL3_mye_SE) 
#Compute log-transformed normalized expression values,要有這一行,對於單細胞數據normalize之后會再算一個log
saveRDS(KUL3_mye_SE,"KUL3_mye_SE.ref.rds")

log normalize之后就多了一個logcounts的assay,singleR的官網示例都是基於logcounts這種數據

將這個參考對象保存為rds文件,方便以后多次調用

現在導入我們的待注釋數據集和參考數據集

library(tidyverse)
library(Seurat)
library(SingleR)
library(scuttle)
library(SummarizedExperiment)

KUL3_mye_SE=readRDS("KUL3_mye_SE.ref.rds")
SMC_mye=readRDS("SMC_mye.rds")
SMC_mye_count=SMC_mye[["RNA"]]@counts

#需要取不同數據集的基因交集
common_gene <- intersect(rownames(SMC_mye_count), rownames(KUL3_mye_SE))
KUL3_mye_SE <- KUL3_mye_SE[common_gene,]
SMC_mye_count <- SMC_mye_count[common_gene,]

#也要創建SummarizedExperiment對象,以及log normalize
SMC_mye_SE <- SummarizedExperiment(assays=list(counts=SMC_mye_count))
SMC_mye_SE <- logNormCounts(SMC_mye_SE)

#注釋代碼
singleR_res <- SingleR(test = SMC_mye_SE, ref = KUL3_mye_SE, labels = KUL3_mye_SE$ref_label)
#導出注釋結果
anno_df <- as.data.frame(singleR_res$labels)
anno_df$Index <- rownames(singleR_res)
colnames(anno_df)[1] <- 'ref_label_from_KUL3'

#將注釋信息添加到Seurat對象
SMC_mye@meta.data=SMC_mye@meta.data%>%inner_join(anno_df,by="Index")
rownames(SMC_mye@meta.data)=SMC_mye@meta.data$Index
DimPlot(SMC_mye, reduction = "tsne", group.by = "Cell_subtype", pt.size=2)+
DimPlot(SMC_mye, reduction = "tsne", group.by = "ref_label_from_KUL3", pt.size=2)

左圖是原文給的注釋,右圖是依據KUL3來注釋SMC數據集,可以看出還是有一些不一致的。

像這種依據某個參考集來做注釋,對參考集質量要求很高,原文KUL3只有兩千髓系細胞,考慮到10X單細胞數據的稀疏性,這個數量是不夠的。也可能是軟件的限制,在做小類注釋時,類與類之間的表達特征其實是比較相似的,軟件不一定能精確給出合適的label,相比之下,軟件做大類注釋一般比較准。

因水平有限,有錯誤的地方,歡迎批評指正!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM