A longer documentation of the library can be found at https://jhorzek.github.io/lesstimate/.
lesstimate (lesstimate estimates sparse estimates) is a C++ header-only library that lets you combine statistical models such linear regression with state of the art penalty functions (e.g., lasso, elastic net, scad). With lesstimate you can add regularization and variable selection procedures to your existing modeling framework. It is currently used in lessSEM to regularize structural equation models.
lesstimate lets you optimize fitting functions of the form
$$g(\pmb\theta) = f(\pmb\theta) + p(\pmb\theta),$$
where $f(\pmb\theta)$ is a smooth objective function (e.g., residual sum squared, weighted least squares or log-Likelihood) and $p(\pmb\theta)$ is a non-smooth penalty function (e.g., lasso or scad).
To use the optimziers, you will need two functions:
Given these two functions, lesstimate lets you apply any of the aforementioned penalties with the quasi-Newton glmnet optimizer developed by Friedman et al. (2010) and Yuan et al. (2012) or variants of the proximal-operator based ista optimizer (see e.g., Gong et al., 2013). Because both optimziers provide a very similar interface, sitching between them is fairly simple. This interface is inspired by the ensmallen library.
A thorough introduction to lesstimate and its use in R or C++ can be found in the documentation. We also provide a template for using lesstimate in R and template for using lesstimate in C++. Finally, you will find another example for including lesstimate in R in the package lessLM. We recommend that you use the simplified interfaces to get started.
The following code demonstrates the use of lesstimate with regularized linear regressions. A longer step-by-step introduction including installation of lesstimate is provided in the documentation. The cmake infrastructure was created with cmake-init.
#include <armadillo>
#include <lesstimate.h>
// The model must inherit from less::model and override the fit and (optionally) the gradients function.
class linearRegressionModel : public less::model
{
public:
double fit(arma::rowvec b, less::stringVector labels) override
{
// compute sum of squared errors
arma::mat sse = (arma::trans(y - X * b.t()) * (y - X * b.t())) / (2.0 * y.n_elem);
return (sse(0, 0));
}
// linear regression requires dependent variables y and design matrix X:
const arma::colvec y;
const arma::mat X;
// constructor
linearRegressionModel(arma::colvec y_, arma::mat X_) : y(y_), X(X_){};
};
int main()
{
// examples for design matrix and dependent variable:
arma::mat X = {{1.00, -0.70, -0.86},
{1.00, -1.20, -2.10},
{1.00, -0.15, 1.13},
{1.00, -0.50, -1.50},
{1.00, 0.83, 0.44},
{1.00, -1.52, -0.72},
{1.00, 1.40, -1.30},
{1.00, -0.60, -0.59},
{1.00, -1.10, 2.00},
{1.00, -0.96, -0.20}};
arma::colvec y = {{0.56},
{-0.32},
{0.01},
{-0.09},
{0.18},
{-0.11},
{0.62},
{0.72},
{0.52},
{0.12}};
// initialize model
linearRegressionModel linReg(y, X);
// To use the optimizers, you will need to
// (1) specify starting values and names for the parameters
arma::rowvec startingValues(3);
startingValues.fill(0.0);
std::vector<std::string> labels{"b0", "b1", "b2"};
less::stringVector parameterLabels(labels);
// (2) specify the penalty to be used for each of the parameters:
std::vector<std::string> penalty{"none", "lasso", "lasso"};
// (3) specify the tuning parameters of your penalty for
// each parameter:
arma::rowvec lambda = {{0.0, 0.2, 0.2}};
// theta is not used by the lasso penalty:
arma::rowvec theta = {{0.0, 0.0, 0.0}};
less::fitResults fitResult_ = less::fitGlmnet(
linReg,
startingValues,
parameterLabels,
penalty,
lambda,
theta);
return(0);
}
This project is under GPL >= 2.
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.