Differential Expression

library(broadSeq)

In this vignette, the easy use of broadSeq to identify differentially expressed(DE) genes with several R packages has been shown. All these packages use different input and output formats. Whereas with broadSeq, only SummarizedExperiment format will be enough for input. And the results will be returned as data.frame object which will make downstream analysis easier. No need to learn new data formats for evaluating different packages.

Data

In this example we will use RNA-seq expression data from developing mouse molar tissue. First we read the data as a SummarizedExperiment object.

se <- readRDS(system.file("extdata","rat_vole_mouseSE_salmon.rds", package = "broadSeq"))

# To reduce the run time, subset of the data used here
se <- se[,colData(se)$species == "Mouse"]

Gene information

head(rownames(se))
#> [1] "Axin2"  "Mmp14"  "Timp1"  "Pax9"   "Irx2"   "Col1a1"

The gene ids are in ensemble format. For easy readability, information about genes can be fetched through biomaRt package as shown below.

require(biomaRt)

ensembl_ms_mart <- useMart(biomart="ENSEMBL_MART_ENSEMBL",
                           dataset="mmusculus_gene_ensembl", host="www.ensembl.org")
gene_attributes<- c("ensembl_gene_id", "mgi_symbol",
                    "start_position", "chromosome_name","gene_biotype")
gene_location_sample <- getBM(attributes=gene_attributes, filters = "ensembl_gene_id",
                              values = rownames(se),uniqueRows = TRUE,
                              mart=ensembl_ms_mart,verbose = FALSE,useCache = TRUE)

# remove rows with duplicate ensembl_gene_id
gene_location_sample <- gene_location_sample[!duplicated(gene_location_sample$ensembl_gene_id),]
# some ensembl_gene_id may not be found in biomart
# remove those ensembl_gene_id s
se <- se[gene_location_sample$ensembl_gene_id,]

rownames(gene_location_sample) <- gene_location_sample$ensembl_gene_id
rowData(se) <- gene_location_sample[rownames(se),]

Finally the gene information is stored and can be accessed through rowData funtion

head(rowData(se))

Sample information

The sample metadata

head(colData(se))
#> DataFrame with 6 rows and 4 columns
#>                 day        info    stage  species
#>            <factor> <character> <factor> <factor>
#> ME16-E3M1L      E16  ME16-E3M1L     Bell    Mouse
#> ME16-E5M1L      E16  ME16-E5M1L     Bell    Mouse
#> ME16-E6M1R      E16  ME16-E6M1R     Bell    Mouse
#> ME16-E6M1L      E16  ME16-E6M1L     Bell    Mouse
#> ME16-E7M1R      E16  ME16-E7M1R     Bell    Mouse
#> ME16-E8M1R      E16  ME16-E8M1R     Bell    Mouse
table(colData(se)$stage)
#> 
#>      Bud      Cap Late Cap     Bell 
#>        7        7        7        7

Diff Expression

There are four developmental time points; Bud, Cap, Late Cap and Bell (from embryonic days 13 to 16) with seven replicates each. Here, in this example, DE genes between Bud and Cap stages will be identified.

Function pattern

In broadSeq, the names of DE method has similar pattern like “use_”+“method name”. All these method has same signature of input arguments.

Here we will see use_NOIseq() method to apply NOISeq::noiseqbio() function.

result_Noiseq <- 
    use_NOIseq(se = se, 
           colData_id = "stage", control = "Bud", treatment = "Cap",
           rank = TRUE, 
           r = 10) # r is an argument of NOISeq::noiseqbio
#> Computing Z values...
#> Filtering out low count features...
#> 4654 features are to be kept for differential expression analysis with filtering method 1
#> [1] "r = 1"
#> [1] "r = 2"
#> [1] "r = 3"
#> [1] "r = 4"
#> [1] "r = 5"
#> [1] "r = 6"
#> [1] "r = 7"
#> [1] "r = 8"
#> [1] "r = 9"
#> [1] "r = 10"
#> Computing probability of differential expression...
#> p0 = 0.3809764779521
#> Probability
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
#>  0.0000  0.3169  0.7234  0.6102  0.9102  1.0000    1124

head(result_Noiseq)
#>          Bud_mean   Cap_mean    theta prob   log2FC rank
#> Dlx2    888.94171 375.731990 4.449016    1 1.242385    1
#> Irf6    511.38324 215.511591 4.491907    1 1.246639    2
#> Ptch2   358.98412 151.233857 3.525978    1 1.247139    3
#> Spp1     43.80853   1.627490 3.780321    1 4.750491    4
#> Fgf3     92.59420   1.270972 4.002669    1 6.186918    5
#> Sostdc1 993.75851 448.122284 4.155289    1 1.149003    6
# boxplot of top four DE genes with their mgi_symbol

# broadSeq::genes_plot function internally converts SummarizedExperiment to use
# ggpubr::ggboxplot 

pg <- broadSeq::genes_plot(se, x = "stage", assayName =  "counts",  
           features = result_Noiseq %>% dplyr::filter(rank <5) %>% rownames(),
           fill="stage", facet.by = "symbol",
           palette="jco", add = "dotplot")+rotate_x_text()

pg_sc <- ggscatter(result_Noiseq, x="Bud_mean", y="Cap_mean",color = "prob")+ 
    scale_x_log10()+scale_y_log10()

pg+pg_sc

Available methods

Following implementations of popular methods are available here.

# limma 
?use_limma_trend(se, colData_id, control, treatment, rank = FALSE, ...)
?use_limma_voom(se, colData_id, control, treatment, rank = FALSE, ...)

# edgeR 
?use_edgeR_exact(se, colData_id, control, treatment, rank = FALSE, ...)
?use_edgeR_GLM(se, colData_id, control, treatment, rank = FALSE, ...)

# deseq2
?use_deseq2(se, colData_id, control, treatment, rank = FALSE, ...)

# DELocal
?use_DELocal(se, colData_id, control, treatment, rank = FALSE, ...)

# noiseq
?use_NOIseq(se, colData_id, control, treatment, rank = FALSE, ...) 

# EBSeq 
?use_EBSeq(se, colData_id, control, treatment, rank = FALSE, ...)

# samseq
?use_SAMseq(se, colData_id, control, treatment, rank = FALSE, ...)

Advanced users can pass package specific arguments through ‘…’ .

Compare DE results

It is possible to execute all DE methods together and get aggregated results in a data.frame. broadSeq::use_multDE() should be used for it.

# First define a named list of functions
funs <- list(limma_trend = use_limma_trend, limma_voom = use_limma_voom,
             edgeR_exact = use_edgeR_exact, edgeR_glm = use_edgeR_GLM,
             deseq2 = use_deseq2, 
             DELocal = use_DELocal, noiseq = use_NOIseq, 
             EBSeq = use_EBSeq) 


multi_result <- broadSeq::use_multDE(
    se = se, 
    deFun_list = funs, return.df = TRUE,  
    colData_id = "stage", control = "Bud", treatment = "Cap", 
    rank = TRUE)
#> Now executing >>  limma_trend
#> ####
#> Now executing >>  limma_voom
#> ####
#> Now executing >>  edgeR_exact
#> ####
#> Now executing >>  edgeR_glm
#> ####
#> Now executing >>  deseq2
#> ####
#> factor levels were dropped which had no samples
#> estimating size factors
#> using 'avgTxLength' from assays(dds), correcting for library size
#> estimating dispersions
#> gene-wise dispersion estimates
#> mean-dispersion relationship
#> final dispersion estimates
#> fitting model and testing
#> -- replacing outliers and refitting for 22 genes
#> -- DESeq argument 'minReplicatesForReplace' = 7 
#> -- original counts are preserved in counts(dds)
#> estimating dispersions
#> fitting model and testing
#> Now executing >>  DELocal
#> ####
#> Default 1Mb neighborhood will be used
#> factor levels were dropped which had no samples
#> using 'avgTxLength' from assays(dds), correcting for library size
#> Now executing >>  noiseq
#> ####
#> Now executing >>  EBSeq
#> ####

The column names of the resultant data.frame are prefixed with corresponding function names.

head(multi_result)
#>               limma_trend_logFC limma_trend_AveExpr limma_trend_t
#> 1110008P14Rik        0.54405160           4.8117022     3.6578280
#> 1110032A03Rik       -0.13874330           5.3785105    -1.1189797
#> 1110032F04Rik        1.49491410           3.0666526     7.0648546
#> 1110051M20Rik       -0.08607705           6.8048345    -1.8949926
#> 1110059G10Rik        0.11686705           5.4687249     0.9131006
#> 1300017J02Rik       -1.75373449           0.3862759    -3.1448352
#>               limma_trend_P.Value limma_trend_adj.P.Val limma_trend_B
#> 1110008P14Rik        2.797602e-03          0.0130149310     -2.410387
#> 1110032A03Rik        2.829681e-01          0.4526549814     -6.717686
#> 1110032F04Rik        7.519122e-06          0.0001281578      3.676603
#> 1110051M20Rik        8.005768e-02          0.1777077549     -5.657093
#> 1110059G10Rik        3.774584e-01          0.5365202649     -6.925361
#> 1300017J02Rik        7.568554e-03          0.0283599915     -3.404915
#>               limma_trend_rank limma_voom_logFC limma_voom_AveExpr limma_voom_t
#> 1110008P14Rik             1242       0.55012790          4.7963921    3.4912966
#> 1110032A03Rik             3612      -0.13598068          5.3683453   -1.0766122
#> 1110032F04Rik              339       1.52521100          3.0082492    5.5457607
#> 1110051M20Rik             2603      -0.08377041          6.8010984   -1.5379391
#> 1110059G10Rik             4065       0.12743802          5.4591759    0.9788081
#> 1300017J02Rik             1542      -2.79755481         -0.4115494   -3.3164034
#>               limma_voom_P.Value limma_voom_adj.P.Val limma_voom_B
#> 1110008P14Rik       3.185938e-03         0.0140952159    -2.450562
#> 1110032A03Rik       2.982906e-01         0.4602197395    -6.781351
#> 1110032F04Rik       5.160299e-05         0.0005491014     2.094132
#> 1110051M20Rik       1.444281e-01         0.2758695513    -6.580324
#> 1110059G10Rik       3.428565e-01         0.5101789153    -6.904758
#> 1300017J02Rik       4.577596e-03         0.0189053550    -1.996826
#>               limma_voom_rank edgeR_exact_logFC edgeR_exact_logCPM
#> 1110008P14Rik            1306        0.56742197          4.8655704
#> 1110032A03Rik            3745       -0.11220434          5.3968467
#> 1110032F04Rik             543        1.62986496          3.3283271
#> 1110051M20Rik            3025       -0.08359159          6.8073364
#> 1110059G10Rik            3883        0.13179863          5.4882085
#> 1300017J02Rik            1399       -2.12756839          0.8642446
#>               edgeR_exact_PValue edgeR_exact_FDR edgeR_exact_rank
#> 1110008P14Rik       1.000530e-03    5.231732e-03             1105
#> 1110032A03Rik       4.437472e-01    6.609702e-01             3878
#> 1110032F04Rik       2.602324e-09    4.409451e-08              341
#> 1110051M20Rik       3.282945e-01    5.379710e-01             3526
#> 1110059G10Rik       3.735760e-01    5.881532e-01             3670
#> 1300017J02Rik       8.116018e-03    3.044647e-02             1540
#>               edgeR_glm_logFC edgeR_glm_logCPM edgeR_glm_LR edgeR_glm_PValue
#> 1110008P14Rik      0.56740347        4.8655850   11.7410747     6.113571e-04
#> 1110032A03Rik     -0.11219402        5.3968485    0.6026420     4.375717e-01
#> 1110032F04Rik      1.62985892        3.3283632   35.7072150     2.293132e-09
#> 1110051M20Rik     -0.08358111        6.8073360    0.9752985     3.233623e-01
#> 1110059G10Rik      0.13181500        5.4882097    0.8224682     3.644595e-01
#> 1300017J02Rik     -2.12795630        0.8641698    6.5759873     1.033637e-02
#>               edgeR_glm_FDR edgeR_glm_rank deseq2_baseMean
#> 1110008P14Rik  3.429535e-03           1030       147.18768
#> 1110032A03Rik  6.195270e-01           4081       218.60073
#> 1110032F04Rik  3.840497e-08            345        49.16736
#> 1110051M20Rik  5.007092e-01           3731       595.51100
#> 1110059G10Rik  5.431548e-01           3877       232.78793
#> 1300017J02Rik  3.670776e-02           1627        12.81403
#>               deseq2_log2FoldChange deseq2_lfcSE deseq2_stat deseq2_pvalue
#> 1110008P14Rik            0.50451366    0.1657664   3.0435219  2.338264e-03
#> 1110032A03Rik            0.19082266    0.1940145   0.9835483  3.253377e-01
#> 1110032F04Rik            1.58701594    0.2811161   5.6454104  1.647877e-08
#> 1110051M20Rik            0.43358853    0.1816105   2.3874642  1.696506e-02
#> 1110059G10Rik            0.08091388    0.1977231   0.4092283  6.823722e-01
#> 1300017J02Rik           -2.81096557    1.0793250  -2.6043737  9.204233e-03
#>                deseq2_padj deseq2_rank DELocal_relative.logFC DELocal_P.Value
#> 1110008P14Rik 1.108404e-02        1055               17.83827    0.2729166121
#> 1110032A03Rik 4.972536e-01        3272               42.92129    0.1221318350
#> 1110032F04Rik 3.225187e-07         255               48.05240    0.0007963788
#> 1110051M20Rik 5.449085e-02        1557               88.53803    0.1739847417
#> 1110059G10Rik 8.038971e-01        4245               11.50263    0.7104000042
#> 1300017J02Rik 3.336348e-02        1380              -17.16339    0.0080219554
#>               DELocal_adj.P.Val DELocal_B DELocal_rank noiseq_Bud_mean
#> 1110008P14Rik        0.62788658 -4.658483         2740      33.8722312
#> 1110032A03Rik        0.41032892 -4.279768         1972      39.6798287
#> 1110032F04Rik        0.01675251 -1.976905         1891      14.3689100
#> 1110051M20Rik        0.49469006 -4.450382         1367     107.2818570
#> 1110059G10Rik        0.95442262 -5.011704         3056      45.9373517
#> 1300017J02Rik        0.07509916 -2.959888         2777       0.6001355
#>               noiseq_Cap_mean noiseq_theta noiseq_prob noiseq_log2FC
#> 1110008P14Rik       23.331126    0.6555759   0.8852864    0.53784711
#> 1110032A03Rik       43.774221   -0.1974162   0.4118575   -0.14167571
#> 1110032F04Rik        4.693828    1.3985890   0.9774037    1.61411366
#> 1110051M20Rik      115.980525   -0.2726831   0.5827917   -0.11247646
#> 1110059G10Rik       42.887052    0.1415338   0.1180432    0.09912552
#> 1300017J02Rik        2.506642   -0.9268528   0.9510382   -2.06239542
#>               noiseq_rank   EBSeq_PPEE EBSeq_PPDE EBSeq_Status EBSeq_Direction
#> 1110008P14Rik        1872 0.0315029178 0.96849708           DE    Bud Over Cap
#> 1110032A03Rik        3472 0.9747575436 0.02524246           EE    Bud Over Cap
#> 1110032F04Rik         505 0.0001226596 0.99987734           DE    Bud Over Cap
#> 1110051M20Rik        3056 0.9830170118 0.01698299           EE    Bud Over Cap
#> 1110059G10Rik        4102 0.9690535947 0.03094641           EE    Bud Over Cap
#> 1300017J02Rik        1040 0.0220131318 0.97798687           DE    Bud Over Cap
#>               EBSeq_rank      mouse_gene_id        symbol Class chromosome_name
#> 1110008P14Rik       1219 ENSMUSG00000039195 1110008P14Rik Other               2
#> 1110032A03Rik       4261 ENSMUSG00000037971 1110032A03Rik Other               9
#> 1110032F04Rik        744 ENSMUSG00000046999 1110032F04Rik Other               3
#> 1110051M20Rik       4582 ENSMUSG00000040591 1110051M20Rik Other               2
#> 1110059G10Rik       4093 ENSMUSG00000032551 1110059G10Rik Other               9
#> 1300017J02Rik       1186 ENSMUSG00000033688 1300017J02Rik Other               9
#>               start_position   gene_biotype        vole_gene_id
#> 1110008P14Rik       32267109 protein_coding Mglareolus_00032142
#> 1110032A03Rik       50674128 protein_coding Mglareolus_00020124
#> 1110032F04Rik       68776919 protein_coding Mglareolus_00010961
#> 1110051M20Rik       91105413 protein_coding Mglareolus_00006101
#> 1110059G10Rik      122774154 protein_coding Mglareolus_00025510
#> 1300017J02Rik      103127720 protein_coding Mglareolus_00023537
#>                     Rnor_gene_id
#> 1110008P14Rik ENSRNOG00000022681
#> 1110032A03Rik ENSRNOG00000030962
#> 1110032F04Rik ENSRNOG00000009803
#> 1110051M20Rik ENSRNOG00000014798
#> 1110059G10Rik ENSRNOG00000004135
#> 1300017J02Rik ENSRNOG00000009434
# nrow(multi_result) == nrow(se)
colnames(multi_result)
#>  [1] "limma_trend_logFC"      "limma_trend_AveExpr"    "limma_trend_t"         
#>  [4] "limma_trend_P.Value"    "limma_trend_adj.P.Val"  "limma_trend_B"         
#>  [7] "limma_trend_rank"       "limma_voom_logFC"       "limma_voom_AveExpr"    
#> [10] "limma_voom_t"           "limma_voom_P.Value"     "limma_voom_adj.P.Val"  
#> [13] "limma_voom_B"           "limma_voom_rank"        "edgeR_exact_logFC"     
#> [16] "edgeR_exact_logCPM"     "edgeR_exact_PValue"     "edgeR_exact_FDR"       
#> [19] "edgeR_exact_rank"       "edgeR_glm_logFC"        "edgeR_glm_logCPM"      
#> [22] "edgeR_glm_LR"           "edgeR_glm_PValue"       "edgeR_glm_FDR"         
#> [25] "edgeR_glm_rank"         "deseq2_baseMean"        "deseq2_log2FoldChange" 
#> [28] "deseq2_lfcSE"           "deseq2_stat"            "deseq2_pvalue"         
#> [31] "deseq2_padj"            "deseq2_rank"            "DELocal_relative.logFC"
#> [34] "DELocal_P.Value"        "DELocal_adj.P.Val"      "DELocal_B"             
#> [37] "DELocal_rank"           "noiseq_Bud_mean"        "noiseq_Cap_mean"       
#> [40] "noiseq_theta"           "noiseq_prob"            "noiseq_log2FC"         
#> [43] "noiseq_rank"            "EBSeq_PPEE"             "EBSeq_PPDE"            
#> [46] "EBSeq_Status"           "EBSeq_Direction"        "EBSeq_rank"            
#> [49] "mouse_gene_id"          "symbol"                 "Class"                 
#> [52] "chromosome_name"        "start_position"         "gene_biotype"          
#> [55] "vole_gene_id"           "Rnor_gene_id"

Similarity of methods

DE methods are clustered based on their ranking of genes

clusters <- multi_result %>% dplyr::select(ends_with("rank")) %>% t() %>% dist() %>% hclust()
plot(clusters,main =  "distance: Euclidean")

Plots

Volcano

Up regulated genes should be red or hot colors

multi_result %>% broadSeq::volcanoPlot(
    pValName = "deseq2_padj",
    lFCName = "deseq2_log2FoldChange",
    labelName = "symbol",
    palette = "lancet" ,
    selectedLabel =
        multi_result %>% dplyr::arrange(deseq2_padj) %>% pull(symbol) %>% head()
)


multi_result %>% broadSeq::volcanoPlot(
    pValName = "deseq2_padj",
    lFCName = "deseq2_log2FoldChange",
    labelName = "symbol",
    palette = c("purple","orange","grey"),
    selectedLabel = list(criteria = "(`x` > 5 | `x` < -2) & (`y` > 10)")
) +xlim(-7.5,7.5)

sessionInfo

#> R Under development (unstable) (2024-03-18 r86148)
#> Platform: x86_64-pc-linux-gnu
#> Running under: Ubuntu 22.04.4 LTS
#> 
#> Matrix products: default
#> BLAS:   /home/biocbuild/bbs-3.19-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] stats4    stats     graphics  grDevices utils     datasets  methods  
#> [8] base     
#> 
#> other attached packages:
#>  [1] vsn_3.71.1                  broadSeq_0.99.1            
#>  [3] SummarizedExperiment_1.33.3 Biobase_2.63.1             
#>  [5] GenomicRanges_1.55.4        GenomeInfoDb_1.39.13       
#>  [7] IRanges_2.37.1              S4Vectors_0.41.6           
#>  [9] BiocGenerics_0.49.1         MatrixGenerics_1.15.0      
#> [11] matrixStats_1.2.0           ggpubr_0.6.0               
#> [13] ggplot2_3.5.0               dplyr_1.1.4                
#> 
#> loaded via a namespace (and not attached):
#>   [1] splines_4.4.0           bitops_1.0-7            ggplotify_0.1.2        
#>   [4] tibble_3.2.1            polyclip_1.10-6         preprocessCore_1.65.0  
#>   [7] XML_3.99-0.16.1         lifecycle_1.0.4         rstatix_0.7.2          
#>  [10] rprojroot_2.0.4         edgeR_4.1.21            doParallel_1.0.17      
#>  [13] lattice_0.22-6          MASS_7.3-60.2           NOISeq_2.47.0          
#>  [16] backports_1.4.1         magrittr_2.0.3          limma_3.59.6           
#>  [19] sass_0.4.9              rmarkdown_2.26          jquerylib_0.1.4        
#>  [22] yaml_2.3.8              cowplot_1.1.3           DBI_1.2.2              
#>  [25] RColorBrewer_1.1-3      pkgload_1.3.4           abind_1.4-5            
#>  [28] zlibbioc_1.49.3         Rtsne_0.17              purrr_1.0.2            
#>  [31] ggraph_2.2.1            yulab.utils_0.1.4       tweenr_2.0.3           
#>  [34] circlize_0.4.16         seriation_1.5.4         GenomeInfoDbData_1.2.12
#>  [37] enrichplot_1.23.1       ggrepel_0.9.5           tidytree_0.4.6         
#>  [40] testthat_3.2.1          genefilter_1.85.1       pheatmap_1.0.12        
#>  [43] annotate_1.81.2         codetools_0.2-20        DelayedArray_0.29.9    
#>  [46] DOSE_3.29.2             ggforce_0.4.2           tidyselect_1.2.1       
#>  [49] shape_1.4.6.1           aplot_0.2.2             UCSC.utils_0.99.5      
#>  [52] farver_2.1.1            viridis_0.6.5           TSP_1.2-4              
#>  [55] jsonlite_1.8.8          GetoptLong_1.0.5        tidygraph_1.3.1        
#>  [58] randomcoloR_1.1.0.1     survival_3.5-8          iterators_1.0.14       
#>  [61] foreach_1.5.2           tools_4.4.0             treeio_1.27.0          
#>  [64] sechm_1.11.0            Rcpp_1.0.12             glue_1.7.0             
#>  [67] gridExtra_2.3           SparseArray_1.3.4       xfun_0.43              
#>  [70] DESeq2_1.43.4           qvalue_2.35.0           ca_0.71.1              
#>  [73] withr_3.0.0             BiocManager_1.30.22     fastmap_1.1.1          
#>  [76] fansi_1.0.6             caTools_1.18.2          digest_0.6.35          
#>  [79] DELocal_1.3.1           R6_2.5.1                gridGraphics_0.5-1     
#>  [82] colorspace_2.1-0        GO.db_3.19.0            gtools_3.9.5           
#>  [85] RSQLite_2.3.6           ggsci_3.0.3             hexbin_1.28.3          
#>  [88] utf8_1.2.4              tidyr_1.3.1             generics_0.1.3         
#>  [91] data.table_1.15.4       graphlayouts_1.1.1      httr_1.4.7             
#>  [94] S4Arrays_1.3.6          scatterpie_0.2.2        pkgconfig_2.0.3        
#>  [97] gtable_0.3.4            registry_0.5-1          blob_1.2.4             
#> [100] ComplexHeatmap_2.19.0   XVector_0.43.1          brio_1.1.4             
#> [103] clusterProfiler_4.11.0  shadowtext_0.1.3        htmltools_0.5.8.1      
#> [106] carData_3.0-5           fgsea_1.29.0            clue_0.3-65            
#> [109] blockmodeling_1.1.5     scales_1.3.0            png_0.1-8              
#> [112] EBSeq_2.1.0             ggfun_0.1.4             knitr_1.46             
#> [115] reshape2_1.4.4          rjson_0.2.21            nlme_3.1-164           
#> [118] curl_5.2.1              cachem_1.0.8            GlobalOptions_0.1.2    
#> [121] stringr_1.5.1           KernSmooth_2.23-22      parallel_4.4.0         
#> [124] HDO.db_0.99.1           AnnotationDbi_1.65.2    desc_1.4.3             
#> [127] pillar_1.9.0            grid_4.4.0              vctrs_0.6.5            
#> [130] gplots_3.1.3.1          car_3.1-2               xtable_1.8-4           
#> [133] cluster_2.1.6           evaluate_0.23           cli_3.6.2              
#> [136] locfit_1.5-9.9          compiler_4.4.0          rlang_1.1.3            
#> [139] crayon_1.5.2            ggsignif_0.6.4          labeling_0.4.3         
#> [142] forcats_1.0.0           affy_1.81.0             plyr_1.8.9             
#> [145] fs_1.6.3                stringi_1.8.3           viridisLite_0.4.2      
#> [148] BiocParallel_1.37.1     munsell_0.5.1           Biostrings_2.71.5      
#> [151] lazyeval_0.2.2          V8_4.4.2                GOSemSim_2.29.1        
#> [154] Matrix_1.7-0            RcppEigen_0.3.4.0.0     patchwork_1.2.0        
#> [157] bit64_4.0.5             KEGGREST_1.43.0         statmod_1.5.0          
#> [160] highr_0.10              igraph_2.0.3            broom_1.0.5            
#> [163] memoise_2.0.1           affyio_1.73.0           bslib_0.7.0            
#> [166] ggtree_3.11.1           fastmatch_1.1-4         bit_4.0.5              
#> [169] ape_5.7-1               gson_0.1.0