Learn-SciBet
1. 背景介绍
细胞类型注释是scRNA-seq里非常基础的一步,常见的策略是将基于无监督分群结果的基因差异表达分析结果作为marker,结合先验知识,判断该分群为何种类型。
近年来,随着scRNA-seq的数据集的逐渐积累,也有很多研究组提出了一些基于已有分群结果进行有监督的细胞类型注释的方法,比如scmap
,或者Seurat里的TransferData
。此外,也有评估相关方法的benchmark研究:
SciBet是张泽民老师组最近新发表的一个快捷(实测真的比Seurat的TransferData
快,而且效果确实差不多),方便的进行有监督的细胞类型注释的方法。论文见SciBet as a portable and fast single cell type identifier,相关报道见Nature Communications | 张泽民课题组发表单细胞转录组数据快速注释新方法
2. 方法原理简介
如果读者只对软件使用感兴趣的本节可以略过。
根据上面提到的那篇报道,如果用一句话概括SciBet的原理,应该是这样的:
张泽民实验室的博士生李辰威、刘宝琳联合任仙文副研究员开发的SciBet则有效地解决了这一问题:他们从“同一类型的单细胞表达谱服从同一多项分布”这一基本假设出发,对训练集数据中不同细胞类型分别进行建模,进而通过极大似然估计来对测试集细胞进行有监督注释。
接下来我们根据作者论文的方法部分和补充材料,学习一下这个巧妙地思路。分为如下几个部分:
- 预备知识
- 单细胞表达谱的统计模型
- 根据表达谱计算信息熵
- E-test
- 构建有监督的细胞类型分类模型
我们假定读者已经修过概率论等相关课程。
2.1 预备知识
预备知识1:
我们需要向读者回顾关于负二项分布的知识,如果一个离散随机变量
那么我们称其服从负二项分布。记为
预备知识2:
对于两个随机变量
预备知识3:
关于负二项分布,有如下结论:
对于随机变量
,若 , 则 其中
证明:
因为:
根据预备知识3,我们有:
预备知识4:
负二项分布是泊松分布和伽马分布的混合分布。
预备知识5(该结论为概率论和数理统计的常识):
对于随机变量的pdf为
,做变换 ,其中 为单调函数,X和Y各自样本空间的 和 分别满足: 若 在 中连续且逆变换 在 中连续可微,则新的随机变量 的pdf为:
该结论为Statistical Inference(Casella Berger著)中的定理2.1.5,证明见该书。
预备知识6(只有这个结论作者在补充材料里给了证明):
The scaling property of the Gamma distribution
若
, 则
证明: 由题设:
根据题设,由预备知识5,有:
故
预备知识6:
若独立同分布样本
服从 , 且观测值分别为 ,则参数 的矩估计量和极大似然估计量相等,均为
证明很简单,在很多教材也能找到,故从略。
预备知识7:
若独立同分布样本
服从 , 且观测值分别为 ,则参数 的极大似然估计满足:
证明:
由题设:
故取对数后极大似然函数为:
由
解得
预备知识8:
若随机变量
的pdf为 ,样本空间为 , 定义 information generating function
:则:
证明:(严格证明的话,得要考虑函数
而随机变量
故
预备知识9:
若
,则其信息熵 为
由预备知识8经过计算即可证明,从略。
预备知识10:
注:更多关于伽马分布的知识可见:理解Gamma分布、Beta分布与Dirichlet分布
2.2 单细胞表达谱的统计模型
经过大量的统计分析和后续的实验验证(相关证据可参考这篇文献)有这样一个经验性的结论:
观察到单细胞基因表达的count(比如UMI count)的分布可以用负二项分布很好的拟合,且相同细胞类型的单细胞表达谱服从同一个分布。
结合2.1中的预备知识,我们可以将单细胞基因表达的count表示为泊松分布的伽马分布的混合分布。所以作者参考了SAVER可以进行如下建模:
假设我们现在有
其中
接下来的可以根据预备知识里的结论进行参数估计:
由预备知识6,我们很容易得到
2.3 根据表达数据计算信息熵
不是所有的基因都是对后续的统计学习有用的,需要进行特征选择,也就是说,挑选出那些能表示不同群细胞之间表达差异的基因。本文的新意是基于信息熵(也就是香农熵)的概念引入了新的进行特征选择的方法:E-test。在讲E-test之前,我们需要看看作者是如何实现从表达量中计算信息熵的。
根据2.2我们知道可以将观测得到单细胞表达gene count
对于相同类型的细胞而言,根据2.1中的结论9,真实表达量
用
记:
并且记
根据上述记号,(1)最终化简为:
接下来,我们考虑道不同的细胞类型。若细胞
其中
若
最终,我们可以得到
2.4 E-test
首先,零假设为所有不同类型细胞都是从同一个细胞类型(记为 group 0)中均匀随机采样,那么基因的平均表达量为
接着计算基因
(8)-(7)并求和,得:
其中
利用Jesen不等式可以证明
若要进行假设检验,还需要计算
若所有预先定义分群的细胞类型的细胞均来自同一个样本,则对任意的标签为细胞类型
默认的Feature为500个基因。
2.5 构建有监督学习的模型
根据2.4,在训练集中,我们可以进行特征选择选出一些“informative gene”进行模型训练。
作者假设从相同的转录出的mRNA是不可区分的,而且每个mRNA的产生是相互独立的,记录对于细胞类型为
其中概率
同样的,在测试集中,未知细胞类型的细胞
其中
如果,我们引入
2.6 方法总结
可以用原文献中的流图对SciBet进行总结:
3. 软件使用
3.1 在线版
在线版使用请按照官网的Online classification教程。
值得一提的是,作者提供了很从不同组织,不同实验条件的单细胞测序数据中训练好的Signature:
这些不同的signature可以供不同研究者结合自己的兴趣使用。
3.2 本地版
3.2.1 安装
if (!requireNamespace("devtools", quietly = TRUE)) install.packages("devtools")
::install_github("PaulingLiu/scibet") devtools
如果出现错误,请看相关issue
3.2.2 作者提供的测试数据
按照官网的教程E-test and SciBet;下载所需的数据;然后后按照其说明文档进行即可。
接下来,我们看如何用使用SciBet结合Seurat进行单细胞分析。
3.2.3 SciBet结合Seurat
为了说明问题,我们选择Seurat自带的pbmcsca数据集, 该数据集已经提供了预先定义好的细胞标签,代码如下:
library(Seurat)
library(pbmcsca.SeuratData)
library(ggplot2)
library(scibet)
library(tidyverse)
library(viridis)
####0.---define utilized function--------
####---Export expr data from 10x to tibble----
#' @param seuv3 a seuv3 object
#'
<- function(seuv3,...){
myGetExpr <- GetAssayData(object = seuv3, slot = "data")
expr <- as_tibble(t(as.matrix(expr)),rownames = NA)
expr return(expr)
}
###1.load data and preprocessing
data("pbmcsca")
###---avoid warning-----
<- UpdateSeuratObject(pbmcsca)
pbmcsca ###---show predifined cell type------
table(pbmcsca$CellType)
# B cell CD14+ monocyte
# 5020 5550
# CD16+ monocyte CD4+ T cell
# 804 7391
# Cytotoxic T cell Dendritic cell
# 9071 433
# Megakaryocyte Natural killer cell
# 977 1565
# Plasmacytoid dendritic cell Unassigned
# 164 46
###---split data-----
<- SplitObject(pbmcsca, split.by = "Method")
pbmc.list ###---normalize-------
for (i in names(pbmc.list)) {
<- NormalizeData(pbmc.list[[i]], verbose = FALSE)
pbmc.list[[i]] }
names(pbmc.list)
[1] "Smart-seq2" "CEL-Seq2" "10x Chromium (v2) A"
[4] "10x Chromium (v2) B" "10x Chromium (v3)" "Drop-seq"
[7] "Seq-Well" "inDrops" "10x Chromium (v2)"
测试 reference base模式的效果
###----2. test scibet----
###----define reference and query-----
<- pbmc.list[[1]]
reference <- pbmc.list[[2]]
query
###----test query reference mode----
<- myGetExpr(reference)
reference.expr <- myGetExpr(query)
query.expr
<- as.character(reference$CellType)
reference.label <- as.character(query$CellType)
test.label
<- cbind(reference.expr,label=reference.label)
reference.expr
<- SciBet(train = reference.expr, test = query.expr)
prd.label Confusion_heatmap(test.label, prd.label)
ggsave(filename = "res/fig/learn_scibet_confusionheatmap_refmode.pdf",
width = 6,height = 6)
准确率为
<- length(test.label)
num1 <- tibble(
num2 ori = test.label,
prd = prd.label
%>%
) ::filter(ori == prd) %>%
dplyrnrow(.)
/num1 num2
0.851711
测试用作者提供的训练好的模型
###----test load_model mode-----
###using 30 major cell types signature----
<- readr::read_csv(file = "http://scibet.cancer-pku.cn/major_human_cell_types.csv")
model <- pro.core(model)
model
<- LoadModel(model)
prd <- prd(query.expr)
prd.label
Confusion_heatmap(test.label,prd.label)
ggsave(filename = "res/fig/learn_scibet_confusionheatmap_signaturemode.pdf",
width = 6,height = 6)