Version 0.4 (2024-06-05) 1) Bug fix in rk() - only applicable to odd x distributions * Defaults could have produced replicate knots (causing prediction issue) * Previous: knots = quantile(x, probs = seq(0, 1, length.out = df)) * Updated: knots = unique(quantile(x, probs = seq(0, 1, length.out = df))) 2) Added cv.compare() function * Plots cv-error (+/- sd) for different solutions * For a single model, it plots lambda.min and lambda.1se * For multiple models, it plots (min, 1se) for all models 3) Added visualize.penalty() function * New function to plot (or return grpnet penalty (or its derivative) * Can plot/return the penalty evaluation for different signal strengths * Allows user to adjust hyperparameters that control the penalty 4) Added visualize.shrink() function * New function to plot (or return) grpnet shrinkage (or its fitted values) * Can plot/return the shrinkage operator for different signal strengths * Allows user to adjust hyperparameters that control the shrinkage 5) "character" variables are now supported by formula methods * Previously rk.model.matrix failed for characters * Now character variables are coerced to factors * Applies to cv.grpnet, grpnet, and rk.model.matrix 6) Update to default gamma used for grpnet() * The gamma argument is the hyperparameter for MCP and SCAD * Previous default was gamma = 3 for MCP and gamma = 4 for SCAD * New default is gamma = 4 for both MCP and SCAD 7) Update to defaults of standardized and orthogonalized in grpnet() * Previous default was to standardize (i.e., standardized = TRUE) * New default is to orthogonalize (i.e., orthogonalized = TRUE) * In practice, it can be useful to compare both approaches 8) Updates to defaults of cv.grpnet() tuning * Now deviance is defined as the MEAN (not SUM) of deviance residuals * Now gamma is tuned with respect to c(3, 4, 5) when using MCP or SCAD * Now $tune returns table of tuning results for alpha and gamma 9) Changes to defaults of predict.cv.grpnet * Previously default prediction was at lambda.min * New default is to predict at lambda.1se * Revert to old default by using: s = "lambda.min" 10) Added reference to Helwig (2024) for the ABGD algorithm Helwig, N. E. (2024). Versatile descent algorithms for group regularization and variable selection in generalized linear models. Journal of Computational and Graphical Statistics. doi: 10.1080/10618600.2024.2362232 Version 0.3 (2024-02-20) 1) Added orthogonalization option to grpnet * Use 'orthogonalize = TRUE' to groupwise orthogonalize design matrices * Default is still 'standardize = TRUE' (and 'orthogonalize = FALSE') * Now three possible options: unstandardized, standardized, orthogonalized 2) Improvement to rk() and rk.model.matrix for periodic splines * Periodicity is specified via a named list with T/F for each entry * Previously it was necessary to include all variables in list * Now any variable excluded from the list automatically gets F entry 3) Additional output included for grpnet() function * New returned value: "xsd" gives the groupwise standard deviation of 'x' * The "xsd" values are used to standardize 'x' (when standardize = TRUE) * The "xsd" values are used by predict.grpnet() when type = "znorm" 4) Expanded functionality for predict.grpnet() and predict.cv.grpnet() * New prediction type: "znorm" gives L2 norm of standardized coefs * Equivalent to multiplying the "norm" type prediction by "xsd" * "znorm" should be preferred over "norm" when predictor metrics differ 5) Inconsequential updates to underlying Fortran code * Previously the "pw" argument was only used to input penalty weights * Now the "pw" argument is used to output "xsd" (x standard deviation) * This output is now returned as a part of grpnet objects ($xsd) 6) Additional option ("znorm") for plot.grpnet() function 7) Slight update to package title and description. 8) Added an additional reference to rk() and rk.model.matrix() help files Version 0.2 (2023-09-08) 1) Bug Fix (penalty.factor) * In ver 0.1 penalty.factor was not being passed to internal Fortran routines * In the Fortran code, the penalty.factor was hard-coded as sqrt(grpsize) * Now the penalty.factor argument is appropriately passed to internal code 2) Bug Fix (ridge solution) * In ver 0.1 the ridge solution was computed at alpha = 0.001 for the first entry * Now alpha = 0.001 is used to compute the lambda sequence but not the solution * In ver 0.2 the ridge solution is computed at alpha = 0 (using lambda[1] from alpha = 0.001) 3) Expanded functionality of predict.grpnet and predict.cv.grpnet functions * Previously only offered predictions of type "link", "response", and "class" * Now offers 11 kinds of predictions (although some are not actually predictions) * Additions include "terms", "importance", and 6 options for extracting coefficient info 4) Expanded functionality of plot.grpnet function * Previously only offered plot of coefficient values (colored by group) * Now offers three types: coef, norm, imp (obtained via predict.grpnet) * The "type" option controls the type of plot that is produced 5) Improvements to grpnet and cv.grpnet outputs for multinomial responses * Previously factor levels were internally replaced with y1,...,ym * Resulted in coef names that differed from original factor levels * Now original factor levels are retained and used for coef names 6) Improvements to the formula methods for grpnet and cv.grpnet * Previously used model.matrix() to build (parametric) design matrix * New argument: "use.rk" controls whether to use model.matrix() or rk.model.matrix() * New default: "use.rk = TRUE" uses rk.model.matrix() to build (nonparametric) design matrix 7) Intercept is now accounted for in "group" that is output of grpnet (and cv.grpnet) * Previously the returned "group" was the same regardless of the intercept * Now the group vector contains "0" as the first element if an intercept was used * Updated behavior is similar to behavior of model.matrix and rk.model.matrix 8) rk.model.matrix * New function for forming model (design) matrices using the rk() function * Designed to be a more flexible (nonparametric) alternative to model.matrix * Interactions of any order are formed via the row.kronecker function 9) rk * New function for forming a reproducing kernel (smoothing spline) basis * Designed to be an improvement of the bs() function in the "stats" package * Computes nominal, ordinal, and polynomial (linear, cubic, quintic) splines 10) row.kronecker * New function for computing the row-wise Kronecker product between X and Y * Note that X and Y are two matrices with the same number of rows * Used by the rk.model.matrix() function to form bases for interaction effects