Introduction

In this report we establish a new method for generating simulated data with known ground truth. This will be used to test different gene methylation enrichment approaches systematically.

The general steps are:

  1. Import GSE158422 data corresponding to control (non-tumour tissue).

  2. From the 37 samples, create two groups of 18 samples. One of these will be considered “control” and the other “case”.

  3. Create random gene sets that have similar sized to Reactome pathways.

  4. Some gene sets will be selected to be differentially methylated. Half of these will be hypermethylated and the others will be hypomethylated.

  5. The changes will be incorporated into the “case” samples.

  6. The enrichment analysis will be conducted.

  7. The accuracy will be calculated.

suppressPackageStartupMessages({
  library("stringi")
  library("limma")
  library("missMethyl")
  library("IlluminaHumanMethylation450kmanifest")
  library("IlluminaHumanMethylationEPICanno.ilm10b4.hg19")
  library("HGNChelper")
  library('org.Hs.eg.db')
  library("psych")
  library("mitch")
  library("kableExtra")
  library("rslurm")
})

source("GSE158422_simulate_functions.R")

# optimised for 128 GB sever with 32 threads
CORES=6

Load data

  • annotations

  • probe sets

  • gene sets

  • design matrix

  • mval matrix

# get probe-gene mapping
anno <- getAnnotation(IlluminaHumanMethylationEPICanno.ilm10b4.hg19)
myann <- data.frame(anno[,c("UCSC_RefGene_Name","UCSC_RefGene_Group","Islands_Name","Relation_to_Island")])
gp <- myann[,"UCSC_RefGene_Name",drop=FALSE]
gp2 <- strsplit(gp$UCSC_RefGene_Name,";")
names(gp2) <- rownames(gp)
gp2 <- lapply(gp2,unique)
gt <- stack(gp2)
colnames(gt) <- c("gene","probe")
dim(gt)
## [1] 684970      2
str(gt)
## 'data.frame':    684970 obs. of  2 variables:
##  $ gene : chr  "YTHDF1" "EIF2S3" "PKN3" "CCDC57" ...
##  $ probe: Factor w/ 865859 levels "cg18478105","cg09835024",..: 1 2 3 4 5 6 7 8 8 9 ...
head(gt)
##     gene      probe
## 1 YTHDF1 cg18478105
## 2 EIF2S3 cg09835024
## 3   PKN3 cg14361672
## 4 CCDC57 cg01763666
## 5   INF2 cg12950382
## 6  CDC16 cg02115394
#new.hgnc.table <- getCurrentHumanMap()
#new.hgnc.table <- readRDS("new.hgnc.table.rds")
#fix <- checkGeneSymbols(gt$gene,map=new.hgnc.table)
#fix2 <- fix[which(fix$x != fix$Suggested.Symbol),]
#length(unique(fix2$x))
#gt$gene <- fix$Suggested.Symbol

if (!file.exists("GSE158422_design.rds")) {
  download.file("https://ziemann-lab.net/public/gmea_prototype/GSE158422_design.rds", "GSE158422_design.rds")
}
design <- readRDS("GSE158422_design.rds")

if (!file.exists("GSE158422_design.rds")) {
  options(timeout=10000000000000)
  download.file("https://ziemann-lab.net/public/gmea_prototype/GSE158422_mx.rds","GSE158422_mx.rds")
}
mval <- readRDS("GSE158422_mx.rds")

Gene set database

We could use Reactome pathways, however these have a lot of overlapping sets, which could cause inflated false positives. After some testing, I found that the gene set size strongly impacts the accuracy.

For reference, Reactome sets have a mean of 48 and median of 15, while MSigDB has a median of 47 and mean of 116.

Therefore, a reasonable analysis would include small (20), medium (50) and large (100) sets.

To reflect coverage of Reactome and other pathway databases, only half the genes will be included in sets.

gene_catalog <- unique(gt$gene)

# set gene set size here
lengths <- rep(50,1000)

gsets <- randomGeneSets(gene_catalog,lengths,seed=100)

Incorporate changes

TODO: to incorporate changes to case samples.

Need to figure out what magnitude to change. Will refer to the cancer/normal comparison.

Select genes and probes to alter.

seed=100
frac_genes=0.5
frac_probes=0.5
delta=1
nsamples=10
normal_mval <- mval[,(1:(ncol(mval)/2)*2)]

Run analyses

Set assumptions.

num_dm_sets=50
sims=100
groupsizes=c(3,5,8,12)
deltas=c(0.1,0.2,0.3,0.4,0.5)
#groupsizes=12
#deltas=0.5

params <- expand.grid("groupsizes"=groupsizes,"deltas"=deltas,"seed"=seq(100,sims*100,100))

colnames(params) <- c("groupsize","delta","seed")

str(params)
## 'data.frame':    2000 obs. of  3 variables:
##  $ groupsize: num  3 5 8 12 3 5 8 12 3 5 ...
##  $ delta    : num  0.1 0.1 0.1 0.1 0.2 0.2 0.2 0.2 0.3 0.3 ...
##  $ seed     : num  100 100 100 100 100 100 100 100 100 100 ...
##  - attr(*, "out.attrs")=List of 2
##   ..$ dim     : Named int [1:3] 4 5 100
##   .. ..- attr(*, "names")= chr [1:3] "groupsizes" "deltas" "seed"
##   ..$ dimnames:List of 3
##   .. ..$ groupsizes: chr [1:4] "groupsizes= 3" "groupsizes= 5" "groupsizes= 8" "groupsizes=12"
##   .. ..$ deltas    : chr [1:5] "deltas=0.1" "deltas=0.2" "deltas=0.3" "deltas=0.4" ...
##   .. ..$ seed      : chr [1:100] "seed=  100" "seed=  200" "seed=  300" "seed=  400" ...
params <- params[order(params$groupsize),]

GSA

Using GSAmeth of significant probes.

sopt1 <- list(time = '6:00:00', mem="16G")

sjob <- slurm_apply(simgsa, params, jobname = 'gsa',
  nodes = 50, cpus_per_node = 1, submit = TRUE, slurm_options = sopt1,
  genesetdatabase=gsets, myann=myann, mval=normal_mval, frac_genes=0.5,
  frac_probes=0.5, num_dm_sets=num_dm_sets,
  pkgs = rev(.packages()),
  global_objects = c("randomGeneSets", "runlimma","incorp_dm", "F1", "gsets") )
## Submitted batch job 4446
gres <- get_slurm_out(sjob, outtype = 'raw', wait = TRUE)

gres <- do.call(rbind,gres)

gres <- data.frame(params,gres)

str(gres)
## 'data.frame':    2000 obs. of  9 variables:
##  $ groupsize: num  3 3 3 3 3 3 3 3 3 3 ...
##  $ delta    : num  0.1 0.2 0.3 0.4 0.5 0.1 0.2 0.3 0.4 0.5 ...
##  $ seed     : num  100 100 100 100 100 200 200 200 200 200 ...
##  $ TP       : num  0 0 0 0 0 0 0 0 0 1 ...
##  $ FP       : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ FN       : num  50 50 50 50 50 50 50 50 50 49 ...
##  $ TN       : num  950 950 950 950 950 950 950 950 950 950 ...
##  $ PREC     : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN 1 ...
##  $ REC      : num  0 0 0 0 0 0 0 0 0 0.02 ...

LAT

Limma Average t-test.

sopt1 <- list(time = '6:00:00', mem="32G")

sjob <- slurm_apply(simlac, params, jobname = 'lat',
  nodes = 50, cpus_per_node = 2, submit = TRUE, slurm_options = sopt1,
  genesetdatabase=gsets, myann=myann, mval=normal_mval, frac_genes=0.5,
  frac_probes=0.5, num_dm_sets=num_dm_sets,
  pkgs = rev(.packages()),
  global_objects = c("randomGeneSets", "runlimma","incorp_dm", "ttenrich","F1", "gsets","gt") )
## Submitted batch job 4497
latres <- get_slurm_out(sjob, outtype = 'raw', wait = TRUE)

latres <- do.call(rbind,latres)

latres <- data.frame(params,latres)

str(latres)
## 'data.frame':    2000 obs. of  9 variables:
##  $ groupsize: num  3 3 3 3 3 3 3 3 3 3 ...
##  $ delta    : num  0.1 0.2 0.3 0.4 0.5 0.1 0.2 0.3 0.4 0.5 ...
##  $ seed     : num  100 100 100 100 100 200 200 200 200 200 ...
##  $ TP       : num  0 0 2 2 4 0 1 2 5 6 ...
##  $ FP       : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ FN       : num  50 50 48 48 46 50 49 48 45 44 ...
##  $ TN       : num  950 950 950 950 950 950 950 950 950 950 ...
##  $ PREC     : num  NaN NaN 1 1 1 NaN 1 1 1 1 ...
##  $ REC      : num  0 0 0.04 0.04 0.08 0 0.02 0.04 0.1 0.12 ...

LTT

Limma top t-test.

sopt1 <- list(time = '6:00:00', mem="32G")

sjob <- slurm_apply(simlactop, params, jobname = 'ltt',
  nodes = 50, cpus_per_node = 2, submit = TRUE, slurm_options = sopt1,
  genesetdatabase=gsets, myann=myann, mval=normal_mval, frac_genes=0.5,
  frac_probes=0.5, num_dm_sets=num_dm_sets,
  pkgs = rev(.packages()),
  global_objects = c("randomGeneSets", "runlimma","incorp_dm", "ttenrich","F1", "gsets","gt") )
## Submitted batch job 4548
lttres <- get_slurm_out(sjob, outtype = 'raw', wait = TRUE)

lttres <- do.call(rbind,lttres)

lttres <- data.frame(params,lttres)

str(lttres)
## 'data.frame':    2000 obs. of  9 variables:
##  $ groupsize: num  3 3 3 3 3 3 3 3 3 3 ...
##  $ delta    : num  0.1 0.2 0.3 0.4 0.5 0.1 0.2 0.3 0.4 0.5 ...
##  $ seed     : num  100 100 100 100 100 200 200 200 200 200 ...
##  $ TP       : num  0 0 0 1 3 0 0 0 2 2 ...
##  $ FP       : num  1 0 0 0 0 0 0 0 0 0 ...
##  $ FN       : num  50 50 50 49 47 50 50 50 48 48 ...
##  $ TN       : num  949 950 950 950 950 950 950 950 950 950 ...
##  $ PREC     : num  0 NaN NaN 1 1 NaN NaN NaN 1 1 ...
##  $ REC      : num  0 0 0 0.02 0.06 0 0 0 0.04 0.04 ...

LAW

Limma average wilcox.

sopt1 <- list(time = '6:00:00', mem="32G")

sjob <- slurm_apply(simnlac, params, jobname = 'law',
  nodes = 50, cpus_per_node = 2, submit = TRUE, slurm_options = sopt1,
  genesetdatabase=gsets, myann=myann, mval=normal_mval, frac_genes=0.5,
  frac_probes=0.5, num_dm_sets=num_dm_sets,
  pkgs = rev(.packages()),
  global_objects = c("randomGeneSets", "runlimma","incorp_dm", "wtenrich","F1", "gsets","gt") )
## Submitted batch job 4599
lawres <- get_slurm_out(sjob, outtype = 'raw', wait = TRUE)

lawres <- do.call(rbind,lawres)

lawres <- data.frame(params,lawres)

str(lawres)
## 'data.frame':    2000 obs. of  9 variables:
##  $ groupsize: num  3 3 3 3 3 3 3 3 3 3 ...
##  $ delta    : num  0.1 0.2 0.3 0.4 0.5 0.1 0.2 0.3 0.4 0.5 ...
##  $ seed     : num  100 100 100 100 100 200 200 200 200 200 ...
##  $ TP       : num  0 0 3 3 7 0 2 2 6 11 ...
##  $ FP       : num  0 0 0 0 0 0 0 0 1 2 ...
##  $ FN       : num  50 50 47 47 43 50 48 48 44 39 ...
##  $ TN       : num  950 950 950 950 950 950 950 950 949 948 ...
##  $ PREC     : num  NaN NaN 1 1 1 ...
##  $ REC      : num  0 0 0.06 0.06 0.14 0 0.04 0.04 0.12 0.22 ...

LAM

Limma average mitch.

sopt1 <- list(time = '6:00:00', mem="32G")

sjob <- slurm_apply(simlacm, params, jobname = 'lam',
  nodes = 50, cpus_per_node = 2, submit = TRUE, slurm_options = sopt1,
  genesetdatabase=gsets, myann=myann, mval=normal_mval, frac_genes=0.5,
  frac_probes=0.5, num_dm_sets=num_dm_sets,
  pkgs = rev(.packages()),
  global_objects = c("randomGeneSets", "runlimma","incorp_dm", "runmitch","F1", "gsets","gt") )
## Submitted batch job 4650
lamres <- get_slurm_out(sjob, outtype = 'raw', wait = TRUE)

lamres <- do.call(rbind,lamres)

lamres <- data.frame(params,lamres)

str(lamres)
## 'data.frame':    2000 obs. of  9 variables:
##  $ groupsize: num  3 3 3 3 3 3 3 3 3 3 ...
##  $ delta    : num  0.1 0.2 0.3 0.4 0.5 0.1 0.2 0.3 0.4 0.5 ...
##  $ seed     : num  100 100 100 100 100 200 200 200 200 200 ...
##  $ TP       : num  0 0 3 3 7 0 2 2 6 12 ...
##  $ FP       : num  0 0 0 0 0 0 0 0 1 1 ...
##  $ FN       : num  50 50 47 47 43 50 48 48 44 38 ...
##  $ TN       : num  950 950 950 950 950 950 950 950 949 949 ...
##  $ PREC     : num  NaN NaN 1 1 1 ...
##  $ REC      : num  0 0 0.06 0.06 0.14 0 0.04 0.04 0.12 0.24 ...

LRM

Limma rank mitch.

sopt1 <- list(time = '6:00:00', mem="32G")

sjob <- slurm_apply(simlrm, params, jobname = 'lrm',
  nodes = 50, cpus_per_node = 2, submit = TRUE, slurm_options = sopt1,
  genesetdatabase=gsets, myann=myann, mval=normal_mval, frac_genes=0.5,
  frac_probes=0.5, num_dm_sets=num_dm_sets,
  pkgs = rev(.packages()),
  global_objects = c("randomGeneSets", "runlimma","incorp_dm", "runmitch","F1", "gsets","gt") )
## Submitted batch job 4701
lrmres <- get_slurm_out(sjob, outtype = 'raw', wait = TRUE)

lrmres <- do.call(rbind,lrmres)

lrmres <- data.frame(params,lrmres)

str(lrmres)
## 'data.frame':    2000 obs. of  9 variables:
##  $ groupsize: num  3 3 3 3 3 3 3 3 3 3 ...
##  $ delta    : num  0.1 0.2 0.3 0.4 0.5 0.1 0.2 0.3 0.4 0.5 ...
##  $ seed     : num  100 100 100 100 100 200 200 200 200 200 ...
##  $ TP       : num  0 0 2 3 5 0 2 2 4 5 ...
##  $ FP       : num  0 0 0 0 0 0 0 0 0 1 ...
##  $ FN       : num  50 50 48 47 45 50 48 48 46 45 ...
##  $ TN       : num  950 950 950 950 950 950 950 950 950 949 ...
##  $ PREC     : num  NaN NaN 1 1 1 ...
##  $ REC      : num  0 0 0.04 0.06 0.1 0 0.04 0.04 0.08 0.1 ...

ALT

Aggregate limma t-test

sopt1 <- list(time = '6:00:00', mem="32G")

sjob <- slurm_apply(simalc, params, jobname = 'alt',
  nodes = 50, cpus_per_node = 2, submit = TRUE, slurm_options = sopt1,
  genesetdatabase=gsets, myann=myann, mval=normal_mval, frac_genes=0.5,
  frac_probes=0.5, num_dm_sets=num_dm_sets,
  pkgs = rev(.packages()),
  global_objects = c("randomGeneSets", "runlimma","incorp_dm", "ttenrich","F1", "gsets","gt") )
## Submitted batch job 4752
altres <- get_slurm_out(sjob, outtype = 'raw', wait = TRUE)

altres <- do.call(rbind,altres)

altres <- data.frame(params,altres)

str(altres)
## 'data.frame':    2000 obs. of  9 variables:
##  $ groupsize: num  3 3 3 3 3 3 3 3 3 3 ...
##  $ delta    : num  0.1 0.2 0.3 0.4 0.5 0.1 0.2 0.3 0.4 0.5 ...
##  $ seed     : num  100 100 100 100 100 200 200 200 200 200 ...
##  $ TP       : num  0 0 0 0 5 0 0 1 3 5 ...
##  $ FP       : num  1 0 0 0 0 0 0 0 0 0 ...
##  $ FN       : num  50 50 50 50 45 50 50 49 47 45 ...
##  $ TN       : num  949 950 950 950 950 950 950 950 950 950 ...
##  $ PREC     : num  0 NaN NaN NaN 1 NaN NaN 1 1 1 ...
##  $ REC      : num  0 0 0 0 0.1 0 0 0.02 0.06 0.1 ...

ALW

Aggregate limma wilcox test

sopt1 <- list(time = '6:00:00', mem="32G")

sjob <- slurm_apply(simnalc, params, jobname = 'alw',
  nodes = 50, cpus_per_node = 2, submit = TRUE, slurm_options = sopt1,
  genesetdatabase=gsets, myann=myann, mval=normal_mval, frac_genes=0.5,
  frac_probes=0.5, num_dm_sets=num_dm_sets,
  pkgs = rev(.packages()),
  global_objects = c("randomGeneSets", "runlimma","incorp_dm", "wtenrich","F1", "gsets","gt") )
## Submitted batch job 4803
alwres <- get_slurm_out(sjob, outtype = 'raw', wait = TRUE)

alwres <- do.call(rbind,alwres)

alwres <- data.frame(params,alwres)

str(alwres)
## 'data.frame':    2000 obs. of  9 variables:
##  $ groupsize: num  3 3 3 3 3 3 3 3 3 3 ...
##  $ delta    : num  0.1 0.2 0.3 0.4 0.5 0.1 0.2 0.3 0.4 0.5 ...
##  $ seed     : num  100 100 100 100 100 200 200 200 200 200 ...
##  $ TP       : num  0 0 3 3 10 0 0 2 2 9 ...
##  $ FP       : num  1 0 1 0 1 0 0 0 0 1 ...
##  $ FN       : num  50 50 47 47 40 50 50 48 48 41 ...
##  $ TN       : num  949 950 949 950 949 950 950 950 950 949 ...
##  $ PREC     : num  0 NaN 0.75 1 0.909 ...
##  $ REC      : num  0 0 0.06 0.06 0.2 0 0 0.04 0.04 0.18 ...

ALM

Aggregate limma mitch

sopt1 <- list(time = '6:00:00', mem="32G")

sjob <- slurm_apply(simalm, params, jobname = 'alm',
  nodes = 50, cpus_per_node = 2, submit = TRUE, slurm_options = sopt1,
  genesetdatabase=gsets, myann=myann, mval=normal_mval, frac_genes=0.5,
  frac_probes=0.5, num_dm_sets=num_dm_sets,
  pkgs = rev(.packages()),
  global_objects = c("randomGeneSets", "runlimma","incorp_dm", "runmitch","F1", "gsets","gt") )
## Submitted batch job 4854
almres <- get_slurm_out(sjob, outtype = 'raw', wait = TRUE)

almres <- do.call(rbind,almres)

almres <- data.frame(params,almres)

str(almres)
## 'data.frame':    2000 obs. of  9 variables:
##  $ groupsize: num  3 3 3 3 3 3 3 3 3 3 ...
##  $ delta    : num  0.1 0.2 0.3 0.4 0.5 0.1 0.2 0.3 0.4 0.5 ...
##  $ seed     : num  100 100 100 100 100 200 200 200 200 200 ...
##  $ TP       : num  0 0 3 3 10 0 0 2 2 9 ...
##  $ FP       : num  1 0 1 0 1 0 0 0 0 1 ...
##  $ FN       : num  50 50 47 47 40 50 50 48 48 41 ...
##  $ TN       : num  949 950 949 950 949 950 950 950 950 949 ...
##  $ PREC     : num  0 NaN 0.75 1 0.909 ...
##  $ REC      : num  0 0 0.06 0.06 0.2 0 0 0.04 0.04 0.18 ...

Session information

save.image("GSE158422_simulate050_rslurm.Rdata")

sessionInfo()
## R version 4.3.2 (2023-10-31)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 22.04.2 LTS
## 
## Matrix products: default
## BLAS:   /software/R/4.3.2/lib/R/lib/libRblas.so 
## LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/liblapack.so.3;  LAPACK version 3.10.0
## 
## locale:
##  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
##  [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
##  [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: Australia/Melbourne
## tzcode source: system (glibc)
## 
## attached base packages:
## [1] parallel  stats4    stats     graphics  grDevices utils     datasets 
## [8] methods   base     
## 
## other attached packages:
##  [1] rslurm_0.6.2                                       
##  [2] kableExtra_1.3.4                                   
##  [3] mitch_1.15.0                                       
##  [4] psych_2.3.12                                       
##  [5] org.Hs.eg.db_3.18.0                                
##  [6] AnnotationDbi_1.64.1                               
##  [7] HGNChelper_0.8.1                                   
##  [8] IlluminaHumanMethylation450kmanifest_0.4.0         
##  [9] missMethyl_1.36.0                                  
## [10] IlluminaHumanMethylationEPICanno.ilm10b4.hg19_0.6.0
## [11] IlluminaHumanMethylation450kanno.ilmn12.hg19_0.6.1 
## [12] minfi_1.48.0                                       
## [13] bumphunter_1.44.0                                  
## [14] locfit_1.5-9.8                                     
## [15] iterators_1.0.14                                   
## [16] foreach_1.5.2                                      
## [17] Biostrings_2.70.1                                  
## [18] XVector_0.42.0                                     
## [19] SummarizedExperiment_1.32.0                        
## [20] Biobase_2.62.0                                     
## [21] MatrixGenerics_1.14.0                              
## [22] matrixStats_1.2.0                                  
## [23] GenomicRanges_1.54.1                               
## [24] GenomeInfoDb_1.38.5                                
## [25] IRanges_2.36.0                                     
## [26] S4Vectors_0.40.2                                   
## [27] BiocGenerics_0.48.1                                
## [28] limma_3.58.1                                       
## [29] stringi_1.8.3                                      
## 
## loaded via a namespace (and not attached):
##   [1] splines_4.3.2             later_1.3.2              
##   [3] BiocIO_1.12.0             bitops_1.0-7             
##   [5] filelock_1.0.3            tibble_3.2.1             
##   [7] preprocessCore_1.64.0     XML_3.99-0.16            
##   [9] lifecycle_1.0.4           processx_3.8.3           
##  [11] lattice_0.22-5            MASS_7.3-60              
##  [13] base64_2.0.1              scrime_1.3.5             
##  [15] magrittr_2.0.3            sass_0.4.8               
##  [17] rmarkdown_2.25            jquerylib_0.1.4          
##  [19] yaml_2.3.8                remotes_2.4.2.1          
##  [21] httpuv_1.6.13             doRNG_1.8.6              
##  [23] askpass_1.2.0             sessioninfo_1.2.2        
##  [25] pkgbuild_1.4.3            DBI_1.2.0                
##  [27] RColorBrewer_1.1-3        abind_1.4-5              
##  [29] pkgload_1.3.3             zlibbioc_1.48.0          
##  [31] rvest_1.0.3               quadprog_1.5-8           
##  [33] purrr_1.0.2               RCurl_1.98-1.13          
##  [35] rappdirs_0.3.3            GenomeInfoDbData_1.2.11  
##  [37] genefilter_1.84.0         annotate_1.80.0          
##  [39] svglite_2.1.3             DelayedMatrixStats_1.24.0
##  [41] codetools_0.2-19          DelayedArray_0.28.0      
##  [43] xml2_1.3.6                tidyselect_1.2.0         
##  [45] beanplot_1.3.1            BiocFileCache_2.10.1     
##  [47] webshot_0.5.5             illuminaio_0.44.0        
##  [49] GenomicAlignments_1.38.1  jsonlite_1.8.8           
##  [51] multtest_2.58.0           ellipsis_0.3.2           
##  [53] survival_3.5-7            systemfonts_1.0.5        
##  [55] tools_4.3.2               progress_1.2.3           
##  [57] Rcpp_1.0.11               glue_1.6.2               
##  [59] gridExtra_2.3             mnormt_2.1.1             
##  [61] SparseArray_1.2.3         xfun_0.41                
##  [63] usethis_2.2.2             dplyr_1.1.4              
##  [65] HDF5Array_1.30.0          BiocManager_1.30.22      
##  [67] fastmap_1.1.1             GGally_2.2.0             
##  [69] rhdf5filters_1.14.1       fansi_1.0.6              
##  [71] openssl_2.1.1             caTools_1.18.2           
##  [73] callr_3.7.3               digest_0.6.33            
##  [75] R6_2.5.1                  mime_0.12                
##  [77] colorspace_2.1-0          gtools_3.9.5             
##  [79] biomaRt_2.58.0            RSQLite_2.3.4            
##  [81] utf8_1.2.4                tidyr_1.3.0              
##  [83] generics_0.1.3            data.table_1.14.10       
##  [85] rtracklayer_1.62.0        prettyunits_1.2.0        
##  [87] httr_1.4.7                htmlwidgets_1.6.4        
##  [89] S4Arrays_1.2.0            whisker_0.4.1            
##  [91] ggstats_0.5.1             pkgconfig_2.0.3          
##  [93] gtable_0.3.4              blob_1.2.4               
##  [95] siggenes_1.76.0           htmltools_0.5.7          
##  [97] echarts4r_0.4.5           profvis_0.3.8            
##  [99] scales_1.3.0              png_0.1-8                
## [101] rstudioapi_0.15.0         knitr_1.45               
## [103] reshape2_1.4.4            tzdb_0.4.0               
## [105] rjson_0.2.21              nlme_3.1-164             
## [107] curl_5.2.0                cachem_1.0.8             
## [109] rhdf5_2.46.1              stringr_1.5.1            
## [111] KernSmooth_2.23-22        miniUI_0.1.1.1           
## [113] restfulr_0.0.15           desc_1.4.3               
## [115] GEOquery_2.70.0           pillar_1.9.0             
## [117] grid_4.3.2                reshape_0.8.9            
## [119] vctrs_0.6.5               gplots_3.1.3             
## [121] urlchecker_1.0.1          promises_1.2.1           
## [123] dbplyr_2.4.0              xtable_1.8-4             
## [125] beeswarm_0.4.0            evaluate_0.23            
## [127] readr_2.1.4               GenomicFeatures_1.54.1   
## [129] cli_3.6.2                 compiler_4.3.2           
## [131] Rsamtools_2.18.0          rlang_1.1.2              
## [133] crayon_1.5.2              rngtools_1.5.2           
## [135] nor1mix_1.3-2             mclust_6.0.1             
## [137] ps_1.7.5                  plyr_1.8.9               
## [139] fs_1.6.3                  viridisLite_0.4.2        
## [141] BiocParallel_1.36.0       munsell_0.5.0            
## [143] devtools_2.4.5            Matrix_1.6-4             
## [145] hms_1.1.3                 sparseMatrixStats_1.14.0 
## [147] bit64_4.0.5               ggplot2_3.4.4            
## [149] Rhdf5lib_1.24.1           KEGGREST_1.42.0          
## [151] statmod_1.5.0             shiny_1.8.0              
## [153] memoise_2.0.1             bslib_0.6.1              
## [155] bit_4.0.5