Contents

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
)

0.1 Objective

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.

0.2 Inputs and fixed seeds

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")

Table 1: Null-validation inputs
Metric Value
Samples 26
Measured loci 684813
Fixed published seeds 22667
Null permutations 999

0.3 Analysis functions

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)
        }
    )
}

0.4 Observed regional assembly

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")

Table 2: 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

0.5 Chromosome-stratified null permutations

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"
)

0.6 Global conditional-null test

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")

Table 3: 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"
    )
Histogram shows the number of unique supplied seeds incorporated into DMRs across null permutations. An orange vertical line marks the observed seed-incorporation count.

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")

Table 4: 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"
    )
Histogram shows the number of called DMRs across null permutations. An orange vertical line marks the DMR count in the original, unpermuted data.

Figure 2: Number of DMRs called in the original, unpermuted data compared with the conditional null distribution from chromosome-stratified methylation-profile permutations

0.7 Interpretation

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