# 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.2               scuttle_1.21.0              ExperimentHub_3.1.0
    ##  [4] AnnotationHub_4.1.0         BiocFileCache_3.1.0         dbplyr_2.5.1
    ##  [7] muscat_1.25.1               dreamlet_1.9.1              SingleCellExperiment_1.33.0
    ## [10] SummarizedExperiment_1.41.1 Biobase_2.71.0              GenomicRanges_1.63.1
    ## [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.5             forcats_1.0.1
    ## [22] stringr_1.6.0               dplyr_1.2.0                 purrr_1.2.1
    ## [25] readr_2.1.6                 tidyr_1.3.2                 tibble_3.3.1
    ## [28] tidyverse_2.0.0             glue_1.8.0                  HMP_2.0.1
    ## [31] dirmult_0.1.3-5             variancePartition_1.41.3    BiocParallel_1.45.0
    ## [34] limma_3.67.0                crumblr_1.3.0               ggplot2_4.0.2
    ## [37] BiocStyle_2.39.0
    ##
    ## loaded via a namespace (and not attached):
    ##   [1] GSEABase_1.73.0           progress_1.2.3            Biostrings_2.79.4
    ##   [4] vctrs_0.7.1               digest_0.6.39             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.46.1         permute_0.9-10
    ##  [13] MASS_7.3-65               fontLiberation_0.1.0      reshape2_1.4.5
    ##  [16] SQUAREM_2021.1            foreach_1.5.2             withr_3.0.2
    ##  [19] xfun_0.56                 ggfun_0.2.0               memoise_2.0.1
    ##  [22] ggbeeswarm_0.7.3          systemfonts_1.3.1         tidytree_0.4.7
    ##  [25] zoo_1.8-15                GlobalOptions_0.1.3       gtools_3.9.5
    ##  [28] KEGGgraph_1.71.0          sys_3.4.3                 prettyunits_1.2.0
    ##  [31] KEGGREST_1.51.1           httr_1.4.7                globals_0.19.0
    ##  [34] ashr_2.2-63               babelgene_22.9            curl_7.0.0
    ##  [37] ScaledMatrix_1.19.0       SparseArray_1.11.10       xtable_1.8-4
    ##  [40] doParallel_1.0.17         evaluate_1.0.5            S4Arrays_1.11.1
    ##  [43] Rfast_2.1.5.2             hms_1.1.4                 irlba_2.3.7
    ##  [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.1
    ##  [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.27.2
    ##  [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-7
    ##  [73] metadat_1.4-0             gridGraphics_0.5-1        locfit_1.5-9.12
    ##  [76] bit_4.6.0                 mathjaxr_2.0-0            sandwich_3.1-1
    ##  [79] codetools_0.2-20          BiocSingular_1.27.1       bslib_0.10.0
    ##  [82] slam_0.1-55               GetoptLong_1.1.0          remaCor_0.0.20
    ##  [85] splines_4.5.2             circlize_0.4.17           Rcpp_1.1.1
    ##  [88] sparseMatrixStats_1.23.0  EnrichmentBrowser_2.41.0  knitr_1.51
    ##  [91] blob_1.3.0                clue_0.3-66               BiocVersion_3.23.1
    ##  [94] lme4_1.1-38               fs_1.6.6                  listenv_0.10.0
    ##  [97] DelayedMatrixStats_1.33.0 Rdpack_2.6.5              IHW_1.39.0
    ## [100] ggplotify_0.1.3           Matrix_1.7-4              rpart.plot_3.1.4
    ## [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.1           RSQLite_2.4.6
    ## [112] viridisLite_0.4.3         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.12
    ## [121] sass_0.4.10               patchwork_1.3.2           BiocManager_1.30.27
    ## [124] graph_1.89.1              zenith_1.13.0             rpart_4.1.24
    ## [127] farver_2.1.2              reformulas_0.4.4          aod_1.3.3
    ## [130] mgcv_1.9-4                yaml_2.3.12               cli_3.6.5
    ## [133] lifecycle_1.0.5           mashr_0.2.79              glmmTMB_1.1.14
    ## [136] mvtnorm_1.3-3             backports_1.5.0           annotate_1.89.0
    ## [139] timechange_0.4.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.2               bitops_1.0-9              bit64_4.6.0-1
    ## [148] assertthat_0.2.1          yulab.utils_0.2.4         vegan_2.7-2
    ## [151] BiocNeighbors_2.5.3       RcppParallel_5.1.11-1     jquerylib_0.1.4
    ## [154] pbkrtest_0.5.5            lazyeval_0.2.2            htmltools_0.5.9
    ## [157] sctransform_0.4.3         rappdirs_0.3.4            httr2_1.2.2
    ## [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.19                invgamma_1.2
    ## [169] R6_2.6.1                  DESeq2_1.51.6             ggiraph_0.9.4
    ## [172] gplots_3.3.0              fdrtool_1.2.18            labeling_0.4.3
    ## [175] cluster_2.1.8.2           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.73.0      future_1.69.0
    ## [184] rsvd_1.0.5                KernSmooth_2.23-26        S7_0.2.1
    ## [187] fontquiver_0.2.1          data.table_1.18.2.1       htmlwidgets_1.6.4
    ## [190] ComplexHeatmap_2.27.1     RColorBrewer_1.1-3        rlang_1.1.7
    ## [193] lmerTest_3.2-0            lpsymphony_1.39.0         beeswarm_0.4.0