scLANE 0.99.0
Single cell RNA-seq technologies allow scientists to profile developmental processes at the cellular level. Trajectory inference comprises a broad set of methods including pseudotime estimation, RNA velocity, and graph abstraction. These methods usually seek to identify some sort of pseudotemporal ordering of cells based on their transcriptomic similarity, with the assumption that it’s possible to reconstruct the biological process being studied based on gene expression. This ordering is then used to perform trajectory differential expression (TDE) testing, wherein pseudotime is treated as a covariate and gene expression is the response. Genes with statistically significant associations with pseudotime are then investigated to determine their biological effect on the process being studied.
In order to properly characterize transcriptional dynamics across trajectories models must be able to handle nonlinearity. This is traditionally done using generalized additive models (GAMs), though interpretation of that type of model is tricky and often subjective. The scLANE
method proposes a negative-binomial nonlinear model that is piecewise linear across empirically chosen pseudotime intervals; within each interval the model is interpretable as a classical generalized linear model (GLM). This package is comprised of an efficient implementation of that model for both single- and multi-subject datasets, along with a suite of downstream analysis utilities.
First we’ll need to load some packages & resolve a few function conflicts.
library(scran)
library(dplyr)
library(scater)
library(scLANE)
library(ggplot2)
library(ComplexHeatmap)
select <- dplyr::select
filter <- dplyr::filter
We’ll start by reading in some simulated scRNA-seq data with a simple trajectory structure that is homogeneous across several subjects.
sim_data <- readRDS(url("https://zenodo.org/record/8433077/files/scLANE_sim_data.Rds"))
The ground-truth pseudotime ordering is well-represented in PCA space:
plotPCA(sim_data, colour_by = "cell_time_normed") +
theme_scLANE(umap = TRUE)
Figure 1: PCA embedding showing ground-truth pseudotime
We don’t observe any clustering by subject ID, indicating that the trajectory is consistent across subjects.
plotPCA(sim_data, colour_by = "subject") +
theme_scLANE(umap = TRUE)
Figure 2: PCA embedding showing subject ID
scLANE
testingThe necessary inputs for scLANE
are as follows: a dataframe containing \(\ge 1\) pseudotime lineages, a sequencing depth-based offset, and a matrix of gene expression counts (this can be a SingleCellExperiment
or Seurat
object, or an actual dense or sparse counts matrix). In addition, we can optionally provide a subset of genes to test - here we identify the top 1,000 most highly-variable genes (HVGs), and test only those.
pt_df <- data.frame(PT = sim_data$cell_time_normed)
cell_offset <- createCellOffset(sim_data)
top1k_hvgs <- getTopHVGs(modelGeneVar(sim_data), n = 1e3)
The default modeling framework is based on GLMs, which we use here. Parallel processing is turned on by default in order to speed things up. Setting the verbose = TRUE
parameter would print a progress bar to the console.
scLANE_models <- testDynamic(sim_data,
pt = pt_df,
genes = top1k_hvgs,
size.factor.offset = cell_offset,
n.cores = 6L,
verbose = FALSE)
## Registered S3 method overwritten by 'bit':
## method from
## print.ri gamlss
## scLANE testing in GLM mode completed for 1000 genes across 1 lineage in 1.785 mins
After model fitting has completed, we generate a tidy table of DE test results and statistics using the getResultsDE()
function. Each gene is given a binary dynamic vs. static classification (denoted as 1 or 0, respectively) over a given lineage / the trajectory as a whole if it’s adjusted p-value is less than a specified threshold; the default is \(\alpha = 0.01\).
scLANE_de_res <- getResultsDE(scLANE_models)
select(scLANE_de_res, Gene, Test_Stat, P_Val, P_Val_Adj, Gene_Dynamic_Overall) %>%
slice_sample(n = 5) %>%
knitr::kable(digits = 3,
caption = "Sample of scLANE TDE statistics",
col.names = c("Gene", "LRT Stat.", "P-value", "Adj. P-value", "Pred. Status"))
Gene | LRT Stat. | P-value | Adj. P-value | Pred. Status |
---|---|---|---|---|
APMAP | 587.456 | 0.000 | 0.000 | 1 |
UCHL1 | 202.983 | 0.000 | 0.000 | 1 |
LZTFL1 | 1.901 | 0.168 | 0.182 | 0 |
GABARAPL2 | 511.517 | 0.000 | 0.000 | 1 |
CAPZA1 | 294.854 | 0.000 | 0.000 | 1 |
The package offers a variety of different downstream analysis functionalities, several of which we’ll explore here.
The plotModels()
function allows us to compare different modeling frameworks. Here we visualize the most significant gene and compare our model with a GLM and a GAM. The monotonic GLM fails to capture the inherent nonlinearity of the gene’s dynamics over pseudotime, and while the GAM does capture that trend it lacks the interpretability of the scLANE
model.
plotModels(scLANE_models,
gene = scLANE_de_res$Gene[1],
pt = pt_df,
expr.mat = sim_data,
size.factor.offset = cell_offset,
plot.glm = TRUE,
plot.gam = TRUE)
Figure 3: Modeling framework comparison
Each gene’s output contains a slot named Gene_Dynamics
that summarizes the coefficients across each pseudotime interval.
knitr::kable(scLANE_models[[scLANE_de_res$Gene[1]]]$Lineage_A$Gene_Dynamics,
caption = "Summarized coefficients from scLANE",
digits = 3)
Gene | Lineage | Breakpoint | Slope.Segment1 | Slope.Segment2 | Trend.Segment1 | Trend.Segment2 |
---|---|---|---|---|---|---|
HIST1H4C | A | 0.501 | 4.726 | -3.502 | 1 | -1 |
Using the getFittedValues()
function we can generate a table of per-gene, per-cell expression estimations on a variety of scales (raw, depth-normalized, and log1p-normalized). Here we visualize the fitted dynamics for the top four most significantly TDE genes.
getFittedValues(scLANE_models,
genes = scLANE_de_res$Gene[1:4],
pt = pt_df,
expr.mat = sim_data,
size.factor.offset = cell_offset,
cell.meta.data = data.frame(cluster = sim_data$label)) %>%
ggplot(aes(x = pt, y = rna_log1p)) +
facet_wrap(~gene, ncol = 2) +
geom_point(aes(color = cluster),
size = 2,
alpha = 0.75,
stroke = 0) +
geom_ribbon(aes(ymin = scLANE_ci_ll_log1p, ymax = scLANE_ci_ul_log1p),
linewidth = 0,
fill = "grey70",
alpha = 0.9) +
geom_line(aes(y = scLANE_pred_log1p),
color = "black",
linewidth = 0.75) +
scale_x_continuous(labels = scales::label_number(accuracy = 0.01)) +
labs(x = "Pseudotime",
y = "Normalized Expression",
color = "Leiden") +
theme_scLANE() +
theme(strip.text.x = element_text(face = "italic")) +
guides(color = guide_legend(override.aes = list(alpha = 1, size = 2, stroke = 1)))
Figure 4: Dynamics of the top 4 most TDE genes
To generate a heatmap of expression cascades, we first pull a matrix of gene dynamics for all genes that are significantly TDE.
dyn_genes <- filter(scLANE_de_res, Gene_Dynamic_Overall == 1) %>%
pull(Gene)
smoothed_counts <- smoothedCountsMatrix(scLANE_models,
size.factor.offset = cell_offset,
pt = pt_df,
genes = dyn_genes,
log1p.norm = TRUE)
Next, we set up column annotations for the cells, and order the genes by where their peak expression occurs during pseudotime with the sortGenesHeatmap()
function.
col_anno_df <- data.frame(cell_name = colnames(sim_data),
leiden = as.factor(sim_data$label),
subject = as.factor(sim_data$subject),
pseudotime = sim_data$cell_time_normed) %>%
arrange(pseudotime)
gene_order <- sortGenesHeatmap(smoothed_counts$Lineage_A, pt.vec = sim_data$cell_time_normed)
heatmap_mat <- t(scale(smoothed_counts$Lineage_A))
colnames(heatmap_mat) <- colnames(sim_data)
heatmap_mat <- heatmap_mat[, col_anno_df$cell_name]
heatmap_mat <- heatmap_mat[gene_order, ]
col_anno <- HeatmapAnnotation(Leiden = col_anno_df$leiden,
Subject = col_anno_df$subject,
Pseudotime = col_anno_df$pseudotime,
show_legend = TRUE,
show_annotation_name = FALSE,
gap = unit(1, "mm"),
border = TRUE)
Now we can finally plot the heatmap:
Heatmap(matrix = heatmap_mat,
name = "Scaled\nmRNA",
col = circlize::colorRamp2(colors = viridis::inferno(50),
breaks = seq(min(heatmap_mat), max(heatmap_mat), length.out = 50)),
cluster_columns = FALSE,
width = 9,
height = 6,
column_title = "",
cluster_rows = FALSE,
top_annotation = col_anno,
border = TRUE,
show_column_names = FALSE,
show_row_names = FALSE,
use_raster = TRUE,
raster_by_magick = TRUE,
raster_quality = 5)
Figure 5: Expression cascade of dynamic genes across pseudotime
With embedGenes()
we can compute a gene-level clustering along with PCA & UMAP embeddings. This allows us to examine how groups of genes behave, and annotate those groups based on the genes’ biological functions.
gene_embedding <- embedGenes(expm1(smoothed_counts$Lineage_A))
ggplot(gene_embedding, aes(x = umap1, y = umap2, color = leiden)) +
geom_point(alpha = 0.75,
size = 2,
stroke = 0) +
labs(x = "UMAP 1",
y = "UMAP 2",
color = "Gene Cluster") +
theme_scLANE(umap = TRUE) +
guides(color = guide_legend(override.aes = list(size = 2, alpha = 1, stroke = 1)))
Figure 6: Embedding & clustering of gene dynamics
We assume that each cluster of similarly-behaving genes represents a gene program i.e., a set of genes that work together to perform a shared task. Each program is defined by the set of genes unique to it, and module scoring allows us to assign a per-cell numeric score for each set of genes. The geneProgramScoring()
function performs this task using the UCell package under the hood.
sim_data <- geneProgramScoring(sim_data,
genes = gene_embedding$gene,
gene.clusters = gene_embedding$leiden)
Plotting the program scores for gene cluster 1 shows that cells at the end of the trajectory have overall high expression of genes in that cluster.
plotPCA(sim_data, colour_by = "cluster_1") +
theme_scLANE(umap = TRUE)
Figure 7: Module scores for gene cluster 1
Lastly, we can perform pathway analysis on the set of dynamic genes using the enrichDynamicGenes()
function. This is built off of the gprofiler2 package, which supports a wide variety of species and pathway databases.
dyn_gene_enrichment <- enrichDynamicGenes(scLANE_de_res, species = "hsapiens")
filter(dyn_gene_enrichment$result, source == "GO:BP") %>%
select(term_id, term_name, p_value, source) %>%
slice_head(n = 5) %>%
knitr::kable(digits = 3,
caption = "Trajectory pathway enrichment statistics",
col.names = c("Term ID", "Term name", "Adj. p-value", "Source"))
Term ID | Term name | Adj. p-value | Source |
---|---|---|---|
GO:0019538 | protein metabolic process | 0 | GO:BP |
GO:0051179 | localization | 0 | GO:BP |
GO:0046907 | intracellular transport | 0 | GO:BP |
GO:0006810 | transport | 0 | GO:BP |
GO:0051234 | establishment of localization | 0 | GO:BP |
sessioninfo::session_info()
## ─ Session info ───────────────────────────────────────────────────────────────
## setting value
## version R Under development (unstable) (2025-01-20 r87609)
## os Ubuntu 24.04.1 LTS
## system x86_64, linux-gnu
## ui X11
## language (EN)
## collate C
## ctype en_US.UTF-8
## tz America/New_York
## date 2025-02-03
## pandoc 2.7.3 @ /usr/bin/ (via rmarkdown)
##
## ─ Packages ───────────────────────────────────────────────────────────────────
## package * version date (UTC) lib source
## abind 1.4-8 2024-09-12 [3] CRAN (R 4.5.0)
## backports 1.5.0 2024-05-23 [3] CRAN (R 4.5.0)
## beachmat 2.23.6 2025-02-02 [3] Bioconductor 3.21 (R 4.5.0)
## beeswarm 0.4.0 2021-06-01 [3] CRAN (R 4.5.0)
## bigassertr 0.1.6 2023-01-10 [3] CRAN (R 4.5.0)
## bigparallelr 0.3.2 2021-10-02 [3] CRAN (R 4.5.0)
## bigstatsr 1.6.1 2024-09-09 [3] CRAN (R 4.5.0)
## Biobase * 2.67.0 2025-02-02 [3] Bioconductor 3.21 (R 4.5.0)
## BiocGenerics * 0.53.6 2025-02-02 [3] Bioconductor 3.21 (R 4.5.0)
## BiocManager 1.30.25 2024-08-28 [2] CRAN (R 4.5.0)
## BiocNeighbors 2.1.2 2025-02-02 [3] Bioconductor 3.21 (R 4.5.0)
## BiocParallel 1.41.0 2025-02-02 [3] Bioconductor 3.21 (R 4.5.0)
## BiocSingular 1.23.0 2025-02-02 [3] Bioconductor 3.21 (R 4.5.0)
## BiocStyle * 2.35.0 2025-02-02 [3] Bioconductor 3.21 (R 4.5.0)
## bit 4.5.0.1 2024-12-03 [3] CRAN (R 4.5.0)
## bitops 1.0-9 2024-10-03 [3] CRAN (R 4.5.0)
## bluster 1.17.0 2025-02-02 [3] Bioconductor 3.21 (R 4.5.0)
## bookdown 0.42 2025-01-07 [3] CRAN (R 4.5.0)
## boot 1.3-31 2024-08-28 [4] CRAN (R 4.5.0)
## broom 1.0.7 2024-09-26 [3] CRAN (R 4.5.0)
## broom.mixed 0.2.9.6 2024-10-15 [3] CRAN (R 4.5.0)
## bslib 0.9.0 2025-01-30 [3] CRAN (R 4.5.0)
## bst 0.3-24 2023-01-06 [2] CRAN (R 4.5.0)
## cachem 1.1.0 2024-05-16 [3] CRAN (R 4.5.0)
## Cairo 1.6-2 2023-11-28 [3] CRAN (R 4.5.0)
## circlize 0.4.16 2024-02-20 [3] CRAN (R 4.5.0)
## cli 3.6.3 2024-06-21 [3] CRAN (R 4.5.0)
## clue 0.3-66 2024-11-13 [3] CRAN (R 4.5.0)
## cluster 2.1.8 2024-12-11 [4] CRAN (R 4.5.0)
## coda 0.19-4.1 2024-01-31 [3] CRAN (R 4.5.0)
## codetools 0.2-20 2024-03-31 [4] CRAN (R 4.5.0)
## colorspace 2.1-1 2024-07-26 [3] CRAN (R 4.5.0)
## ComplexHeatmap * 2.23.0 2025-02-02 [3] Bioconductor 3.21 (R 4.5.0)
## coop 0.6-3 2021-09-19 [3] CRAN (R 4.5.0)
## cowplot 1.1.3 2024-01-22 [3] CRAN (R 4.5.0)
## crayon 1.5.3 2024-06-20 [3] CRAN (R 4.5.0)
## data.table 1.16.4 2024-12-06 [3] CRAN (R 4.5.0)
## DelayedArray 0.33.4 2025-02-02 [3] Bioconductor 3.21 (R 4.5.0)
## digest 0.6.37 2024-08-19 [3] CRAN (R 4.5.0)
## doParallel 1.0.17 2022-02-07 [3] CRAN (R 4.5.0)
## doSNOW 1.0.20 2022-02-04 [3] CRAN (R 4.5.0)
## dplyr * 1.1.4 2023-11-17 [3] CRAN (R 4.5.0)
## dqrng 0.4.1 2024-05-28 [3] CRAN (R 4.5.0)
## edgeR 4.5.2 2025-02-02 [3] Bioconductor 3.21 (R 4.5.0)
## emmeans 1.10.7 2025-01-31 [3] CRAN (R 4.5.0)
## estimability 1.5.1 2024-05-12 [3] CRAN (R 4.5.0)
## evaluate 1.0.3 2025-01-10 [3] CRAN (R 4.5.0)
## farver 2.1.2 2024-05-13 [3] CRAN (R 4.5.0)
## fastmap 1.2.0 2024-05-15 [3] CRAN (R 4.5.0)
## ff 4.5.2 2025-01-13 [3] CRAN (R 4.5.0)
## flock 0.7 2016-11-12 [3] CRAN (R 4.5.0)
## forcats 1.0.0 2023-01-29 [3] CRAN (R 4.5.0)
## foreach 1.5.2 2022-02-02 [3] CRAN (R 4.5.0)
## furrr 0.3.1 2022-08-15 [3] CRAN (R 4.5.0)
## future 1.34.0 2024-07-29 [3] CRAN (R 4.5.0)
## gamlss 5.4-22 2024-03-20 [3] CRAN (R 4.5.0)
## gamlss.data 6.0-6 2024-03-14 [3] CRAN (R 4.5.0)
## gamlss.dist 6.1-1 2023-08-23 [3] CRAN (R 4.5.0)
## gbm 2.2.2 2024-06-28 [3] CRAN (R 4.5.0)
## geeM 0.10.1 2018-06-18 [3] CRAN (R 4.5.0)
## generics * 0.1.3 2022-07-05 [3] CRAN (R 4.5.0)
## GenomeInfoDb * 1.43.4 2025-02-02 [3] Bioconductor 3.21 (R 4.5.0)
## GenomeInfoDbData 1.2.13 2025-01-22 [3] Bioconductor
## GenomicRanges * 1.59.1 2025-02-02 [3] Bioconductor 3.21 (R 4.5.0)
## GetoptLong 1.0.5 2020-12-15 [3] CRAN (R 4.5.0)
## ggbeeswarm 0.7.2 2023-04-29 [3] CRAN (R 4.5.0)
## ggh4x 0.3.0 2024-12-15 [3] CRAN (R 4.5.0)
## ggplot2 * 3.5.1 2024-04-23 [3] CRAN (R 4.5.0)
## ggrepel 0.9.6 2024-09-07 [3] CRAN (R 4.5.0)
## glm2 * 1.2.1 2018-08-11 [3] CRAN (R 4.5.0)
## glmmTMB 1.1.10 2024-09-26 [3] CRAN (R 4.5.0)
## glmnet 4.1-8 2023-08-22 [3] CRAN (R 4.5.0)
## GlobalOptions 0.1.2 2020-06-10 [3] CRAN (R 4.5.0)
## globals 0.16.3 2024-03-08 [3] CRAN (R 4.5.0)
## glue 1.8.0 2024-09-30 [3] CRAN (R 4.5.0)
## gprofiler2 0.2.3 2024-02-23 [3] CRAN (R 4.5.0)
## gridExtra 2.3 2017-09-09 [3] CRAN (R 4.5.0)
## gtable 0.3.6 2024-10-25 [3] CRAN (R 4.5.0)
## htmltools 0.5.8.1 2024-04-04 [3] CRAN (R 4.5.0)
## htmlwidgets 1.6.4 2023-12-06 [3] CRAN (R 4.5.0)
## httr 1.4.7 2023-08-15 [3] CRAN (R 4.5.0)
## igraph 2.1.4 2025-01-23 [3] CRAN (R 4.5.0)
## IRanges * 2.41.2 2025-02-02 [3] Bioconductor 3.21 (R 4.5.0)
## irlba 2.3.5.1 2022-10-03 [3] CRAN (R 4.5.0)
## iterators 1.0.14 2022-02-05 [3] CRAN (R 4.5.0)
## jquerylib 0.1.4 2021-04-26 [3] CRAN (R 4.5.0)
## jsonlite 1.8.9 2024-09-20 [3] CRAN (R 4.5.0)
## knitr 1.49 2024-11-08 [3] CRAN (R 4.5.0)
## labeling 0.4.3 2023-08-29 [3] CRAN (R 4.5.0)
## lattice 0.22-6 2024-03-20 [4] CRAN (R 4.5.0)
## lazyeval 0.2.2 2019-03-15 [3] CRAN (R 4.5.0)
## lifecycle 1.0.4 2023-11-07 [3] CRAN (R 4.5.0)
## limma 3.63.3 2025-02-02 [3] Bioconductor 3.21 (R 4.5.0)
## listenv 0.9.1 2024-01-29 [3] CRAN (R 4.5.0)
## lme4 1.1-36 2025-01-11 [3] CRAN (R 4.5.0)
## locfit 1.5-9.10 2024-06-24 [3] CRAN (R 4.5.0)
## magick 2.8.5 2024-09-20 [3] CRAN (R 4.5.0)
## magrittr * 2.0.3 2022-03-30 [3] CRAN (R 4.5.0)
## MASS 7.3-64 2025-01-04 [4] CRAN (R 4.5.0)
## Matrix 1.7-2 2025-01-23 [4] CRAN (R 4.5.0)
## MatrixGenerics * 1.19.1 2025-02-02 [3] Bioconductor 3.21 (R 4.5.0)
## matrixStats * 1.5.0 2025-01-07 [3] CRAN (R 4.5.0)
## metapod 1.15.0 2025-02-02 [3] Bioconductor 3.21 (R 4.5.0)
## mgcv 1.9-1 2023-12-21 [4] CRAN (R 4.5.0)
## minqa 1.2.8 2024-08-17 [3] CRAN (R 4.5.0)
## mpath 0.4-2.26 2024-06-27 [2] CRAN (R 4.5.0)
## multcomp 1.4-28 2025-01-29 [3] CRAN (R 4.5.0)
## munsell 0.5.1 2024-04-01 [3] CRAN (R 4.5.0)
## mvtnorm 1.3-3 2025-01-10 [3] CRAN (R 4.5.0)
## nlme 3.1-167 2025-01-27 [4] CRAN (R 4.5.0)
## nloptr 2.1.1 2024-06-25 [3] CRAN (R 4.5.0)
## numDeriv 2016.8-1.1 2019-06-06 [3] CRAN (R 4.5.0)
## parallelly 1.42.0 2025-01-30 [3] CRAN (R 4.5.0)
## pillar 1.10.1 2025-01-07 [3] CRAN (R 4.5.0)
## pkgconfig 2.0.3 2019-09-22 [3] CRAN (R 4.5.0)
## plotly 4.10.4 2024-01-13 [3] CRAN (R 4.5.0)
## png 0.1-8 2022-11-29 [3] CRAN (R 4.5.0)
## ps 1.8.1 2024-10-28 [3] CRAN (R 4.5.0)
## pscl 1.5.9 2024-01-31 [3] CRAN (R 4.5.0)
## purrr 1.0.2 2023-08-10 [3] CRAN (R 4.5.0)
## R6 2.5.1 2021-08-19 [3] CRAN (R 4.5.0)
## rbibutils 2.3 2024-10-04 [3] CRAN (R 4.5.0)
## RColorBrewer 1.1-3 2022-04-03 [3] CRAN (R 4.5.0)
## Rcpp 1.0.14 2025-01-12 [3] CRAN (R 4.5.0)
## RcppAnnoy 0.0.22 2024-01-23 [3] CRAN (R 4.5.0)
## RcppEigen 0.3.4.0.2 2024-08-24 [3] CRAN (R 4.5.0)
## RCurl 1.98-1.16 2024-07-11 [3] CRAN (R 4.5.0)
## Rdpack 2.6.2 2024-11-15 [3] CRAN (R 4.5.0)
## reformulas 0.4.0 2024-11-03 [3] CRAN (R 4.5.0)
## rjson 0.2.23 2024-09-16 [3] CRAN (R 4.5.0)
## rlang 1.1.5 2025-01-17 [3] CRAN (R 4.5.0)
## rmarkdown 2.29 2024-11-04 [3] CRAN (R 4.5.0)
## rmio 0.4.0 2022-02-17 [3] CRAN (R 4.5.0)
## rpart 4.1.24 2025-01-07 [4] CRAN (R 4.5.0)
## rsvd 1.0.5 2021-04-16 [3] CRAN (R 4.5.0)
## S4Arrays 1.7.1 2025-02-02 [3] Bioconductor 3.21 (R 4.5.0)
## S4Vectors * 0.45.2 2025-02-02 [3] Bioconductor 3.21 (R 4.5.0)
## sandwich 3.1-1 2024-09-15 [3] CRAN (R 4.5.0)
## sass 0.4.9 2024-03-15 [3] CRAN (R 4.5.0)
## ScaledMatrix 1.15.0 2025-02-02 [3] Bioconductor 3.21 (R 4.5.0)
## scales 1.3.0 2023-11-28 [3] CRAN (R 4.5.0)
## scater * 1.35.1 2025-02-02 [3] Bioconductor 3.21 (R 4.5.0)
## scLANE * 0.99.0 2025-02-03 [1] Bioconductor
## scran * 1.35.0 2025-02-02 [3] Bioconductor 3.21 (R 4.5.0)
## scuttle * 1.17.0 2025-02-02 [3] Bioconductor 3.21 (R 4.5.0)
## sessioninfo 1.2.2 2021-12-06 [3] CRAN (R 4.5.0)
## shape 1.4.6.1 2024-02-23 [3] CRAN (R 4.5.0)
## SingleCellExperiment * 1.29.1 2025-02-02 [3] Bioconductor 3.21 (R 4.5.0)
## snow 0.4-4 2021-10-27 [3] CRAN (R 4.5.0)
## SparseArray 1.7.4 2025-02-02 [3] Bioconductor 3.21 (R 4.5.0)
## statmod 1.5.0 2023-01-06 [3] CRAN (R 4.5.0)
## SummarizedExperiment * 1.37.0 2025-02-02 [3] Bioconductor 3.21 (R 4.5.0)
## survival 3.8-3 2024-12-17 [4] CRAN (R 4.5.0)
## TH.data 1.1-3 2025-01-17 [3] CRAN (R 4.5.0)
## tibble 3.2.1 2023-03-20 [3] CRAN (R 4.5.0)
## tidyr 1.3.1 2024-01-24 [3] CRAN (R 4.5.0)
## tidyselect 1.2.1 2024-03-11 [3] CRAN (R 4.5.0)
## tinytex 0.54 2024-11-01 [3] CRAN (R 4.5.0)
## TMB 1.9.16 2025-01-08 [3] CRAN (R 4.5.0)
## UCell 2.11.1 2025-02-02 [3] Bioconductor 3.21 (R 4.5.0)
## UCSC.utils 1.3.1 2025-02-02 [3] Bioconductor 3.21 (R 4.5.0)
## uwot 0.2.2 2024-04-21 [3] CRAN (R 4.5.0)
## vctrs 0.6.5 2023-12-01 [3] CRAN (R 4.5.0)
## vipor 0.4.7 2023-12-18 [3] CRAN (R 4.5.0)
## viridis 0.6.5 2024-01-29 [3] CRAN (R 4.5.0)
## viridisLite 0.4.2 2023-05-02 [3] CRAN (R 4.5.0)
## WeightSVM 1.7-16 2024-10-12 [2] CRAN (R 4.5.0)
## withr 3.0.2 2024-10-28 [3] CRAN (R 4.5.0)
## xfun 0.50 2025-01-07 [3] CRAN (R 4.5.0)
## xtable 1.8-4 2019-04-21 [3] CRAN (R 4.5.0)
## XVector 0.47.2 2025-02-02 [3] Bioconductor 3.21 (R 4.5.0)
## yaml 2.3.10 2024-07-26 [2] CRAN (R 4.5.0)
## zoo 1.8-12 2023-04-13 [3] CRAN (R 4.5.0)
##
## [1] /tmp/RtmpmxXyz9/Rinst249fae195fe350
## [2] /home/pkgbuild/packagebuilder/workers/jobs/3705/R-libs
## [3] /home/biocbuild/bbs-3.21-bioc/R/site-library
## [4] /home/biocbuild/bbs-3.21-bioc/R/library
##
## ──────────────────────────────────────────────────────────────────────────────