美文网首页单细胞
神兵利器——单细胞细胞类群基因marker鉴定新方法:genes

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

作者: Bio_Infor | 来源:发表于2022-06-25 17:08 被阅读0次

    前面给大家介绍过神兵利器——单细胞细胞类群基因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。

    相关文章

      网友评论

        本文标题:神兵利器——单细胞细胞类群基因marker鉴定新方法:genes

        本文链接:https://www.haomeiwen.com/subject/ehsivrtx.html