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.
caretSLOPE()
function that was deprecated has now
been removed from the package.unique
, violations
, and
active_sets
are no longer stored in the SLOPE
object. These fields were typically only used for debugging
purposes.prox_method
and method
arguments in
SLOPE()
and sortedL1Prox()
, 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.SLOPE()
with solver = "admm"
will now throws a
warning and the value will be automatically set to
"auto"
.alpha
is now scaled by n
(the number of
observations) and differences with respect to the type of scaling are no
longer taken into account.coefficients
from SLOPE()
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 in intercepts
in the
returned object and are always present even if
intercept = FALSE
.coef.SLOPE()
has changed somewhat, and
if simplify = FALSE
, then the returned object is now
instead a list of sparse matrices (rather than a three-dimensional array
as before).q
in SLOPE()
has
changed from 0.1 * min(1, NROW(x) / NCOL(x))
to
0.1
.sigma
, n_sigma
, and
lambda_min_ratio
in SLOPE()
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 in deviance
and prmals
and
duals
if diagnostics = TRUE
are now scaled by
n
.path_length
in SLOPE()
now defaults to 100
(previously 20).tol_dev_ratio
in SLOPE()
now defaults to
0.999
(previously 0.995
).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 the q
parameter, the user now needs to use the standard base R graphics API to
facet plots via par(mfrow = c(1, 2))
or similar.tol_rel_gap
, tol_infeas
,
tol_abs
, tol_rel
, tol_rel_coef
in
SLOPE()
are now deprecated. The solvers now all rely on the
same tolerance criterion, which is set by tol
and uses the
duality gap normalized by the current primal value.screen
and screen_alg
are now
deprecated and have no effect. Feature screening is always used. These
arguments were only used for debugging.verbosity
in SLOPE()
is now
defunct and has no effect.prox_method
in SLOPE()
and
sortedL1Prox()
is now defunct and has no effect.x
in SLOPE()
is now allowed
again, even when the matrix is sparse.bigmemory
package. Only support for dense matrices is
available at the moment.center
and scale
in
SLOPE()
.solver = "hybrid"
."auto"
, in which case the
package automatically chooses a solver.diagnostics = TRUE
are
now true duality gaps, computed by guaranteeing that the dual
variable is feasible (which was not the case previously).scale
in SLOPE()
gains a new option
"max_abs"
which scales the columns of x
by
their maximum absolute value.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 argument
magnitudes
, 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 argument
add_labels
, which add numbers for the coefficients to the
plot. Set to FALSE
by default.gamma
in SLOPE()
.plot.trainedSLOPE()
gains a new argument
index
, to select which of the hyperparameter combinations
to plot for.plotClusters()
, which allows
plotting the cluster structure in SLOPE. Thanks, 1!SLOPE()
gains a new argument cd_type
, to
control the type of coordinate descent used for the hybrid solver, with
options "cyclical"
and "permuted"
.trainSLOPE()
.The new hybrid algorithm that’s implemented in libslope and now used in the package constitutes a major upgrade in terms of performance.
We have made an effort to reduce the footprint of the package and reduce the number of dependencies.
ggplot2
is removed.vdiffr
, tidyr
, dplyr
,
bench
, scales
, and glmnet
packages in the Suggests
field that were used for testing
are now removed."gaussian"
when the number of observations is less than the
number of variables.plot.SLOPE()
, plot.trainSLOPE()
and
plotDiagnostics()
have been reimplemented in ggplot2.caretSLOPE()
has been deprecated and will be made
defunct in version 0.6.0.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.SLOPE()
gains two arguments:
theta1
and theta2
to 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. q
is 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.q
parameter is no longer allowed to be smaller than
1e-6
to avoid constructions of regularization paths with
infinite lambda
values.lambda
argument in SLOPE()
now also
allowed the input "lasso"
to obtain the standard
lasso.trainSLOPE()
lambda = "gaussian"
were
incorrectly computed, increasing and then decreasing. This is now fixed
and regularization weights in this case are now always
non-increasing.trainSLOPE()
for multinomial models (thanks @jakubkala and 1)trainSLOPE()
was previously hampered by
erroneous refitting of the models, which has been fixed now (thanks
@jakubkala and
yvar
argument in plotDiagnostics()
that
was previously deprecated is now defunct.missclass
for the measure
argument
in trainSLOPE()
has been deprecated in favor of
misclass
.SLOPE()
.intercept = FALSE
and
family = "gaussian"
(#13, thanks, Patrick Tardivel).tol_rel_coef_change
argument to
SLOPE()
as a convergence criterion for the FISTA solver
that sets a tolerance for the relative change in coefficients across
iterations.std::sqrt()
in
src/SLOPE.cpp
.alpha
(previously sigma
) 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 if scale = "l2"
and the number of observations
if scale = "sd"
or "none"
. No scaling is
applied when scale = "l1"
.sigma
argument is deprecated in favor of
alpha
in SLOPE()
, coef.SLOPE()
,
and predict.SLOPE()
.n_sigma
argument is deprecated in favor of
path_length
in SLOPE()
lambda_min_ratio
argument is deprecated in favor of
alpha_min_ratio
in SLOPE()
lambda
in SLOPE()
has changed from "gaussian"
to "bh"
.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).path_length
has changed from 100 to 20.plot.SLOPE()
has gained an argument
x_variable
that controls what is plotted on the x
axis.max_variables
criterion is hit, the solution
path returned will now include also the last solution (which was not the
case before). Thanks,
rho
instead of 1
is now used in the
factorization part for the ADMM solver.deviance()
and SLOPE()
that were taking too long to execute have been removed or modified.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.
SLOPE_solver()
, SLOPE_solver_matlab()
,
prox_sorted_L1()
, and create_lambda()
have
been deprecated (and will be defunct in the next version of SLOPE)X
, fdr
, and
normalize
have been deprecated in SLOPE()
and
replaced by x
, q
, scale
and
center
, respectively"default"
and "matlab"
to argument
solver
in SLOPE()
have been deprecated and
replaced with "fista"
and "admm"
, which uses
the accelerated proximal gradient method FISTA and alternating direction
of multipliers method (ADMM) respectivelyfamily = "gaussian"
family
argument in SLOPE()
)lambda
is now scaled (divided by) the number
of observations (rows) in x
screen = TRUE
in SLOPE()
. The type of
algorithm can also be set via screen_alg
.SLOPE()
now returns an object of class
"SLOPE"
(and an additional class depending on input to
family
in SLOPE()
SLOPE
objects gain coef()
and
plot()
methods.SLOPE
now uses screening rules to speed up model
fitting in the high-dimensional regimetrainSLOPE()
trains SLOPE with repeated
k-folds cross-validationcaretSLOPE()
enables model-tuning using
the caret packageSLOPE()
now fits an entire path of regularization
sequences by defaultnormalize
option to SLOPE()
has been
replaced by scale
and center
, which allows
granular options for standardizationdeviance()
returns the deviance from the
fitscore()
can be used to assess model
performance against new dataplotDiagnostics()
has been included to
visualize data from the solver (if diagnostics = TRUE
in
the call to SLOPE()
)lambda = "oscar" in the call to
SLOPE()`