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”.

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

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

加油,科研人

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

推荐阅读更多精彩内容