1简介

netSmooth实现一个网络平滑框架,以平滑单细胞基因表达数据以及其他组学数据集。该算法是一种基于图的网络扩散算法。该算法背后的直觉是,编码共表达模式的基因网络可能用于平滑scRNA-seq表达数据,因为网络中连接节点的基因表达值将相互预测。蛋白-蛋白相互作用(PPI)网络和共表达网络是可以用于这种过程的网络之一。

更准确地说,netSmooth工作原理如下。首先,将每个样本中每个基因的基因表达值或其他定量值投影到所提供的网络上。然后,利用扩散过程对图中相邻基因的表达值进行平滑处理,使基因的表达值代表了基于基因本身的表达水平的估计,以及图中相邻基因的表达值。基因的表达值扩散到其邻居的速率是程度标准化的,因此具有许多边的基因对其邻居的影响要小于具有更具体相互作用的基因。该实现有一个自由参数,α,它控制了扩散是局部的还是在图中延伸得更远。数值越高,扩散越远。的netSmooth包实现优化值的策略α

Network-smoothing概念

图1:Network-smoothing概念

总之,netSmooth使用户能够平滑使用基因相互作用网络(如蛋白质-蛋白质相互作用网络)与基因相关的定量值。这个小插图的以下部分演示的功能netSmooth包中。

2使用netSmooth()函数平滑单细胞基因表达数据

的主力netSmooth包装是netSmooth ()函数。该函数至少以网络和基因样本矩阵两个参数作为输入,并对基因样本矩阵进行平滑处理。网络应组织为邻接矩阵,其行名和列名应与基因样本矩阵的行名相匹配。

的用法netSmooth ()函数使用人类PPI的子集和来自GSE44183-GPL11154的单细胞RNA-seq数据的子集。我们将首先加载可用的示例数据集netSmooth包中。

数据(smallPPI)数据(smallscRNAseq)

我们现在可以平滑基因表达网络netSmooth ()函数。我们将使用α= 0.5

smallscRNAseq.sm.se <- netSmooth(smallscRNAseq, smallPPI, alpha=0.5)
##使用给定alpha: 0.5
smallscRNAseq.sm.sce <- singlecel实验(assays=list(counts=assay(smallscRNAseq.sm.se)), colData=colData(smallscRNAseq.sm.se))

现在,我们可以使用热图来查看平滑的和原始的表达式值。

庵野。df <- data.frame(cell.type=colData(smallscRNAseq)$source_name_ch1) rownames(anno.df) <- colnames(smallscRNAseq) pheatmap(log2(assay(smallscRNAseq)+1), annotation_col = anno.df)df, show_rownames = FALSE, show_colnames = FALSE, main="before netSmooth")

pheatmap(log2(assay(smallscRNAseq.sm.sce)+1), annotation_col = anno。df, show_rownames = FALSE, show_colnames = FALSE, main="after netSmooth")

2.1优化平滑参数α

缺省情况下,该参数α将使用稳健的聚类统计进行优化。简单地说,这种方法将尝试不同的聚类算法和/或参数,并找到可以用不同算法再现的聚类。的netSmooth ()函数会尝试不同的方法α由附加参数控制的值,以最大化鲁棒聚类中的样本数量。

现在,我们使用自动alpha优化来平滑表达式值,并绘制原始版本和平滑版本的热图。

smallscRNAseq.sm.se <- netSmooth(smallscRNAseq, smallPPI, alpha='auto') smallscRNAseq.sm.sce <- singlecel实验(assays=list(counts=化验(smallscRNAseq.sm.se)), colData=colData(smallscRNAseq.sm.se)) pheatmap(log2(化验(smallscRNAseq.sm.sce)+1), annotation_col = anno。df, show_rownames = FALSE, show_colnames = FALSE, main="after netSmooth (optimal alpha)")

3.从数据中获得健壮的集群

目前还没有专门针对单细胞RNAseq数据聚类的标准方法,因为不同的研究产生的数据具有不同的拓扑结构,这些拓扑结构对各种聚类算法的响应也不同。为了避免针对不同的数据集优化不同的聚类例程,我们实现了基于clusterExperiment.的clusterExperiment鲁棒聚类框架是基于从不同的数据视图和不同的聚类算法获得的聚类分配的共识聚类。不同的视图是基于不同的技术对数据进行不同的降维投影;因此,没有单一的聚类结果将支配数据,只有对不同分析具有鲁棒性的聚类结构才会占上风。的组件实现了一个集群框架clusterExperiment以及不同的降维方法。

我们可以直接使用鲁棒聚类函数robustClusters

yhat <- robustClusters(smallscRNAseq, makeConsensusMinSize=2, makeConsensusProportion=.9)$clusters . yhat <- robustClusters(smallscRNAseq, makeConsensusMinSize=2, makeConsensusProportion=.9
##选择dimReduceFlavor: umap
##参数组合,0使用顺序方法,0使用子抽样方法##对参数组合运行聚类…# #。
注意:合并将在' makeConsensus '上完成,集群索引为1
yhat。sm <- robustClusters(smallscRNAseq.sm. sm)。makeConsensusMinSize=2, makeConsensusProportion=.9)$clusters . se, makeConsensusMinSize=2, makeConsensusProportion=.9)$clusters . se
##选择dimReduceFlavor: pca
##参数组合,0使用顺序方法,0使用子抽样方法##对参数组合运行聚类…# #。
##警告(函数(A, nv = 5, nu = nv, maxit = 1000, work = nv + 7, reorth = ## TRUE,您计算的奇异值占总奇异值的百分比太大,请使用##标准svd代替。
注意:合并将在' makeConsensus '上完成,集群索引为1
细胞。类型<- colData(smallscRNAseq)$source_name_ch1 knitr::kable(表(单元格。类型,yhat),标题= '单元格类型和' robustClusters '在原始数据。”)

表1: 细胞类型和robustClusters在原始数据中。
-1 1 2
有分裂球 1 0 2
4细胞分裂球 1 0 3.
8芯分裂球 10 0 0
为胚胎 1 0 0
桑椹胚 0 3. 0
卵母细胞 0 0 3.
原核 1 0 2
受精卵 1 0 1
knitr:: kable(表(细胞。类型,yhat.sm),标题= '单元格类型和' robustClusters '在平滑的数据。”)

表1: 细胞类型和robustClusters在平滑数据中。
-1 1 2 3. 4
有分裂球 1 0 2 0 0
4细胞分裂球 3. 0 1 0 0
8芯分裂球 6 0 0 2 2
为胚胎 1 0 0 0 0
桑椹胚 0 3. 0 0 0
卵母细胞 0 0 3. 0 0
原核 0 0 3. 0 0
受精卵 0 0 2 0 0

的群集分配-1指示该单元格不能放置在健壮的群集中,因此已被省略。我们看到,在原始数据中,聚类是完全没有信息的,而平滑数据至少允许robustClusters将8细胞卵裂球的一个子集作为一个单独的集群。

4决定可视化和聚类的最佳降维方法

robustClusters ()函数通过使用PCA或t-SNE在低维嵌入中聚类样本来工作。不同的单细胞数据集可能对不同的降维技术有更好的响应。为了在算法上选择正确的技术,我们在二维嵌入中计算熵。我们使用PCA或t-SNE从500个最可变的基因中获得2D嵌入,将它们放入20x20网格中,并计算熵。二维嵌入中的熵是对嵌入所捕获信息的度量。我们选择信息含量最高的嵌入。pickDimReduction ()函数实现此策略并根据此策略返回最佳嵌入。

下面,我们为我们的示例数据集选择最佳嵌入,并为不同的2D嵌入方法绘制散点图。

smallscRNAseq <- runPCA(smallscRNAseq, ncomponents=2) smallscRNAseq <- runtse (smallscRNAseq, ncomponents=2) smallscRNAseq <- runUMAP(smallscRNAseq, ncomponents=2) plotPCA(smallscRNAseq, colour_by='source_name_ch1') + ggtitle("PCA plot")

plotTSNE(smallscRNAseq, color_by ='source_name_ch1') + ggtitle(" tssne plot")

plotUMAP(smallscRNAseq, color_by ='source_name_ch1') + ggtitle("UMAP plot")

pickDimReduction方法选取产生最大熵嵌入的降维方法:

pickDimReduction (smallscRNAseq)
##[1]“umap”

5常见问题

5.0.1我如何使平滑更快?

确保使用openBLAS或更快的变体编译R。

正式如果不是所有的基因都在我的网络中会发生什么?

平滑只使用网络中的基因,然后未平滑的基因将附着在基因表达矩阵上。


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] pheatmap_1.0.12 netSmooth_1.18.0 [3] clusterExperiment_2.18.0 bigmemory_4.6.1 # # [5] scater_1.26.0 ggplot2_3.3.6 # # [7] scuttle_1.8.0 SingleCellExperiment_1.20.0 # # [9] SummarizedExperiment_1.28.0 Biobase_2.58.0 # # [11] GenomicRanges_1.50.0 GenomeInfoDb_1.34.0 # # [13] IRanges_2.32.0 S4Vectors_0.36.0 # # [15] BiocGenerics_0.44.0 MatrixGenerics_1.10.0 # # [17] matrixStats_0.62.0 BiocStyle_2.26.0 # # # #通过加载一个名称空间(而不是附加):## [9] digest_0.6.30 foreach_1.5.2 ## [11] htmltools_0.5.3 magick_2.7.3 ## [13] viridis_0.6.2 fansi_1.0.3 memoise_2.0.1 ## [17] ScaledMatrix_1.6.0 cluster_2.1.4 ## [19] doParallel_1.0.17 limma_1 .54.0 ## [23] prettyunits_1.1.1 colorspace_2.0-3 ## [25] blob_1.2.3 ggrepel_0.9.1 ## [27] xfun_0.34dplyr_1.0.10 # # [29] crayon_1.5.2 rcurl_1.98 - 1.9 # # [31] jsonlite_1.8.3 bigmemory.sri_0.1.3 # # [33] genefilter_1.80.0 phylobase_0.8.10 # # [35] survival_3.4-0 iterators_1.0.14 # # [37] ape_5.6-2 glue_1.6.2 # # [39] registry_0.5-1 gtable_0.3.1 # # [41] zlibbioc_1.44.0 XVector_0.38.0 # # [43] DelayedArray_0.24.0 BiocSingular_1.14.0 # # [45] kernlab_0.9-31 Rhdf5lib_1.20.0 # # [47] HDF5Array_1.26.0 abind_1.4-5 # # [49] scales_1.2.1 DBI_1.1.3 # # [51] edgeR_3.40.0 rngtools_1.5.2 # # [53] Rcpp_1.0.9viridisLite_0.4.1 ## [57] bit_4.0.4 rsvd_1.0.5 ## [59] httr_1.4.4 FNN_1.1.3.1 ## [61] RColorBrewer_1.1-3 ellipsis_0.3.2 ## [63] farver_2.1.1 pkgconfig_2.0.3 ## [65] XML_3.99-0.12 uwot_0.1.14 ## [67] sass_0.4.2 locfit_1. 2 -9.6 ## [69] utf8_1.2.2 labeling_0.4.2 ## [71] howmany_0.3-1 tidyselect_1.2.0 ## [73] rlang_1.0.6 softimpute_1 .1- 1 ## [75] reshape2_1.4.4 AnnotationDbi_1.60.0 ## [77] munsell_0.5.0 tools_4.2.1 ## [79] cachem_1.0.6 cli_3.4.1 ## [81]generics_0.1.3 RSQLite_2.2.18 ## [83] ade4_1.7-19 evaluate_0.17 ## [85] string_1 .4.1 fastmap_1.1.0 ## [87] yaml_2.3.6 knitr_1.40 ## [89] bit64_4.0.5 purrr_0.3.5 ## [91] KEGGREST_1.38.0 nlme_1 -160 ## [93] sparseMatrixStats_1.10.0 xml2_1.3.3 ## [95] compiler_4.2.1 beeswarm_0.4.0 ## [97] png_0.1-7 tibble_3.1.8 ## [101] bslib_0.4.0 RNeXML_2.4.8 ## [101] stringi_1.7.8 highr_0.9 ## [103] lattice_0.20-45 Matrix_1.5-1 ## [105] vctrs_0.5.0 pillar_1.8.1 ## [107] lifecycle_1.0.3 rhdf5filters_1.10.0 ## [109] BiocManager_1.30.19 jquerylib_0.1.4 ## [111] zinbwave_1.20.0 BiocNeighbors_1.16.0 ## [113] cowplot_1.1.1 data.table_1.14.4 ## [115] bitops_1.0-7 irlba_2.3.5.1 ## [117] R6_2.5.1 bookdown_0.29 ## [119] gridExtra_2.3 vipor_0.4.5 ## [121] codetools_0.2-18 MASS_7.3-58.1 ## [123] assertthat_0.2.1 MAST_1.24.0 ## [125] rhdf5_2.42.0 pkgmaker_0.32.2 ## [127] withr_2.5.0 GenomeInfoDbData_1.2.9 ## [129] locfdr_1.1-8 parallel_4.2.1 ## [131] hms_1.1.2 grid_4.2.1 ## [133] beachmat_2.14.0 tidyr_1.2.1 ## [135] rmarkdown_2.17 DelayedMatrixStats_1.20.0 ## [137] Rtsne_0.16 ggbeeswarm_0.6.0