knitr::opts_chunk$set(
echo = TRUE,
warning = FALSE,
message = FALSE,
fig.width = 8,
fig.height = 5,
dpi = 300
)
required_packages <- c(
"CMEnt", "data.table", "GenomicRanges", "ggplot2", "readxl"
)
missing_packages <- required_packages[
!vapply(required_packages, requireNamespace, logical(1), quietly = TRUE)
]
if (length(missing_packages) > 0L) {
stop("Install required packages before rendering: ", paste(missing_packages, collapse = ", "))
}
if (file.exists("DESCRIPTION") && requireNamespace("devtools", quietly = TRUE)) {
devtools::load_all(quiet = TRUE)
} else if (file.exists("../DESCRIPTION") && requireNamespace("devtools", quietly = TRUE)) {
devtools::load_all("..", quiet = TRUE)
}
suppressPackageStartupMessages({
library(CMEnt)
library(GenomicRanges)
library(ggplot2)
})
get_project_file <- function(...) {
parts <- c(...)
if (file.exists("DESCRIPTION")) {
do.call(file.path, as.list(parts))
} else if (file.exists("../DESCRIPTION")) {
do.call(file.path, as.list(c("..", parts)))
} else if (basename(getwd()) == "notebooks") {
do.call(file.path, as.list(parts[-1L]))
} else {
stop("Render this notebook from the CMEnt repository root or its notebooks directory.")
}
}
input_dir <- get_project_file("notebooks", "cached_results", "metastudyEpic")
result_dir <- Sys.getenv(
"CMENT_NULL_RESULT_DIR",
get_project_file("notebooks", "cached_results", "null_model")
)
dir.create(result_dir, recursive = TRUE, showWarnings = FALSE)
genome <- "hg19"
array_type <- "EPIC"
n_permutations <- suppressWarnings(as.integer(Sys.getenv("CMENT_NULL_NPERM", "999")))
if (length(n_permutations) != 1L || is.na(n_permutations) || n_permutations < 1L) {
stop("CMENT_NULL_NPERM must be a positive integer.")
}
master_seed <- 20260907L
njobs <- suppressWarnings(as.integer(Sys.getenv(
"NJOBS",
as.character(max(1L, min(8L, parallel::detectCores(logical = TRUE) - 1L)))
)))
if (length(njobs) != 1L || is.na(njobs) || njobs < 1L) {
stop("NJOBS must be a positive integer.")
}
cment_parameters <- list(
sample_group_col = "tissue.ch1",
casecontrol_col = "casecontrol",
testing_mode = "parametric",
max_bridge_seeds_gaps = 1L,
max_bridge_extension_gaps = 3L,
min_seeds = 2L,
min_sites = 3L,
ext_site_delta_beta = 0.2,
max_lookup_dist = 1000,
expansion_window = -1,
max_pval = 0.05,
entanglement = "weak",
aggfun = "median",
score_dmrs = FALSE,
annotate_with_genes = FALSE,
extract_motifs = FALSE,
njobs = njobs,
verbose = 0
)
This analysis tests whether CMEnt organizes an externally supplied seed set into regional methylation structures more strongly than expected when methylation profiles have no privileged genomic placement. The published GSE244696 DMPs are held fixed as the seeds. No CMEnt seed-discovery helper is called.
The null transformation independently permutes intact locus-level methylation profiles among measured loci within each chromosome. It therefore preserves the phenotype, sample structure, locus-profile distribution, seed count, and exact seed geometry while disrupting the alignment between genomic proximity and methylation-profile similarity.
beta_file <- file.path(input_dir, "GSE244696_beta_values.tsv.gz")
samplesheet_file <- file.path(input_dir, "GSE244696_samplesheet.tsv")
published_dmp_file <- file.path(input_dir, "GSE244696_DMPs.xlsx")
zenodo_base_url <- "https://zenodo.org/records/20592944/files/"
for (path in c(beta_file, samplesheet_file, published_dmp_file)) {
if (!file.exists(path)) {
curl::curl_download(
paste0(zenodo_base_url, basename(path), "?download=1"),
path
)
}
}
pheno <- utils::read.table(
samplesheet_file,
header = TRUE,
stringsAsFactors = FALSE,
sep = "\t",
check.names = FALSE
)
if (all(rownames(pheno) == as.character(seq_len(nrow(pheno))))) {
rownames(pheno) <- pheno[[1L]]
}
pheno$casecontrol <- pheno$tissue.ch1 == "Tumor"
beta_handler <- CMEnt::getBetaHandler(
beta_file,
array = array_type,
genome = genome,
njobs = njobs
)
beta_mat <- as.matrix(beta_handler$getBeta())
locs <- as.data.frame(beta_handler$getBetaLocs())
common_samples <- intersect(colnames(beta_mat), rownames(pheno))
if (length(common_samples) < 6L) {
stop("Fewer than six beta samples match the phenotype row names.")
}
beta_mat <- beta_mat[, common_samples, drop = FALSE]
pheno <- pheno[common_samples, , drop = FALSE]
common_sites <- intersect(rownames(locs), rownames(beta_mat))
locs <- locs[common_sites, , drop = FALSE]
beta_mat <- beta_mat[common_sites, , drop = FALSE]
published_dmps_raw <- suppressWarnings(suppressMessages(readxl::read_xlsx(
published_dmp_file,
sheet = "Suppl_Table 1",
range = readxl::cell_cols(1:21),
.name_repair = "unique"
)))
published_seed_ids <- unique(as.character(published_dmps_raw[[1L]]))
published_seed_ids <- published_seed_ids[
!is.na(published_seed_ids) & nzchar(published_seed_ids) & published_seed_ids %in% common_sites
]
if (length(published_seed_ids) < 2L) {
stop("Fewer than two published DMPs are present in the beta matrix.")
}
# Deliberately exclude published p-values: this validation conditions only on
# the externally supplied seed identities and tests CMEnt regional assembly.
seeds <- data.frame(site_id = published_seed_ids, stringsAsFactors = FALSE)
input_summary <- data.frame(
Metric = c("Samples", "Measured loci", "Fixed published seeds", "Null permutations"),
Value = c(ncol(beta_mat), nrow(beta_mat), nrow(seeds), n_permutations)
)
knitr::kable(input_summary, row.names = FALSE, caption = "Null-validation inputs")
| Metric | Value |
|---|---|
| Samples | 26 |
| Measured loci | 684813 |
| Fixed published seeds | 22667 |
| Null permutations | 999 |
cache_signature <- list(
analysis_version = 1L,
master_seed = master_seed,
seed_ids = published_seed_ids,
beta_md5 = unname(tools::md5sum(beta_file)),
samplesheet_md5 = unname(tools::md5sum(samplesheet_file)),
dmp_md5 = unname(tools::md5sum(published_dmp_file)),
cment_parameters = cment_parameters
)
read_cache <- function(path, signature) {
if (!file.exists(path)) {
return(NULL)
}
value <- readRDS(path)
# remove njobs from signature comparison because it does not affect the result
signature$cment_parameters$njobs <- NULL
value$signature$cment_parameters$njobs <- NULL
if (!is.list(value) || !identical(value$signature, signature)) {
return(NULL)
}
value$result
}
write_cache <- function(path, result, signature) {
saveRDS(list(result = result, signature = signature), path)
}
permute_profiles_within_chromosome <- function(beta, locations, seed) {
set.seed(seed)
source_index <- seq_len(nrow(beta))
chromosome_rows <- split(seq_len(nrow(locations)), as.character(locations$chr))
for (idx in chromosome_rows) {
if (length(idx) > 1L) {
source_index[idx] <- sample(idx, length(idx), replace = FALSE)
}
}
permuted <- beta[source_index, , drop = FALSE]
rownames(permuted) <- rownames(beta)
permuted
}
run_cment <- function(beta) {
handler <- CMEnt::getBetaHandler(
beta = beta,
genome = genome,
sorted_locs = locs,
njobs = njobs
)
do.call(
CMEnt::buildDMRs,
c(
list(
beta = handler,
seeds = seeds,
seeds_id_col = "site_id",
pheno = pheno
),
cment_parameters
)
)
}
split_ids <- function(x) {
ids <- unlist(strsplit(as.character(x), ",", fixed = TRUE), use.names = FALSE)
unique(ids[!is.na(ids) & nzchar(ids)])
}
summarise_dmrs <- function(dmrs, replicate_id, is_observed) {
if (is.null(dmrs) || length(dmrs) == 0L) {
return(data.frame(
replicate_id = replicate_id,
observed = is_observed,
incorporated_seeds = 0L,
dmrs = 0L,
supporting_sites = 0L,
total_coverage_bp = 0,
median_connection_pval = NA_real_
))
}
metadata <- S4Vectors::mcols(dmrs)
incorporated_seeds <- if ("seeds" %in% colnames(metadata)) {
length(split_ids(metadata$seeds))
} else {
0L
}
supporting_sites <- if ("sites" %in% colnames(metadata)) {
length(split_ids(metadata$sites))
} else {
0L
}
connection_pvals <- if ("connection_corr_pval" %in% colnames(metadata)) {
suppressWarnings(as.numeric(metadata$connection_corr_pval))
} else {
numeric(0)
}
connection_pvals <- connection_pvals[is.finite(connection_pvals)]
data.frame(
replicate_id = replicate_id,
observed = is_observed,
incorporated_seeds = incorporated_seeds,
dmrs = length(dmrs),
supporting_sites = supporting_sites,
total_coverage_bp = sum(GenomicRanges::width(GenomicRanges::reduce(dmrs))),
median_connection_pval = if (length(connection_pvals) == 0L) {
NA_real_
} else {
stats::median(connection_pvals)
}
)
}
observed_cache <- file.path(result_dir, "observed.rds")
observed_summary <- read_cache(observed_cache, cache_signature)
if (is.null(observed_summary)) {
observed_dmrs <- run_cment(beta_mat)
observed_summary <- summarise_dmrs(observed_dmrs, 0L, TRUE)
write_cache(observed_cache, observed_summary, cache_signature)
}
knitr::kable(observed_summary, row.names = FALSE, caption = "Observed CMEnt regional assembly")
| replicate_id | observed | incorporated_seeds | dmrs | supporting_sites | total_coverage_bp | median_connection_pval |
|---|---|---|---|---|---|---|
| 0 | TRUE | 6572 | 2100 | 15577 | 3002022 | 4.18e-05 |
null_rows <- vector("list", n_permutations)
for (permutation_id in seq_len(n_permutations)) {
permutation_cache <- file.path(result_dir, sprintf("permutation_%04d.rds", permutation_id))
permutation_signature <- c(cache_signature, list(permutation_id = permutation_id))
cached_result <- read_cache(permutation_cache, permutation_signature)
if (is.null(cached_result)) {
null_beta <- permute_profiles_within_chromosome(
beta_mat,
locs,
seed = master_seed + permutation_id
)
null_dmrs <- run_cment(null_beta)
null_rows[[permutation_id]] <- summarise_dmrs(
null_dmrs,
permutation_id,
FALSE
)
write_cache(permutation_cache, null_rows[[permutation_id]], permutation_signature)
rm(null_beta, null_dmrs)
invisible(gc(verbose = FALSE))
} else {
null_rows[[permutation_id]] <- cached_result
}
}
null_summary <- do.call(rbind, null_rows)
all_results <- rbind(observed_summary, null_summary)
data.table::fwrite(
all_results,
file.path(result_dir, "null_validation_summary.tsv"),
sep = "\t"
)
The primary statistic is the number of unique supplied seeds incorporated into the final multi-seed DMRs. The Monte Carlo p-value includes the observed result in the numerator and denominator.
observed_statistic <- observed_summary$incorporated_seeds[[1L]]
null_statistics <- null_summary$incorporated_seeds
exceedances <- sum(null_statistics >= observed_statistic)
empirical_p <- (exceedances + 1) / (n_permutations + 1)
exceedance_interval <- stats::binom.test(exceedances, n_permutations)$conf.int
inference_summary <- data.frame(
Statistic = c(
"Observed incorporated seeds",
"Null median incorporated seeds",
"Null 95th percentile",
"Null exceedances",
"Monte Carlo p-value",
"Exceedance probability 95% CI lower",
"Exceedance probability 95% CI upper"
),
Value = c(
observed_statistic,
stats::median(null_statistics),
unname(stats::quantile(null_statistics, 0.95)),
exceedances,
empirical_p,
exceedance_interval[[1L]],
exceedance_interval[[2L]]
)
)
knitr::kable(inference_summary, digits = 4, row.names = FALSE, caption = "Primary conditional-null test")
| Statistic | Value |
|---|---|
| Observed incorporated seeds | 6572.0000 |
| Null median incorporated seeds | 1151.0000 |
| Null 95th percentile | 1222.1000 |
| Null exceedances | 0.0000 |
| Monte Carlo p-value | 0.0010 |
| Exceedance probability 95% CI lower | 0.0000 |
| Exceedance probability 95% CI upper | 0.0037 |
cat(sprintf(
paste0(
"Across %d chromosome-stratified methylation-profile permutations, ",
"CMEnt incorporated %s published seeds into multi-seed DMRs in the observed data, ",
"compared with a null median of %s (95th percentile %s; Monte Carlo p = %.4g)."
),
n_permutations,
format(observed_statistic, big.mark = ","),
format(stats::median(null_statistics), big.mark = ","),
format(unname(stats::quantile(null_statistics, 0.95)), big.mark = ","),
empirical_p
))
## Across 999 chromosome-stratified methylation-profile permutations, CMEnt incorporated 6,572 published seeds into multi-seed DMRs in the observed data, compared with a null median of 1,151 (95th percentile 1,222.1; Monte Carlo p = 0.001).
ggplot(null_summary, aes(x = incorporated_seeds)) +
geom_histogram(bins = 40, fill = "#0072B2", color = "white") +
geom_vline(xintercept = observed_statistic, color = "#D55E00", linewidth = 1) +
theme_minimal(base_size = 11) +
labs(
title = "CMEnt regional assembly under the conditional null",
subtitle = sprintf("Observed value shown in orange; %d chromosome-stratified permutations", n_permutations),
x = "Unique supplied seeds incorporated into DMRs",
y = "Null permutations"
)
Figure 1: Observed CMEnt seed incorporation compared with the conditional null distribution from chromosome-stratified methylation-profile permutations
Secondary summaries describe the resulting regional structures but are not treated as additional confirmatory tests.
secondary_summary <- data.frame(
Measure = c("DMRs", "Supporting sites", "Total coverage (bp)"),
Observed = c(
observed_summary$dmrs,
observed_summary$supporting_sites,
observed_summary$total_coverage_bp
),
Null_median = c(
stats::median(null_summary$dmrs),
stats::median(null_summary$supporting_sites),
stats::median(null_summary$total_coverage_bp)
),
Null_95th_percentile = c(
stats::quantile(null_summary$dmrs, 0.95),
stats::quantile(null_summary$supporting_sites, 0.95),
stats::quantile(null_summary$total_coverage_bp, 0.95)
)
)
knitr::kable(secondary_summary, digits = 1, row.names = FALSE, caption = "Descriptive regional-assembly summaries")
| Measure | Observed | Null_median | Null_95th_percentile |
|---|---|---|---|
| DMRs | 2100 | 513 | 543.1 |
| Supporting sites | 15577 | 1679 | 1784.2 |
| Total coverage (bp) | 3002022 | 385890 | 418024.5 |
ggplot(null_summary, aes(x = dmrs)) +
geom_histogram(bins = 40, fill = "#0072B2", color = "white") +
geom_vline(xintercept = observed_summary$dmrs[[1L]], color = "#D55E00", linewidth = 1) +
theme_minimal(base_size = 11) +
labs(
title = "Called DMRs under the conditional null",
subtitle = sprintf(
"Observed: %s DMRs (orange); %d chromosome-stratified permutations",
format(observed_summary$dmrs[[1L]], big.mark = ","),
n_permutations
),
x = "Number of called DMRs",
y = "Null permutations"
)
Figure 2: Number of DMRs called in the original, unpermuted data compared with the conditional null distribution from chromosome-stratified methylation-profile permutations
This is a conditional global test of CMEnt regional assembly given the published seed coordinates. It does not evaluate how the seeds were selected, does not use CMEnt’s optional seed-discovery helpers, and does not claim per-DMR false-discovery rate control. A small empirical p-value indicates that the fixed published seeds are incorporated into coherent multi-seed regions more extensively than expected when intact methylation profiles are randomly reassigned among loci on the same chromosome.
sessionInfo()
## R version 4.6.1 (2026-06-24)
## Platform: x86_64-pc-linux-gnu
## Running under: Ubuntu 24.04.4 LTS
##
## Matrix products: default
## BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.12.0
## LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.12.0 LAPACK version 3.12.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: Europe/Brussels
## tzcode source: system (glibc)
##
## attached base packages:
## [1] parallel stats4 stats graphics grDevices datasets utils
## [8] methods base
##
## other attached packages:
## [1] CMEnt_0.99.14
## [2] HDF5Array_1.40.0
## [3] h5mread_1.4.1
## [4] rhdf5_2.56.1
## [5] DelayedArray_0.38.2
## [6] SparseArray_1.12.3
## [7] S4Arrays_1.12.1
## [8] abind_1.4-8
## [9] Matrix_1.7-6
## [10] curl_8.1.0
## [11] IlluminaHumanMethylation450kanno.ilmn12.hg19_0.6.1
## [12] pathview_1.52.0
## [13] IlluminaHumanMethylationEPICanno.ilm10b4.hg19_0.6.0
## [14] scales_1.4.0
## [15] minfi_1.58.0
## [16] bumphunter_1.54.0
## [17] locfit_1.5-9.12
## [18] iterators_1.0.14
## [19] foreach_1.5.2
## [20] Biostrings_2.80.2
## [21] XVector_0.52.0
## [22] DSS_2.60.0
## [23] BiocParallel_1.46.0
## [24] bsseq_1.48.0
## [25] SummarizedExperiment_1.42.0
## [26] Biobase_2.72.0
## [27] MatrixGenerics_1.24.0
## [28] matrixStats_1.5.0
## [29] ggplot2_4.0.3
## [30] GenomicRanges_1.64.0
## [31] Seqinfo_1.2.0
## [32] IRanges_2.46.0
## [33] S4Vectors_0.50.3
## [34] BiocGenerics_0.58.1
## [35] generics_0.1.4
## [36] dplyr_1.2.1
## [37] data.table_1.18.6.1
## [38] testthat_3.3.2
## [39] BiocStyle_2.40.0
##
## loaded via a namespace (and not attached):
## [1] graph_1.90.0
## [2] igraph_2.3.4
## [3] plotly_4.12.1
## [4] Formula_1.2-6
## [5] devtools_2.5.2
## [6] tidyselect_1.2.1
## [7] bit_4.6.0
## [8] doParallel_1.0.17
## [9] clue_0.3-68
## [10] lattice_0.23-1
## [11] rjson_0.2.23
## [12] nor1mix_1.3-3
## [13] blob_1.3.0
## [14] stringr_1.6.0
## [15] rngtools_1.5.2
## [16] base64_2.0.2
## [17] dichromat_2.0-1
## [18] scrime_1.3.7
## [19] seqLogo_1.78.0
## [20] png_0.1-9
## [21] tinytex_0.61
## [22] cli_3.6.6
## [23] ggplotify_0.1.4
## [24] bedr_1.1.5
## [25] ProtGenerics_1.44.0
## [26] askpass_1.2.1
## [27] outliers_0.15
## [28] multtest_2.68.0
## [29] openssl_2.4.2
## [30] pkgdown_2.2.1
## [31] textshaping_1.0.5
## [32] BiocIO_1.22.0
## [33] purrr_1.2.2
## [34] mime_0.13
## [35] evaluate_1.0.5
## [36] tidytree_0.4.8
## [37] ComplexHeatmap_2.28.0
## [38] stringi_1.8.9
## [39] backports_1.5.1
## [40] desc_1.4.3
## [41] XML_3.99-0.25
## [42] httpuv_1.6.17
## [43] AnnotationDbi_1.74.0
## [44] magrittr_2.0.5
## [45] clusterProfiler_4.20.2
## [46] rappdirs_0.3.4
## [47] splines_4.6.1
## [48] mclust_6.1.3
## [49] DelayedDataFrame_1.28.0
## [50] jpeg_0.1-11
## [51] doRNG_1.8.6.3
## [52] ggraph_2.2.2
## [53] rentrez_1.2.4
## [54] org.Hs.eg.db_3.23.1
## [55] DT_0.34.0
## [56] sessioninfo_1.2.4
## [57] DBI_1.3.0
## [58] reactome.db_1.96.0
## [59] jquerylib_0.1.4
## [60] genefilter_1.94.0
## [61] withr_3.0.3
## [62] class_7.3-24
## [63] systemfonts_1.3.2
## [64] rprojroot_2.1.1
## [65] enrichplot_1.32.1
## [66] ggnewscale_0.5.2
## [67] benchmarkme_1.0.8
## [68] brio_1.1.5
## [69] tidygraph_1.3.1
## [70] formatR_1.14
## [71] rtracklayer_1.72.0
## [72] BiocManager_1.30.27
## [73] htmlwidgets_1.6.4
## [74] fs_2.1.0
## [75] biomaRt_2.68.0
## [76] missMethyl_1.46.0
## [77] ggrepel_0.9.8
## [78] labeling_0.4.3
## [79] cellranger_1.1.0
## [80] shinycssloaders_1.1.0
## [81] annotate_1.90.0
## [82] VariantAnnotation_1.58.0
## [83] knitr_1.52
## [84] TFBSTools_1.50.0
## [85] UCSC.utils_1.8.0
## [86] beanplot_1.3.1
## [87] TFMPvalue_1.0.0
## [88] annotatr_1.38.3
## [89] patchwork_1.3.2
## [90] caTools_1.18.4
## [91] grid_4.6.1
## [92] ggtree_4.2.0
## [93] pwalign_1.8.0
## [94] R.oo_1.27.1
## [95] ggiraph_0.9.6
## [96] regioneR_1.44.0
## [97] gridGraphics_0.5-1
## [98] ellipsis_0.3.3
## [99] lazyeval_0.2.3
## [100] yaml_2.3.12
## [101] survival_3.8-12
## [102] BiocVersion_3.23.1
## [103] crayon_1.5.3
## [104] Rgraphviz_2.56.0
## [105] tweenr_2.0.3
## [106] RColorBrewer_1.1-3
## [107] tidyr_1.3.2
## [108] later_1.4.8
## [109] codetools_0.2-20
## [110] base64enc_0.1-6
## [111] GlobalOptions_0.1.4
## [112] KEGGREST_1.52.2
## [113] shape_1.4.6.1
## [114] ReactomePA_1.56.0
## [115] limma_3.68.5
## [116] gdtools_0.5.2
## [117] Rsamtools_2.28.0
## [118] filelock_1.0.3
## [119] showtext_0.9-8
## [120] foreign_0.8-91
## [121] pkgconfig_2.0.3
## [122] KEGGgraph_1.72.0
## [123] xml2_1.6.0
## [124] GenomicAlignments_1.48.0
## [125] aplot_0.3.2
## [126] hummingbird_1.22.0
## [127] BSgenome_1.80.0
## [128] ape_5.8-1
## [129] viridisLite_0.4.3
## [130] biovizBase_1.60.0
## [131] TxDb.Hsapiens.UCSC.hg19.knownGene_3.22.1
## [132] gridBase_0.4-7
## [133] xtable_1.8-8
## [134] interp_1.1-6
## [135] plyr_1.8.9
## [136] httr_1.4.9
## [137] tools_4.6.1
## [138] pkgbuild_1.4.8
## [139] htmlTable_2.5.0
## [140] checkmate_2.3.4
## [141] nlme_3.1-170
## [142] futile.logger_1.4.9
## [143] lambda.r_1.2.6
## [144] dbplyr_2.6.0
## [145] ExperimentHub_3.2.2
## [146] digest_0.6.39
## [147] permute_0.9-10
## [148] bookdown_0.48
## [149] farver_2.1.2
## [150] tzdb_0.5.0
## [151] AnnotationFilter_1.36.0
## [152] reshape2_1.4.5
## [153] viridis_0.6.5
## [154] yulab.utils_0.2.5
## [155] DirichletMultinomial_1.54.1
## [156] rpart_4.1.27
## [157] glue_1.8.1
## [158] cachem_1.1.0
## [159] bspm_0.5.8
## [160] VennDiagram_1.8.2
## [161] BiocFileCache_3.2.0
## [162] polyclip_1.10-7
## [163] Hmisc_5.3-0
## [164] sysfonts_0.8.9
## [165] pkgload_1.5.3
## [166] statmod_1.5.2
## [167] fontBitstreamVera_0.1.1
## [168] GEOquery_2.80.0
## [169] httr2_1.3.0
## [170] showtextdb_3.0
## [171] gson_0.2.2
## [172] dmrseq_1.32.0
## [173] graphlayouts_1.2.5
## [174] siggenes_1.86.0
## [175] gtools_3.9.5
## [176] readxl_1.6.0
## [177] preprocessCore_1.74.0
## [178] gridExtra_2.3.1
## [179] shiny_1.14.0
## [180] tidydr_0.0.7
## [181] R.utils_2.13.0
## [182] rhdf5filters_1.24.1
## [183] RCurl_1.98-1.20
## [184] memoise_2.0.1
## [185] rmarkdown_2.32
## [186] R.methodsS3_1.8.2
## [187] svglite_2.2.2
## [188] reshape_0.8.10
## [189] fontLiberation_0.1.0
## [190] illuminaio_0.54.0
## [191] rstudioapi_0.19.0
## [192] cluster_2.1.8.3
## [193] hms_1.1.4
## [194] DMRcate_3.8.0
## [195] colorspace_2.1-4
## [196] FNN_1.1.4.1
## [197] rlang_1.3.0
## [198] quadprog_1.5-8
## [199] GenomeInfoDb_1.48.0
## [200] DelayedMatrixStats_1.34.0
## [201] sparseMatrixStats_1.24.0
## [202] ggforce_0.5.0
## [203] circlize_0.4.18
## [204] ggtangle_0.1.4
## [205] xfun_0.62
## [206] ggseqlogo_0.2.2
## [207] e1071_1.7-17
## [208] aisdk_1.4.12
## [209] GOSemSim_2.38.3
## [210] tibble_3.3.1
## [211] treeio_1.36.1
## [212] Rhdf5lib_2.0.0
## [213] readr_2.2.0
## [214] futile.options_1.0.1
## [215] bitops_1.1-0
## [216] ps_1.9.3
## [217] promises_1.5.0
## [218] qvalue_2.44.0
## [219] scatterpie_0.2.6
## [220] inline_0.3.21
## [221] RSQLite_3.53.3
## [222] proxy_0.4-29
## [223] GO.db_3.23.1
## [224] compiler_4.6.1
## [225] prettyunits_1.2.0
## [226] beachmat_2.28.0
## [227] graphite_1.58.0
## [228] Rcpp_1.1.2
## [229] benchmarkmeData_2.0.0
## [230] fontquiver_0.2.1
## [231] edgeR_4.10.6
## [232] AnnotationHub_4.2.2
## [233] usethis_3.2.2
## [234] MASS_7.3-66
## [235] progress_1.2.3
## [236] R6_2.6.1
## [237] fastmap_1.2.0
## [238] ensembldb_2.36.1
## [239] enrichit_0.2.6
## [240] nnet_7.3-21
## [241] gtable_0.3.6
## [242] strex_2.1.0
## [243] latticeExtra_0.6-31
## [244] deldir_2.0-4
## [245] htmltools_0.5.9
## [246] bit64_4.8.6
## [247] lifecycle_1.0.5
## [248] S7_0.2.2
## [249] processx_3.9.0
## [250] callr_3.8.0
## [251] Gviz_1.56.0
## [252] restfulr_0.0.17
## [253] sass_0.4.10
## [254] vctrs_0.7.3
## [255] isoband_0.3.0
## [256] DOSE_4.6.0
## [257] ggfun_0.2.2
## [258] bslib_0.12.0
## [259] pillar_1.11.1
## [260] GenomicFeatures_1.64.0
## [261] magick_2.9.1
## [262] otel_0.2.0
## [263] jsonlite_2.0.0
## [264] cigarillo_1.2.1
## [265] GetoptLong_1.1.1