单细胞-注释

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

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)

BLS@meta.data$Index=rownames(BLS@meta.data)
BLS@meta.data=inner_join(BLS@meta.data,KUL3.all.anno,by="Index")
rownames(BLS@meta.data)=BLS@meta.data$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矩阵

#准备注释信息
pdata=KUL3_BLS@meta.data[,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对象里面
SMC_Han@meta.data=SMC_Han@meta.data%>%inner_join(anno_df,by="Index")   # 属性数据库和anno_df有公共列Index
rownames(SMC_Han@meta.data)=SMC_Han@meta.data$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比利时人注释的
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容