knitr::opts_chunk$set( collapse = TRUE, comment = "#>", fig.width = 7, fig.height = 5, dev = "svglite", fig.ext = "svg" ) library(corrselect)
# Install from CRAN install.packages("corrselect") # Or install development version from GitHub # install.packages("pak") pak::pak("gcol33/corrselect")
Suggested packages (for extended functionality):
lme4, glmmTMB: Mixed-effects models in modelPrune()
WGCNA: Biweight midcorrelation (bicor)
energy: Distance correlation
minerva: Maximal information coefficient
corrselect identifies and removes redundant variables based on pairwise correlation or association. Given a threshold $\tau$, it finds subsets where all pairwise associations satisfy $|a_{ij}| < \tau$ (see vignette("theory") for mathematical formulation).
corrselect provides three levels of interface:
corrPrune() - Removes redundant predictors based on pairwise correlation:
Returns a single pruned dataset
No response variable required
Fast greedy or exact search
modelPrune() - Reduces VIF in regression models:
Returns a single pruned dataset with response
Iteratively removes high-VIF predictors
Works with lm, glm, lme4, glmmTMB
corrSelect() - Returns all maximal subsets (numeric data):
Enumerates all maximal valid subsets satisfying threshold (see vignette("theory"))
Provides full metadata (size, avg_corr, max_corr, min_corr)
Exact or greedy search
assocSelect() - Returns all maximal subsets (mixed-type data):
Handles numeric, factor, and ordered variables
Uses appropriate association measures per variable pair
Exact or greedy search
MatSelect() - Direct matrix input:
Accepts precomputed correlation/association matrices
No data preprocessing
Useful for repeated analyses
data(mtcars) # Remove correlated predictors (threshold = 0.7) pruned <- corrPrune(mtcars, threshold = 0.7) # Results cat(sprintf("Reduced from %d to %d variables\n", ncol(mtcars), ncol(pruned))) names(pruned)
Variables removed:
attr(pruned, "removed_vars")
How corrPrune() selects among multiple maximal subsets:
When multiple maximal subsets exist (which is common), corrPrune() (in exact mode) selects among them by, in order:
Largest subset size: Keeping more variables is preferred over keeping fewer
Lowest average absolute correlation: Among subsets of the same (largest) size, the one with the least redundancy is preferred
Alphabetically first variable names: A final tiebreaker for deterministic behavior when size and average correlation are both tied
Subset size is checked first, so a smaller subset is never preferred over a larger one even if its average correlation is lower.
To explore all maximal subsets instead of just the optimal one, use corrSelect() (see below).
# Prune based on VIF (limit = 5) model_data <- modelPrune( formula = mpg ~ ., data = mtcars, limit = 5 ) # Results cat("Variables kept:", paste(attr(model_data, "selected_vars"), collapse = ", "), "\n") cat("Variables removed:", paste(attr(model_data, "removed_vars"), collapse = ", "), "\n")
results <- corrSelect(mtcars, threshold = 0.7) show(results)
Inspect subsets:
as.data.frame(results)[1:5, ] # First 5 subsets
Extract a specific subset:
subset_data <- corrSubset(results, mtcars, which = 1) names(subset_data)
# Create mixed-type data df <- data.frame( x1 = rnorm(100), x2 = rnorm(100), cat1 = factor(sample(c("A", "B", "C"), 100, replace = TRUE)), ord1 = ordered(sample(1:5, 100, replace = TRUE)) ) # Handle mixed types automatically results_mixed <- assocSelect(df, threshold = 0.5) show(results_mixed) # Verify all pairwise associations are below threshold cat("Max pairwise association:", max(results_mixed@max_corr), "\n")
Use force_in to ensure specific variables are always retained:
# Force "mpg" to remain in all subsets pruned_force <- corrPrune( data = mtcars, threshold = 0.7, force_in = "mpg" ) # Verify forced variable is present "mpg" %in% names(pruned_force)
Common thresholds: 0.5 (strict), 0.7 (moderate, recommended default), 0.9 (lenient).
Lower thresholds are stricter because they allow fewer variable pairs to coexist, resulting in smaller subsets. Higher thresholds permit stronger correlations, retaining more variables.
For detailed threshold selection strategies including visualization techniques, VIF guidelines, and sensitivity analysis, see vignette("advanced").
| Scenario | Function | Key Parameters |
|----------|----------|----------------|
| Quick dimensionality reduction | corrPrune() | threshold, mode |
| Model-based refinement | modelPrune() | limit (VIF threshold), engine |
| Enumerate all maximal subsets | corrSelect() | threshold |
| Mixed-type data | assocSelect() | threshold |
| Precomputed matrices | MatSelect() | threshold, method |
| Protect key variables | Any function | force_in |
Removes redundant predictors based on pairwise correlation.
corrPrune(data, threshold = 0.7, measure = "auto", mode = "auto", force_in = NULL, by = NULL, group_q = 1, max_exact_p = 100)
| Parameter | Description | Default |
|-----------|-------------|---------|
| data | Data frame or matrix | required |
| threshold | Maximum allowed correlation | 0.7 |
| measure | Correlation type: "auto", "pearson", "spearman", "kendall", "bicor", "distance", "maximal" | "auto" |
| mode | Algorithm: "auto", "exact", "greedy" | "auto" |
| force_in | Variables that must be retained | NULL |
| by | Column name(s) for grouped pruning | NULL |
| group_q | Quantile for aggregating group correlations (0-1] | 1 |
| max_exact_p | Max predictors for exact search when mode = "auto" | 100 |
Returns: Data frame with pruned variables. Attributes: selected_vars, removed_vars.
Iteratively removes predictors with high VIF from a regression model.
modelPrune(formula, data, engine = "lm", criterion = "vif", limit = 5, force_in = NULL, max_steps = NULL, ...)
| Parameter | Description | Default |
|-----------|-------------|---------|
| formula | Model formula (e.g., y ~ .) | required |
| data | Data frame | required |
| engine | "lm", "glm", "lme4", "glmmTMB", or custom | "lm" |
| criterion | "vif" or "condition_number" | "vif" |
| limit | Maximum allowed diagnostic value | 5 |
| force_in | Variables that must be retained | NULL |
Returns: Pruned data frame. Attributes: selected_vars, removed_vars, final_model.
Enumerates all maximal subsets satisfying correlation threshold (numeric data).
corrSelect(df, threshold = 0.7, method = NULL, force_in = NULL, cor_method = "pearson", ...)
| Parameter | Description | Default |
|-----------|-------------|---------|
| df | Data frame (numeric columns only) | required |
| threshold | Maximum allowed correlation | 0.7 |
| method | Algorithm: "bron-kerbosch", "els" | auto |
| cor_method | "pearson", "spearman", "kendall", "bicor", "distance", "maximal" | "pearson" |
| force_in | Variables required in all subsets | NULL |
Returns: CorrCombo object with properties: subset_list, avg_corr, min_corr, max_corr.
Enumerates all maximal subsets for mixed-type data (numeric, factor, ordered).
assocSelect(df, threshold = 0.7, method = NULL, force_in = NULL, method_num_num = "pearson", method_num_ord = "spearman", method_ord_ord = "spearman", ...)
| Parameter | Description | Default |
|-----------|-------------|---------|
| df | Data frame (any column types) | required |
| threshold | Maximum allowed association | 0.7 |
| method_num_num | Numeric-numeric: "pearson", "spearman", etc. | "pearson" |
| method_num_ord | Numeric-ordered: "spearman", "kendall" | "spearman" |
| method_ord_ord | Ordered-ordered: "spearman", "kendall" | "spearman" |
Returns: CorrCombo object.
Direct matrix interface for precomputed correlation/association matrices.
MatSelect(mat, threshold = 0.7, method = NULL, force_in = NULL, ...)
| Parameter | Description | Default |
|-----------|-------------|---------|
| mat | Symmetric correlation/association matrix | required |
| threshold | Maximum allowed value | 0.7 |
| method | Algorithm: "bron-kerbosch", "els" | auto |
| force_in | Variables required in all subsets | NULL |
Returns: CorrCombo object.
Extracts a specific subset from a CorrCombo result.
corrSubset(res, df, which = "best", keepExtra = FALSE)
| Parameter | Description | Default |
|-----------|-------------|---------|
| res | CorrCombo object from corrSelect/assocSelect/MatSelect | required |
| df | Original data frame | required |
| which | Subset index or "best" (largest size, then lowest avg correlation) | "best" |
| keepExtra | Include non-numeric columns in output? | FALSE |
Returns: Data frame containing only the selected variables.
"No valid subsets found" error - Threshold too strict: all variable pairs exceed it
force_in to keep at least one variableVIF computation fails in modelPrune() - Perfect multicollinearity (R² = 1) present
corrPrune(threshold = 0.99) first to remove near-duplicatesForced variables conflict
- Variables in force_in are too highly correlated with each other
force_in setSlow performance with many variables - Exact mode is exponential for large p
mode = "greedy" for p > 25For comprehensive troubleshooting with code examples, see vignette("advanced"), Section 5.
vignette("workflows") - Complete real-world workflows (ecological, survey, genomic, mixed models)
vignette("advanced") - Algorithmic control and custom engines
vignette("comparison") - Comparison with caret, Boruta, glmnet
vignette("theory") - Theoretical foundations and formulation
?corrPrune, ?modelPrune, ?corrSelect, ?assocSelect, ?MatSelect
sessionInfo()
Any 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.