Initial commit
[aggexp.git] / R / m_RidgeRegression.R
1 #' @include b_LinearAlgorithm.R
2
3 #' @title Ridge Regression Algorithm
4 #'
5 #' @description Ridge Regression Algorithm.
6 #' Inherits \code{\link{LinearAlgorithm}}
7 #'
8 #' @field lambda Value of lambda (let undefined for cross-validation). Default: undefined
9 #' @field lambdas Vector of "optimal" lambda values over time. TODO: remove for production
10 #'
11 RidgeRegression = setRefClass(
12 Class = "RidgeRegression",
13
14 fields = c(
15 lambda = "numeric",
16 lambdas = "numeric"
17 ),
18
19 contains = "LinearAlgorithm",
20
21 methods = list(
22 predict_noNA = function(XY, x)
23 {
24 if (length(lambda) > 0 || nrow(XY) < 30) #TODO: magic number
25 {
26 #simple ridge regression with fixed lambda (not enough history for CV)
27 X = matricize(XY[,names(XY) != "Measure"])
28 Y = XY[,"Measure"]
29 lambda_ = ifelse(length(lambda) > 0, lambda, LAMBDA)
30 weight = ridgeSolve(X, Y, lambda_)
31 }
32
33 else
34 {
35 #enough data for cross-validations
36 require(MASS, quietly=TRUE)
37 gridLambda = seq(0.05,5.05,0.1)
38 res_lmr = lm.ridge(Measure ~ . + 0, data=XY, lambda = gridLambda)
39 lambda_ = res_lmr$lambda[which.min(res_lmr$GCV)]
40 weight = as.matrix(coef(res_lmr))[which.min(res_lmr$GCV),]
41 }
42
43 lambdas <<- c(lambdas, lambda_)
44
45 appendWeight(weight)
46 return (matricize(x) %*% weight)
47 }
48 )
49 )