X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=pkg%2FR%2FForecaster.R;h=52587602ee9b6c3533c70fc1245b3bb0dc4616e4;hb=d2ab47a744d8fb29c03a76a7ca2368dae53f9a57;hp=47160b561647cc80c454de929384f41df412166f;hpb=5d83d8150dc135347d5ef39e5015b88f33fa9ee3;p=talweg.git diff --git a/pkg/R/Forecaster.R b/pkg/R/Forecaster.R index 47160b5..5258760 100644 --- a/pkg/R/Forecaster.R +++ b/pkg/R/Forecaster.R @@ -1,47 +1,71 @@ #' Forecaster #' -#' Forecaster (abstract class, implemented by all forecasters) +#' Forecaster (abstract class, implemented by all forecasters). #' -#' @docType class -#' @importFrom R6 R6Class +#' A Forecaster object encapsulates parameters (which can be of various kinds, for +#' example "Neighbors" method stores informations about the considered neighborhood for +#' the current prediction task) and one main function: \code{predictSerie()}. This last +#' function (by default) calls \code{predictShape()} to get a forecast of a centered +#' serie, and then calls the "jump prediction" function -- see "field" section -- to +#' adjust it based on the last observed values. +#' +#' @usage # Forecaster$new(pjump) #warning: predictShape() is unimplemented +#' +#' @field .params List of computed parameters (if applicable). +#' @field .pjump Function: how to predict the jump at day interface? The arguments of +#' this function are -- in this order: +#' \itemize{ +#' \item data : object output of \code{getData()}, +#' \item today : index (integer or date) of the last known day in data, +#' \item memory : number of days to use in the past (including today), +#' \item horizon : number of time steps to predict, +#' \item params : optimized parameters in the main method \code{predictShape()}, +#' \item ... : additional arguments. +#' } +#' .pjump returns an estimation of the jump after the last observed value. #' -#' @field params List of computed parameters, for post-run analysis (dev) -#' @field data Dataset, object of class Data -#' @field pjump Function: how to predict the jump at day interface ? +#' @section Methods: +#' \describe{ +#' \item{\code{initialize(data, pjump)}}{ +#' Initialize a Forecaster object with a Data object and a jump prediction function.} +#' \item{\code{predictSerie(today,memory,horizon,...)}}{ +#' Predict a new serie of \code{horizon} values at day index \code{today} using +#' \code{memory} days in the past.} +#' \item{\code{predictShape(today,memory,horizon,...)}}{ +#' Predict a new shape of \code{horizon} values at day index \code{today} using +#' \code{memory} days in the past.} +#' \item{\code{getParameters()}}{ +#' Return (internal) parameters.} +#' } +#' +#' @docType class +#' @format R6 class #' -#' @section Methods: \describe{ -#' \item{\code{initialize(data, pjump)}} -#' {Initialize a Forecaster object with a Data object and a jump prediction function.} -#' \item{\code{predictSerie(today,memory,horizon,...)}} -#' {Predict a new serie of \code{horizon} values at day index \code{today} using \code{memory} -#' days in the past.} -#' \item{\code{predictShape(today,memory,horizon,...)}} -#' {Predict a new shape of \code{horizon} values at day index \code{today} using \code{memory} -#' days in the past.} -#' \item{\code{getParameters()}} -#' {Return (internal) parameters.}} Forecaster = R6::R6Class("Forecaster", private = list( .params = list(), - .data = NULL, .pjump = NULL ), public = list( - initialize = function(data, pjump) + initialize = function(pjump) { - private$.data <- data private$.pjump <- pjump invisible(self) }, - predictSerie = function(today, memory, horizon, ...) + predictSerie = function(data, today, memory, predict_from, horizon, ...) { # Parameters (potentially) computed during shape prediction stage - predicted_shape = self$predictShape(today, memory, horizon, ...) - predicted_delta = private$.pjump(private$.data,today,memory,horizon,private$.params,...) - # Predicted shape is aligned it on the end of current day + jump - predicted_shape+tail(private$.data$getSerie(today),1)-predicted_shape[1]+predicted_delta + predicted_shape = self$predictShape(data,today,memory,predict_from,horizon,...) + predicted_delta = private$.pjump(data, today, memory, predict_from, horizon, + private$.params, ...) + + # Predicted shape is aligned on the end of current day + jump + c( data$getSerie(today)[if (predict_from>=2) 1:(predict_from-1) else c()], + predicted_shape - predicted_shape[1] + predicted_delta + + ifelse(predict_from>=2, + data$getSerie(today)[predict_from-1], tail(data$getSerie(today-1),1)) ) }, - predictShape = function(today, memory, horizon, ...) + predictShape = function(data, today, memory, predict_from, horizon, ...) NULL #empty default implementation: to implement in inherited classes , getParameters = function()