1 Introduction

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.

2 Libraries

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

3 Data

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)
PCA embedding showing ground-truth pseudotime

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)
PCA embedding showing subject ID

Figure 2: PCA embedding showing subject ID

4 scLANE testing

The 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"))

Table 1: Sample of scLANE TDE statistics
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

5 Downstream analysis

The package offers a variety of different downstream analysis functionalities, several of which we’ll explore here.

5.1 Model comparison

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)
Modeling framework comparison

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)

Table 2: Summarized coefficients from scLANE
Gene Lineage Breakpoint Slope.Segment1 Slope.Segment2 Trend.Segment1 Trend.Segment2
HIST1H4C A 0.501 4.726 -3.502 1 -1

5.2 Gene dynamics plots

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)))
Dynamics of the top 4 most TDE genes

Figure 4: Dynamics of the top 4 most TDE genes

5.3 Heatmaps

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)
Expression cascade of dynamic genes across pseudotime

Figure 5: Expression cascade of dynamic genes across pseudotime

5.4 Gene embeddings

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)))
Embedding & clustering of gene dynamics

Figure 6: Embedding & clustering of gene dynamics

5.5 Gene program scoring

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)
Module scores for gene cluster 1

Figure 7: Module scores for gene cluster 1

5.6 Trajectory enrichment

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"))

Table 3: Trajectory pathway enrichment statistics
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

6 Session info

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
## 
## ──────────────────────────────────────────────────────────────────────────────