if (!requireNamespace("BiocManager", quietly = TRUE)) {
install.packages("BiocManager")
}
BiocManager::install("Dune")
We use a subset of the Allen Smart-Seq nuclei dataset. Run ?Dune::nuclei
for more details on pre-processing.
suppressPackageStartupMessages({
library(RColorBrewer)
library(dplyr)
library(ggplot2)
library(tidyr)
library(knitr)
library(purrr)
library(Dune)
})
data("nuclei", package = "Dune")
theme_set(theme_classic())
We have a dataset of \(1744\) cells, with the results from 3 clustering algorithms: Seurat3, Monocle3 and SC3. The Allen Institute also produce hand-picked cluster and subclass labels. Finally, we included the coordinates from a t-SNE representation, for visualization.
ggplot(nuclei, aes(x = x, y = y, col = subclass_label)) +
geom_point()
We can also see how the three clustering algorithm partitioned the dataset initially:
walk(c("SC3", "Seurat", "Monocle"), function(clus_algo){
df <- nuclei
df$clus_algo <- nuclei[, clus_algo]
p <- ggplot(df, aes(x = x, y = y, col = as.character(clus_algo))) +
geom_point(size = 1.5) +
# guides(color = FALSE) +
labs(title = clus_algo, col = "clusters") +
theme(legend.position = "bottom")
print(p)
})
The adjusted Rand Index between the three methods can be computed.
plotARIs(nuclei %>% select(SC3, Seurat, Monocle))
## Warning: The `<scale>` argument of `guides()` cannot be `FALSE`. Use "none" instead as
## of ggplot2 3.3.4.
## â„ą The deprecated feature was likely used in the Dune package.
## Please report the issue to the authors.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
As we can see, the ARI between the three methods is initially quite low.
We can now try to merge clusters with the Dune
function. At each step, the algorithm will print which clustering label is merged (by its number, so 1~SC3
and so on), as well as the pair of clusters that get merged.
merger <- Dune(clusMat = nuclei %>% select(SC3, Seurat, Monocle), verbose = TRUE)
## [1] "SC3" "21" "20"
## [1] "Monocle" "20" "4"
## [1] "SC3" "11" "12"
## [1] "SC3" "30" "28"
## [1] "SC3" "11" "24"
The output from Dune
is a list with four components:
names(merger)
## [1] "initialMat" "currentMat" "merges" "ImpMetric" "metric"
initialMat
is the initial matrix. of cluster labels. currentMat
is the final matrix of cluster labels. merges
is a matrix that recapitulates what has been printed above, while ImpARI
list the ARI improvement over the merges.
We can now see how much the ARI has improved:
plotARIs(clusMat = merger$currentMat)
The methods now look much more similar, as can be expected.
We can also see how the number of clusters got reduced.
plotPrePost(merger)
For SC3 for example, we can visualize how the clusters got merged:
ConfusionPlot(merger$initialMat[, "SC3"], merger$currentMat[, "SC3"]) +
labs(x = "Before merging", y = "After merging")
Finally, the ARIImp function tracks mean ARI improvement as pairs of clusters get merged down.
ARItrend(merger)
sessionInfo()
## R version 4.3.0 RC (2023-04-13 r84269)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 22.04.2 LTS
##
## Matrix products: default
## BLAS: /home/biocbuild/bbs-3.17-bioc/R/lib/libRblas.so
## LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.10.0
##
## 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_TELEPHONE=C
## [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
##
## time zone: America/New_York
## tzcode source: system (glibc)
##
## attached base packages:
## [1] stats graphics grDevices utils datasets methods base
##
## other attached packages:
## [1] Dune_1.12.0 purrr_1.0.1 knitr_1.42 tidyr_1.3.0
## [5] ggplot2_3.4.2 dplyr_1.1.2 RColorBrewer_1.1-3
##
## loaded via a namespace (and not attached):
## [1] SummarizedExperiment_1.30.0 gtable_0.3.3
## [3] xfun_0.39 bslib_0.4.2
## [5] Biobase_2.60.0 lattice_0.21-8
## [7] vctrs_0.6.2 tools_4.3.0
## [9] bitops_1.0-7 generics_0.1.3
## [11] stats4_4.3.0 parallel_4.3.0
## [13] tibble_3.2.1 fansi_1.0.4
## [15] highr_0.10 pkgconfig_2.0.3
## [17] Matrix_1.5-4 S4Vectors_0.38.0
## [19] lifecycle_1.0.3 GenomeInfoDbData_1.2.10
## [21] compiler_4.3.0 farver_2.1.1
## [23] progress_1.2.2 munsell_0.5.0
## [25] aricode_1.0.2 codetools_0.2-19
## [27] GenomeInfoDb_1.36.0 htmltools_0.5.5
## [29] sass_0.4.5 RCurl_1.98-1.12
## [31] yaml_2.3.7 pillar_1.9.0
## [33] crayon_1.5.2 jquerylib_0.1.4
## [35] BiocParallel_1.34.0 cachem_1.0.7
## [37] DelayedArray_0.26.0 magick_2.7.4
## [39] tidyselect_1.2.0 digest_0.6.31
## [41] stringi_1.7.12 labeling_0.4.2
## [43] fastmap_1.1.1 grid_4.3.0
## [45] colorspace_2.1-0 cli_3.6.1
## [47] magrittr_2.0.3 utf8_1.2.3
## [49] withr_2.5.0 prettyunits_1.1.1
## [51] scales_1.2.1 rmarkdown_2.21
## [53] XVector_0.40.0 matrixStats_0.63.0
## [55] hms_1.1.3 evaluate_0.20
## [57] GenomicRanges_1.52.0 IRanges_2.34.0
## [59] viridisLite_0.4.1 gganimate_1.0.8
## [61] rlang_1.1.0 Rcpp_1.0.10
## [63] glue_1.6.2 tweenr_2.0.2
## [65] BiocGenerics_0.46.0 jsonlite_1.8.4
## [67] R6_2.5.1 MatrixGenerics_1.12.0
## [69] zlibbioc_1.46.0