单细胞-注释

注释是很关键的一步,这几天先把注释完全搞懂。现在有几个问题需要解决:

1、搞清楚不同注释方法(手动、网站、用已发表的文章里面的去注释同一测序样品);
2、如何提取细胞亚群,进行亚群注释

单细胞数据经过降维处理后,得到的tesn和umap图就是根据表达情况,把表达相似的细胞聚在一起(也就是不同的cluster)。注释这一步其实就是给这些表达相似的细胞群起名字。

参考:

【生信纯干货】 生信分析手把手教学 第六课
第五讲-基于Seurat的细胞注释分析
单细胞数据分析系列讲座(三):细胞类型注释


注释原则:

image.png

image.png

image.png

1、手动注释

注释网站 CellMarker
就是先搜索组织 再定位组织里面的细胞 打开之后,给到你某个组织中特定的细胞的 Marker 基因。然后用 Vlnplot 看marker在不同的群里面的特异性表达情况。 然后慢慢筛选、调整。整个过程需要对测序的细胞比较熟悉,尤其是肿瘤细胞。

marker 展示方法:


image.png

image.png

image.png

image.png

image.png

image.png

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菌的代码,然后找一篇文章自己做一次。


image.png

演示用到的数据集来自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菌提到的一个很关键的因素就是:比利时人也就是参考集的细胞比较少,然后要注释的韩国人组的细胞多,这样可能不太好。最好是参考集的细胞数比待注释的细胞多情况下比较准确。

还有一个要解决的问题就是:看了很多帖子说可以同时参考几个参考集,然后去注释,这样更准确。但是没找到详细的参考资料。

作者手动注释的图
用KUL3比利时人注释的

你可能感兴趣的:(单细胞-注释)