注释是很关键的一步,这几天先把注释完全搞懂。现在有几个问题需要解决:
1、搞清楚不同注释方法(手动、网站、用已发表的文章里面的去注释同一测序样品);
2、如何提取细胞亚群,进行亚群注释
单细胞数据经过降维处理后,得到的tesn和umap图就是根据表达情况,把表达相似的细胞聚在一起(也就是不同的cluster)。注释这一步其实就是给这些表达相似的细胞群起名字。
参考:
【生信纯干货】 生信分析手把手教学 第六课
第五讲-基于Seurat的细胞注释分析
单细胞数据分析系列讲座(三):细胞类型注释
注释原则:
1、手动注释
注释网站 CellMarker
就是先搜索组织 再定位组织里面的细胞 打开之后,给到你某个组织中特定的细胞的 Marker 基因。然后用 Vlnplot 看marker在不同的群里面的特异性表达情况。 然后慢慢筛选、调整。整个过程需要对测序的细胞比较熟悉,尤其是肿瘤细胞。
marker 展示方法:
2、自动注释(内置参考集,也就是celldex包)-人工检查
这一种注释方法比较常用,最常用的是SingleR。使用时,需要下载celldex参考数据包。
使用内置参考进行注释(最简便的)
使用SingleR的最简单方法是使用内置参考对细胞进行注释。celldex包通过专用的检索功能提供了7个参考数据集(主要来自大量RNA-seq或微阵列数据)。
singleR自带的7个参考数据集,需要联网才能下载,其中5个是人类数据,2个是小鼠的数据:
BlueprintEncodeData Blueprint (Martens and Stunnenberg 2013) and Encode (The ENCODE Project Consortium 2012) (人)
DatabaseImmuneCellExpressionData The Database for Immune Cell Expression(/eQTLs/Epigenomics)(Schmiedel et al. 2018)(人)
HumanPrimaryCellAtlasData the Human Primary Cell Atlas (Mabbott et al. 2013)(人)
MonacoImmuneData, Monaco Immune Cell Data - GSE107011 (Monaco et al. 2019)(人)
NovershternHematopoieticData Novershtern Hematopoietic Cell Data - GSE24759(人)
ImmGenData the murine ImmGen (Heng et al. 2008) (鼠)
MouseRNAseqData a collection of mouse data sets downloaded from GEO (Benayoun et al. 2019).鼠)
pred<- SingleR(test = norm_count, #输入表达矩阵
ref = ref, #参考数据
clusters = scRNA$originalexp_snn_res.0.2,
labels = ref$label.main)
head(pred)
table(pred$labels)
scRNA$singleR_cluster = pred$labels[match(scRNA$originalexp_snn_res.0.2,
rownames(pred))]
table(scRNA$singleR_cluster)
3、自动注释(已发表文章作为参考集)-人工检查
前两种注释方法介绍的帖子非常多,这里主要关注一下自己用已发表的文章制作参考集,然后用singleR做注释的方法。 参考复现的是全网介绍最详细的 TOP生物信息 的帖子,参考帖子链接如下:
单细胞辅助注释工具-SingleR
SingleR如何使用自定义的参考集
使用SingleR包进行单细胞类型注释分析
【单细胞】SingleR注释细胞类型
学习对scRNA-seq数据注释的R包SingleR
Lineage-dependent gene expression programs influence the immune landscape of colorectal cancer
先复现TOP菌的代码,然后找一篇文章自己做一次。
演示用到的数据集来自2020年发表在Nature Genetics的一篇结直肠癌研究。文中用到了韩国患者(SMC)和比利时患者(KUL3)两套数据集,两套数据平行分析,相互印证。
TOP菌只取了髓系细胞,用KUL3数据集中的髓系细胞为参考,来注释SMC里面的髓系细胞。我这里用的是全部的细胞做注释。
23例韩国大肠癌患者的单细胞(GSE132465 )
6例比利时大肠癌患者的单细胞(GSE144735)
代码如下:
对应TOP菌的 0.R
library(Seurat)
library(tidyverse)
library(data.table)
setwd(dir="D:/SingleR自定义-TOP-0801")
### 表达数据和注释可以到NCBI下载 ##########
#https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE132465
#https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE144735
#1、这一步是全部的细胞,TOP菌只用了髓系细胞,比利时人KUL3的注释文件
KUL3.anno1=read.table("D:/SingleR自定义-TOP-0801/下载的原始数据/GSE144735_processed_KUL3_CRC_10X_annotation.txt/GSE144735_processed_KUL3_CRC_10X_annotation.txt",header = T,sep = "\t",stringsAsFactors = F)
KUL3.all.anno=KUL3.anno1%>%filter(Cell_subtype!="Unknown" & Cell_subtype!="Proliferating")
#2、读取原始数据 fread和read.table是一样的
mat=fread("D:/SingleR自定义-TOP-0801/下载的原始数据/GSE144735_processed_KUL3_CRC_10X_raw_UMI_count_matrix .txt/GSE144735_processed_KUL3_CRC_10X_raw_UMI_count_matrix.txt")
mat=as.data.frame(mat)
rownames(mat)=mat$Index
mat$Index=NULL
#3、制作KUL3文件
KUL3.all.mat=mat[,KUL3.all.anno$Index]
rm(list = c("KUL3.anno1","mat"))
###################
#4、KUL3的Seurat标准流程
BLS <- CreateSeuratObject(counts = KUL3.all.mat, project = "BLS") %>%
Seurat::NormalizeData() %>%
FindVariableFeatures(selection.method = "vst", nfeatures = 2000) %>%
ScaleData()
BLS <- RunPCA(BLS, npcs = 50, verbose = FALSE)
[email protected]$Index=rownames([email protected])
[email protected]=inner_join([email protected],KUL3.all.anno,by="Index")
rownames([email protected])[email protected]$Index
BLS <- FindNeighbors(BLS, dims = 1:20)
BLS <- FindClusters(BLS, resolution = 0.5)
BLS <- RunUMAP(BLS, dims = 1:20)
BLS <- RunTSNE(BLS, dims = 1:20)
DimPlot(BLS, reduction = "tsne", group.by = "Cell_subtype", pt.size=2)
DimPlot(BLS, reduction = "tsne", group.by = "Class", pt.size=2)
saveRDS(BLS,file = "KUL3_BLS.rds")
#######################
#5、开始做韩国人的,
SMC.anno1=read.table("D:/SingleR自定义-TOP-0801/下载的原始数据/GSE132465_GEO_processed_CRC_10X_cell_annotation.txt/GSE132465_GEO_processed_CRC_10X_cell_annotation.txt",header = T,sep = "\t",stringsAsFactors = F)
SMC.all.anno=SMC.anno1%>%filter(Cell_subtype!="Unknown" & Cell_subtype!="Proliferating")
mat=fread("D:/SingleR自定义-TOP-0801/下载的原始数据/GSE132465_GEO_processed_CRC_10X_raw_UMI_count_matrix .txt/GSE132465_GEO_processed_CRC_10X_raw_UMI_count_matrix.txt",select = c("Index",SMC.all.anno$Index))
mat=as.data.frame(mat)
rownames(mat)=mat$Index
mat$Index=NULL
SMC.all.mat=mat[,SMC.all.anno$Index]
rm(list = c("SMC.anno1","mat")
###################
Han <- CreateSeuratObject(counts = SMC.all.mat, project = "Han") %>%
Seurat::NormalizeData() %>%
FindVariableFeatures(selection.method = "vst", nfeatures = 2000) %>%
ScaleData()
Han <- RunPCA(Han, npcs = 50, verbose = FALSE)
对应TOP菌的 1.R
library(Seurat)
library(tidyverse)
library(SummarizedExperiment)
library(scuttle)
KUL3_BLS=readRDS("KUL3_BLS.rds")
KUL3_BLS_count=KUL3_BLS[["RNA"]]@counts #提取counts矩阵
#准备注释信息
[email protected][,c("Index","Cell_subtype")]
rownames(pdata)=pdata$Index
pdata$Index=NULL
colnames(pdata)="ref_label"
KUL3_BLS_SE <- SummarizedExperiment(assays=list(counts=KUL3_BLS_count),colData = pdata)
KUL3_BLS_SE <- logNormCounts(KUL3_BLS_SE) #Compute log-transformed normalized expression values #参考集一定是logcounts的数据
saveRDS(KUL3_BLS_SE,"KUL3_BLS_SE.ref.rds")
对应TOP菌的 2.R
library(tidyverse)
library(Seurat)
library(SingleR)
library(scuttle)
library(SummarizedExperiment)
KUL3_BLS_SE=readRDS("KUL3_BLS_SE.ref.rds") #导入参考集
SMC_Han=readRDS("SMC_Han.rds") #待查询的数据集,韩国人的
#下面开始是构建待查询数据集的SE对象
SMC_Han_count=SMC_Han[["RNA"]]@counts # 导出表达矩阵counts
# 下面这三行是把带查询和参考数据集 取交集,注释的方法依赖的就是交集基因
common_gene <- intersect(rownames(SMC_Han_count), rownames(KUL3_BLS_SE))
KUL3_BLS_SE <- KUL3_BLS_SE[common_gene,]
SMC_Han_count <- SMC_Han_count[common_gene,]
SMC_Han_SE <- SummarizedExperiment(assays=list(counts=SMC_Han_count)) #创建SE对象
SMC_Han_SE <- logNormCounts(SMC_Han_SE) # 对创建SE对象,做logNormCounts处理
#开始SingleR注释: labels参数的意思是:用参考集里面的说明labels去做注释,
#由于制作的参考集只有ref_label(用$符号就可以看)一个,如果用SingleR自带的包的话,可能有2个、3个labels。例如SingleR的 main大类、fine小类。
singleR_res <- SingleR(test = SMC_Han_SE, ref = KUL3_BLS_SE, labels = KUL3_BLS_SE$ref_label)
anno_df <- as.data.frame(singleR_res$labels) #将labels转换成数据框
anno_df$Index <- rownames(singleR_res) #给数据框加行名
colnames(anno_df)[1] <- 'ref_label_from_KUL3' # 换列名
#把得到的注释信息整合到seurat对象里面
[email protected][email protected]%>%inner_join(anno_df,by="Index") # 属性数据库和anno_df有公共列Index
rownames([email protected])[email protected]$Index #属性数据框是没有行名的,再把Index赋给行名
DimPlot(SMC_Han, reduction = "tsne", group.by = "Cell_subtype", pt.size=2)+
DimPlot(SMC_Han, reduction = "tsne", group.by = "ref_label_from_KUL3", pt.size=2)
最后结果:
可以看到用比利时人KUL3注释的,和作者手动注释的结果差不多。 TOP菌提到的一个很关键的因素就是:比利时人也就是参考集的细胞比较少,然后要注释的韩国人组的细胞多,这样可能不太好。最好是参考集的细胞数比待注释的细胞多情况下比较准确。