Skip to content

Commit

Permalink
version 0.2.0
Browse files Browse the repository at this point in the history
  • Loading branch information
ff1201 authored and cran-robot committed Jul 15, 2024
1 parent 3fb82b3 commit 3945a16
Show file tree
Hide file tree
Showing 59 changed files with 4,527 additions and 2,034 deletions.
14 changes: 7 additions & 7 deletions DESCRIPTION
Original file line number Diff line number Diff line change
@@ -1,24 +1,24 @@
Package: sgs
Title: Sparse-Group SLOPE: Adaptive Bi-Level Selection with FDR Control
Version: 0.1.1
Date: 2023-08-21
Version: 0.2.0
Date: 2024-07-12
Authors@R: c(person("Fabio", "Feser", role = c("aut", "cre"), email = "ff120@ic.ac.uk",comment = c(ORCID = "0009-0007-3088-9727")),
person("Marina", "Evangelou", role =c("aut"), comment = c(ORCID = "0000-0003-0789-8944")))
Maintainer: Fabio Feser <ff120@ic.ac.uk>
Description: Implementation of Sparse-group SLOPE: Adaptive bi-level with FDR-control (Feser et al. (2023) <arXiv:2305.09467>). Linear and logistic regression models are supported, both of which can be fit using k-fold cross-validation. Dense and sparse input matrices are supported. In addition, a general adaptive three operator splitting (ATOS) implementation is provided.
Description: Implementation of Sparse-group SLOPE (SGS) (Feser and Evangelou (2023) <doi:10.48550/arXiv.2305.09467>) models. Linear and logistic regression models are supported, both of which can be fit using k-fold cross-validation. Dense and sparse input matrices are supported. In addition, a general adaptive three operator splitting (ATOS) implementation is provided. Group SLOPE (gSLOPE) (Brzyski et al. (2019) <doi:10.1080/01621459.2017.1411269>) models are also implemented. Both gSLOPE and SGS are available with strong screening rules (Feser and Evangelou (2024) <doi:10.48550/arXiv.2405.15357>) for computational speed-up.
Imports: Matrix, MASS, caret, grDevices, graphics, methods, stats,
faux, SLOPE, Rlab, Rcpp (>= 1.0.10)
LinkingTo: Rcpp, RcppArmadillo
Suggests: SGL, gglasso, glmnet, testthat, knitr, rmarkdown
RoxygenNote: 7.2.3
Suggests: SGL, gglasso, glmnet, testthat, knitr, grpSLOPE, rmarkdown
RoxygenNote: 7.3.1
License: GPL (>= 3)
Encoding: UTF-8
URL: https://github.com/ff1201/sgs
BugReports: https://github.com/ff1201/sgs/issues
VignetteBuilder: knitr
NeedsCompilation: yes
Packaged: 2023-08-22 00:27:08 UTC; ff120
Packaged: 2024-07-13 16:27:30 UTC; ff120
Author: Fabio Feser [aut, cre] (<https://orcid.org/0009-0007-3088-9727>),
Marina Evangelou [aut] (<https://orcid.org/0000-0003-0789-8944>)
Repository: CRAN
Date/Publication: 2023-08-22 15:50:05 UTC
Date/Publication: 2024-07-14 03:30:02 UTC
97 changes: 57 additions & 40 deletions MD5
Original file line number Diff line number Diff line change
@@ -1,46 +1,63 @@
41f04f3ceb2bed6e60f0ff7c6b43dbd2 *DESCRIPTION
60a598cbd20d896996be758fc8f686bf *NAMESPACE
54c9a07458b1586f2c1935b7430fe401 *R/RcppExports.R
d8905f227b448ca640c5cf27108464f4 *R/as_sgs.R
fcf68dbe52f8cee45a45a1c819705466 *R/atos.R
af2f82fbe9770fe903354e806ae35304 *R/fit_sgs.R
3ea6177a7e40e000e5ec08e681d669e0 *R/fit_sgs_cv.R
b122ba3213244e067923fc78b159bf6b *R/generate_penalties.R
b8e1d5e17b343b4feb753fdd674250f2 *R/plot.R
962fffc4117c0ce7a5b42f474f7ed64e *R/predict.R
4204a670034f03cdecd9fc2fc1dd884e *R/print.R
570e2da69afaaccb31bbfbf93dfef782 *R/run_algorithm.R
64606f63ba222dec353312e9560bf258 *R/scaled_sgs.R
42e65df8f77bf74da046b0db111ead3c *R/sgs-package.R
d91c3fe4306f092959602e215fcb90b8 *R/toy_data_gen.R
63dba4c996781dc3159885e5afd09d4a *R/utils.R
7f3379241215d54d0529e447fa5660ff *README.md
7b7cad71301e94a254becef0005e40c2 *build/vignette.rds
98fa7392816d242dfe5179e06208cb45 *inst/doc/reproducible_example.R
35f6319240d8381955c1328c08a88be7 *inst/doc/reproducible_example.Rmd
e2aac27a20f18961d7d368adcedf24e6 *inst/doc/reproducible_example.html
72f48781956f4c15a2ca2ce6217d0ee2 *man/arma_mv.Rd
4815259a00ae488f218717fc2d7d6f7c *man/as_sgs.Rd
05317e8cd4e42908c3a13b6c78ac75e6 *man/atos.Rd
1a5a0e2bf982c5b7a4a214ad6f944029 *DESCRIPTION
d03953ea826e47f15fc28d6365ec4ee2 *NAMESPACE
352cd125b1144bfdd43ed845e47f1ec8 *R/RcppExports.R
44bf298c10b0610c3474bfbe48814215 *R/as_sgs.R
978083a366f89cefe63215afe90e355f *R/atos.R
08c2eddf0e94c40c6c8a45bf841ba215 *R/coef.R
1d9e3b92d6f232e2b6334b37b74090d9 *R/fit_gslope.R
e3426f13d822f0b32a9314eaf1e94cbe *R/fit_gslope_cv.R
662c995662a94ed60f54d78cec0aaed9 *R/fit_sgs.R
f3d06b5ac21c2d0614098e7a150a9a78 *R/fit_sgs_cv.R
55c3ab2ac2dceda7d22a75c174deb8b1 *R/fitting_code.R
47bf23d59f3be960292f32efce1475e8 *R/gen_pens.R
365aed3dc4c1420f9501fa0ed3ff9b92 *R/gen_toy_data.R
21795985dbbf7655ed194ec29ff0aba6 *R/global_wrapper_code.R
1a05f38cf2bd3b2484dda2b4990b4721 *R/plot.R
ab4086db6130a411fa7c8130632d839a *R/predict.R
8b52457fb021add713ca16a4d3b60bd6 *R/print.R
8d5cb1b8d7e53c4140de87a5a269ed1f *R/run_algorithm.R
7dce9e7d29f83979faeefbee736e1952 *R/scaled_sgs.R
a894b146f88476cd209614e8b291f6af *R/screen.R
e1724a7f1bbb01edc2123693482829a0 *R/sgs-package.R
b7393ea43b8ae1848864f31ed854b4a4 *R/utils.R
8f4a27ae5cf15f06ccdbf430f5eb10bc *README.md
b943a1546a1e17be4eea235ec7b4616b *build/partial.rdb
37dae1501b064d9c258aad49bdbfd9db *build/vignette.rds
229d501815aea21d96d286205915c7e5 *inst/CITATION
c950fd9c140ae8aeca013f0bc29e2016 *inst/doc/reproducible_example.R
f8fff4e6dc263f3dcad7df24536c215c *inst/doc/reproducible_example.Rmd
146372a0a34478277ffc6dbef8f90826 *inst/doc/reproducible_example.html
487d2370e75dbe87f9b49248539304de *man/arma_mv.Rd
4c130eed8f19f0b6332c5b391dace25e *man/arma_sparse.Rd
b4e52c94232685711b6d6036056e7243 *man/as_sgs.Rd
805e1870db43608583af9c6fc04ebf32 *man/atos.Rd
f7f32b7bdcad78bfd1b951bb6bd22cbe *man/coef.sgs.Rd
d959d3ace2c9e49c1dea92118f377ded *man/figures/README-gslope-ex.avif
7a0754f80f5d9b918e758244c3a06fc6 *man/figures/README-sgs-ex.avif
5d106fc5d3217841391e637def995d67 *man/figures/logo.avif
ab5defe0d8f24a5ef8c0627c532b36fe *man/fit_sgs.Rd
65718d44eed017b0db354e26905816d8 *man/fit_sgs_cv.Rd
8e46c6515e4f776ef4cc3d87fbf25910 *man/generate_penalties.Rd
6e69dea61807a40c767a4bb444470557 *man/generate_toy_data.Rd
c8b81f9739883542e4922748d006a588 *man/plot.sgs_cv.Rd
06c7a819715a7bb96985b0d15c7fa1d0 *man/predict.sgs.Rd
79550c96b3ef9391b22cf64ac4da7e08 *man/print.sgs.Rd
7ff1604ce79b51ad64cc5820149ec21b *man/scaled_sgs.Rd
959cf084e38d1fc7a00ca72b92c6f0bd *man/sgs-package.Rd
88670bc3b0a978d95d12ceab3bc5073b *man/fit_gslope.Rd
74211b01aae7350bb0fee676bcc2e068 *man/fit_gslope_cv.Rd
e3ad1029e757c5df15e965e851ed7d2a *man/fit_sgs.Rd
d04c0284f21ffb147233403734058c9d *man/fit_sgs_cv.Rd
2aba4b85d18f81c373aba61bea70b5cf *man/gen_pens.Rd
25f4a283131bdfe63df8a18d234e1751 *man/gen_toy_data.Rd
15f6b8fd9f09e4404c06fdf93922edbf *man/plot.sgs.Rd
85ed9b856d37cd27ced5fab55b868fc3 *man/predict.sgs.Rd
0b593256b2aacb69bf9182d96f82ae5f *man/print.sgs.Rd
97d62d14cb60a72d986da9efe955ae9e *man/scaled_sgs.Rd
004a0957f275d9da61719adca849dc12 *man/sgs-package.Rd
e62585629948e7dd143efbad43c2a6eb *src/Makevars
e62585629948e7dd143efbad43c2a6eb *src/Makevars.win
9c30da88cbaa6afc153cd482bd54933c *src/RcppExports.cpp
213c5cb947b94277d87e8387068bfa06 *src/RcppExports.cpp
71fd29df2537d26495382069b643026e *src/arma_mv.cpp
22b8b0a7eb25387c0b5c516be8e404d1 *src/arma_sparse.cpp
2724a5e2c41759c08f64a4dab2fb2aa1 *tests/testthat.R
4ac919de7fb8713b33ddc5eb95585f59 *tests/testthat/test-gglasso.R
ffabd5e4bbf22e5087ed0516f970cfdd *tests/testthat/test-lasso.R
d7f8bc660711b1c0464b2a19b475656e *tests/testthat/test-gglasso.R
fc7227abb364bccb0c25c04058e55696 *tests/testthat/test-grpslope.R
c91e7930a636d3750c2a02b768d1d3dd *tests/testthat/test-lasso.R
a280a866d80cdaa358423adb710f9d05 *tests/testthat/test-logistic.R
a16a7ddf8bfbc6348b77ef651faf8a2b *tests/testthat/test-ols.R
32d5a8cacc539719ce106f55ca102ab2 *tests/testthat/test-sgl.R
b37b64ab6b7afbce34df963a8e1eb948 *tests/testthat/test-slope.R
35f6319240d8381955c1328c08a88be7 *vignettes/reproducible_example.Rmd
a76c2867d4751ac106a2a3a10031e70d *tests/testthat/test-ols.R
8d8cb2e7a91623d7288c03baefe82042 *tests/testthat/test-screen.R
9178e21bfe4d8d54dd2b417b905d4bce *tests/testthat/test-sgl.R
1e8f926ae8125a102ae476baebcd7a35 *tests/testthat/test-slope.R
f8fff4e6dc263f3dcad7df24536c215c *vignettes/reproducible_example.Rmd
20 changes: 18 additions & 2 deletions NAMESPACE
Original file line number Diff line number Diff line change
@@ -1,16 +1,31 @@
# Generated by roxygen2: do not edit by hand

S3method(coef,gslope)
S3method(coef,gslope_cv)
S3method(coef,sgs)
S3method(coef,sgs_cv)
S3method(plot,gslope)
S3method(plot,gslope_cv)
S3method(plot,sgs)
S3method(plot,sgs_cv)
S3method(predict,gslope)
S3method(predict,gslope_cv)
S3method(predict,sgs)
S3method(predict,sgs_cv)
S3method(print,gslope)
S3method(print,gslope_cv)
S3method(print,sgs)
S3method(print,sgs_cv)
export(arma_mv)
export(arma_sparse)
export(as_sgs)
export(atos)
export(fit_gslope)
export(fit_gslope_cv)
export(fit_sgs)
export(fit_sgs_cv)
export(generate_penalties)
export(generate_toy_data)
export(gen_pens)
export(gen_toy_data)
export(scaled_sgs)
importFrom(MASS,mvrnorm)
importFrom(Matrix,as.matrix)
Expand All @@ -26,6 +41,7 @@ importFrom(methods,is)
importFrom(stats,ecdf)
importFrom(stats,pchisq)
importFrom(stats,pnorm)
importFrom(stats,prcomp)
importFrom(stats,qchisq)
importFrom(stats,qnorm)
importFrom(stats,quantile)
Expand Down
10 changes: 10 additions & 0 deletions R/RcppExports.R
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,13 @@ arma_mv <- function(m, v) {
.Call(`_sgs_arma_mv`, m, v)
}

#' Matrix Product in RcppArmadillo.
#'
#' @param m numeric sparse matrix
#' @param v numeric vector
#' @return matrix product of m and v
#' @export
arma_sparse <- function(m, v) {
.Call(`_sgs_arma_sparse`, m, v)
}

36 changes: 19 additions & 17 deletions R/as_sgs.R
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@
#
###############################################################################

#' fits the adaptively scaled SGS model (AS-SGS)
#' Fits the adaptively scaled SGS model (AS-SGS).
#'
#' Fits an SGS model using the noise estimation procedure, termed adaptively scaled SGS (Algorithm 2 from Feser et al (2023)).
#' Fits an SGS model using the noise estimation procedure, termed adaptively scaled SGS (Algorithm 2 from Feser and Evangelou (2023)).
#' This adaptively estimates \eqn{\lambda} and then fits the model using the estimated value. It is an alternative approach to
#' cross-validation ([fit_sgs_cv()]). The approach is only compatible with the SGS penalties.
#'
Expand All @@ -44,38 +44,40 @@
#'
#' @return An object of type \code{"sgs"} containing model fit information (see [fit_sgs()]).
#'
#' @references F. Feser, M. Evangelou \emph{Sparse-group SLOPE: adaptive bi-level selection with FDR-control}, \url{https://arxiv.org/abs/2305.09467}
#' @seealso [scaled_sgs()]
#' @family model-selection
#' @family SGS-methods
#'
#' @references Feser, F., Evangelou, M. (2023). \emph{Sparse-group SLOPE: adaptive bi-level selection with FDR-control}, \url{https://arxiv.org/abs/2305.09467}
#' @export

as_sgs <- function(X, y, groups, type="linear", pen_method = 2, alpha=0.95, vFDR=0.1, gFDR=0.1, standardise="l2", intercept=TRUE, verbose=FALSE){
num_obs=dim(X)[1]
num_obs=nrow(X)
if (intercept) {
selected <- 1
X_2 = cbind(1,X)
selected = 1
X_2 = Matrix::cbind2(1,X)
y_1 = y-mean(y)
} else {
selected <- integer(0)
selected = integer(0)
}
out=standardise_sgs(X=X,y=y,standardise,intercept,dim(X)[1])
out=standardise_data(X=X,y=y,standardise,intercept,nrow(X))
selected_prev = 1000
attempts = 0
repeat {
selected_prev_2 = selected_prev
selected_prev <- selected

selected_prev = selected

noise_est <- estimateNoise(X_2[, selected], y_1, intercept)
pens_out = generate_penalties_2(gFDR, vFDR, pen_method=pen_method,groups,alpha,lambda = noise_est)
noise_est = estimateNoise(X_2[, selected], y_1, intercept)
pens_out = gen_pens_as_sgs(gFDR, vFDR, pen_method=pen_method,groups,alpha,lambda = noise_est)

fit <- fit_sgs(X=X, y=y, groups=groups, pen_method=pen_method, type, lambda=noise_est*out$scale_pen, alpha=alpha, vFDR=vFDR, gFDR=gFDR,intercept=intercept,
v_weights=pens_out$pen_slope_org,w_weights=pens_out$pen_gslope_org,standardise=standardise)
fit = fit_sgs(X=X, y=y, groups=groups, pen_method=pen_method, type, lambda=noise_est*out$scale_pen, alpha=alpha, vFDR=vFDR, gFDR=gFDR,intercept=intercept,
v_weights=pens_out$pen_slope_org,w_weights=pens_out$pen_gslope_org,standardise=standardise, screen = FALSE)

selected <- fit$selected_var
if (intercept) {
selected <- union(1, selected+1)
selected = union(1, selected+1)
}

if (identical(selected, selected_prev) |identical(selected, selected_prev_2)) {
if (identical(selected, selected_prev) | identical(selected, selected_prev_2)) {
break
}
if (length(selected) + 1 >= num_obs) {
Expand Down
Loading

0 comments on commit 3945a16

Please sign in to comment.