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:
Import GSE158422 data corresponding to control (non-tumour tissue).
From the 37 samples, create two groups of 18 samples. One of these will be considered “control” and the other “case”.
Create random gene sets that have similar sized to Reactome pathways.
Some gene sets will be selected to be differentially methylated. Half of these will be hypermethylated and the others will be hypomethylated.
The changes will be incorporated into the “case” samples.
The enrichment analysis will be conducted.
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
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")
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)
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)]
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),]
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 ...
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 ...
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 ...
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 ...
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 ...
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 ...
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 ...
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 ...
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 ...
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