10X单细胞(10X空间转录组)基础知识之泊松分布--sciBet

关于泊松分布,我们举个例子分享一下

1 甜在心馒头店

公司楼下有家馒头店:

每天早上六点到十点营业,生意挺好,就是发愁一个事情,应该准备多少个馒头才能既不浪费又能充分供应?

老板统计了一周每日卖出的馒头(为了方便计算和讲解,缩小了数据):

图片.png

均值为:

图片.png

按道理讲均值是不错的选择,但是如果每天准备5个馒头的话,从统计表来看,至少有两天不够卖,40% 的时间不够卖:

图片.png

你“甜在心馒头店”又不是小米,搞什么饥饿营销啊?老板当然也知道这一点,就拿起纸笔来开始思考。

2 老板的思考

老板尝试把营业时间抽象为一根线段,把这段时间用 T 来表示:


图片.png

然后把周一的三个馒头(“甜在心馒头”,有褶子的馒头)按照销售时间放在线段上:


图片.png

把 T 均分为四个时间段:


图片.png

此时,在每一个时间段上,要不卖出了(一个)馒头,要不没有卖出:


图片.png

在每个时间段,就有点像抛硬币,要不是正面(卖出),要不是反面(没有卖出):


图片.png

T 内卖出3个馒头的概率,就和抛了4次硬币(4个时间段),其中3次正面(卖出3个)的概率一样了。

这样的概率通过二项分布来计算就是:

图片.png

但是,如果把周二的七个馒头放在线段上,分成四段就不够了:


图片.png

从图中看,每个时间段,有卖出3个的,有卖出2个的,有卖出1个的,就不再是单纯的“卖出、没卖出”了。不能套用二项分布了。

解决这个问题也很简单,把 T 分为20个时间段,那么每个时间段就又变为了抛硬币:


图片.png

这样,T 内卖出7个馒头的概率就是(相当于抛了20次硬币,出现7次正面):

图片.png

为了保证在一个时间段内只会发生“卖出、没卖出”,干脆把时间切成 n 份:

图片.png

越细越好,用极限来表示:

图片.png

更抽象一点,T 时刻内卖出 k 个馒头的概率为:

图片.png

3 p 的计算

“那么”,老板用笔敲了敲桌子,“只剩下一个问题,概率 p 怎么求?”

在上面的假设下,问题已经被转为了二项分布。二项分布的期望为:

图片.png

那么:

图片.png

4 泊松分布

有了
图片.png

了之后,就有:

图片.png

我们来算一下这个极限:


图片.png

其中:

图片.png
图片.png

所以:

图片.png

上面就是泊松分布的概率密度函数,也就是说,在 T 时间内卖出 k 个馒头的概率为:

图片.png

一般来说,我们会换一个符号,让
图片.png

,所以:

图片.png

这就是教科书中的泊松分布的概率密度函数。

5 馒头店的问题的解决

老板依然蹙眉,不知道μ啊?

没关系,刚才不是计算了样本均值:


图片.png

可以用它来近似:

图片.png

于是:

图片.png

画出概率密度函数的曲线就是:


图片.png

可以看到,如果每天准备8个馒头的话,那么足够卖的概率就是把前8个的概率加起来:

图片.png

这样 93% 的情况够用,偶尔卖缺货也有助于品牌形象。

老板算出一脑门的汗,“那就这么定了!”

6 二项分布与泊松分布

鉴于二项分布与泊松分布的关系,可以很自然的得到一个推论,当二项分布的 p 很小的时候,两者比较接近:


图片.png

7 总结

这个故事告诉我们,要努力学习啊,要不以后馒头都没得卖。

生活中还有很多泊松分布。比如物理中的半衰期,我们只知道物质衰变一半的时间期望是多少,但是因为不确定性原理,我们没有办法知道具体哪个原子会在什么时候衰变?所以可以用泊松分布来计算。

还有比如交通规划等等问题。

说了这么多,泊松分布和我们的单细胞有什么关系?

关系就在我们的细胞定义

图片.png
图片.png
图片.png

sciBet这个软件是一种细胞定义的软件

2020年4月发表于Nature Communications,影响因子12分

E-test and SciBet

Apr. 16, 2021


In this example workflow, we demonstrate a single cell classifier we recently developed in our preprint.

For illustration, we’ve chosen a T cell dataset that we recently published to get started. The TPM expression matrix can be downloaded here.

Library

suppressMessages(library(ggplot2))
suppressMessages(library(tidyverse))
suppressMessages(library(scibet))
suppressMessages(library(viridis))
suppressMessages(library(ggsci))

Load the data

path_da <- "~/test.rds.gz"
expr <- readr::read_rds(path = path_da) 

For expression matrix (TPM), rows should be cells and the last column should be "label".

expr[1:10, 1:10]
图片.png

E(ntropy)-test for supervised gene selection

Based on our unified model, we developed E-test for supervised gene selection. This step is implemented with SelectGene function. Our use of E-test involves an assumption that there is no heterogeneity within each population and hence could be directly calculated by feeding its corresponding into the - formula.

etest_gene <- SelectGene(expr, k = 50)
etest_gene
##  [1] "CXCL13"   "CCR7"     "FGFBP2"   "SELL"     "CCL4"     "GZMH"    
##  [7] "GZMB"     "IFNG"     "CCL3"     "FCGR3A"   "GPR15"    "RGS1"    
## [13] "GZMK"     "CX3CR1"   "KLRC2"    "CXCR6"    "GZMA"     "RGS2"    
## [19] "MAL"      "TMIGD2"   "LEF1"     "KLRC1"    "PLEK"     "HAVCR2"  
## [25] "KLRF1"    "GNLY"     "S100B"    "CD160"    "NR4A2"    "KLRG1"   
## [31] "ITGAE"    "NR4A1"    "FOS"      "FCER1G"   "LDLRAP1"  "NKG7"    
## [37] "HLA-DRB5" "VCAM1"    "CCL5"     "CST7"     "PDCD1"    "FCRL6"   
## [43] "C1orf162" "CD82"     "TNFAIP3"  "GPR183"   "LAT2"     "CD69"    
## [49] "S1PR5"    "PLAC8"

To verify these genes, we can examine their expression patterns across different cell types with Marker_heatmap.

Marker_heatmap(expr, etest_gene)
image.png

SciBet: Single Cell Identifier Based on Entropy Test

For accurate, fast, and robust single cell identification. We developed SciBet using a multinomial-distribution model. This step is implemented with SciBet function.

1. For reference set, rows should be cells, column should be genes and the last column should be "label" (TPM). 2. For query set, rows should be cells and column should be genes (TPM).

tibble(
  ID = 1:nrow(expr),
  label = expr$label
) %>%
  dplyr::sample_frac(0.7) %>%
  dplyr::pull(ID) -> ID

train_set <- expr[ID,]      #construct reference set
test_set <- expr[-ID,]      #construct query set

prd <- SciBet(train_set, test_set[,-ncol(test_set)])

We can evaluate how well our predicted cell type annotations match the reference with Confusion_heatmap. For this dataset, we find that there is a high agreement in cell type identification.

Confusion_heatmap(test_set$label, prd)
image.png

False positive control

Due to the incomplete nature of reference scRNA-seq data collection, cell types excluded from the reference dataset may be falsely predicted to be a known cell type. By applying a null dataset as background, SciBet controls the potential false positives while maintaining high prediction accuracy for cells with types covered by the reference dataset (positive cells).

For illustration, we’ve chosen a recent melanoma dataset with immunde cells as “positive cells” and the other cells (CAF, maligant cells and endothelial cells) as “negative cells”.

  • reference set
  • query set
  • null set

For the purposes of this example, these three datasets are used to get started.

null <- readr::read_rds('~/null.rds.gz')
reference <- readr::read_rds('~/reference.rds.gz')
query <- readr::read_rds('~/query.rds.gz')

For query set, “negative cells” account for more than 60%.

ori_label <- query$label
table(ori_label)
## ori_label
##     B.cell Macrophage   Neg.cell         NK      T.CD4      T.CD8 
##        245        126       2228         28        257        528

The confidence score of each query cell is calculated with the function conf_score.

query <- query[,-ncol(query)]
c_score <- conf_score(ref = reference, query = query, null_expr = null, gene_num = 500)

The visualization of above result could be implemented with the function Confusion_heatmap_negctrl.

tibble(
  ori = ori_label,
  prd = SciBet(reference, query),
  c_score = c_score
) -> res

Confusion_heatmap_negctrl(res, cutoff = 0.45)
image.png

也许这个软件仍然不好用,但是值得我们一试

加油,科研人

你可能感兴趣的:(10X单细胞(10X空间转录组)基础知识之泊松分布--sciBet)