Cell Type annotation---Cell-ID篇

Cell-ID发表在NBT上面:Genesignature extraction and cell identity recognition at the single-cell levelwith Cell-ID。

最近我看了很多细胞类型注释的思路。在谈到自动注释时,又基于marker gene的方法,例如scCATCH,SCCA等前面都介绍过了。还有基于相关性也就是elation分析的,例如SingleR等。还有基于机器学习的,例如Garnett,ACTINN,srClassify等。类似的软件还有很多,原理上可能五花八门。很多软件在做注释时会基于某个细胞和参考细胞表达谱的相似性,今天看到的这个软件使用的是另一种思路:将某个细胞的特征基因集与表征细胞类型的参考基因集做富集分析,当在某个细胞类型的基因集上显著富集时,就定义为这个细胞类型(和GO富集很像)。所以这种方法的关键点是:找单个细胞的特征基因集,以及找细胞类型的参考基因集。

==安装====

devtools::install_github("RausellLab/CelliD",ref = "legacy")

==例子测试==

library(CellID)

library(Seurat)

library(tidyverse)

 

#获取原始表达矩阵

BaronMatrix   <-readRDS(url("https://storage.googleapis.com/cellid-cbl/BaronMatrix.rds"))

//也可以下载其它几组数据

BaronMetaData <- readRDS("BaronMetaData.rds")

SegerMatrix   <- readRDS("SegerstolpeMatrix.rds")

SegerMetaData <- readRDS("SegerstolpeMetaData2.rds")

#仅考虑编码蛋白质的基因

data("HgProteinCodingGenes")

BaronMatrixProt <- BaronMatrix[rownames(BaronMatrix) %in% HgProteinCodingGenes,]

SegerMatrixProt <- SegerMatrix[rownames(SegerMatrix) %in% HgProteinCodingGenes,]

 

#这几步类似Seurat的标准流程

Baron <- CreateSeuratObject(counts = BaronMatrixProt, project = "Baron", min.cells = 5, meta.data = BaronMetaData)

Seger <- CreateSeuratObject(counts = SegerMatrixProt, project = "Segerstolpe", min.cells = 5, meta.data = SegerMetaData)

Baron <- NormalizeData(Baron)

Baron <- ScaleData(Baron, features = rownames(Baron))

Baron <- RunMCA(Baron) //#该软件的主要分析函数,将细胞和基因同时降维到一个空间,离细胞近的基因被定义为细胞的特征基因

DimPlotMC(Baron, reduction = "mca", group.by = "cell.type", features = c("CTRL", "INS", "MYZAP", "CDH11"), as.text = TRUE) + ggtitle("MCA with some key gene markers") 

//还可以将MCA的结果和PCA,UMAP以及TSNE做对比

Baron <- RunPCA(Baron, features = rownames(Baron))

Baron <- RunUMAP(Baron, dims = 1:30)

Baron <- RunTSNE(Baron, dims = 1:30)

PCA  <- DimPlot(Baron, reduction = "pca", group.by = "cell.type")  + ggtitle("PCA") + theme(legend.text = element_text(size =10), aspect.ratio = 1)

tSNE <- DimPlot(Baron, reduction = "tsne", group.by = "cell.type")+ ggtitle("tSNE") + theme(legend.text = element_text(size =10), aspect.ratio = 1)

UMAP <- DimPlot(Baron, reduction = "umap", group.by = "cell.type") + ggtitle("UMAP") + theme(legend.text = element_text(size =10), aspect.ratio = 1)

MCA <- DimPlot(Baron, reduction = "mca", group.by = "cell.type")  + ggtitle("MCA") + theme(legend.text = element_text(size =10), aspect.ratio = 1)

ggarrange(PCA, MCA, common.legend = TRUE, legend = "top")

ggarrange(tSNE, UMAP, common.legend = TRUE, legend = "top")

同样的,cell-ID也可以利用预先知道的marker集合。

下载参考基因集

panglao <-read_tsv("https://panglaodb.se/markers/PanglaoDB_markers_27_Mar_2020.tsv.gz")

#根据器官过滤,示例数据就是胰腺的

panglao_pancreas <- panglao %>%filter(organ == "Pancreas")

#物种包含人

panglao_pancreas <- panglao_pancreas%>%  filter(str_detect(species,"Hs"))

#下面两步会得到一个列表,列表的每一个元素是由基因集构成的字符向量,且每个元素被命名为对应的细胞类型的名字

panglao_pancreas <- panglao_pancreas%>% 

 group_by(`cell type`) %>% 

 summarise(geneset = list(`official gene symbol`))

pancreas_gs <-setNames(panglao_pancreas$geneset, panglao_pancreas$`cell type`)

得到的相当于每个cell中的marker gene list

#富集分析,用的超几何检验

HGT_pancreas_gs <- RunCellHGT(Baron,pathways = pancreas_gs, dims = 1:50, n.features = 200) #每个细胞选200个特征基因

富集分析之后会返回一个矩阵,矩阵中的每一个值表示p值在校正之后,求-log10,即-log10 corrected p-value,当然这个值越大越好。

pancreas_gs_prediction <-rownames(HGT_pancreas_gs)[apply(HGT_pancreas_gs, 2, which.max)]

#矩阵的每一列依次:判断是否是最大值,得到一列布尔值,结合矩阵的行名会返回行名中的一个元素(也就是最有可能的细胞类型)。

#所有列运行完了之后会得到所有细胞最可能的注释

pancreas_gs_prediction_signif <-ifelse(apply(HGT_pancreas_gs, 2, max)>2, yes = pancreas_gs_prediction,"unassigned")

#如果`-log10 correctedp-value`的值小于等于2,则认为不显著,注释更正为"unassigned"

Baron$pancreas_gs_prediction <-pancreas_gs_prediction_signif

所以到此,细胞类型的预测就结束了。

color <- c("#F8766D", "#E18A00", "#BE9C00", "#8CAB00", "#24B700", "#00BE70", "#00C1AB", "#00BBDA", "#00ACFC", "#8B93FF", "#D575FE", "#F962DD", "#FF65AC", "grey")

ggcolor <- setNames(color,c(sort(unique(Baron$cell.type)), "unassigned"))

OriginalPlot <- DimPlot(Baron, reduction = "tsne", group.by = "cell.type") + 

  scale_color_manual(values = ggcolor) + 

  theme(legend.text = element_text(size =10), aspect.ratio = 1)

Predplot1 <- DimPlot(Baron, reduction = "tsne", group.by = "pancreas_gs_prediction") + 

  scale_color_manual(values = ggcolor) + 

  theme(legend.text = element_text(size =10), aspect.ratio = 1)

ggarrange(OriginalPlot, Predplot1, legend = "top",common.legend = TRUE)

//可以把原先注释的和现在注释的做个对比,可以看出准确率还是可以的

//还可以试下用库中所有的marker,而不是挑选的Pancreas子集。

HGT_all_gs <- RunCellHGT(Baron, pathways = all_gs, dims = 1:50)

all_gs_prediction <- rownames(HGT_all_gs)[apply(HGT_all_gs, 2, which.max)]

all_gs_prediction_signif <- ifelse(apply(HGT_all_gs, 2, max)>2, yes = all_gs_prediction, "unassigned")

Baron$all_gs_prediction <- ifelse(all_gs_prediction_signif %in% c(names(pancreas_gs), "Schwann cells", "Endothelial cells", "Macrophages", "Mast cells", "T cells","Fibroblasts", "unassigned"), all_gs_prediction_signif,"other")

color <- c("#F8766D", "#E18A00", "#BE9C00", "#8CAB00", "#24B700", "#00BE70", "#00C1AB", "#00BBDA", "#00ACFC", "#8B93FF", "#D575FE", "#F962DD", "#FF65AC", "#D575FE", "#F962DD", "grey", "black")

ggcolor <- setNames(color,c(sort(unique(Baron$cell.type)), "Fibroblasts", "Schwann cells", "unassigned", "other"))

Baron$pancreas_gs_prediction <- factor(Baron$pancreas_gs_prediction,c(sort(unique(Baron$cell.type)), "Fibroblasts", "Schwann cells", "unassigned", "other"))

PredPlot2 <- DimPlot(Baron, group.by = "all_gs_prediction", reduction = "tsne") + 

             scale_color_manual(values = ggcolor, drop = FALSE) + 

             theme(legend.text = element_text(size = 10), aspect.ratio = 1)

ggarrange(OriginalPlot, PredPlot2, legend = "top", common.legend = TRUE)

//效果还是不如指定organ的好

做过GO或者pathway的人能体会的,参考GO库和pathway库的重要性。因此,可以看出这个方法非常依赖于PanglaoDB的准确性。但是对于不知道类型的cluster就比较方便,可以像GO一样推测可能的细胞类型。

本文使用 文章同步助手 同步

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,348评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,122评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,936评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,427评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,467评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,785评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,931评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,696评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,141评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,483评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,625评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,291评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,892评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,741评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,324评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,492评论 2 348

推荐阅读更多精彩内容