NEWS
enrichit 0.2.7 (2026-10-28)
- GSEA no longer turns a degenerate input into a silently useless table:
eps outside [0, 1] is
rejected (it returned p = eps > 1), an all-zero ranking is an error instead of a frame of
ES = NaN, a gene set covering the whole ranked list is excluded as fgsea does, and gene sets
dropped for having no estimable p-value are counted instead of vanishing (2026-10-27)
- the multilevel "too few same-side permutations" guard is a rate, not a count, so
nPermSimple
below 10 no longer turns every pathway NA; default results are unchanged (2026-10-27)
qvalueCutoff is applied row by row: one unestimable Storey q-value used to disable the
cutoff for the whole table, so qvalueCutoff = 0.2 returned terms with q = 0.9
(clusterProfiler#710, #584, #614, #332). Related: a failed estimate is now a message() rather
than a warning(), and NA pvalue/p.adjust no longer yield all-NA rows (2026-10-27)
- NSEA's permutation null no longer counts skipped permutations (
nPerm reports what ran).
Not reachable from ordinary input, so this is hardening (2026-10-27)
- ORA results keep
DESize, UniverseSize and SetSize as columns, so GeneRatio == Count/DESize
and friends are checkable from the table (clusterProfiler#703, #523, #618, #723) (2026-10-27)
bayes_enrich(): default false_negative is 0.9, not 0.1, which drove every posterior to 0 on
real KEGG data. Also rejects burnin + thin > n_iter and warns when no candidate reaches
posterior_cutoff (2026-10-26)
dsea() and dsea_scores(): design-aware GSEA and per-sample ssGSEA scores, with the contrast
never guessed; as_ranked() and as_genes() adapt DESeq2 objects for it (2026-10-18)
filter_gene_sets() is vectorized and ora_gson() skips the background intersection when the
background was not restricted: 14,209 GO BP sets 14.0 s -> 0.9 s, single enrichGO() 19 s ->
4.2 s, 13-cluster compareCluster() 381 s -> 197 s. ora() returns geneID in input order
instead of hash-set order (2026-10-18)
- remove the golden-reference script and data for the retired
camera/roast/fry engines, and
the design note for the never-implemented dsea_nb set test (2026-10-18)
enrichit 0.2.6 (2026-10-06)
- fix permutation-based GSEA p-values in the fixed and adaptive engines
(
method = "sample" / "permute") for the default two-sided
(scoreType = "std") calculation: the numerator counted only same-sign
permutations while the denominator divided by all of them, so p-values were too
small under a symmetric null. The denominator now counts only permutations on
the same side of zero as the observed ES, following the main fgsea convention
(2026-10-06, closes #3)
- update the
RcppEigen sparse-matrix interface in rwr_eigen_cpp() from
MappedSparseMatrix to Map<SparseMatrix> for Eigen 5 compatibility
(2026-10-06, PR #2)
- add a
reportNA argument to gsea_gson() so pathways with NA multilevel
p-values can be retained (2026-10-04, closes DOSE#88)
- fix GSEA leading-edge edge cases with one
rank = 0L sentinel for zero-overlap,
N_R == 0 and non-finite running-score paths; align as_gseaResult() with the
same contract and document the gsea_leading_edge_details() return value
(2026-10-04–2026-10-05, closes DOSE#46)
- keep
qvalue as NA when estimation fails instead of falling back to
p.adjust, and document the pvalue / p.adjust / qvalue semantics in
as_enrichResult() and as_gseaResult() (2026-10-05, addresses DOSE#24)
enrichit 0.2.5 (2026-09-24)
- ORA results carry an
oddsRatio column (Fisher's exact 2x2 odds ratio, next
to FoldEnrichment). FoldEnrichment is a ratio of proportions; the odds ratio
is the effect size the hypergeometric test is built on. It is the plain
cross-product odds ratio and differs slightly from fisher.test()$estimate,
which reports the conditional MLE (2026-09-22)
- report non-finite gene statistics instead of aborting with
missing value where TRUE/FALSE needed. gsea_gson() checked is.unsorted()
before validating its input, and a bare if (NA) stopped there, so an
NA / NaN / Inf never reached the finiteness check that explains the
problem. gseaScores() now validates too and returns NA rather than aborting
when the running score is not finite (2026-09-22)
- add generic constructors
as_enrichResult() / as_gseaResult() to build
'enrichit' result objects from external result tables (enrichr, g:Profiler,
WebGestalt, fgsea, ...), with canonical column aliases, ID de-duplication,
p-value validation, derived statistics (RichFactor / FoldEnrichment /
zScore) when the query and background are known, and missing GSEA detail
columns recomputed via gsea_leading_edge_details() (2026-09-21)
enrichit 0.2.4 (2026-09-17)
- stop emitting spurious
no package '<...>' was found warnings when no input
gene can be mapped (2026-09-17). check_gene_id() routed its notices through
yulab.utils::yulab_msg(), which builds the package citation banner and
expects a package name, so it called packageDescription() on the notice text
itself and emitted three such warnings per run. The notices now go through
message(), yulab.utils::yulab_msg() is no longer imported, and the sample of
expected gene IDs no longer contains NA for sets with fewer than 100 genes
enrichit 0.2.3
- calibrate NSEA significance testing by switching the default to a
whole-pipeline permutation null instead of GSEA's label-permutation test
(2026-08-23). The legacy pipeline ran the label-permutation test on the
network-diffused scores; diffusion induces strong autocorrelation between
neighbouring genes, which violates the exchangeability assumption of that null
and produces anti-conservative p-values (~2.5x the nominal false-positive rate).
significance = "whole_pipeline" rebuilds the null of the enrichment score by
permuting gene labels, re-diffusing with RWR and recomputing the score;
significance = "internal" keeps the earlier formulation
- add
significance, nPerm, seed and exponent to nsea() and
nsea_gson(), and expose pvalueCutoff / pAdjustMethod in nsea_gson().
nPerm (default 1000) sets the number of whole-pipeline permutations with a
smallest estimable p-value of 1/(nPerm + 1); seed makes the null
reproducible; nsea_gson() now applies pvalueCutoff to both the raw and the
adjusted p-value, matching gsea_gson()
- extend
prepare_network() to accept a mechgraph object as well as an
edge-list data.frame / matrix or a sparse matrix. The edges table must
have from / to columns; a numeric score or weight column supplies the
edge weight, otherwise unit weights are used. The class is duck-typed by name,
so enrichit does not hard-depend on the mechgraph package
- add a fast C++ kernel
gsea_es_all_cpp() that computes the classic weighted
enrichment score for many gene sets at once from the hit positions only, cheap
enough to evaluate on every whole-pipeline permutation
- share single implementations of the RWR diffusion (
.nsea_diffuse()) and
TF-IDF specificity weighting (.nsea_specific_weights()); in signed mode
positive and negative seeds propagate in a single linear solve. Robust
node-name extraction guards against Matrix accessor quirks on serialized
sparse matrices
- add regression tests for whole-pipeline reproducibility and p-value calibration
on null data
enrichit 0.2.2
- align
gsea_gson() p-value filtering with historical clusterProfiler/DOSE
behaviour: pvalueCutoff now requires both the raw and the adjusted p-value to
pass (previously only the raw p-value was filtered), restoring significant
pathway counts comparable to clusterProfiler <= 4.18.x (2026-08-14)
- clarify and harden the
seed interface of GSEA (2026-08-14). gsea() treats
seed = TRUE as a fixed default seed (consistent with the C++ default) instead
of silently coercing it to the integer 1; gsea_gson() exposes an explicit
seed argument; seed = FALSE (default) draws a fresh seed from R's RNG on
each run, while a numeric seed (or set.seed() before the call) makes the
result reproducible. Regression tests assert identical results across runs with
a fixed seed
enrichit 0.2.1 (2026-08-04)
- fix
gsea() to intersect gene sets with names(geneList) before applying
minGSSize / maxGSSize, so the size filter constrains the actual overlap
rather than the raw gene-set size; also guard gsea_gson() against NA pvalue
rows leaking into the result table (2026-08-04, clusterProfiler#824)
enrichit 0.2.0 (2026-07-01)
- multi-omics integration at pathway and topology level (2026-06-24):
aggregate_enrichment() for Late Fusion over several enrichResult /
gseaResult objects; correlation-aware p-value aggregation
(method = "brown") and method = "weighted_mean" for signed statistics with
layer-specific weights in aggregate_omics(); mnsea() / mnsea_gson() for
multi-layer network-based enrichment, with prepare_multilayer_network(),
propagate_multilayer() and collapse_multilayer_scores(); mnseaResult to
store diffusion results, collapsed scores, layer weights and cached explanation
tables; get_mnsea_contribution() and extract_mnsea_subnetwork() for
explanation-ready extraction. Provides the engine layer for
clusterProfiler::mnseGO(), mnseKEGG(), mnseMKEGG() and mnseWP()
- Early Integration helpers (2026-06-23):
aggregate_omics(),
harmonize_ids() and select_features_for_ora(), with a conflict_policy
argument ("keep_all" / "strict" / "penalty") for directional conflicts in
signed statistics; early fusion before ora(), gsea() and nsea() through a
decoupled aggregation layer
get_omics_contribution() and classify_omics_pattern() for multi-omics
contribution tracing
- Weighted Enrichment Analysis (2026-06-23): a
weight argument in ora(),
ora_gson(), gsea() and gsea_gson(); Weighted ORA uses Wallenius'
noncentral hypergeometric distribution via BiasedUrn, Weighted GSEA fuses
external weights with the ranked statistics
- Network-based Set Enrichment Analysis (2026-06-23):
nsea() and
nsea_gson() based on Random Walk with Restart, with mode = "signed" for
bidirectional propagation; prepare_network() for parsing and normalizing edge
lists or sparse matrices; fast RWR via RcppEigen sparse multiplication; a
zero-dependency integration strategy for diffusion followed by multilevel GSEA.
Provides the engine layer for clusterProfiler::nseGO(), nseKEGG(),
nseMKEGG() and nseWP()
- align multilevel GSEA rank scaling with
fgsea::prepareStats() to reduce drift
against the long-used fgsea backend (2026-06-22): replace the fixed * 1e6
scaling in prepare_gsea_inputs() with fgsea-style total-weight normalization
and integer rounding, with a regression test against fgsea::fgseaMultilevel()
- exclude zero-overlap gene sets from
ora_gson() before multiple-testing
correction (2026-06-22): Count = 0 rows stay out of p.adjust / qvalue so
ORA results match historical DOSE / clusterProfiler behaviour, resolving
inflated adjustment in enricher(), enrichKEGG() and compareCluster()
(clusterProfiler#821, #819)
enrichit 0.1.5 (2026-06-16)
- add Bayesian term selection for ORA results (2026-06-16):
bayes_enrich()
estimates posterior probabilities of active explanatory terms from
enrichResult objects, bayes_summary() returns them ordered by posterior.
Candidate term spaces may come from top ranked rows, significant
as.data.frame() rows, all x@result rows, or explicit term IDs. The output
stays an enrichResult with posterior, posterior odds, Bayesian rank, active
flag and covered-gene columns
enrichit 0.1.4 (2026-04-08)
- fix GSON helpers (2026-04-06):
TERM2NAME() maps gsid to term names,
TERMID2EXTID() returns gene vectors in the requested term order, and missing
terms return character(0). Resolves malformed Description.* columns in
clusterProfiler::groupGO()
enrichit 0.1.3 (2026-03-10)
- fix
gsea_gson() (2026-03-10): force sorting of geneList so the result object
is consistent with the input, which resolves incorrect metric/colour alignment
in enrichplot::gseaplot()
enrichit 0.1.2 (2026-02-26)
- improve robustness of
calculate_qvalue() (2026-02-02): handle a missing
qvalue package, retry with different parameters, and handle invalid p-values
(NA, infinite, out of range)
- validate p-values in
ora_gson() (2026-02-02), warning on values outside
[0, 1]
- use
phyper instead of summing dhyper for better performance and precision
in the C++ ORA p-value calculation (2026-02-02)
enrichit 0.1.1 (2026-02-01)
setReadable() converts gene IDs to any type, not only SYMBOL (2026-01-21)
- add an
organism slot to compareClusterResult (2026-01-20)
enrichit 0.1.0 (2026-01-18)
- fix bugs in
gsea_gson() and ora_gson() (2026-01-11): fill missing columns
(e.g. qvalues) with NA, and handle NA or duplicate gene-set IDs in result
rownames
calculate_qvalue() returns NA instead of NULL when qvalue estimation
fails (2026-01-11)
- update
ora_gson() output columns (2026-01-11)
enrichit 0.0.9 (2026-01-10)
- add leading edge analysis for GSEA (2026-01-10)
enrichit 0.0.8 (2025-12-22)
- fix p-value calculation in multilevel GSEA (2025-12-10), by learning the source
code of 'fgsea'
enrichit 0.0.7
- add
gseaScores() to calculate GSEA scores for a single gene set (2025-12-07)
enrichit 0.0.6
- add vignette (2025-12-07)
enrichit 0.0.5
- implement the multilevel GSEA algorithm (2025-12-06)
enrichit 0.0.4
- implement a simplified adaptive early-stopping GSEA algorithm (2025-12-05): run
an initial batch of permutations, stop if p > threshold, otherwise increase the
permutation count geometrically until the p-value stabilizes or the maximum is
reached
enrichit 0.0.3
- implement
ora_gson() and gsea_gson() as replacements for
enricher_internal and GSEA_internal (2025-12-05)
- move helper functions and class definitions from
DOSE to enrichit (2025-12-05),
to extend this package as the base package for the clusterProfiler family
enrichit 0.0.2
gsea(): Gene Set Enrichment Analysis using C++ via Rcpp (2025-12-04)
enrichit 0.0.1
ora(): fast Over-Representation Analysis using C++ via Rcpp (2025-12-03)