|
| 1 | +# SLOPE 1.0.0 |
| 2 | + |
| 3 | +This update of SLOPE brings an entirely different C++ implementation of the |
| 4 | +underlying package based on the C++ library |
| 5 | +[libslope](https://github.com/jolars/libslope). It comes with several large and |
| 6 | +breaking changes with respect to the previous version of the package. |
| 7 | + |
| 8 | +We realized that this may throw off some users, and hope that you will be |
| 9 | +patient with dealing with the large number of breaking changes. |
| 10 | + |
| 11 | +## Breaking Changes |
| 12 | + |
| 13 | +- The `caretSLOPE()` function that was deprecated has now been removed from the |
| 14 | + package. |
| 15 | +- Fields `unique`, `violations`, and `active_sets` are no longer stored in the |
| 16 | + `SLOPE` object. These fields were typically only used for debugging purposes. |
| 17 | +- The `prox_method` and `method` arguments in `SLOPE()` and `sortedL1Prox()`, |
| 18 | + respectively, have been removed. The proximal operator is now always computed |
| 19 | + using the fast stack-based algorithm. There was never any reason to use the |
| 20 | + slower PAVA algorithm. |
| 21 | +- The ADMM solver has been removed from the package. Calling `SLOPE()` with |
| 22 | + `solver = "admm"` will now throws a warning and the value will be |
| 23 | + automatically set to `"auto"`. |
| 24 | +- `alpha` is now scaled by `n` (the number of observations) and differences with |
| 25 | + respect to the type of scaling are no longer taken into account. |
| 26 | +- The object `coefficients` from `SLOPE()` is now a list of sparse matrices |
| 27 | + (rather than a three-dimensional array as before). Now it contains only the |
| 28 | + coefficients and not the intercepts. The intercepts are instead stored in |
| 29 | + `intercepts` in the returned object and are always present even if |
| 30 | + `intercept = FALSE`. |
| 31 | +- The behavior of `coef.SLOPE()` has changed somewhat, and if |
| 32 | + `simplify = FALSE`, then the returned object is now instead a list of sparse |
| 33 | + matrices (rather than a three-dimensional array as before). |
| 34 | +- The default value of `q` in `SLOPE()` has changed from |
| 35 | + `0.1 * min(1, NROW(x) / NCOL(x))` to `0.1`. |
| 36 | +- Arguments `sigma`, `n_sigma`, and `lambda_min_ratio` in `SLOPE()` that were |
| 37 | + previously deprecated have been removed. |
| 38 | +- `SLOPE()` now internally solves the problem normalized by scaling with the |
| 39 | + number of observations, which means that values returned in `deviance` and |
| 40 | + `prmals` and `duals` if `diagnostics = TRUE` are now scaled by `n`. |
| 41 | +- `path_length` in `SLOPE()` now defaults to 100 (previously 20). |
| 42 | +- `tol_dev_ratio` in `SLOPE()` now defaults to `0.999` (previously `0.995`). |
| 43 | +- Plots from `plot.SLOPE()` now use base R graphics rather than ggplot2. This |
| 44 | + means that the plots are more difficult to customize but plot much more faster |
| 45 | + when there are many variables and significantly reduces the dependency load of |
| 46 | + the package. For plots of trained SLOPE objects, which used to be faceted on |
| 47 | + the `q` parameter, the user now needs to use the standard base R graphics API |
| 48 | + to facet plots via `par(mfrow = c(1, 2))` or similar. |
| 49 | + |
| 50 | +## Deprecated Functionality |
| 51 | + |
| 52 | +- Arguments `tol_rel_gap`, `tol_infeas`, `tol_abs`, `tol_rel`, `tol_rel_coef` in |
| 53 | + `SLOPE()` are now deprecated. The solvers now all rely on the same tolerance |
| 54 | + criterion, which is set by `tol` and uses the duality gap normalized by the |
| 55 | + current primal value. |
| 56 | +- Arguments `screen` and `screen_alg` are now deprecated and have no effect. |
| 57 | + Feature screening is always used. These arguments were only used for |
| 58 | + debugging. |
| 59 | +- The argument `verbosity` in `SLOPE()` is now defunct and has no effect. |
| 60 | +- The argument `prox_method` in `SLOPE()` and `sortedL1Prox()` is now defunct |
| 61 | + and has no effect. |
| 62 | + |
| 63 | +## New Features |
| 64 | + |
| 65 | +- Centering `x` in `SLOPE()` is now allowed again, even when the matrix is |
| 66 | + sparse. |
| 67 | +- Out-of-memory matrices are now allowed through the `bigmemory` package. Only |
| 68 | + support for dense matrices is available at the moment. |
| 69 | +- Centers and scales can now be specified manually by providing vectors to |
| 70 | + `center` and `scale` in `SLOPE()`. |
| 71 | +- A new solver based on a hybrid method of proximal gradient descent and |
| 72 | + coordinate descent is available and used by default by the Gaussian and |
| 73 | + binomial families. Use it by specifying `solver = "hybrid"`. |
| 74 | +- Solver can now be set to `"auto"`, in which case the package automatically |
| 75 | + chooses a solver. |
| 76 | +- The returned duality gaps when `diagnostics = TRUE` are now _true_ duality |
| 77 | + gaps, computed by guaranteeing that the dual variable is feasible (which was |
| 78 | + not the case previously). |
| 79 | +- `scale` in `SLOPE()` gains a new option `"max_abs"` which scales the columns |
| 80 | + of `x` by their maximum absolute value. |
| 81 | +- When `alpha = "estimate"`, there is a now an iteration limit in case the |
| 82 | + algorithm does not converge to one set of features. Thanks @RomanParzer. |
| 83 | +- `plot.SLOPE()` gains a new argument `magnitudes`, which causes the plot to |
| 84 | + only show the magnitudes of the coefficients (which helps if you want to |
| 85 | + visualize cluster structure). |
| 86 | +- `plot.SLOPE()` gains a new argument `add_labels`, which add numbers for the |
| 87 | + coefficients to the plot. Set to `FALSE` by default. |
| 88 | +- Relaxed SLOPE models can now be fit by specifying `gamma` in `SLOPE()`. |
| 89 | +- `plot.trainedSLOPE()` gains a new argument `index`, to select which of the |
| 90 | + hyperparameter combinations to plot for. |
| 91 | +- There's a new function `plotClusters()`, which allows plotting the cluster |
| 92 | + structure in SLOPE. Thanks, @KrystynaGrzesiak! |
| 93 | +- `SLOPE()` gains a new argument `cd_type`, to control the type of coordinate |
| 94 | + descent used for the hybrid solver, with options `"cyclical"` and |
| 95 | + `"permuted"`. |
| 96 | + |
| 97 | +## Bug Fixes |
| 98 | + |
| 99 | +- Return correct model when training for AUC in `trainSLOPE()`. |
| 100 | + |
| 101 | +## Performance Improvements |
| 102 | + |
| 103 | +The new hybrid algorithm that's implemented in libslope and now used in the |
| 104 | +package constitutes a major upgrade in terms of performance. |
| 105 | + |
| 106 | +- The solver is now much more memory-efficient and can avoid copies of the |
| 107 | + design matrix entirely by normalizing the columns just-in-time. This is the |
| 108 | + standard behavior. Future versions of the package will allow the user to |
| 109 | + specify whether to copy (and modify) the design matrix or not. |
| 110 | + |
| 111 | +## Dependencies |
| 112 | + |
| 113 | +We have made an effort to reduce the footprint of the package and reduce the |
| 114 | +number of dependencies. |
| 115 | + |
| 116 | +- The package now relies on Eigen (through RcppEigen) rather than Armadillo, |
| 117 | + which means that there is no longer any reliance on BLAS and LAPACK libraries. |
| 118 | +- The dependency on `ggplot2` is removed. |
| 119 | +- The `vdiffr`, `tidyr`, `dplyr`, `bench`, `scales`, and `glmnet` packages in |
| 120 | + the `Suggests` field that were used for testing are now removed. |
| 121 | + |
1 | 122 | # SLOPE 0.5.2
|
2 | 123 |
|
3 | 124 | ## Bug Fixes
|
|
0 commit comments