内容

1博士tl;

为了演示,我们将使用来自scRNAseq包中。为了提高速度,我们将把它随机划分为500个单元格。

library(scRNAseq) sce <- BachMammaryData(samples="G_2") set.seed(1000) sce <- sce[,sample(ncol(sce), 500)]

为了本演示的目的,我们将执行一个非常快速的分析。在这里,人们通常会更加小心,做一些质量控制,创建一些诊断图,等等,但我们没有空间做这些。

library(scutle) sce <- logNormCounts(sce) library(scran) dec <- modelGeneVar(sce) library(scater) set.seed(1000) sce <- runPCA(sce, ncomponents=10, subset_row=getTopHVGs(dec, n=1000)) library(bluster) clusters <- clusterRows(reducedDim(sce, "PCA"), NNGraphParam()) sce <- runTSNE(sce, dimred="PCA") plotTSNE(sce, colour_by=I(群集),text_by=I(群集)))

然后运行findDoubletClusters ()来检验每个聚类是否符合零假设由双重结构组成。如果一个聚类中有许多DE基因位于“源”聚类所定义的表达限制之外,则拒绝null。另一方面,如果num.de低,聚类的表达谱与双态假设一致。

library(scDblFinder)选项卡<- findDoubletClusters(sce, clusters)选项卡
与7 # # DataFrame行9列# # source1 source2 num.de median.de最好p.value # # <人物> <人物> <整数> <整数> <人物> <数字> # # 6 2 1 0 122 ENSMUSG00000019256 1.00000 e + 00 # # 3 6 5 8 46 ENSMUSG00000002985 8.41352 e-05 # # 393 5 1 11 ENSMUSG00000075705 2.04690平台以及# # 4 7 63 ENSMUSG00000022491 4.15645 e-13 24 # # 1 6 86 715 ENSMUSG00000001349 8.49703 e-08 # # 5 7 2 112 1007 2.38765 ENSMUSG00000024610 e-11 # # 2 6 5 124 336 4.06936 ENSMUSG00000023505 e-06 # #自由。size1自由。Size2 prop ## <数字> <数字> <数字> ## 6 0.927081 0.443667 0.084 ## 3 2.026090 0.859424 0.242 ## 7 1.195040 1.249946 0.030 ## 4 0.630479 1.646729 0.150 ## 1 0.800035 2.253942 0.192 ## 5 0.836792 2.185591 0.032 ## 2 1.078655 0.457542 0.270

2数学背景

考虑一个细胞群我\ \ ()这是平均记录数\ (\ lambda_ {gi} \)基因\ (g \).假设每个群体表现出独特的规模偏差\ (s_i \),代表图书馆为该群体准备资料的效率。然后观察每个基因的read/UMI计数\ (\ mu_ {gi} = s_i \ lambda_ {gi} \).(为了简单起见,我们将忽略特定基因的缩放偏差,因为这很容易通过考虑来适应\(\lambda_{gi} \equiv \phi_g \lambda_{gi}\)对于一些偏见\ \ phi_g \ ())。每个种群的预期总数为\(N_i = \sum_g \mu_{gi}\)

现在,让我们考虑一个双态总体\ (j \)这是由两个亲本种群形成的\ (i_1 \)而且\ (i_2 \).所观察到的读计数\ (g \)\ (j \)\ (\ mu_ {gj} = s_j (\ lambda_ {gi_1} + \ lambda_ {gi_2}) \).请注意,\ (s_j \)不需要是任何特定的函数\ (s_ {i_1} \)而且\ (s_ {i_2} \).相反,这种关系取决于文库制备过程中反转录和扩增试剂饱和的速度,这很难做出假设。

3.按库大小归一化

我们根据库的大小获得每个单元格的对数规范化表达式值。假设库大小规范化的表达式值是这样的\ (\ mu_ {gi_1} N_ {i_1} ^ {1} < \ mu_ {gi_2} N_ {i_2} ^ {1} \)的比例\ (g \)增加\ (i_2 \)相比\ (i_1 \).各自的贡献\ (s_i \)消掉了\[\压裂{\ lambda_ {gi_1}} {\ sum_g \ lambda_ {gi_1}} < \压裂{\ lambda_ {gi_2}} {\ sum_g \ lambda_ {gi_2}} \;。\]双态集群的规范化表达式值\ (j \)随后\[\压裂{\ lambda_ {gi_1} + \ lambda_ {gi_2}} {\ sum_g (\ lambda_ {gi_1} + \ lambda_ {gi_2 })} \;, \]这很容易证明\[\压裂{\ lambda_ {gi_1}} {\ sum_g \ lambda_ {gi_1}} < \压裂{\ lambda_ {gi_1} + \ lambda_ {gi_2}} {\ sum_g (\ lambda_ {gi_1} + \ lambda_ {gi_2})} < \压裂{\ lambda_ {gi_2}} {\ sum_g \ lambda_ {gi_2}} \;。\]也就是说,我们基因在双态簇中的期望文库大小归一化表达介于父母双方之间。

用任意的大小因子提供理论保证比较困难,这就是为什么我们只使用库大小进行归一化。唯一的例外是尖峰大小因素\ (s_i \)直接。这将使我们能够获得估计\ (\ lambda_ {gi} \)的父集群和\(\lambda_{gi_1} + \lambda_{gi_2}\)对于双份。通过这种方式,我们可以更精确地将双态集群识别为规范化表达式值等于父节点的和的集群。不幸的是,spike-in通常不适用于基于液滴的数据集,因为在这种情况下,双偶问题最为严重。

4测试(缺乏)中介性

我们想要识别可能由其他集群的双重集组成的集群。对于每个集群\ \ (j '),我们在库大小标准化的表达式配置文件中测试不同的表达式\(我\).对于每对其他集群\(我_1 \)而且\(我_2 \),我们识别基因的变化\ \ (j ')\(我_1 \)而且\(我_2 \)方向相同.这种基因的存在违反了预期的双态簇的中介作用,并提供了证据\ \ (j ')不是双份的吗\(我_1 \)而且\(我_2 \)

显着基因是通过交叉并集试验鉴定的\ (p \)-值来自之间的成对比较\ \ (j ')而且\(我_1 \)\(我_2 \).(具体地说,\ \ (t)-测试通过findMarkers ()函数食物)。的\ (p \)当两次比较的对数倍变化的符号不相同时,将基因的-value设置为统一。使用Benjamini-Hochberg方法应用多重校正测试,并以指定的错误发现率(通常为5%)计算检测到的基因数量。这一对\((我“_1,我”“_2)\)以最少的检测到的基因被认为是推定的父母\ \ (j ')

理论上,计算西姆斯的组合是可能的\ (p \)-value来拒绝双态假设\ \ (j ').这将提供一种更严格的方法来排除潜在的双子体/父子体组合。但是,这对集群的错误规范非常敏感——请参见下文。

5调用双态集群

假设大多数簇不是由双偶组成的,我们识别出的簇具有异常低的检测到的违反中间条件的基因数量。这是通过在函数中使用基于中值绝对偏差的方法,在检测到的基因的对数转换数量上识别小异常值来实现的。(我们使用对数变换只是为了提高低值时的分辨率。)如果集群是这个度量的异常值,那么它们很可能是双重。

双态集群也应该拥有比父集群更大的库大小。这与每个双态中存在更多的RNA是一致的,尽管双态簇的文库大小不一定是父簇的总和(由于饱和度和组成效应等因素)。分配给双态簇的细胞比例也应该是“合理的”;这究竟意味着什么取决于实验设置和所使用协议的双态速率。

6讨论

这种方法的最大优势在于它的可解释性。给定一组现有的集群,我们可以显式地识别那些可能是双节点的集群。我们还对每个假定的双态星系团的亲本起源有了一些了解,这可能会引起一些兴趣。我们避免了任何关于双态形成的假设,否则基于模拟的方法是必要的。特别是,我们不需要任何关于确切关系的知识\ (s_j \)而且\ (s_i \),使我们能够在双态的确切位置未知的情况下(例如,由于父簇之间RNA含量的差异)识别双态。

缺点是,当然,我们依赖于提供有意义的集群,其中亲代细胞和双态细胞是分开的。中介需求足够宽松,可以提供一些抗错误规范的健壮性,但这也只能到此为止。此外,由于DE检测能力较低,该策略倾向于将单元数较少的集群调用为双元(或双元的父节点)。这可以通过比较来抵消num.de反对median.de因为后者对于涉及系统低功率比较的集群来说是低的,尽管很难调整功率差异对IUT的确切影响。

会话信息

sessionInfo ()
## R版本4.2.1(2022-06-23)##平台:x86_64-pc-linux-gnu(64位)##运行在Ubuntu 20.04.5 LTS ## ##矩阵产品:默认## BLAS: /home/biocbuild/bbs-3.16-bioc/R/lib/libRblas。/home/biocbuild/bbs-3.16-bioc/R/lib/libRlapack。所以## ## locale: ## [1] LC_CTYPE=en_US。UTF-8 LC_NUMERIC= c# # [3] LC_TIME=en_GB LC_COLLATE= c# # [5] LC_MONETARY=en_US。utf - 8 LC_MESSAGES = en_US。UTF-8 ## [7] LC_PAPER=en_US。UTF-8 LC_NAME= c# # [9] LC_ADDRESS=C lc_phone = c# # [11] LC_MEASUREMENT=en_US。UTF-8 LC_IDENTIFICATION=C ## ##附加的基本包:## [1]stats4 stats graphics grDevices utils datasets methods ##[8]基础## ##其他附加包:# # # # [1] bluster_1.8.0 scDblFinder_1.12.0 [3] scater_1.26.0 ggplot2_3.3.6 # # [5] scran_1.26.0 scuttle_1.8.0 # # [7] ensembldb_2.22.0 AnnotationFilter_1.22.0 # # [9] GenomicFeatures_1.50.0 AnnotationDbi_1.60.0 # # [11] scRNAseq_2.11.0 SingleCellExperiment_1.20.0 # # [13] SummarizedExperiment_1.28.0 Biobase_2.58.0 # # [15] GenomicRanges_1.50.0 GenomeInfoDb_1.34.0 # # [17] IRanges_2.32.0 S4Vectors_0.36.0 # # [19] BiocGenerics_0.44.0 MatrixGenerics_1.10.0 # # [21] matrixStats_0.62.0 BiocStyle_2.26.0 # # # #通过命名空间加载(并且没有附加):# # # # [1] AnnotationHub_3.6.0 BiocFileCache_2.6.0 [3] igraph_1.3.5 lazyeval_0.2.2 # # [5] BiocParallel_1.32.0 digest_0.6.30 # # [7] htmltools_0.5.3 magick_2.7.3 # # [9] viridis_0.6.2 fansi_1.0.3 # # [11] magrittr_2.0.3 memoise_2.0.1 # # [13] ScaledMatrix_1.6.0 cluster_2.1.4 # # [15] limma_3.54.0 Biostrings_2.66.0 # # [17] prettyunits_1.1.1 colorspace_2.0-3 # # [19] ggrepel_0.9.1 blob_1.2.3 # # [21] rappdirs_0.3.3 xfun_0.34 # # [23] dplyr_1.0.10 crayon_1.5.2 # # [25] rcurl_1.98 - 1.9 jsonlite_1.8.3 # # [27][31] DelayedArray_0.24.0 BiocSingular_1.14.0 ## [33] scales_1.2.1 DBI_1.1.3 ## [35] edgeR_3.40.0 Rcpp_1.0.9 ## [37] viridisLite_0.4.1 xtable_1.8-4 ## [39] progress_1.2.2 dqrng_0.3.0 ## [43] metapod_1.6.0 httr_1.4.4 ## [45] ellipsis_0.3.2 farver_2.1.1 ## [47] pkgconfig_2.0.3 XML_3.99-0.12 ## [49] sass_0.4.2 dbplyr_2.2.1 ## [51] locfit_1.5-9.6 utf8_1.2.2 ## [53] labeling_0.4.2 tidyselect_1.2.0 ## [55][63] generics_0.1.3 RSQLite_2.2.18 ## [67] experimenthub_1 .4.1 fastmap_1.1.0 ## [69] yaml_2.3.6 knitr_1.40 ## [71] bit64_4.0.5 purrr_0.3.5 ## [73] KEGGREST_1.38.0 sparseMatrixStats_1.10.0 ## [75] mime_0.12 xml2_1.3.3 ## [77] biomaRt_2.54.0 compiler_4.2.1 ## [79] beeswarm_0.4.0 filelock_1.0.2 ## [81] curl_4.3.3 png_0.1-7 ## [83] interactiveDisplayBase_1.36.0 tibble_3.1.8 ## [85] statmod_1.4.37 bslib_0.4.0 ## [87] stringi_1.7.8 highr_0.9 ## [89] lattice_0.20-45 ProtGenerics_1.30.0 ## [91] Matrix_1.5-1 vctrs_0.5.0 ## [93] pillar_1.8.1 lifecycle_1.0.3 ## [95] BiocManager_1.30.19 jquerylib_0.1.4 ## [97] BiocNeighbors_1.16.0 cowplot_1.1.1 ## [99] data.table_1.14.4 bitops_1.0-7 ## [101] irlba_2.3.5.1 httpuv_1.6.6 ## [103] rtracklayer_1.58.0 R6_2.5.1 ## [105] BiocIO_1.8.0 bookdown_0.29 ## [107] promises_1.2.0.1 gridExtra_2.3 ## [109] vipor_0.4.5 codetools_0.2-18 ## [111] MASS_7.3-58.1 assertthat_0.2.1 ## [113] rjson_0.2.21 withr_2.5.0 ## [115] GenomicAlignments_1.34.0 Rsamtools_2.14.0 ## [117] GenomeInfoDbData_1.2.9 parallel_4.2.1 ## [119] hms_1.1.2 grid_4.2.1 ## [121] beachmat_2.14.0 rmarkdown_2.17 ## [123] DelayedMatrixStats_1.20.0 Rtsne_0.16 ## [125] shiny_1.7.3 ggbeeswarm_0.6.0 ## [127] restfulr_0.0.15