aboutsummaryrefslogtreecommitdiff
path: root/R/sparsestep.R
diff options
context:
space:
mode:
authorGertjan van den Burg <gertjanvandenburg@gmail.com>2016-02-10 20:19:51 -0500
committerGertjan van den Burg <gertjanvandenburg@gmail.com>2016-02-10 20:19:51 -0500
commit6c3d2ff1cb9e7bd3bf1426e1ec4cecd0891ea089 (patch)
tree0cf43714e1252ae833e473dc6beed6ddad953663 /R/sparsestep.R
parentadded authors and dependencies (diff)
downloadsparsestep-6c3d2ff1cb9e7bd3bf1426e1ec4cecd0891ea089.tar.gz
sparsestep-6c3d2ff1cb9e7bd3bf1426e1ec4cecd0891ea089.zip
bugfixes, documentation improvements, and generic function agreement
Diffstat (limited to 'R/sparsestep.R')
-rw-r--r--R/sparsestep.R93
1 files changed, 89 insertions, 4 deletions
diff --git a/R/sparsestep.R b/R/sparsestep.R
index 05cf9ff..b1f9a58 100644
--- a/R/sparsestep.R
+++ b/R/sparsestep.R
@@ -1,5 +1,90 @@
-#' sparsestep.
+#' @title Fits the SparseStep model
#'
-#' @name sparsestep
-#' @docType package
-NULL
+#' @description Fits the SparseStep model for a single value of the
+#' regularization parameter.
+#'
+#' @param x matrix of predictors
+#' @param y response
+#' @param lambda regularization parameter
+#' @param gamma0 starting value of the gamma parameter
+#' @param gammastop stopping value of the gamma parameter
+#' @param IMsteps number of steps of the majorization algorithm to perform for
+#' each value of gamma
+#' @param gammastep factor to decrease gamma with at each step
+#' @param normalize if TRUE, each variable is standardized to have unit L2
+#' norm, otherwise it is left alone.
+#' @param intercept if TRUE, an intercept is included in the model (and not
+#' penalized), otherwise no intercept is included
+#' @param force.zero if TRUE, absolute coefficients smaller than the provided
+#' threshold value are set to absolute zero as a post-processing step,
+#' otherwise no thresholding is performed
+#' @param threshold threshold value to use for setting coefficients to
+#' absolute zero
+#' @param XX The X'X matrix; useful for repeated runs where X'X stays the same
+#' @param Xy The X'y matrix; useful for repeated runs where X'y stays the same
+#' @param use.XX whether or not to compute X'X and return it
+#' @param use.Xy whether or not to compute X'y and return it
+#'
+#' @return A "sparsestep" S3 object is returned, for which print, predict,
+#' coef, and plot methods exist. It has the following items:
+#' \item{call}{The call that was used to construct the model.}
+#' \item{lambda}{The value(s) of lambda used to construct the model.}
+#' \item{gamma0}{The gamma0 value of the model.}
+#' \item{gammastop}{The gammastop value of the model}
+#' \item{IMsteps}{The IMsteps value of the model}
+#' \item{gammastep}{The gammastep value of the model}
+#' \item{intercept}{Boolean indicating if an intercept was fitted in the
+#' model}
+#' \item{force.zero}{Boolean indicating if a force zero-setting was
+#' performed.}
+#' \item{threshold}{The threshold used for a forced zero-setting}
+#' \item{beta}{The resulting coefficients stored in a sparse matrix format
+#' (dgCMatrix). This matrix has dimensions nvar x nlambda}
+#' \item{a0}{The intercept vector for each value of gamma of length nlambda}
+#' \item{normx}{Vector used to normalize the columns of x}
+#' \item{meanx}{Vector of column means of x}
+#' \item{XX}{The matrix X'X if use.XX was set to TRUE}
+#' \item{Xy}{The matrix X'y if use.Xy was set to TRUE}
+#'
+#' @seealso
+#' \code{\link{coef}}, \code{\link{print}}, \code{\link{predict}},
+#' \code{\link{plot}}, and \code{\link{path.sparsestep}}.
+#'
+#' @export
+#'
+#' @examples
+#' x <- matrix(rnorm(100*20), 100, 20)
+#' y <- rnorm(100)
+#' fit <- sparsestep(x, y)
+#'
+sparsestep <- function(x, y, lambda=c(0.1, 0.5, 1.0, 5, 10), gamma0=1e3,
+ gammastop=1e-4, IMsteps=2, gammastep=2.0,
+ normalize=TRUE, intercept=TRUE, force.zero=TRUE,
+ threshold=1e-7, XX=NULL, Xy=NULL, use.XX = TRUE,
+ use.Xy = TRUE)
+{
+ call <- match.call()
+ prep <- preprocess(x, y, normalize, intercept, XX, Xy, use.XX, use.Xy)
+
+ betas <- NULL
+ for (lmd in lambda) {
+ beta <- run.sparsestep(prep$x, prep$y, prep$XX, prep$Xy,
+ prep$nvars, lmd, gamma0, gammastep,
+ gammastop, IMsteps, force.zero,
+ threshold)
+ betas <- cbind(betas, beta)
+ }
+
+ post <- postprocess(t(betas), prep$a0, prep$x, prep$normx, prep$nvars,
+ length(lambda))
+
+ object <- list(call = call, lambda = lambda, gamma0 = gamma0,
+ gammastop = gammastop, IMsteps = IMsteps,
+ gammastep = gammastep, intercept = intercept,
+ force.zero = force.zero, threshold = threshold,
+ beta = post$beta, a0 = post$a0, normx = prep$normx,
+ meanx = prep$meanx, XX = if(use.XX) prep$XX else NULL,
+ Xy = if(use.Xy) prep$Xy else NULL)
+ class(object) <- "sparsestep"
+ return(object)
+}