rename pkg --> aggexp
[aggexp.git] / aggexp / R / m_GeneralizedAdditive.R
diff --git a/aggexp/R/m_GeneralizedAdditive.R b/aggexp/R/m_GeneralizedAdditive.R
new file mode 100644 (file)
index 0000000..5baf60b
--- /dev/null
@@ -0,0 +1,42 @@
+#' @include b_Algorithm.R
+
+#' @title Generalized Additive Model
+#'
+#' @description Generalized Additive Model using the \code{gam} package.
+#' Inherits \code{\link{Algorithm}}
+#'
+#' @field family Family of the distribution to be used. Default: gaussian().
+#'
+GeneralizedAdditive = setRefClass(
+       Class = "GeneralizedAdditive",
+
+       fields = c(
+               "family" #class "family"
+       ),
+
+       contains = "Algorithm",
+
+       methods = list(
+               initialize = function(...)
+               {
+                       callSuper(...)
+                       if (class(family) == "uninitializedField")
+                               family <<- gaussian()
+               },
+               predict_noNA = function(XY, x)
+               {
+                       #GAM need some data to provide reliable results
+                       if (nrow(XY) < 30)
+                       {
+                               X = XY[,names(XY) != "Measure"]
+                               Y = XY[,"Measure"]
+                               weight = ridgeSolve(X, Y, LAMBDA)
+                               return (matricize(x) %*% weight)
+                       }
+
+                       suppressPackageStartupMessages( require(gam) )
+                       g = gam(Measure ~ ., data=XY, family=family)
+                       return (stats::predict(g, x))
+               }
+       )
+)