R语言之双细胞检测工具DoubletFinder
双细胞的定义是一个液滴或一个微孔中包含了2个或多个细胞 。根据Poisson分布,单个液滴包含超过一个细胞(doublets或multiplets)的频率随着上机细胞的浓度而改变。通常如果上样细胞浓度较高,doublets/multiplets的频率也会增加。因此,单细胞实验中的doublets事件限制了实验时的细胞通量。当前有两个工具是比较流行的,一个是基于python的scrublet。其原理是数据中出现doublet时,有两种情况。一种称之为内嵌双细胞,在这种情况下,doublet和真正存在的某种细胞类型有相似的基因表达,doublet会和这些细胞被聚类到一起,同时在分群结果中占某一个群的一小部分,不会对最终的分析结果产生严重的影响。另一种情况称之为新型双细胞,在这种情况下,doublet会构成一个和现有的细胞类型基因表达非常不同的群,而这个新的群会严重影响到后续的分析结果。但不管在什么情况下,都假定doublet只占样本数据中很小的一部分。
(引自:https://doi.org/10.1016/j.cels.2018.11.005)
另一个工具是DoubletFinder。其原理是从现有的矩阵的细胞中根据我们预先定义好的细胞类型模拟一些双细胞出来(比如单核和T细胞的双细胞、B细胞和中性粒细胞的双细胞等等),将模拟出的双细胞和原有矩阵的细胞混合在一起,进行降维聚类,原则上合成doublets占所有细胞的比例为pN,默认最大pN为25%,目的是生成足够多的人工doublets。用 pK 表示领域大小(neighborhood size,例如对5,000细胞的数据,pK=0.01时,相当于寻找给定细胞近邻的200个细胞)。将合并后的细胞在主成分空间的嵌入信息转换成欧几里得距离矩阵,基于该距离矩阵 定义每个细胞的最近邻(nearest neighbors,NN)。将人造NN(artificial nearest neighbors,ANN)数除以领域大小,得到人造NN的比例( pANN =n(模拟的doublets)/n(真实细胞+模拟的doublets));对不同的pN-pK组合分别计算pANN。利用 BCmvn (均值-方差标准化双峰系数)最大 化的方法寻找计算pANN的最优pK值,而将pN固定为25%,并利用该组合下的pANN鉴别 doublets;并排除DoubletFinder不能检出的同源doublets,得到优化后的预估doublets数量。
(引自:https://doi.org/10.1016/j.cels.2019.03.003)
当然,以上方法都存在一个不足,那就是他们并不能解决同一细胞双marker表达的情况以及单细胞UMI含量过高问题。这部分则需要基于专业知识进行手工筛查。
今天给大家介绍一款在R语言中的工具DoubletFinder。首先看下包的安装:
install.packages(“devtools”)
devtools::install_github('chris-mcginnis-ucsf/DoubletFinder')
install.packages(“Seurat”)
install.packages('hdf5r')
install.packages("tidyverse")
接下来我们需要获取实例数据:
数据下载链接:
https://cf.10xgenomics.com/samples/cell-exp/3.0.2/5k_pbmc_v3_nextgem/5k_pbmc_v3_nextgem_filtered_feature_bc_matrix.h5
1.数据的预处理
library(Seurat)
library(DoubletFinder)
library(hdf5r)
pbmc <- Read10X_h5("5k_pbmc_v3_nextgem_filtered_feature_bc_matrix.h5")
pbmc <- CreateSeuratObject(pbmc)
pbmc <- SCTransform(pbmc)
pbmc <- RunPCA(pbmc, verbose = F)
pc.num=1:30
pbmc <- RunUMAP(pbmc, dims=pc.num)
pbmc <- FindNeighbors(pbmc, dims = pc.num)
pbmc=FindClusters(pbmc,resolution = 0.3)
DimPlot(pbmc, reduction = "umap", group.by = "seurat_clusters")
2.寻找最优pK值。
sweep.res.list <- paramSweep_v3(pbmc, PCs = pc.num, sct = T)##sct指是否seurat做了SCT处理,做了为T。
sweep.stats <- summarizeSweep(sweep.res.list, GT = FALSE)
bcmvn <- find.pK(sweep.stats)
pK_bcmvn <- as.numeric(bcmvn$pK[which.max(bcmvn$BCmetric)])
3.排除不能检出的同源doublets,优化期望的doublets数量。
DoubletRate = 0.039 # 5000细胞对应的doublets rate是3.9%
homotypic.prop <- modelHomotypic(pbmc$seurat_clusters) # 最好提供celltype
nExp_poi <- round(DoubletRate*ncol(pbmc))
nExp_poi.adj <- round(nExp_poi*(1-homotypic.prop))
4.使用确定好的参数鉴定doublets
pbmc <- doubletFinder_v3(pbmc, PCs = pc.num, pN = 0.25, pK = pK_bcmvn,
nExp = nExp_poi.adj, reuse.pANN = F, sct = T)
5.结果展示
DimPlot(pbmc, reduction = "umap", group.by = "DF.classifications_0.25_11_171")
至此便是双细胞检测的所有步骤,欢迎你给大家学习交流!
相关文章
- 哈希表(Java语言实现一个哈希表)
- 14. Groovy 语言结构-脚本和类知识学习
- R语言广义相加模型 (GAMs)分析预测CO2时间序列数据|附代码数据
- GO语言基础知识
- Go 语言数据类型
- 【C 语言】字符串拷贝 ( 函数形参使用推荐方法 | 凡是涉及 修改指针指向 的操作一律创建新的 指针变量 执行 | 引入 辅助 局部 指针变量 )
- 【Groovy】使用 Groovy 语言开发服务器 Server 和客户端 Client 套接字程序 ( 客户端开发 )
- xcode 支持语言
- Go语言DialTCP():网络通信
- SQL Server字符集:如何生成优秀的多语言应用(sqlserver字符集)
- Go语言开发协程与Redis的结合使用(协程redis详细解说)
- 从javascript语言本身谈项目实战
- c语言10个经典小程序
- 探讨javascript是不是面向对象的语言