神兵利器——单细胞细胞类群基因marker鉴定新方法:genesorteR

前面给大家介绍过神兵利器——单细胞细胞类群基因marker鉴定新方法:COSG,现在给大家分享一个新的方法:genesorteR。并且会对这两个方法进行一个准确性和时间成本两个方面的简单比较。

首先在学习一个工具之前,我个人觉得还是得多多少少对它的原理进行一些了解,所以首先从我的角度来理解一下这个工具的原理,当然这部分是选择性的去进行。

genesorteR原理概述(optional reading)

首先我们要明白:一个好的基因marker无非具有的特征是其表达具有细胞类型特异性。正是基于这个标准,genesorteR对一个基因细胞类型表达特异性的水平进行了如下刻画:

首先,genesorteR和其它工具一样都是假定你已经聚好类,分好群。细胞共被分为k类(type),分别记为:
\{t_1,t_2,\cdots,t_k\}
共有j个基因(gene),分别记为:
\{g_1,g_2,\cdots,g_j\}
那么首先,当我们观测到某个基因g_j表达时,这些表达的细胞中细胞类型t_i出现的概率就是:
P(t_i|g_j) = {P(t_i \cap g_j)\over P(g_j)},\sum_{i=1}^kP(t_i|g_j)=1
使用条件概率的定义做如下变换:
P(t_i|g_j) = {P(g_j|t_i)\cdot P(t_i)\over P(g_j)}
对这里几个部分的含义进行分析:首先P(g_j|t_i)表示的是在细胞类型t_i中基因g_j表达的比例;P(t_i)就是细胞类型为t_i的细胞的比例;P(g_j)表示在所有细胞中检测到基因g_j表达的比例。所以综上,P(t_i|g_j)这个参数就刻画了每个基因表达细胞类型特异性程度,显然其表达的细胞类型特异性程度越高,P(t_i|g_j)就会在相应的那个细胞类型中越高。

进一步的,作者将这个参数进行了如下的变换,最终得到了s_{ij}
s_{ij}=P(g_j|t_i)\cdot P(t_i|g_j)={P(g_j|t_i)^2\cdot P(t_i)\over P(g_j)}
最终,**这个参数s_{ij}将是一个[0,1]之间的值,越接近于1,就表明基因g_j越特异性的表达于细胞类群(类型)t_i

更进一步,为了综合考量每个基因在不同细胞类型中的表达特异性程度,作者提出了对于每个基因基于的参数si_j。(注意不是s_{ij}哦)
si_j=-\sum_{i=1}^ks_{ij}\cdot log(s_{ij})

所以一个标准的marker gene应该具备两个特质:(1)有一个比较高的s_{ij}(在某一种细胞类型里面表达较普遍);(2)有比较高的si_j(其余的细胞类型表达较少)。

实例代码分析

我们还是使用pbmc公共数据集来进行测试:

#install packages
devtools::install_github("mahmoudibrahim/genesorteR") 
remotes::install_github(repo = 'genecell/COSGR')

library(Seurat)
library(SeuratData)
library(genesorteR)
library(COSG)

data("pbmc3k.final")

#identify gene marker with COSG
starttime <- Sys.time()
COSG_markers <- cosg(
  pbmc3k.final,
  groups = 'all',
  assay = 'RNA',
  slot = 'data',
  mu = 1)
endtime <- Sys.time()
timecost <- endtime - starttime
print(timecost)
#Time difference of 0.3216481 secs

#identify gene marker with genesorteR
starttime <- Sys.time()
gs <- sortGenes(x = pbmc3k.final@assays$RNA@data, 
                classLabels = Idents(pbmc3k.final))
head(gs$specScore)
genesorteR_markers <- getMarkers(gs = gs, quant = 0.99)
pp <- plotMarkerHeat(gs$inputMat, 
                     gs$inputClass, 
                     genesorteR_markers$markers, 
                     clusterGenes = T, 
                     outs = T)
pp$gene_class_info
endtime <- Sys.time()
timecost <- endtime - starttime
print(timecost)
#Time difference of 1.358346 secs

几个函数和参数做个说明:

  • sortGenes函数就是在计算每个基因在不同的细胞类型中的s_{ij}
  • getMarkers函数选取了位于前1%(quant = 0.99)的s_{ij}所对应的基因,然后再根据它们的si值进行分类,最终鉴定出真正的marker基因。

最终genesorteR鉴定出来的marker:

    S100A9     S100A8     FCER1A     FCGR3A       GNLY       SDPR     TMEM40        GP9      SPON2     FGFBP2 
         3          3          1          9          2          6          8          6          2          2 
      GZMK       GZMA        LTB      PTCRA      GNG11       FCN1       PRF1     IFITM3      MS4A7      MS4A1 
         4          4          7          8          6          3          2          9          9          5 
AP001189.4       CD3D       LDHB       GZMB       IL32       CCL5     ITGA2B      CD79B       CST3       CST7 
         6          7          7          2          7          4          6          5          3          4 
     CD79A       NKG7      SEPT5     LGALS2 
         5          4          6          3 

检查一下效果:

library(patchwork)
library(ggplot2)
#for cosg
p1 <- DotPlot(pbmc3k.final, 
              assay = 'RNA',
              features = COSG_markers$names$B[1:10]) +
  ggtitle(label = 'B cell Markers with COSG') + 
  theme(axis.text.x = element_text(hjust = 1, angle = 45))

p2 <- DotPlot(pbmc3k.final, 
              assay = 'RNA',
              features = which(pp$gene_class_info == 5) %>% names()) +
  ggtitle(label = 'B cell Markers with genesorteR') + 
  theme(axis.text.x = element_text(hjust = 1, angle = 45))
p1+p2

使用体验

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

推荐阅读更多精彩内容