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(20,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")

params %>% kbl(caption="Parameters to test") %>% kable_paper("hover", full_width = F)
Parameters to test
groupsize delta seed
12 0.5 100
12 0.5 200
12 0.5 300
12 0.5 400
12 0.5 500
12 0.5 600
12 0.5 700
12 0.5 800
12 0.5 900
12 0.5 1000
12 0.5 1100
12 0.5 1200
12 0.5 1300
12 0.5 1400
12 0.5 1500
12 0.5 1600
12 0.5 1700
12 0.5 1800
12 0.5 1900
12 0.5 2000
12 0.5 2100
12 0.5 2200
12 0.5 2300
12 0.5 2400
12 0.5 2500
12 0.5 2600
12 0.5 2700
12 0.5 2800
12 0.5 2900
12 0.5 3000
12 0.5 3100
12 0.5 3200
12 0.5 3300
12 0.5 3400
12 0.5 3500
12 0.5 3600
12 0.5 3700
12 0.5 3800
12 0.5 3900
12 0.5 4000
12 0.5 4100
12 0.5 4200
12 0.5 4300
12 0.5 4400
12 0.5 4500
12 0.5 4600
12 0.5 4700
12 0.5 4800
12 0.5 4900
12 0.5 5000
12 0.5 5100
12 0.5 5200
12 0.5 5300
12 0.5 5400
12 0.5 5500
12 0.5 5600
12 0.5 5700
12 0.5 5800
12 0.5 5900
12 0.5 6000
12 0.5 6100
12 0.5 6200
12 0.5 6300
12 0.5 6400
12 0.5 6500
12 0.5 6600
12 0.5 6700
12 0.5 6800
12 0.5 6900
12 0.5 7000
12 0.5 7100
12 0.5 7200
12 0.5 7300
12 0.5 7400
12 0.5 7500
12 0.5 7600
12 0.5 7700
12 0.5 7800
12 0.5 7900
12 0.5 8000
12 0.5 8100
12 0.5 8200
12 0.5 8300
12 0.5 8400
12 0.5 8500
12 0.5 8600
12 0.5 8700
12 0.5 8800
12 0.5 8900
12 0.5 9000
12 0.5 9100
12 0.5 9200
12 0.5 9300
12 0.5 9400
12 0.5 9500
12 0.5 9600
12 0.5 9700
12 0.5 9800
12 0.5 9900
12 0.5 10000

GSA

Using GSAmeth of significant probes.

sopt1 <- list(time = '1:00:00', mem="20G")

sjob <- slurm_apply(simgsa, params, jobname = 'gsa',
  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", "F1", "gsets") )
## Submitted batch job 3060
gres <- get_slurm_out(sjob, outtype = 'raw', wait = TRUE)

gres <- do.call(rbind,gres)

gres <- data.frame(params,gres)

str(gres)
## 'data.frame':    100 obs. of  9 variables:
##  $ groupsize: num  12 12 12 12 12 12 12 12 12 12 ...
##  $ delta    : num  0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 ...
##  $ seed     : num  100 200 300 400 500 600 700 800 900 1000 ...
##  $ TP       : num  16 21 28 18 31 30 32 25 26 27 ...
##  $ FP       : num  0 1 1 0 2 1 0 2 0 2 ...
##  $ FN       : num  34 29 22 32 19 20 18 25 24 23 ...
##  $ TN       : num  950 949 949 950 948 949 950 948 950 948 ...
##  $ PREC     : num  1 0.955 0.966 1 0.939 ...
##  $ REC      : num  0.32 0.42 0.56 0.36 0.62 0.6 0.64 0.5 0.52 0.54 ...

LAT

Limma Average t-test.

sopt1 <- list(time = '1:00:00', mem="20G")

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 3113
latres <- get_slurm_out(sjob, outtype = 'raw', wait = TRUE)

latres <- do.call(rbind,latres)

latres <- data.frame(params,latres)

str(latres)
## 'data.frame':    100 obs. of  9 variables:
##  $ groupsize: num  12 12 12 12 12 12 12 12 12 12 ...
##  $ delta    : num  0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 ...
##  $ seed     : num  100 200 300 400 500 600 700 800 900 1000 ...
##  $ TP       : num  0 1 0 0 0 0 0 0 0 0 ...
##  $ FP       : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ FN       : num  50 49 50 50 50 50 50 50 50 50 ...
##  $ TN       : num  950 950 950 950 950 950 950 950 950 950 ...
##  $ PREC     : num  NaN 1 NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ REC      : num  0 0.02 0 0 0 0 0 0 0 0 ...

LTT

Limma top t-test.

sopt1 <- list(time = '1:00:00', mem="20G")

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 3164
lttres <- get_slurm_out(sjob, outtype = 'raw', wait = TRUE)

lttres <- do.call(rbind,lttres)

lttres <- data.frame(params,lttres)

str(lttres)
## 'data.frame':    100 obs. of  9 variables:
##  $ groupsize: num  12 12 12 12 12 12 12 12 12 12 ...
##  $ delta    : num  0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 ...
##  $ seed     : num  100 200 300 400 500 600 700 800 900 1000 ...
##  $ TP       : num  2 1 0 0 1 1 3 3 3 0 ...
##  $ FP       : num  0 0 0 1 0 0 1 3 3 0 ...
##  $ FN       : num  48 49 50 50 49 49 47 47 47 50 ...
##  $ TN       : num  950 950 950 949 950 950 949 947 947 950 ...
##  $ PREC     : num  1 1 NaN 0 1 1 0.75 0.5 0.5 NaN ...
##  $ REC      : num  0.04 0.02 0 0 0.02 0.02 0.06 0.06 0.06 0 ...

LAW

Limma average wilcox.

sopt1 <- list(time = '1:00:00', mem="20G")

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 3216
lawres <- get_slurm_out(sjob, outtype = 'raw', wait = TRUE)

lawres <- do.call(rbind,lawres)

lawres <- data.frame(params,lawres)

str(lawres)
## 'data.frame':    100 obs. of  9 variables:
##  $ groupsize: num  12 12 12 12 12 12 12 12 12 12 ...
##  $ delta    : num  0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 ...
##  $ seed     : num  100 200 300 400 500 600 700 800 900 1000 ...
##  $ TP       : num  1 4 2 3 1 9 9 2 0 7 ...
##  $ FP       : num  0 1 0 0 0 1 0 0 0 0 ...
##  $ FN       : num  49 46 48 47 49 41 41 48 50 43 ...
##  $ TN       : num  950 949 950 950 950 949 950 950 950 950 ...
##  $ PREC     : num  1 0.8 1 1 1 0.9 1 1 NaN 1 ...
##  $ REC      : num  0.02 0.08 0.04 0.06 0.02 0.18 0.18 0.04 0 0.14 ...

LAM

Limma average mitch.

sopt1 <- list(time = '1:00:00', mem="20G")

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 3267
lamres <- get_slurm_out(sjob, outtype = 'raw', wait = TRUE)

lamres <- do.call(rbind,lamres)

lamres <- data.frame(params,lamres)

str(lamres)
## 'data.frame':    100 obs. of  9 variables:
##  $ groupsize: num  12 12 12 12 12 12 12 12 12 12 ...
##  $ delta    : num  0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 ...
##  $ seed     : num  100 200 300 400 500 600 700 800 900 1000 ...
##  $ TP       : num  1 4 2 3 1 9 9 2 0 7 ...
##  $ FP       : num  0 1 0 0 0 1 0 0 0 0 ...
##  $ FN       : num  49 46 48 47 49 41 41 48 50 43 ...
##  $ TN       : num  950 949 950 950 950 949 950 950 950 950 ...
##  $ PREC     : num  1 0.8 1 1 1 0.9 1 1 NaN 1 ...
##  $ REC      : num  0.02 0.08 0.04 0.06 0.02 0.18 0.18 0.04 0 0.14 ...

LRM

Limma rank mitch.

sopt1 <- list(time = '1:00:00', mem="20G")

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 3318
lrmres <- get_slurm_out(sjob, outtype = 'raw', wait = TRUE)

lrmres <- do.call(rbind,lrmres)

lrmres <- data.frame(params,lrmres)

str(lrmres)
## 'data.frame':    100 obs. of  9 variables:
##  $ groupsize: num  12 12 12 12 12 12 12 12 12 12 ...
##  $ delta    : num  0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 ...
##  $ seed     : num  100 200 300 400 500 600 700 800 900 1000 ...
##  $ TP       : num  0 2 0 0 0 1 2 0 0 4 ...
##  $ FP       : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ FN       : num  50 48 50 50 50 49 48 50 50 46 ...
##  $ TN       : num  950 950 950 950 950 950 950 950 950 950 ...
##  $ PREC     : num  NaN 1 NaN NaN NaN 1 1 NaN NaN 1 ...
##  $ REC      : num  0 0.04 0 0 0 0.02 0.04 0 0 0.08 ...

ALT

Aggregate limma t-test

sopt1 <- list(time = '1:00:00', mem="20G")

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 3369
altres <- get_slurm_out(sjob, outtype = 'raw', wait = TRUE)

altres <- do.call(rbind,altres)

altres <- data.frame(params,altres)

str(altres)
## 'data.frame':    100 obs. of  9 variables:
##  $ groupsize: num  12 12 12 12 12 12 12 12 12 12 ...
##  $ delta    : num  0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 ...
##  $ seed     : num  100 200 300 400 500 600 700 800 900 1000 ...
##  $ TP       : num  0 1 0 0 0 0 0 0 0 0 ...
##  $ FP       : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ FN       : num  50 49 50 50 50 50 50 50 50 50 ...
##  $ TN       : num  950 950 950 950 950 950 950 950 950 950 ...
##  $ PREC     : num  NaN 1 NaN NaN NaN NaN NaN NaN NaN NaN ...
##  $ REC      : num  0 0.02 0 0 0 0 0 0 0 0 ...

ALW

Aggregate limma wilcox test

sopt1 <- list(time = '1:00:00', mem="20G")

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 3420
alwres <- get_slurm_out(sjob, outtype = 'raw', wait = TRUE)

alwres <- do.call(rbind,alwres)

alwres <- data.frame(params,alwres)

str(alwres)
## 'data.frame':    100 obs. of  9 variables:
##  $ groupsize: num  12 12 12 12 12 12 12 12 12 12 ...
##  $ delta    : num  0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 ...
##  $ seed     : num  100 200 300 400 500 600 700 800 900 1000 ...
##  $ TP       : num  2 3 2 3 1 7 7 2 0 7 ...
##  $ FP       : num  0 1 0 0 0 0 0 0 0 1 ...
##  $ FN       : num  48 47 48 47 49 43 43 48 50 43 ...
##  $ TN       : num  950 949 950 950 950 950 950 950 950 949 ...
##  $ PREC     : num  1 0.75 1 1 1 1 1 1 NaN 0.875 ...
##  $ REC      : num  0.04 0.06 0.04 0.06 0.02 0.14 0.14 0.04 0 0.14 ...

ALM

Aggregate limma mitch

sopt1 <- list(time = '1:00:00', mem="20G")

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 3471
almres <- get_slurm_out(sjob, outtype = 'raw', wait = TRUE)

almres <- do.call(rbind,almres)

almres <- data.frame(params,almres)

str(almres)
## 'data.frame':    100 obs. of  9 variables:
##  $ groupsize: num  12 12 12 12 12 12 12 12 12 12 ...
##  $ delta    : num  0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 ...
##  $ seed     : num  100 200 300 400 500 600 700 800 900 1000 ...
##  $ TP       : num  2 3 2 3 1 7 7 2 0 7 ...
##  $ FP       : num  0 1 0 0 0 0 0 0 0 1 ...
##  $ FN       : num  48 47 48 47 49 43 43 48 50 43 ...
##  $ TN       : num  950 949 950 950 950 950 950 950 950 949 ...
##  $ PREC     : num  1 0.75 1 1 1 1 1 1 NaN 0.875 ...
##  $ REC      : num  0.04 0.06 0.04 0.06 0.02 0.14 0.14 0.04 0 0.14 ...

Session information

save.image("GSE158422_simulate020_rslurm.Rdata")

sessionInfo()
## R version 4.2.3 (2023-03-15)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 22.04.3 LTS
## 
## Matrix products: default
## BLAS:   /software/R/4.2.3/lib/R/lib/libRblas.so
## LAPACK: /software/R/4.2.3/lib/R/lib/libRlapack.so
## 
## 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       
## 
## 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.16.0                                
##  [6] AnnotationDbi_1.60.2                               
##  [7] HGNChelper_0.8.1                                   
##  [8] IlluminaHumanMethylation450kmanifest_0.4.0         
##  [9] missMethyl_1.32.1                                  
## [10] IlluminaHumanMethylationEPICanno.ilm10b4.hg19_0.6.0
## [11] IlluminaHumanMethylation450kanno.ilmn12.hg19_0.6.1 
## [12] minfi_1.44.0                                       
## [13] bumphunter_1.40.0                                  
## [14] locfit_1.5-9.8                                     
## [15] iterators_1.0.14                                   
## [16] foreach_1.5.2                                      
## [17] Biostrings_2.66.0                                  
## [18] XVector_0.38.0                                     
## [19] SummarizedExperiment_1.28.0                        
## [20] Biobase_2.58.0                                     
## [21] MatrixGenerics_1.10.0                              
## [22] matrixStats_1.2.0                                  
## [23] GenomicRanges_1.50.2                               
## [24] GenomeInfoDb_1.34.9                                
## [25] IRanges_2.32.0                                     
## [26] S4Vectors_0.36.2                                   
## [27] BiocGenerics_0.44.0                                
## [28] limma_3.54.2                                       
## [29] stringi_1.7.12                                     
## 
## loaded via a namespace (and not attached):
##   [1] systemfonts_1.0.5         BiocFileCache_2.6.1      
##   [3] plyr_1.8.8                splines_4.2.3            
##   [5] BiocParallel_1.32.6       ggplot2_3.4.3            
##   [7] digest_0.6.33             htmltools_0.5.6          
##   [9] fansi_1.0.4               magrittr_2.0.3           
##  [11] memoise_2.0.1             tzdb_0.4.0               
##  [13] readr_2.1.4               annotate_1.76.0          
##  [15] svglite_2.1.3             askpass_1.2.0            
##  [17] siggenes_1.72.0           prettyunits_1.1.1        
##  [19] colorspace_2.1-0          rvest_1.0.3              
##  [21] blob_1.2.4                rappdirs_0.3.3           
##  [23] xfun_0.40                 dplyr_1.1.3              
##  [25] crayon_1.5.2              RCurl_1.98-1.13          
##  [27] jsonlite_1.8.7            genefilter_1.80.3        
##  [29] GEOquery_2.66.0           survival_3.5-3           
##  [31] glue_1.6.2                gtable_0.3.4             
##  [33] zlibbioc_1.44.0           webshot_0.5.5            
##  [35] DelayedArray_0.24.0       Rhdf5lib_1.20.0          
##  [37] HDF5Array_1.26.0          scales_1.2.1             
##  [39] GGally_2.1.2              DBI_1.2.0                
##  [41] rngtools_1.5.2            Rcpp_1.0.11              
##  [43] viridisLite_0.4.2         xtable_1.8-4             
##  [45] progress_1.2.2            bit_4.0.5                
##  [47] mclust_6.0.1              preprocessCore_1.60.2    
##  [49] htmlwidgets_1.6.2         httr_1.4.7               
##  [51] gplots_3.1.3              RColorBrewer_1.1-3       
##  [53] ellipsis_0.3.2            pkgconfig_2.0.3          
##  [55] reshape_0.8.9             XML_3.99-0.16            
##  [57] sass_0.4.7                dbplyr_2.4.0             
##  [59] utf8_1.2.3                reshape2_1.4.4           
##  [61] later_1.3.1               tidyselect_1.2.0         
##  [63] rlang_1.1.1               munsell_0.5.0            
##  [65] tools_4.2.3               cachem_1.0.8             
##  [67] cli_3.6.1                 generics_0.1.3           
##  [69] RSQLite_2.3.4             evaluate_0.21            
##  [71] stringr_1.5.0             fastmap_1.1.1            
##  [73] yaml_2.3.7                knitr_1.44               
##  [75] bit64_4.0.5               beanplot_1.3.1           
##  [77] caTools_1.18.2            scrime_1.3.5             
##  [79] purrr_1.0.2               KEGGREST_1.38.0          
##  [81] nlme_3.1-162              doRNG_1.8.6              
##  [83] sparseMatrixStats_1.10.0  whisker_0.4.1            
##  [85] mime_0.12                 nor1mix_1.3-2            
##  [87] xml2_1.3.6                biomaRt_2.54.1           
##  [89] rstudioapi_0.15.0         compiler_4.2.3           
##  [91] beeswarm_0.4.0            filelock_1.0.3           
##  [93] curl_5.2.0                png_0.1-8                
##  [95] tibble_3.2.1              statmod_1.5.0            
##  [97] bslib_0.5.1               highr_0.10               
##  [99] GenomicFeatures_1.50.4    lattice_0.20-45          
## [101] Matrix_1.5-3              multtest_2.54.0          
## [103] vctrs_0.6.3               pillar_1.9.0             
## [105] lifecycle_1.0.3           rhdf5filters_1.10.1      
## [107] jquerylib_0.1.4           data.table_1.14.10       
## [109] bitops_1.0-7              httpuv_1.6.11            
## [111] rtracklayer_1.58.0        R6_2.5.1                 
## [113] BiocIO_1.8.0              promises_1.2.1           
## [115] KernSmooth_2.23-20        gridExtra_2.3            
## [117] echarts4r_0.4.5           codetools_0.2-19         
## [119] gtools_3.9.4              MASS_7.3-58.2            
## [121] rhdf5_2.42.1              openssl_2.1.1            
## [123] rjson_0.2.21              GenomicAlignments_1.34.1 
## [125] Rsamtools_2.14.0          mnormt_2.1.1             
## [127] GenomeInfoDbData_1.2.9    hms_1.1.3                
## [129] quadprog_1.5-8            grid_4.2.3               
## [131] tidyr_1.3.0               base64_2.0.1             
## [133] rmarkdown_2.24            DelayedMatrixStats_1.20.0
## [135] illuminaio_0.40.0         shiny_1.7.5              
## [137] restfulr_0.0.15