LUCIDus 3.2.0

This release follows directly on 3.1.0’s correctness pass. It narrows the exported API to what a user actually calls, adds four extractor functions for a fitted model’s output, marks statistically significant bootstrap CI rows in summary(), fixes several consistency and reliability issues across model types, and reworks the tutorial vignettes into a polished, user-facing set built entirely on the public API.

Breaking change. Five numerical-stability helpers (check_and_stabilize_sigma(), safe_solve(), safe_log_sum_exp(), check_convergence(), safe_normalize()) and fill_data() are no longer exported. They were internal EM building blocks that happened to have a CRAN manual page; their behavior is unchanged, and they remain reachable as LUCIDus:::fn(...) for anyone who was calling them directly. The bare plot() S3 generic LUCIDus declared is also removed – graphics::plot() already provides it, and plot.early_lucid() etc. still dispatch normally.

New: model-type autodetection. predict_lucid() and boot_lucid() no longer require lucid_model – it is now optional and is auto-detected from class(model). Explicitly passing it still works exactly as before (including the existing mismatch error when it disagrees with model’s class), so no existing call site is affected; it simply becomes unnecessary to specify.

New: extractor functions. Four new functions read directly off a fitted model and auto-detect early/parallel/serial themselves, so no branching on model type is needed at the call site:

New: significance markers in summary(). Every bootstrap CI table summary() prints when boot.se/se is supplied – the exposure-to-cluster table, the cluster-to-outcome table, and the cluster-specific omics-mean table – now includes a sig column marking rows whose normal-theory interval excludes 0 with "*".

Bug fixes. The serial model’s returned object is now consistent with early and parallel: it reports a likelihood and a select field the way the other two model types always have, a stray unused Rho_G penalty is no longer silently applied where it has no exposures to act on, and its console progress messages use the same wording and level of detail the other two model types use. Several input-validation gaps that only showed up for specific model types or specific entry points (estimate_lucid(), tune_lucid(), predict_lucid(), boot_lucid()) are closed, so a bad input is now reported with a clear message regardless of which model type or function it went through, rather than surfacing later as a confusing downstream error.

Reliability. Convergence checking is now handled by a single, shared routine for every model type, and the optimizer’s log-likelihood is checked at every iteration to confirm it is actually improving, with a warning if it ever isn’t. A handful of tuning and bootstrap code paths that could previously abort an entire multi-candidate run over one bad candidate now skip that candidate and continue, matching how the other paths already behaved.

Internal. Every internal (non-user-facing) function in the package now has real documentation explaining what it does, and source files have been reorganized and renamed so that related functionality lives together and file names describe their contents – neither change affects behavior, and both are aimed at making the package easier to review and maintain. Several long-unused, dead code paths were also removed.

Vignettes. helix_early_parallel_workflow.Rmd is replaced by two files, lucid_3models_normal_outcome.Rmd and lucid_3models_binary_outcome.Rmd, split by outcome family (both still demonstrate all three model architectures). Every vignette is rewritten as a user-facing tutorial: custom code that reimplemented feature-selection extraction, hard cluster assignment, or omics-importance ranking is replaced by the new extractor functions and lucid_model autodetection, sections that walked through internal-only functions (fill_data(), the numerical-stability helpers) are removed, and each major step gains an explanation of what it does, why it’s needed, and how to read its output.

Packaging. The README.md is no longer shipped inside the package tarball (it remains in the source repository), and the paper-reproduction vignette (rjournal_paper_examples.Rmd) is no longer part of the package. Example, vignette and test runtime is trimmed so a full R CMD check completes well within CRAN’s time budget: heavy examples run on small data subsets with capped EM iterations, vignette bootstrap sizes are reduced, and essentially the whole model-fitting regression suite is marked skip_on_cran() – those tests still run in full locally and in CI; only the fast oracle, input-validation and tightly-capped smoke tests run on CRAN.

LUCIDus 3.1.0

This release is a correctness pass over the estimation, missing-data, prediction, model-selection and inference paths, validated against the statistical definitions in the two LUCID papers:

Corrections to results reported by earlier versions

These change numbers that version 3.0.x produced. Analyses run with 3.0.x may need to be re-run.

Bug fixes

New features

Documentation

The reference documentation was reviewed against the code function by function. The substantive corrections:

Internal