SLOPE 1.2.0
CRAN release: 2025-11-11
Major Changes
- The default argument for
threadsinSLOPE()has been changed fromNULL(half of available cores) to1(no multithreading). This is to avoid excessive CPU usage on systems with many cores. Users can still setthreads = NULLto get the previous behavior, or set it to any positive integer to control the number of threads used.
Minor Changes
- The C++ routine can now be interrupted through R’s usual interrupt mechanism (e.g., Ctrl+C in RStudio or R terminal).
- The citation information has been updated. Use
citation("SLOPE")to see the correct way to cite the package. - The y axis label for coefficients has changed from
expression(hat(beta))to"Coefficients"to avoid issues with rendering in some environments, where the hat symbol would be cropped.
Bug Fixes
- In the return object from
SLOPE(), thecoefficients_scaledfield incorrectly contained unscaled coefficients, which also affectedcoef.SLOPE(). This has now been fixed.
SLOPE 1.0.0
CRAN release: 2025-06-30
This update of SLOPE brings an entirely different C++ implementation of the underlying package based on the C++ library libslope. It comes with several large and breaking changes with respect to the previous version of the package.
We realized that this may throw off some users, and hope that you will be patient with dealing with the large number of breaking changes.
Breaking Changes
- The
caretSLOPE()function that was deprecated has now been removed from the package. - Fields
unique,violations, andactive_setsare no longer stored in theSLOPEobject. These fields were typically only used for debugging purposes. - The
prox_methodandmethodarguments inSLOPE()andsortedL1Prox(), respectively, have been removed. The proximal operator is now always computed using the fast stack-based algorithm. There was never any reason to use the slower PAVA algorithm. - The ADMM solver has been removed from the package. Calling
SLOPE()withsolver = "admm"will now throws a warning and the value will be automatically set to"auto". -
alphais now scaled byn(the number of observations) and differences with respect to the type of scaling are no longer taken into account. - The object
coefficientsfromSLOPE()is now a list of sparse matrices (rather than a three-dimensional array as before). Now it contains only the coefficients and not the intercepts. The intercepts are instead stored ininterceptsin the returned object and are always present even ifintercept = FALSE. - The behavior of
coef.SLOPE()has changed somewhat, and ifsimplify = FALSE, then the returned object is now instead a list of sparse matrices (rather than a three-dimensional array as before). - The default value of
qinSLOPE()has changed from0.1 * min(1, NROW(x) / NCOL(x))to0.1. - Arguments
sigma,n_sigma, andlambda_min_ratioinSLOPE()that were previously deprecated have been removed. -
SLOPE()now internally solves the problem normalized by scaling with the number of observations, which means that values returned indevianceandprmalsanddualsifdiagnostics = TRUEare now scaled byn. -
path_lengthinSLOPE()now defaults to 100 (previously 20). -
tol_dev_ratioinSLOPE()now defaults to0.999(previously0.995). - Plots from
plot.SLOPE()now use base R graphics rather than ggplot2. This means that the plots are more difficult to customize but plot much more faster when there are many variables and significantly reduces the dependency load of the package. For plots of trained SLOPE objects, which used to be faceted on theqparameter, the user now needs to use the standard base R graphics API to facet plots viapar(mfrow = c(1, 2))or similar.
Deprecated Functionality
- Arguments
tol_rel_gap,tol_infeas,tol_abs,tol_rel,tol_rel_coefinSLOPE()are now deprecated. The solvers now all rely on the same tolerance criterion, which is set bytoland uses the duality gap normalized by the current primal value. - Arguments
screenandscreen_algare now deprecated and have no effect. Feature screening is always used. These arguments were only used for debugging. - The argument
verbosityinSLOPE()is now defunct and has no effect. - The argument
prox_methodinSLOPE()andsortedL1Prox()is now defunct and has no effect.
New Features
- Centering
xinSLOPE()is now allowed again, even when the matrix is sparse. - Out-of-memory matrices are now allowed through the
bigmemorypackage. Only support for dense matrices is available at the moment. - Centers and scales can now be specified manually by providing vectors to
centerandscaleinSLOPE(). - A new solver based on a hybrid method of proximal gradient descent and coordinate descent is available and used by default by the Gaussian and binomial families. Use it by specifying
solver = "hybrid". - Solver can now be set to
"auto", in which case the package automatically chooses a solver. - The returned duality gaps when
diagnostics = TRUEare now true duality gaps, computed by guaranteeing that the dual variable is feasible (which was not the case previously). -
scaleinSLOPE()gains a new option"max_abs"which scales the columns ofxby their maximum absolute value. - When
alpha = "estimate", there is a now an iteration limit in case the algorithm does not converge to one set of features. Thanks @RomanParzer. -
plot.SLOPE()gains a new argumentmagnitudes, which causes the plot to only show the magnitudes of the coefficients (which helps if you want to visualize cluster structure). -
plot.SLOPE()gains a new argumentadd_labels, which add numbers for the coefficients to the plot. Set toFALSEby default. - Relaxed SLOPE models can now be fit by specifying
gammainSLOPE(). -
plot.trainedSLOPE()gains a new argumentindex, to select which of the hyperparameter combinations to plot for. - There’s a new function
plotClusters(), which allows plotting the cluster structure in SLOPE. Thanks, 1! -
SLOPE()gains a new argumentcd_type, to control the type of coordinate descent used for the hybrid solver, with options"cyclical"and"permuted".
Bug Fixes
- Return correct model when training for AUC in
trainSLOPE().
Performance Improvements
The new hybrid algorithm that’s implemented in libslope and now used in the package constitutes a major upgrade in terms of performance.
- The solver is now much more memory-efficient and can avoid copies of the design matrix entirely by normalizing the columns just-in-time. This is the standard behavior. Future versions of the package will allow the user to specify whether to copy (and modify) the design matrix or not.
Dependencies
We have made an effort to reduce the footprint of the package and reduce the number of dependencies.
- The package now relies on Eigen (through RcppEigen) rather than Armadillo, which means that there is no longer any reliance on BLAS and LAPACK libraries.
- The dependency on
ggplot2is removed. - The
vdiffr,tidyr,dplyr,bench,scales, andglmnetpackages in theSuggestsfield that were used for testing are now removed.
SLOPE 0.5.0
CRAN release: 2022-06-09
Major changes
-
plot.SLOPE(),plot.trainSLOPE()andplotDiagnostics()have been reimplemented in ggplot2.
SLOPE 0.4.0
CRAN release: 2021-12-10
New Functions
-
sortedL1Prox()is a new function that computes the proximal operator for the sorted L1 norm (the penalty term in SLOPE). -
regularizationWeights()is a new function that returns the penalty weights (lambda sequence) for SLOPE or OSCAR.
Major changes
- The parametrization for OSCAR models have been corrected and changed. As a result,
SLOPE()gains two arguments:theta1andtheta2to control the behavior using the parametrization from L. W. Zhong and J. T. Kwok, “Efficient sparse modeling with automatic feature grouping,” IEEE Transactions on Neural Networks and Learning Systems, vol. 23, no. 9, pp. 1436–1447, Sep. 2012, doi: 10.1109/TNNLS.2012.2200262.qis no longer used with OSCAR models. Thanks, Nuno Eusebio. -
SLOPE()has gained a new argument,prox_method, which allows the user to select prox algorithm to use. There is no an additional algorithm in the package, based on the PAVA algorithm used in isotonic regression, that can be used. Note that this addition is mostly of academic interest and does not need to be changed by the user.
Minor Changes
- The
qparameter is no longer allowed to be smaller than1e-6to avoid constructions of regularization paths with infinitelambdavalues. - The
lambdaargument inSLOPE()now also allowed the input"lasso"to obtain the standard lasso. - The performance of
trainSLOPE()
Bug Fixes
- For very small numbers of observations (10 or so), the regularization weights for
lambda = "gaussian"were incorrectly computed, increasing and then decreasing. This is now fixed and regularization weights in this case are now always non-increasing. - Misclassification error was previously computed incorrectly in
trainSLOPE()for multinomial models (thanks @jakubkala and 1) - Performance of
trainSLOPE()was previously hampered by erroneous refitting of the models, which has been fixed now (thanks @jakubkala and
Deprecated and Defunct
-
yvarargument inplotDiagnostics()that was previously deprecated is now defunct. - Using
missclassfor themeasureargument intrainSLOPE()has been deprecated in favor ofmisclass.
SLOPE 0.3.2
CRAN release: 2020-07-10
Minor changes
- Added
tol_rel_coef_changeargument toSLOPE()as a convergence criterion for the FISTA solver that sets a tolerance for the relative change in coefficients across iterations.
SLOPE 0.3.0
CRAN release: 2020-07-02
Major changes
- Scaling of
alpha(previouslysigma) is now invariant to the number of observations, which is achieved by scaling the penalty part of the objective by the square root of the number of observations ifscale = "l2"and the number of observations ifscale = "sd"or"none". No scaling is applied whenscale = "l1". - The
sigmaargument is deprecated in favor ofalphainSLOPE(),coef.SLOPE(), andpredict.SLOPE(). - The
n_sigmaargument is deprecated in favor ofpath_lengthinSLOPE() - The
lambda_min_ratioargument is deprecated in favor ofalpha_min_ratioinSLOPE() - The default for argument
lambdainSLOPE()has changed from"gaussian"to"bh". - Functions and arguments deprecated in 0.2.0 are now defunct and have been removed from the package.
-
scale = "sd"now scales with the population standard deviation rather than the sample standard deviation, i.e. the scaling factor now used is the number of observations (and not the number of observations minus one as before).
Minor changes
- Default
path_lengthhas changed from 100 to 20. -
plot.SLOPE()has gained an argumentx_variablethat controls what is plotted on the x axis. - A warning is now thrown if the maximum number of passes was reached anywhere along the path (and prints where as well).
- If the
max_variablescriterion is hit, the solution path returned will now include also the last solution (which was not the case before). Thanks,
SLOPE 0.2.1
CRAN release: 2020-04-16
Minor changes
- A few examples in
deviance()andSLOPE()that were taking too long to execute have been removed or modified.
SLOPE 0.2.0
This version of SLOPE represents a major change to the package. We have merged functionality from the owl package into this package, which means there are several changes to the API, including deprecated functions.
Major changes
-
SLOPE_solver(),SLOPE_solver_matlab(),prox_sorted_L1(), andcreate_lambda()have been deprecated (and will be defunct in the next version of SLOPE) - arguments
X,fdr, andnormalizehave been deprecated inSLOPE()and replaced byx,q,scaleandcenter, respectively - options
"default"and"matlab"to argumentsolverinSLOPE()have been deprecated and replaced with"fista"and"admm", which uses the accelerated proximal gradient method FISTA and alternating direction of multipliers method (ADMM) respectively - ADMM has been implemented as a solver for
family = "gaussian" - binomial, poisson, and multinomial families are now supported (using
familyargument inSLOPE()) - input to
lambdais now scaled (divided by) the number of observations (rows) inx - predictor screening rules have been implemented and are activated by calling
screen = TRUEinSLOPE(). The type of algorithm can also be set viascreen_alg. -
SLOPE()now returns an object of class"SLOPE"(and an additional class depending on input tofamilyinSLOPE() -
SLOPEobjects gaincoef()andplot()methods. -
SLOPEnow uses screening rules to speed up model fitting in the high-dimensional regime - most of the code is now written in C++ using the Rcpp and RcppArmadillo packages
- a new function
trainSLOPE()trains SLOPE with repeated k-folds cross-validation - a new function
caretSLOPE()enables model-tuning using the caret package -
SLOPE()now fits an entire path of regularization sequences by default - the
normalizeoption toSLOPE()has been replaced byscaleandcenter, which allows granular options for standardization - sparse matrices (from the Matrix package) can now be used as input
- there are now five datasets included in the package
- the introductory vignette has been replaced
Minor changes
- a new function
deviance()returns the deviance from the fit - a new function
score()can be used to assess model performance against new data - a new function
plotDiagnostics()has been included to visualize data from the solver (ifdiagnostics = TRUEin the call toSLOPE()) - OSCAR-type penalty sequences can be used by setting
lambda = "oscar" in the call toSLOPE()` - the test suite for the package has been greatly extended
