runELS() was a single greedy expansion per seed vertex, not an implementation of Eppstein-Loffler-Strash, and could silently miss valid maximal subsets. Replaced with a genuine ELS implementation (degeneracy ordering + per-vertex bounded expansion), sharing a verified Bron-Kerbosch pivot core with the "bron-kerbosch" method. Verified against brute-force enumeration.NaN > threshold is false in C++); NaN now always registers as a threshold violation.1e-8 tolerance, and could reject matrices the R layer had already accepted as symmetric. Added a minimum ncol >= 2 guard, and n_rows_used no longer reports a fabricated row count for matrix input (now NA).force_in indices were checked against the final (filtered) correlation matrix but never remapped from the original data frame's column positions, so a numeric index could silently force the wrong variable into every subset after non-numeric or constant columns were dropped.measure argument had no effect on mixed-type data (numeric-numeric pairs always used Pearson regardless of the requested measure). It now customizes numeric-numeric pairs as documented, and the measure actually used per pair-type is reported via a new assoc_methods_used attribute."x1" matching the "x10" column). Columns are now resolved via the model's own assign bookkeeping.log(mpg) ~ .) crashed during formula parsing.which = "best" on a CorrCombo with no subsets raised an uninformative "subscript out of bounds" error instead of a clear message.runELS, runBronKerbosch) now validate force_in bounds directly rather than relying solely on the R-level dispatcher.force_in/by overlap detection, and a coverage warning when most groups are skipped during grouped aggregation in corrPrune.corrPrune and modelPrune: hand-computed grouped quantile aggregation, exact-value tie-break tests (lexicographic and greedy), a greedy-vs-exact identity check, VIF verified against car::vif(), condition-number verified against a manual SVD reference, and seed-repeated recovery tests against simulated ground truth.modelPrune tests that silently passed a nonexistent threshold argument instead of limit..Rbuildignore to exclude non-standard hidden directories flagged by CRAN incoming checks.CorrCombo result class now uses the modern S7 object system instead of S4. This brings cleaner construction (CorrCombo(...) instead of new("CorrCombo", ...)), built-in validation, and forward-looking OOP design.names property renamed to var_names: S7 reserves names as a property name. Code accessing result@names must be updated to result@var_names. All other @ property access (@subset_list, @avg_corr, etc.) is unchanged.methods package is no longer imported; S7 is now a dependency.Coverage improved from 92% to 94%:
skip_if_not_installed() guardsby parameter computes association matrices per group and aggregates using the group_q quantile (default: 0.5 = median). Useful when correlations vary across experimental conditions or subpopulations.bicor: Biweight midcorrelation (requires WGCNA package)distance: Distance correlation (requires energy package)maximal: Maximal information coefficient (requires minerva package)criterion = "condition_number" option uses SVD-based condition indices for detecting multicollinearity. Higher values indicate greater collinearity.isValidAddition, isValidCombination) from utils.cpp/utils.hThis release addresses reviewer feedback from the JOSS submission.
caret::findCorrelation() to emphasize the key difference (single solution vs. all maximal subsets)install.packages("corrselect"))suppressWarnings() to hide expected VIF computation warnings.gitignore to exclude build artifacts (*.Rcheck/, *.tar.gz, CRAN-SUBMISSION)modelPrune(): Fixed infinite loop when VIF computation encountered perfect multicollinearityInf and NA VIF values in pruning loopmodelPrune(): Fixed design matrix extraction for lme4 and glmmTMB enginesstats::model.matrix() for all engines (more robust)Version 3.0.0 represents a major expansion of corrselect from a specialized subset enumeration tool into a comprehensive predictor pruning toolkit. Fully backward compatible with 2.x - all existing code continues to work.
corrPrune(): High-level association-based predictor pruningmeasure = "auto")force_in parameter to protect important predictorsReturns single pruned data.frame with pairwise associations ≤ threshold
modelPrune(): Model-based predictor pruning using diagnostics
lm, glm, lme4, glmmTMBforce_in parameter for protecting important variablescorrPrune(mode = "greedy") and mode = "auto"corrSelect(), assocSelect()) now integrate seamlessly with corrPrune()modelPrune(): Users can define custom modeling backends with fit and diagnostics functions, enabling integration with any R modeling packagecorrPrune() and modelPrune()lme4 and glmmTMB to Suggests (required for respective engines)corrPrune(mode = "auto") for best performanceinstall.packages(c("lme4", "glmmTMB"))force_in in MatSelect() now correctly accepts character column names.els now correctly lists all valid subsets when a single variable is forced in.corrSelect() now displays an appropriate warning if only one variable remains after dropping unsupported columns.assocSelect() now safely falls back to 0 for failed or meaningless associations (e.g. empty chi-squared tables due to sparse combinations or unused factor levels).assocSelect() now supports logical columns by automatically converting them to factors.Version 2.0.0 introduces support for mixed-type data through the new assocSelect() function, enabling subset selection on datasets containing numeric, factor, and ordered variables.
assocSelect(): New function for mixed-type data frame interfaceAny scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.