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.p
times m
(number of classes). The returned
coefficients from SLOPE()
now have dimensions p
times m
(rather than
m - 1
).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.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.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.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 @KrystynaGrzesiak)trainSLOPE()
was previously hampered by erroneous refitting
of the models, which has been fixed now (thanks @jakubkala and
@KrystynaGrzesiak)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,
@straw-boy.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()`