单细胞自动注释之Garnett

在使用Seurat包得到降维聚类分群的结果后,就可以对数据进行注释了。Garnett是Cole Trapnell 实验室实验室开发的自动注释R包,使用机器学习算法来预测细胞类型,可以支持训练自己的分类器。

本文的步骤是:加载数据,创建CDS对象,数据预处理,根据自己的marker基因训练分类器,对细胞进行注释,并可视化结果。

代码主要来自官网https://cole-trapnell-lab.github.io/garnett/

1.R包和数据

library(Seurat)
library(tidyverse)
library(patchwork)
library(org.Hs.eg.db)
library(garnett)

这是一个Seurat对象,是先前由Seurat包执行标准流程所得到的,我使用的的示例数据可以在生信星球回复"953anno"获取。

rm(list=ls())
load("obj.Rdata")

2.创建CDS对象

CDS是monocle3包可以处理的对象,因为是同一个团队研发的,所以是同一个对象

data <- GetAssayData(sce.all, assay = 'RNA', layer = 'counts')
cell_metadata <- sce.all@meta.data
gene_annotation <- data.frame(gene_short_name = rownames(data))
rownames(gene_annotation) <- rownames(data)
cds <- new_cell_data_set(data,
                         cell_metadata = cell_metadata,
                         gene_metadata = gene_annotation)

3.预处理CDS对象

这一步相当于Seurat中的NormalizeData+ScaleData+RunPCA步骤。

现在使用的数据GSE146026,是log(TPM/10+1),所以在Seurat分析流程中,虽然是存在“counts”里面,但它是lognormalize之后的数据,所以在这里加了一个参数norm_method = “none”

经过我的一番深入搜索,米有找到该如何用harmony之后的结果来衔接,但是monocle3里面有个去除批次效应的函数align_cds,如果是多样本数据要整合那就要运行一下这一句。

cds <- preprocess_cds(cds, 
                      num_dim = 30,
                      norm_method = "none")
cds <- align_cds(cds, alignment_group = "orig.ident")

4.训练细胞分类器

要先检查下自己准备的marker基因

根据官网的要求,需要整理成这样的格式:

所以我的test.txt文件是这样的:

cat(readLines("test.txt"),sep = "\n")

## 
## >Bcells
## expressed: CD19, CD79A, CD79B 
## 
## >CAFs
## expressed: PDPN, DCN, THY1 
## 
## >DC
## expressed: CD1C, CD1E, CCR7, CD83 
## 
## >epithelial
## expressed: EPCAM 
## 
## >erythrocytes
## expressed: GATA1 
## 
## >macrophages
## expressed: CD14, AIF1, CSF1R, CD163 
## 
## >Tcells
## expressed: CD2, CD3D, CD3E, CD3G

marker_check <- check_markers(cds, marker_file = "test.txt",
                              db=org.Hs.eg.db,
                              cds_gene_id_type = "SYMBOL",
                              marker_file_gene_id_type = "SYMBOL")
plot_markers(marker_check)

这一步运行超级的慢,作用是根据自己的细胞与marker基因对应关系文件训练分类器。所以设置了一个存在即跳过。

class_file <- "my_classifier.Rdata"
if(!file.exists(class_file)){
  my_classifier <- train_cell_classifier(cds = cds,
                                           marker_file = "test.txt",
                                           db = org.Hs.eg.db,
                                           cds_gene_id_type = "SYMBOL",
                                           num_unknown = 50,
                                           marker_file_gene_id_type = "SYMBOL")
  save(my_classifier, file = class_file)
} else {
  load(class_file)
}

也可以在官网上面查查有适合直接用的就直接用

5.使用分类器对细胞进行分类

我们将使用训练好的分类器来对细胞进行分类,并使用cluster_extend = TRUE这个参数来试图对每个seurat做出来的细胞亚群分配一个类型。

看帮助文档里面有说:

Logical. When TRUE, the classifier provides a secondary cluster-extended classification, which assigns type for the entire cluster based on the assignments of the cluster members.

If the colData table of the input CDS has a column called “garnett_cluster”, this will be used for cluster-extended assignments.

所以我们在pdata中添加garnett_cluster列,内容就是seurat降维结果,这样就可以按照亚群来注释了,省的有些乱。

我试了一下只是这样设置还是会有一些亚群会被注释成多种类型,还有两个相关的参数

cluster_extend_max_frac_unknown: 默认为0.95,意味着允许一个cluster中最多95%的细胞是未知类型,仍然可以为整个cluster分配一个类型。 cluster_extend_max_frac_incorrect: 默认为0.1,意味着允许一个cluster中最多10%的细胞被错误分类,仍然可以为整个cluster分配一个类型。

而可以自行调整,如果两个都调成1就100%分配一个类型了。

pData(cds)$garnett_cluster <- pData(cds)$seurat_clusters
cds <- classify_cells(cds,
                      my_classifier, 
                      db = org.Hs.eg.db,
                      cluster_extend = TRUE,
                      cluster_extend_max_frac_incorrect = 1,
                      cds_gene_id_type = "SYMBOL")

6.可视化结果

可以用Seurat的DimPlot函数

cds.meta <- subset(pData(cds), select = c("cell_type", "cluster_ext_type")) %>% as.data.frame()
sce.all <- AddMetaData(sce.all, metadata = cds.meta)
p1 = DimPlot(sce.all, reduction = "umap", group.by = "cell_type") + theme_bw()
p2 = DimPlot(sce.all, reduction = "umap", group.by = "cluster_ext_type") + theme_bw()
p1+p2

也可以提取数据用ggplot2的函数来画

umap <- as.data.frame(sce.all@reductions[["umap"]]@cell.embeddings)
pd <- as.data.frame(pData(cds))
identical(rownames(umap),rownames(pd))

## [1] TRUE

data.umap <-cbind(umap,pd)

p1 <- ggplot(data.umap, aes(x = umap_1, y = umap_2, color = cell_type)) + 
  geom_point() + 
  scale_color_brewer(palette = "Set1")+
  theme_bw() + 
  labs(title = "Garnett Cell Type Allocation")

p2 <- ggplot(data.umap, aes(x = umap_1, y = umap_2, color = cluster_ext_type)) + 
  geom_point() + 
  scale_color_brewer(palette = "Set1")+
  theme_bw() + 
  labs(title = "Garnett Cluster Extended Type Allocation")

p1 + p2

通过上述步骤,我们完成了从数据加载到细胞类型注释的整个分析流程。这个流程可以帮助我们理解每个细胞亚群的生物学特性。

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

推荐阅读更多精彩内容