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