#' @include b_LinearAlgorithm.R #' @title Ridge Regression Algorithm #' #' @description Ridge Regression Algorithm. #' Inherits \code{\link{LinearAlgorithm}} #' #' @field lambda Value of lambda (let undefined for cross-validation). Default: undefined #' @field lambdas Vector of "optimal" lambda values over time. TODO: remove for production #' RidgeRegression = setRefClass( Class = "RidgeRegression", fields = c( lambda = "numeric", lambdas = "numeric" ), contains = "LinearAlgorithm", methods = list( predict_noNA = function(XY, x) { if (length(lambda) > 0 || nrow(XY) < 30) #TODO: magic number { #simple ridge regression with fixed lambda (not enough history for CV) X = matricize(XY[,names(XY) != "Measure"]) Y = XY[,"Measure"] lambda_ = ifelse(length(lambda) > 0, lambda, LAMBDA) weight = ridgeSolve(X, Y, lambda_) } else { #enough data for cross-validations require(MASS, quietly=TRUE) gridLambda = seq(0.05,5.05,0.1) res_lmr = lm.ridge(Measure ~ . + 0, data=XY, lambda = gridLambda) lambda_ = res_lmr$lambda[which.min(res_lmr$GCV)] weight = as.matrix(coef(res_lmr))[which.min(res_lmr$GCV),] } lambdas <<- c(lambdas, lambda_) appendWeight(weight) return (matricize(x) %*% weight) } ) )