Integration with dreamlet / SingleCellExperiment

Load and process single cell data

Here we perform analysis of PBMCs from 8 individuals stimulated with interferon-β Kang, et al, 2018, Nature Biotech. We perform standard processing with dreamlet to compute pseudobulk before applying crumblr.

Here, single cell RNA-seq data is downloaded from ExperimentHub.

library(dreamlet)
library(muscat)
library(ExperimentHub)
library(scater)

# Download data, specifying EH2259 for the Kang, et al study
eh <- ExperimentHub()
sce <- eh[["EH2259"]]
sce$ind <- as.character(sce$ind)

# only keep singlet cells with sufficient reads
sce <- sce[rowSums(counts(sce) > 0) > 0, ]
sce <- sce[, colData(sce)$multiplets == "singlet"]

# compute QC metrics
qc <- perCellQCMetrics(sce)

# remove cells with few or many detected genes
ol <- isOutlier(metric = qc$detected, nmads = 2, log = TRUE)
sce <- sce[, !ol]

# set variable indicating stimulated (stim) or control (ctrl)
sce$StimStatus <- sce$stim

Aggregate to pseudobulk

Dreamlet creates the pseudobulk dataset:

# Since 'ind' is the individual and 'StimStatus' is the stimulus status,
# create unique identifier for each sample
sce$id <- paste0(sce$StimStatus, sce$ind)

# Create pseudobulk data by specifying cluster_id and sample_id for aggregating cells
pb <- aggregateToPseudoBulk(sce,
  assay = "counts",
  cluster_id = "cell",
  sample_id = "id",
  verbose = FALSE
)

Process data

Here we evaluate whether the observed cell proportions change in response to interferon-β.

library(crumblr)

# use dreamlet::cellCounts() to extract data
cellCounts(pb)[1:3, 1:3]
##          B cells CD14+ Monocytes CD4 T cells
## ctrl101      101             136         288
## ctrl1015     424             644         819
## ctrl1016     119             315         413
# Apply crumblr transformation
# cobj is an EList object compatable with limma workflow
# cobj$E stores transformed values
# cobj$weights stores precision weights
cobj <- crumblr(cellCounts(pb))

Analysis

Now continue on with the downstream analysis

library(variancePartition)

fit <- dream(cobj, ~ StimStatus + ind, colData(pb))
fit <- eBayes(fit)

topTable(fit, coef = "StimStatusstim", number = Inf)
##                         logFC    AveExpr          t     P.Value  adj.P.Val         B
## CD8 T cells       -0.25085170  0.0857175 -4.0787416 0.002436375 0.01949100 -1.279815
## Dendritic cells    0.37386979 -2.1849234  3.1619195 0.010692544 0.02738587 -2.638507
## CD14+ Monocytes   -0.10525402  1.2698117 -3.1226341 0.011413912 0.02738587 -2.709377
## B cells           -0.10478652  0.5516882 -3.0134349 0.013692935 0.02738587 -2.940542
## CD4 T cells       -0.07840101  2.0201947 -2.2318104 0.050869691 0.08139151 -4.128069
## FCGR3A+ Monocytes  0.07425165 -0.2567492  1.6647681 0.128337022 0.17111603 -4.935304
## NK cells           0.10270672  0.3797777  1.5181860 0.161321761 0.18436773 -5.247806
## Megakaryocytes     0.01377768 -1.8655172  0.1555131 0.879651456 0.87965146 -6.198336

Given the results here, we see that CD8 T cells at others change relative abundance following treatment with interferon-β.

Session Info

## R version 4.5.2 (2025-10-31)
## Platform: x86_64-pc-linux-gnu
## Running under: Ubuntu 24.04.3 LTS
## 
## Matrix products: default
## BLAS:   /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 
## LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.26.so;  LAPACK version 3.12.0
## 
## locale:
##  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C               LC_TIME=en_US.UTF-8       
##  [4] LC_COLLATE=C               LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
##  [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                  LC_ADDRESS=C              
## [10] LC_TELEPHONE=C             LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       
## 
## time zone: Etc/UTC
## tzcode source: system (glibc)
## 
## attached base packages:
## [1] stats4    parallel  stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
##  [1] scater_1.39.0               scuttle_1.21.0              ExperimentHub_3.1.0        
##  [4] AnnotationHub_4.0.0         BiocFileCache_3.0.0         dbplyr_2.5.1               
##  [7] muscat_1.23.2               dreamlet_1.9.0              SingleCellExperiment_1.33.0
## [10] SummarizedExperiment_1.41.0 Biobase_2.70.0              GenomicRanges_1.63.0       
## [13] Seqinfo_1.1.0               IRanges_2.45.0              S4Vectors_0.49.0           
## [16] BiocGenerics_0.57.0         generics_0.1.4              MatrixGenerics_1.23.0      
## [19] matrixStats_1.5.0           lubridate_1.9.4             forcats_1.0.1              
## [22] stringr_1.6.0               dplyr_1.1.4                 purrr_1.2.0                
## [25] readr_2.1.5                 tidyr_1.3.1                 tibble_3.3.0               
## [28] tidyverse_2.0.0             glue_1.8.0                  HMP_2.0.1                  
## [31] dirmult_0.1.3-5             variancePartition_1.41.0    BiocParallel_1.45.0        
## [34] limma_3.67.0                crumblr_1.2.0               ggplot2_4.0.0              
## [37] BiocStyle_2.38.0           
## 
## loaded via a namespace (and not attached):
##   [1] GSEABase_1.73.0           progress_1.2.3            Biostrings_2.79.2        
##   [4] vctrs_0.6.5               digest_0.6.37             png_0.1-8                
##   [7] corpcor_1.6.10            shape_1.4.6.1             ggrepel_0.9.6            
##  [10] mixsqp_0.3-54             parallelly_1.45.1         permute_0.9-8            
##  [13] MASS_7.3-65               fontLiberation_0.1.0      reshape2_1.4.4           
##  [16] SQUAREM_2021.1            foreach_1.5.2             withr_3.0.2              
##  [19] xfun_0.54                 ggfun_0.2.0               memoise_2.0.1            
##  [22] ggbeeswarm_0.7.2          systemfonts_1.3.1         tidytree_0.4.6           
##  [25] zoo_1.8-14                GlobalOptions_0.1.2       gtools_3.9.5             
##  [28] KEGGgraph_1.71.0          sys_3.4.3                 prettyunits_1.2.0        
##  [31] KEGGREST_1.51.0           httr_1.4.7                globals_0.18.0           
##  [34] ashr_2.2-63               babelgene_22.9            curl_7.0.0               
##  [37] ScaledMatrix_1.19.0       SparseArray_1.11.1        xtable_1.8-4             
##  [40] doParallel_1.0.17         evaluate_1.0.5            S4Arrays_1.11.0          
##  [43] Rfast_2.1.5.2             hms_1.1.4                 irlba_2.3.5.1            
##  [46] colorspace_2.1-2          filelock_1.0.3            magrittr_2.0.4           
##  [49] Rgraphviz_2.55.0          buildtools_1.0.0          viridis_0.6.5            
##  [52] ggtree_4.1.1              lattice_0.22-7            future.apply_1.20.0      
##  [55] scattermore_1.2           XML_3.99-0.20             maketools_1.3.2          
##  [58] pillar_1.11.1             nlme_3.1-168              iterators_1.0.14         
##  [61] caTools_1.18.3            compiler_4.5.2            beachmat_2.26.0          
##  [64] stringi_1.8.7             rmeta_3.0                 minqa_1.2.8              
##  [67] plyr_1.8.9                msigdbr_25.1.1            crayon_1.5.3             
##  [70] abind_1.4-8               truncnorm_1.0-9           blme_1.0-6               
##  [73] metadat_1.4-0             gridGraphics_0.5-1        locfit_1.5-9.12          
##  [76] bit_4.6.0                 mathjaxr_1.8-0            sandwich_3.1-1           
##  [79] codetools_0.2-20          BiocSingular_1.26.0       bslib_0.9.0              
##  [82] slam_0.1-55               GetoptLong_1.0.5          remaCor_0.0.20           
##  [85] splines_4.5.2             circlize_0.4.16           Rcpp_1.1.0               
##  [88] sparseMatrixStats_1.23.0  EnrichmentBrowser_2.41.0  knitr_1.50               
##  [91] blob_1.2.4                clue_0.3-66               BiocVersion_3.23.1       
##  [94] lme4_1.1-37               fs_1.6.6                  listenv_0.10.0           
##  [97] DelayedMatrixStats_1.33.0 Rdpack_2.6.4              IHW_1.39.0               
## [100] ggplotify_0.1.3           Matrix_1.7-4              rpart.plot_3.1.3         
## [103] statmod_1.5.1             tzdb_0.5.0                fANCOVA_0.6-1            
## [106] pkgconfig_2.0.3           tools_4.5.2               cachem_1.1.0             
## [109] RhpcBLASctl_0.23-42       rbibutils_2.4             RSQLite_2.4.4            
## [112] viridisLite_0.4.2         DBI_1.2.3                 numDeriv_2016.8-1.1      
## [115] zigg_0.0.2                fastmap_1.2.0             rmarkdown_2.30           
## [118] scales_1.4.0              grid_4.5.2                broom_1.0.10             
## [121] sass_0.4.10               patchwork_1.3.2           BiocManager_1.30.26      
## [124] graph_1.89.0              zenith_1.13.0             rpart_4.1.24             
## [127] farver_2.1.2              reformulas_0.4.2          aod_1.3.3                
## [130] mgcv_1.9-4                yaml_2.3.10               cli_3.6.5                
## [133] lifecycle_1.0.4           mashr_0.2.79              glmmTMB_1.1.13           
## [136] mvtnorm_1.3-3             backports_1.5.0           annotate_1.88.0          
## [139] timechange_0.3.0          gtable_0.3.6              rjson_0.2.23             
## [142] metafor_4.8-0             ape_5.8-1                 jsonlite_2.0.0           
## [145] edgeR_4.9.0               bitops_1.0-9              bit64_4.6.0-1            
## [148] assertthat_0.2.1          yulab.utils_0.2.1         vegan_2.7-2              
## [151] BiocNeighbors_2.4.0       RcppParallel_5.1.11-1     jquerylib_0.1.4          
## [154] pbkrtest_0.5.5            lazyeval_0.2.2            htmltools_0.5.8.1        
## [157] sctransform_0.4.2         rappdirs_0.3.3            httr2_1.2.1              
## [160] XVector_0.51.0            gdtools_0.4.4             RCurl_1.98-1.17          
## [163] treeio_1.35.0             gridExtra_2.3             EnvStats_3.1.0           
## [166] boot_1.3-32               TMB_1.9.18                invgamma_1.2             
## [169] R6_2.6.1                  DESeq2_1.51.1             ggiraph_0.9.2            
## [172] gplots_3.2.0              fdrtool_1.2.18            labeling_0.4.3           
## [175] cluster_2.1.8.1           aplot_0.2.9               nloptr_2.2.1             
## [178] DelayedArray_0.37.0       tidyselect_1.2.1          vipor_0.4.7              
## [181] fontBitstreamVera_0.1.1   AnnotationDbi_1.72.0      future_1.67.0            
## [184] rsvd_1.0.5                KernSmooth_2.23-26        S7_0.2.0                 
## [187] fontquiver_0.2.1          data.table_1.17.8         htmlwidgets_1.6.4        
## [190] ComplexHeatmap_2.27.0     RColorBrewer_1.1-3        rlang_1.1.6              
## [193] lmerTest_3.1-3            lpsymphony_1.39.0         beeswarm_0.4.0