From dc1ae696cb6761ceefa9e591873bd993e1fbc908 Mon Sep 17 00:00:00 2001 From: Tanguy BARTHELEMY Date: Fri, 12 Jul 2024 09:26:04 +0200 Subject: [PATCH 01/18] lint space between function and parenthese --- R/arima.R | 2 +- R/calendars.R | 6 +++--- R/jd3rslts.R | 30 +++++++++++++++--------------- R/modellingcontext.R | 2 +- R/spec_regarima.R | 24 ++++++++++++------------ 5 files changed, 32 insertions(+), 32 deletions(-) diff --git a/R/arima.R b/R/arima.R index 47445da..ebf4e50 100644 --- a/R/arima.R +++ b/R/arima.R @@ -353,7 +353,7 @@ sarima_estimate<-function(x, order=c(0,0,0), seasonal = list(order=c(0,0,0), per if (length(res$b) > 0) { names_xreg <- colnames(xreg) - if (is.null (names_xreg) && !is.null (xreg)){ + if (is.null(names_xreg) && !is.null(xreg)){ if (is.matrix(xreg)) { # unnamed matrix regressors names_xreg <- sprintf("xreg_%i", seq_len(ncol(xreg))) diff --git a/R/calendars.R b/R/calendars.R index 3ad75c6..a5ff4b1 100644 --- a/R/calendars.R +++ b/R/calendars.R @@ -691,7 +691,7 @@ weighted_calendar<-function(calendars, weights){ #' \url{https://jdemetra-new-documentation.netlify.app/} #' @export national_calendar <- function(days, mean_correction=TRUE){ - if (! is.list(days)) stop ('Days should be a list of holidays') + if (! is.list(days)) stop('Days should be a list of holidays') return(structure(list(days=days, mean_correction=mean_correction), class=c('JD3_CALENDAR', 'JD3_CALENDARDEFINITION'))) } @@ -825,7 +825,7 @@ print.JD3_CALENDAR <- function(x, ...) { } #' @export -print.JD3_CHAINEDCALENDAR <- function (x, ...) +print.JD3_CHAINEDCALENDAR <- function(x, ...) { cat("First calendar before ", x$break_date, "\n", sep = "") print(x$calendar1) @@ -839,7 +839,7 @@ print.JD3_CHAINEDCALENDAR <- function (x, ...) } #' @export -print.JD3_WEIGHTEDCALENDAR <- function (x, ...) +print.JD3_WEIGHTEDCALENDAR <- function(x, ...) { for (index_cal in seq_along(x$weights)) { cat("Calendar n", index_cal, "\n", sep = "") diff --git a/R/jd3rslts.R b/R/jd3rslts.R index 6b41c5d..235ee6f 100644 --- a/R/jd3rslts.R +++ b/R/jd3rslts.R @@ -7,7 +7,7 @@ if (!is.jnull(s)) .jcall(s, "D", "doubleValue") else - return (NaN) + return(NaN) } #' @export #' @rdname jd3_utilities @@ -38,11 +38,11 @@ .proc_ts<-function(rslt, name){ s<-.jcall(rslt, "Ljava/lang/Object;", "getData", name) if (is.jnull(s)) - return (NULL) + return(NULL) if (.jinstanceof(s, "jdplus/toolkit/base/api/timeseries/TsData")) return(.jd2r_tsdata(.jcast(s,"jdplus/toolkit/base/api/timeseries/TsData"))) else - return (NULL) + return(NULL) } #' @export #' @rdname jd3_utilities @@ -80,7 +80,7 @@ if (is.jnull(s)) return(NULL) val<-.jcall(s, "D", "getValue") - return (val) + return(val) } #' @export #' @rdname jd3_utilities @@ -102,23 +102,23 @@ s<-.jcall(rslt, "Ljava/lang/Object;", "getData", name) if (is.jnull(s)) return(NULL) - return (.jd2r_matrix(s)) + return(.jd2r_matrix(s)) } #' @export #' @rdname jd3_utilities .proc_data<-function(rslt, name){ s<-.jcall(rslt, "Ljava/lang/Object;", "getData", name) if (is.jnull(s)) - return (NULL) + return(NULL) if (.jinstanceof(s, "jdplus/toolkit/base/api/timeseries/TsData")) return(.jd2r_tsdata(.jcast(s,"jdplus/toolkit/base/api/timeseries/TsData"))) else if (.jinstanceof(s, "java/lang/Number")) - return (.jcall(s, "D", "doubleValue")) + return(.jcall(s, "D", "doubleValue")) else if (.jinstanceof(s, "jdplus/toolkit/base/api/math/matrices/Matrix")) return(.jd2r_matrix(.jcast(s,"jdplus/toolkit/base/api/math/matrices/Matrix"))) else if (.jinstanceof(s, "jdplus/toolkit/base/api/data/Parameter")){ val<-.jcall(s, "D", "getValue") - return (c(val)) + return(c(val)) } else if (.jinstanceof(s, "[Ljdplus/toolkit/base/api/data/Parameter;")){ p<-.jcastToArray(s) len<-length(p) @@ -126,14 +126,14 @@ for (i in 1:len){ all[i]<-.jcall(p[[i]], "D", "getValue") } - return (all) + return(all) } else if (.jcall(.jcall(s, "Ljava/lang/Class;", "getClass"), "Z", "isArray")) - return (.jevalArray(s, silent=TRUE)) + return(.jevalArray(s, silent=TRUE)) else if (.jinstanceof(s, "jdplus/toolkit/base/api/stats/StatisticalTest")) { - return (.jd2r_test(s)) + return(.jd2r_test(s)) } else - return (.jcall(s, "S", "toString")) + return(.jcall(s, "S", "toString")) } #' @export @@ -151,7 +151,7 @@ keys[i] <- .jcall(.jcall(jiter, "Ljava/lang/Object;", "next"), "Ljava/lang/String;", "toString") } } - return (keys) + return(keys) } #' @export @@ -167,13 +167,13 @@ keys[i] <- .jcall(.jcall(jiter, "Ljava/lang/Object;", "next"), "Ljava/lang/String;", "toString") } } - return (keys) + return(keys) } #' @export #' @rdname jd3_utilities .proc_likelihood<-function(jrslt, prefix){ - return (list( + return(list( ll=.proc_numeric(jrslt, paste(prefix,"ll", sep="")), ssq=.proc_numeric(jrslt, paste(prefix,"ssqerr", sep="")), nobs=.proc_int(jrslt, paste(prefix,"nobs", sep="")), diff --git a/R/modellingcontext.R b/R/modellingcontext.R index d78b8a6..775f6bc 100644 --- a/R/modellingcontext.R +++ b/R/modellingcontext.R @@ -312,7 +312,7 @@ modelling_context<-function(calendars=NULL, variables=NULL){ variables[[i]] <- all_var } } - if (any (ts_var)) { + if (any(ts_var)) { # case of a simple ts dictionary # Use 'r' as the name of the dictionary variables <- c(variables[!ts_var], list(r = variables[ts_var])) diff --git a/R/spec_regarima.R b/R/spec_regarima.R index 42d8086..95d9d4d 100644 --- a/R/spec_regarima.R +++ b/R/spec_regarima.R @@ -67,18 +67,18 @@ add_outlier.default <- function(x, .create_outlier<-function(code, pos, name = NULL, coef=NULL){ res <- list(name=name, pos=pos, code=code, coef = .fixed_parameter(coef)) - return (res) + return(res) } .fixed_parameters<-function(coef){ ncoef<-length(coef) - if (ncoef == 0)return (NULL) + if (ncoef == 0)return(NULL) l<-lapply(coef, function(v){list(value=v, type='FIXED')}) - return (l) + return(l) } .fixed_parameter<-function(coef){ - if (is.null(coef)) return (NULL) - if (coef == 0) return (NULL) - return (list(value=coef, type='FIXED')) + if (is.null(coef)) return(NULL) + if (coef == 0) return(NULL) + return(list(value=coef, type='FIXED')) } @@ -97,7 +97,7 @@ remove_outlier.default <- function(x, date = NULL, name = NULL){ if (is.null(x$regression$outliers)) - return (x) + return(x) out_mat <- simplify2array(x$regression$outliers)[c("code", "pos", "name"),, drop = FALSE] if (is.null(type)) { out_mat["code",] <- "" @@ -115,7 +115,7 @@ remove_outlier.default <- function(x, out_id <- apply(out_mat,2, paste0, collapse = "") rm_out_id <- rbind(type = type, date = date, name = name) if (is.null(rm_out_id)) - return (x) + return(x) rm_out_id <- apply(rm_out_id,2, paste0, collapse = "") remove_out <- out_id %in% rm_out_id @@ -163,7 +163,7 @@ add_ramp.default <- function(x, .create_ramp<-function(start, end, name = NULL, coef=NULL){ res <- list(name=name, start=start, end=end, coef = .fixed_parameter(coef)) - return (res) + return(res) } #' @rdname add_outlier #' @export @@ -179,7 +179,7 @@ remove_ramp.default <- function(x, end = NULL, name = NULL){ if (is.null(x$regression$ramps)) - return (x) + return(x) rp_mat <- simplify2array(x$regression$ramps)[c("start", "end", "name"),, drop = FALSE] if (is.null(start)) { rp_mat["start",] <- "" @@ -193,7 +193,7 @@ remove_ramp.default <- function(x, rp_id <- apply(rp_mat,2, paste0, collapse = "") rm_rp_id <- rbind(start = start, end = end, name = name) if (is.null(rm_rp_id)) - return (x) + return(x) rm_rp_id <- apply(rm_rp_id,2, paste0, collapse = "") remove_rp <- rp_id %in% rm_rp_id @@ -1474,7 +1474,7 @@ add_usrdefvar.default <- function(x, label<-id } res <- list(id = id, name=label, lag=lag, coef = .fixed_parameter(coef), regeffect=regeffect) - return (res) + return(res) } From 926fd37078cefe77c25228b0426b9bf91483d1bb Mon Sep 17 00:00:00 2001 From: Tanguy BARTHELEMY Date: Thu, 29 Aug 2024 15:50:03 +0200 Subject: [PATCH 02/18] Add updated logos --- R/jd3rslts.R | 245 ++++---- R/spec_regarima.R | 2 +- man/figures/logo.png | Bin 235637 -> 253390 bytes man/figures/logo.svg | 621 ++++++++++++------- pkgdown/favicon/apple-touch-icon-120x120.png | Bin 12974 -> 13265 bytes pkgdown/favicon/apple-touch-icon-152x152.png | Bin 17564 -> 17969 bytes pkgdown/favicon/apple-touch-icon-180x180.png | Bin 21782 -> 22351 bytes pkgdown/favicon/apple-touch-icon-60x60.png | Bin 5152 -> 5223 bytes pkgdown/favicon/apple-touch-icon-76x76.png | Bin 6962 -> 7103 bytes pkgdown/favicon/apple-touch-icon.png | Bin 21782 -> 22351 bytes pkgdown/favicon/favicon-16x16.png | Bin 1171 -> 1204 bytes pkgdown/favicon/favicon-32x32.png | Bin 2508 -> 2504 bytes pkgdown/favicon/favicon.ico | Bin 15086 -> 15086 bytes 13 files changed, 507 insertions(+), 361 deletions(-) diff --git a/R/jd3rslts.R b/R/jd3rslts.R index 235ee6f..a52fdaf 100644 --- a/R/jd3rslts.R +++ b/R/jd3rslts.R @@ -3,188 +3,189 @@ #' @export #' @rdname jd3_utilities .proc_numeric<-function(rslt, name){ - s<-.jcall(rslt, "Ljava/lang/Object;", "getData", name) - if (!is.jnull(s)) - .jcall(s, "D", "doubleValue") - else - return(NaN) + s<-.jcall(rslt, "Ljava/lang/Object;", "getData", name) + if (!is.jnull(s)) + .jcall(s, "D", "doubleValue") + else + return(NaN) } #' @export #' @rdname jd3_utilities .proc_vector<-function(rslt, name){ - s<-.jcall(rslt, "Ljava/lang/Object;", "getData", name) - if (is.jnull(s)) - return(NULL) - .jevalArray(s) + s<-.jcall(rslt, "Ljava/lang/Object;", "getData", name) + if (is.jnull(s)) + return(NULL) + .jevalArray(s) } #' @export #' @rdname jd3_utilities .proc_int<-function(rslt, name){ - s<-.jcall(rslt, "Ljava/lang/Object;", "getData", name) - if (is.jnull(s)) - return(-1) - .jcall(s, "I", "intValue") + s<-.jcall(rslt, "Ljava/lang/Object;", "getData", name) + if (is.jnull(s)) + return(-1) + .jcall(s, "I", "intValue") } #' @export #' @rdname jd3_utilities .proc_bool<-function(rslt, name){ - s<-.jcall(rslt, "Ljava/lang/Object;", "getData", name) - if (is.jnull(s)) - return(FALSE) - .jcall(s, "Z", "booleanValue") + s<-.jcall(rslt, "Ljava/lang/Object;", "getData", name) + if (is.jnull(s)) + return(FALSE) + .jcall(s, "Z", "booleanValue") } #' @export #' @rdname jd3_utilities .proc_ts<-function(rslt, name){ - s<-.jcall(rslt, "Ljava/lang/Object;", "getData", name) - if (is.jnull(s)) - return(NULL) - if (.jinstanceof(s, "jdplus/toolkit/base/api/timeseries/TsData")) - return(.jd2r_tsdata(.jcast(s,"jdplus/toolkit/base/api/timeseries/TsData"))) - else - return(NULL) + s<-.jcall(rslt, "Ljava/lang/Object;", "getData", name) + if (is.jnull(s)) + return(NULL) + if (.jinstanceof(s, "jdplus/toolkit/base/api/timeseries/TsData")) + return(.jd2r_tsdata(.jcast(s,"jdplus/toolkit/base/api/timeseries/TsData"))) + else + return(NULL) } #' @export #' @rdname jd3_utilities .proc_str<-function(rslt, name){ - s<-.jcall(rslt, "Ljava/lang/Object;", "getData", name) - if (is.jnull(s)) - return(NULL) - .jcall(s, "S", "toString") + s<-.jcall(rslt, "Ljava/lang/Object;", "getData", name) + if (is.jnull(s)) + return(NULL) + .jcall(s, "S", "toString") } #' @export #' @rdname jd3_utilities .proc_desc<-function(rslt, name){ - s<-.jcall(rslt, "Ljava/lang/Object;", "getData", name) - if (is.jnull(s)) - return(NULL) - .jevalArray(s) + s<-.jcall(rslt, "Ljava/lang/Object;", "getData", name) + if (is.jnull(s)) + return(NULL) + .jevalArray(s) } #' @export #' @rdname jd3_utilities .proc_test<-function(rslt, name){ - s<-.jcall(rslt, "Ljava/lang/Object;", "getData", name) - if (is.jnull(s)) - return(NULL) - desc<-.jcall(s, "S", "getDescription") - val<-.jcall(s, "D", "getValue") - pval<-.jcall(s, "D", "getPvalue") - all<-c(val, pval) - attr(all, "description")<-desc - all + s<-.jcall(rslt, "Ljava/lang/Object;", "getData", name) + if (is.jnull(s)) + return(NULL) + desc<-.jcall(s, "S", "getDescription") + val<-.jcall(s, "D", "getValue") + pval<-.jcall(s, "D", "getPvalue") + all<-c(val, pval) + attr(all, "description")<-desc + all } #' @export #' @rdname jd3_utilities .proc_parameter<-function(rslt, name){ - s<-.jcall(rslt, "Ljava/lang/Object;", "getData", name) - if (is.jnull(s)) - return(NULL) - val<-.jcall(s, "D", "getValue") - return(val) + s<-.jcall(rslt, "Ljava/lang/Object;", "getData", name) + if (is.jnull(s)) + return(NULL) + val<-.jcall(s, "D", "getValue") + return(val) } #' @export #' @rdname jd3_utilities .proc_parameters<-function(rslt, name){ - jd_p<-.jcall(rslt, "Ljava/lang/Object;", "getData", name) - if (is.jnull(jd_p)) - return(NULL) - p<-.jcastToArray(jd_p) - len<-length(p) - all<-array(0, dim=c(len)) - for (i in 1:len){ - all[i]<-.jcall(p[[i]], "D", "getValue") - } - all + jd_p<-.jcall(rslt, "Ljava/lang/Object;", "getData", name) + if (is.jnull(jd_p)) + return(NULL) + p<-.jcastToArray(jd_p) + len<-length(p) + all<-array(0, dim=c(len)) + for (i in 1:len){ + all[i]<-.jcall(p[[i]], "D", "getValue") + } + all } #' @export #' @rdname jd3_utilities .proc_matrix<-function(rslt, name){ - s<-.jcall(rslt, "Ljava/lang/Object;", "getData", name) - if (is.jnull(s)) - return(NULL) - return(.jd2r_matrix(s)) + s<-.jcall(rslt, "Ljava/lang/Object;", "getData", name) + if (is.jnull(s)) + return(NULL) + return(.jd2r_matrix(s)) } #' @export #' @rdname jd3_utilities .proc_data<-function(rslt, name){ - s<-.jcall(rslt, "Ljava/lang/Object;", "getData", name) - if (is.jnull(s)) - return(NULL) - if (.jinstanceof(s, "jdplus/toolkit/base/api/timeseries/TsData")) - return(.jd2r_tsdata(.jcast(s,"jdplus/toolkit/base/api/timeseries/TsData"))) - else if (.jinstanceof(s, "java/lang/Number")) - return(.jcall(s, "D", "doubleValue")) - else if (.jinstanceof(s, "jdplus/toolkit/base/api/math/matrices/Matrix")) - return(.jd2r_matrix(.jcast(s,"jdplus/toolkit/base/api/math/matrices/Matrix"))) - else if (.jinstanceof(s, "jdplus/toolkit/base/api/data/Parameter")){ - val<-.jcall(s, "D", "getValue") - return(c(val)) - } else if (.jinstanceof(s, "[Ljdplus/toolkit/base/api/data/Parameter;")){ - p<-.jcastToArray(s) - len<-length(p) - all<-array(0, dim=c(len)) - for (i in 1:len){ - all[i]<-.jcall(p[[i]], "D", "getValue") + s<-.jcall(rslt, "Ljava/lang/Object;", "getData", name) + if (is.jnull(s)) { + return(NULL) + } + if (.jinstanceof(s, "jdplus/toolkit/base/api/timeseries/TsData")) { + return(.jd2r_tsdata(.jcast(s,"jdplus/toolkit/base/api/timeseries/TsData"))) + } else if (.jinstanceof(s, "java/lang/Number")) { + return(.jcall(s, "D", "doubleValue")) + } else if (.jinstanceof(s, "jdplus/toolkit/base/api/math/matrices/Matrix")) { + return(.jd2r_matrix(.jcast(s,"jdplus/toolkit/base/api/math/matrices/Matrix"))) + } else if (.jinstanceof(s, "jdplus/toolkit/base/api/data/Parameter")){ + val<-.jcall(s, "D", "getValue") + return(c(val)) + } else if (.jinstanceof(s, "[Ljdplus/toolkit/base/api/data/Parameter;")){ + p<-.jcastToArray(s) + len<-length(p) + all<-array(0, dim=c(len)) + for (i in 1:len){ + all[i]<-.jcall(p[[i]], "D", "getValue") + } + return(all) + } else if (.jcall(.jcall(s, "Ljava/lang/Class;", "getClass"), "Z", "isArray")) { + return(.jevalArray(s, silent=TRUE)) + } else if (.jinstanceof(s, "jdplus/toolkit/base/api/stats/StatisticalTest")) { + return(.jd2r_test(s)) + } else { + return(.jcall(s, "S", "toString")) } - return(all) - } else if (.jcall(.jcall(s, "Ljava/lang/Class;", "getClass"), "Z", "isArray")) - return(.jevalArray(s, silent=TRUE)) - else if (.jinstanceof(s, "jdplus/toolkit/base/api/stats/StatisticalTest")) { - return(.jd2r_test(s)) - } - else - return(.jcall(s, "S", "toString")) } #' @export #' @rdname jd3_utilities .proc_dictionary<-function(name){ - jmapping<-.jcall(name, "Ljdplus/toolkit/base/api/information/InformationMapping;", "getMapping") - jmap<-.jnew("java/util/LinkedHashMap") - .jcall(jmapping, "V", "fillDictionary", .jnull("java/lang/String"), .jcast(jmap, "java/util/Map"), TRUE) - jkeys<-.jcall(jmap, "Ljava/util/Set;", "keySet") - size<-.jcall(jkeys, "I", "size") - keys<-array(dim=size) - if (size >0){ - jiter<-.jcall(jkeys, "Ljava/util/Iterator;", "iterator") - for (i in 1:size){ - keys[i] <- .jcall(.jcall(jiter, "Ljava/lang/Object;", "next"), "Ljava/lang/String;", "toString") + jmapping<-.jcall(name, "Ljdplus/toolkit/base/api/information/InformationMapping;", "getMapping") + jmap<-.jnew("java/util/LinkedHashMap") + .jcall(jmapping, "V", "fillDictionary", .jnull("java/lang/String"), .jcast(jmap, "java/util/Map"), TRUE) + jkeys<-.jcall(jmap, "Ljava/util/Set;", "keySet") + size<-.jcall(jkeys, "I", "size") + keys<-array(dim=size) + if (size >0){ + jiter<-.jcall(jkeys, "Ljava/util/Iterator;", "iterator") + for (i in 1:size){ + keys[i] <- .jcall(.jcall(jiter, "Ljava/lang/Object;", "next"), "Ljava/lang/String;", "toString") + } } - } - return(keys) + return(keys) } #' @export #' @rdname jd3_utilities .proc_dictionary2<-function(jobj){ - jmap<-.jcall(jobj, "Ljava/util/Map;", "getDictionary") - jkeys<-.jcall(jmap, "Ljava/util/Set;", "keySet") - size<-.jcall(jkeys, "I", "size") - keys<-array(dim=size) - if (size > 0){ - jiter<-.jcall(jkeys, "Ljava/util/Iterator;", "iterator") - for (i in 1:size){ - keys[i] <- .jcall(.jcall(jiter, "Ljava/lang/Object;", "next"), "Ljava/lang/String;", "toString") + jmap<-.jcall(jobj, "Ljava/util/Map;", "getDictionary") + jkeys<-.jcall(jmap, "Ljava/util/Set;", "keySet") + size<-.jcall(jkeys, "I", "size") + keys<-array(dim=size) + if (size > 0){ + jiter<-.jcall(jkeys, "Ljava/util/Iterator;", "iterator") + for (i in 1:size){ + keys[i] <- .jcall(.jcall(jiter, "Ljava/lang/Object;", "next"), "Ljava/lang/String;", "toString") + } } - } - return(keys) + return(keys) } #' @export #' @rdname jd3_utilities .proc_likelihood<-function(jrslt, prefix){ - return(list( - ll=.proc_numeric(jrslt, paste(prefix,"ll", sep="")), - ssq=.proc_numeric(jrslt, paste(prefix,"ssqerr", sep="")), - nobs=.proc_int(jrslt, paste(prefix,"nobs", sep="")), - neffective=.proc_int(jrslt, paste(prefix,"neffective", sep="")), - nparams=.proc_int(jrslt, paste(prefix,"nparams", sep="")), - df=.proc_int(jrslt, paste(prefix,"df", sep="")), - aic=.proc_numeric(jrslt, paste(prefix,"aic", sep="")), - aicc=.proc_numeric(jrslt, paste(prefix,"aicc", sep="")), - bic=.proc_numeric(jrslt, paste(prefix,"bic", sep="")), - bic2=.proc_numeric(jrslt, paste(prefix,"bic2", sep="")), - bicc=.proc_numeric(jrslt, paste(prefix,"bicc", sep="")), - hannanquinn=.proc_numeric(jrslt, paste(prefix,"hannanquinn", sep=""))) - ) + return(list( + ll=.proc_numeric(jrslt, paste(prefix,"ll", sep="")), + ssq=.proc_numeric(jrslt, paste(prefix,"ssqerr", sep="")), + nobs=.proc_int(jrslt, paste(prefix,"nobs", sep="")), + neffective=.proc_int(jrslt, paste(prefix,"neffective", sep="")), + nparams=.proc_int(jrslt, paste(prefix,"nparams", sep="")), + df=.proc_int(jrslt, paste(prefix,"df", sep="")), + aic=.proc_numeric(jrslt, paste(prefix,"aic", sep="")), + aicc=.proc_numeric(jrslt, paste(prefix,"aicc", sep="")), + bic=.proc_numeric(jrslt, paste(prefix,"bic", sep="")), + bic2=.proc_numeric(jrslt, paste(prefix,"bic2", sep="")), + bicc=.proc_numeric(jrslt, paste(prefix,"bicc", sep="")), + hannanquinn=.proc_numeric(jrslt, paste(prefix,"hannanquinn", sep=""))) + ) } diff --git a/R/spec_regarima.R b/R/spec_regarima.R index c301e7f..88ed92f 100644 --- a/R/spec_regarima.R +++ b/R/spec_regarima.R @@ -782,7 +782,7 @@ set_arima.default <- function(x, coef[is.na(coef)] <- 0 } - if (any(!is.na(c(p, bp, q, bq)))) { + if (!all(is.na(c(p, bp, q, bq)))) { np <- ifelse(is.na(p), 0, p) nbp <- ifelse(is.na(bp), 0, bp) nq <- ifelse(is.na(q), 0, q) diff --git a/man/figures/logo.png b/man/figures/logo.png index 4bf3330a0fafe0ebe28ef20266fce25c6d7f6e84..faf7a0660fa2cf2022dc9ae06f5748ca0038ddf3 100644 GIT binary patch literal 253390 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 diff --git a/man/figures/logo.svg b/man/figures/logo.svg index 2011218..e7a8ac3 100644 --- a/man/figures/logo.svg +++ b/man/figures/logo.svg @@ -3,26 +3,27 @@ @@ -31,246 +32,252 @@ - - - - + - - - - - - - - + - - - - - - - - - - - - - - + - - - - + - - - - - - - - + - - - - + + + + + + - - + + + + - - - - - - - - + + + + + + + - - + + - - + + + + - - - + + - - + + + + + + - - - - - - - - - - - + - rjd3toolkit + + + + + + + + + + + + - github.com/rjdverse/rjd3toolkit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + diff --git a/pkgdown/favicon/apple-touch-icon-120x120.png b/pkgdown/favicon/apple-touch-icon-120x120.png index 7b60e221b4c9b60770331c1671baf1967c7b7f1e..8cf381dc9b0ef4ba1358a61582d2a7d30f31c8e8 100644 GIT binary patch delta 13122 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 delta 12809 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 Pe-@6bjhk%B;qZR|1>Fa{ diff --git a/pkgdown/favicon/apple-touch-icon-152x152.png b/pkgdown/favicon/apple-touch-icon-152x152.png index 88972477eb1ae2c307ddbc58156bb738102745c2..28214b0923d814cac9dc2f228d476e4fb95aa8d5 100644 GIT binary patch literal 17969 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 z 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

SXK#5 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 literal 21782 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
Wm0UXS3 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 diff --git a/pkgdown/favicon/apple-touch-icon-76x76.png b/pkgdown/favicon/apple-touch-icon-76x76.png index 9755d5c0b1b1bff2ff836788171e6b0369fd296c..5e68a997702c92db40af3f483ad1eacb6383ccca 100644 GIT binary patch delta 6914 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 literal 21782 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 delta 983 zcmV;|11S8o36lwsUw;AVP)t-s0000G3Je1Q0!lkHPe3;Y0|gcj5C8xGLpLscZ&WcS zB5q+zu%LFZpms4QBOezRUQs}wkZah&j@-(VpO0%22@X+3H;jE=&b*1ux`-JN6On>q z8WRy7Xiq~pFX+{q^xU8N z=BD}Oru5yQ@Y9*^)0y<$q43q3?b4a?)|>9rneEt}?9i9GpmyZTljO>j&$Wu{&XwfL zl-NfkbY#-#hK2(mad+5-N=&7zLwR%kHoEg>CKh%+Me&! znfBqLu)epVte1G9lY*d*cHhjH^xK~A(wO+)NH-*wEwT-^0PY zPC`3JJT*u>G`y^U`{$?Z+N0OdyxrNz!n~?!T}oh6L4RUaL&da&{O70h-=XQ&oZ-!v z;>MBT%$4NPnB~!!+sKmV)SB_$q20@r#Iu9Iu7B9EfXA+X!?J_Huz|j0000y zbW%=J0Dk}g0000013|zdis$Ge5^LA~{?`LZzxw+Y&KcAh)YKUn)YKW&)XvTp`}@C1 z1K0l7YZB;+B0<2wLEl!UM53_W-;4kN00(qQO+^Rj1_ur&0Q3)GIRF3v z{7FPXR2b7^U;qL}b`DNX4t7Qc2w-C1;^wij;eX}k12TbtnO{Iq$kxu@URXqcpP7L{ zR7_mL!O_Xt#nsJSQd~@wK}y=g)63h(*Uvv7Feq4Bia|y;Bs45MA~GsECN?f!R)#@N zJ|QtFIVCkMJtH$KTS1XQNjWDsFTbF$sJNuGEJs<1K}jVix4fdVs=B7Ou0BTvEYQ%{ z)PLO4+ScCM(Fs(cs%GES-P7CGKVjm;Nt4x;7^F0&Or17;hKG&K%vm_2wzr=*-_Xd|gazU`K5pIx3r)?;8CaqIWn{Oow6bPr1F->_9z9W* z9)0Hk001R)MObuXVRU6WV{&C-bY%cCFibKuEig7MFgH{&G&(amIxsLRFfckWFbG+| zzW@LLC3HntbYx+4WjbwdWNBu305UK#G%YYTEigA!F*G_eIXW;fD=;uRFfe%pcmtC~ F1aGpZ<`e(` diff --git a/pkgdown/favicon/favicon-32x32.png b/pkgdown/favicon/favicon-32x32.png index 146ba93bda28401e9bafc006e786044a92b288d3..5e6ba8b46a4f8bee3cd7c72cea4cf4deee2a22d8 100644 GIT binary patch delta 2258 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 kR53I(`~RnW?R@8JF&J($bTV}B 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 UlN63v!05%bnv9XLGDqhAFK7)pmH+?% literal 15086 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 MbmJI~5#Q*>R From 872b0753249ad6d0e7e3d13a78aed3a8c0802e68 Mon Sep 17 00:00:00 2001 From: Tanguy BARTHELEMY Date: Fri, 13 Sep 2024 15:33:03 +0200 Subject: [PATCH 03/18] lint lengths --- .lintr | 9 +++++++-- R/modellingcontext.R | 6 +++--- R/spec_regarima.R | 24 ++++++++++++------------ man/seasonality_canovahansen.Rd | 3 +++ man/seasonality_canovahansen_trigs.Rd | 6 ++++++ man/td_canovahansen.Rd | 13 +++++++++---- 6 files changed, 40 insertions(+), 21 deletions(-) diff --git a/.lintr b/.lintr index b6fce4f..3fe3049 100644 --- a/.lintr +++ b/.lintr @@ -1,4 +1,4 @@ -linters: linters_with_defaults( +linters: lintr::all_linters( indentation_linter = NULL, brace_linter = NULL, infix_spaces_linter = NULL, @@ -13,6 +13,11 @@ linters: linters_with_defaults( object_usage_linter = NULL, object_name_linter = NULL, line_length_linter = NULL, - commented_code_linter = NULL + commented_code_linter = NULL, + extraction_operator_linter = NULL, + implicit_integer_linter = NULL, + nonportable_path_linter = NULL, + undesirable_function_linter = NULL, + unnecessary_lambda_linter = NULL ) encoding: "UTF-8" diff --git a/R/modellingcontext.R b/R/modellingcontext.R index 775f6bc..2bb05d6 100644 --- a/R/modellingcontext.R +++ b/R/modellingcontext.R @@ -357,7 +357,7 @@ modelling_context<-function(calendars=NULL, variables=NULL){ if (n > 0){ ns<-names(r$calendars) # To take into account empty calendars - length_cal <- sapply(r$calendars, length) + length_cal <- lengths(r$calendars) lcal<-lapply((1:n)[length_cal!=0], function(i){ entry<-jd3.ModellingContext$CalendarsEntry$new() @@ -372,7 +372,7 @@ modelling_context<-function(calendars=NULL, variables=NULL){ n<-length(r$variables) if (n > 0){ ns<-names(r$variables) - length_var <- sapply(r$variables, length) + length_var <- lengths(r$variables) lvar<-lapply((1:n)[length_var!=0], function(i){ entry<-jd3.ModellingContext$VariablesEntry$new() entry$key<-ns[i] @@ -439,7 +439,7 @@ modelling_context<-function(calendars=NULL, variables=NULL){ ns<-names(r) n<-length(ns) # To take into account empty calendars - length_cal <- sapply(r, length) + length_cal <- lengths(r) p$calendars<-lapply((1:n)[length_cal!=0], function(i){ entry<-jd3.Calendars$CalendarsEntry$new() diff --git a/R/spec_regarima.R b/R/spec_regarima.R index 88ed92f..2d4b1f9 100644 --- a/R/spec_regarima.R +++ b/R/spec_regarima.R @@ -464,7 +464,7 @@ set_outlier.default <- function(x, va_name <- ifelse(is_tramo, "va", "defva") tcr_name <- ifelse(is_tramo, "tcrate", "monthlytcrate") - if (missing(critical.value) || any(is.na(critical.value))){ + if (missing(critical.value) || anyNA(critical.value)){ critical.value <- outlier[[va_name]] } else { outlier[[va_name]] <- critical.value[1] @@ -840,7 +840,7 @@ set_arima.default <- function(x, x$arima <- arima regression <- x$regression - if (missing(mean.type) || any(is.na(mean.type))) { + if (missing(mean.type) || anyNA(mean.type)) { mean.type <- "UNDEFINED" } else { mean.type <- match.arg(toupper(mean.type)[1], @@ -1019,7 +1019,7 @@ set_tradingdays.default <- function(x, is_tramo <- inherits(x, "JD3_TRAMO_SPEC") - if (!missing(option) && !any(is.na(option))){ + if (!missing(option) && !anyNA(option)){ option <- match.arg(toupper(option)[1], choices = c("TRADINGDAYS", "WORKINGDAYS", "NONE","USERDEFINED", "TD3", "TD3C", "TD4", "HOLIDAYS")) @@ -1032,11 +1032,11 @@ set_tradingdays.default <- function(x, td$users <- character() } - if (!missing(calendar.name) && !any(is.na(calendar.name))){ + if (!missing(calendar.name) && !anyNA(calendar.name)){ td$holidays <- calendar.name } if (!is.null(uservariable) && - !any(is.na(uservariable)) && + !anyNA(uservariable) && length(uservariable) > 0){ td$td <- "TD_NONE" td$holidays <- "" @@ -1058,7 +1058,7 @@ set_tradingdays.default <- function(x, td$autoadjust <- autoadjust } - if (!is.null(test) && !any(is.na(test))){ + if (!is.null(test) && !anyNA(test)){ if (is_tramo) { test <- match.arg(toupper(test)[1], choices = c("SEPARATE_T", "JOINT_F", "NONE")) @@ -1074,7 +1074,7 @@ set_tradingdays.default <- function(x, test) } } - if (!missing(automatic) && !any(is.na(automatic))){ + if (!missing(automatic) && !anyNA(automatic)){ if (is_tramo) { automatic <- match.arg(toupper(automatic)[1], choices = c("UNUSED", "FTEST", "WALDTEST", "AIC", "BIC")) @@ -1096,12 +1096,12 @@ set_tradingdays.default <- function(x, } if (is_tramo) { - if (!missing(pftd) && !any(is.na(pftd))){ + if (!missing(pftd) && !anyNA(pftd)){ td$ptest <- pftd } } - if (!is.null(leapyear) && !any(is.na(leapyear))) { + if (!is.null(leapyear) && !anyNA(leapyear)) { leapyear <- match.arg(toupper(leapyear), choices = c("LEAPYEAR", "LENGTHOFPERIOD", "NONE")) if (leapyear != "LENGTHOFPERIOD" || (leapyear == "LENGTHOFPERIOD" && !is_tramo)) { @@ -1232,7 +1232,7 @@ set_easter.default <- function(x, enabled = NA, # to set specific TRAMO/REGARIMA values is_tramo <- inherits(x, "JD3_TRAMO_SPEC") - if (!is.null(test) && !any(is.na(test))){ + if (!is.null(test) && !anyNA(test)){ if (is_tramo) { if (!is.logical(test)) { test <- match.arg(toupper(test)[1], @@ -1250,7 +1250,7 @@ set_easter.default <- function(x, enabled = NA, if (!missing(enabled) && !is.na(enabled)){ easter$type <- ifelse(enabled, "STANDARD", "UNUSED") } - if (is_tramo && !is.null(type) && !any(is.na(type))) { + if (is_tramo && !is.null(type) && !anyNA(type)) { # TRAMO SPECIFIC type <- match.arg(toupper(type)[1], choices = c("UNUSED", "STANDARD", "INCLUDEEASTER", "INCLUDEEASTERMONDAY")) @@ -1276,7 +1276,7 @@ set_easter.default <- function(x, enabled = NA, if (missing(coef) ||is.null(coef) || is.na(coef)) { } else { - if (missing(coef.type) || any(is.na(coef.type))) { + if (missing(coef.type) || anyNA(coef.type)) { coef.type <- "FIXED" } else { coef.type <- match.arg(toupper(coef.type)[1], diff --git a/man/seasonality_canovahansen.Rd b/man/seasonality_canovahansen.Rd index e4a8d52..a028b37 100644 --- a/man/seasonality_canovahansen.Rd +++ b/man/seasonality_canovahansen.Rd @@ -29,6 +29,9 @@ seasonality_canovahansen( \item{start}{Position of the first observation of the series} } +\value{ +list with the joint test and with details for the different seasonal variables +} \description{ Canova-Hansen seasonality test } diff --git a/man/seasonality_canovahansen_trigs.Rd b/man/seasonality_canovahansen_trigs.Rd index 0d7fc8e..0d912e1 100644 --- a/man/seasonality_canovahansen_trigs.Rd +++ b/man/seasonality_canovahansen_trigs.Rd @@ -18,6 +18,12 @@ seasonality_canovahansen_trigs( \item{periods}{Periodicities.} +\item{lag1}{Lagged variable in the regression model.} + +\item{kernel}{Kernel used to compute the robust covariance matrix.} + +\item{order}{The truncation parameter used to compute the robust covariance matrix.} + \item{original}{\code{TRUE} for original algorithm, \code{FALSE} for solution proposed by T. Proietti (based on Ox code).} } \description{ diff --git a/man/td_canovahansen.Rd b/man/td_canovahansen.Rd index 4857b3a..2bd3fe8 100644 --- a/man/td_canovahansen.Rd +++ b/man/td_canovahansen.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tests_td.R \name{td_canovahansen} \alias{td_canovahansen} -\title{Canova-Hansen Trading Days test} +\title{Canova-Hansen test for stable trading days} \usage{ td_canovahansen( s, @@ -14,12 +14,17 @@ td_canovahansen( \arguments{ \item{s}{a \code{ts} object that corresponds to the input time series to test.} -\item{differencing}{differencing lags.} +\item{differencing}{Differencing lags.} -\item{order}{} +\item{kernel}{Kernel used to compute the robust covariance matrix.} + +\item{order}{The truncation parameter used to compute the robust covariance matrix.} +} +\value{ +list with the joint test and with details for the different days (starting with Mondays). } \description{ -Canova-Hansen Trading Days test +Canova-Hansen test for stable trading days } \examples{ s<-log(ABS$X0.2.20.10.M) From df2a80f2ac6d896ea20b3148ba8128401b01a32d Mon Sep 17 00:00:00 2001 From: Tanguy BARTHELEMY Date: Fri, 13 Sep 2024 15:53:48 +0200 Subject: [PATCH 04/18] attachment::att_amend_desc() --- .Rbuildignore | 1 + .lintr | 13 ++++- DESCRIPTION | 62 ++++++++++++------------ dev/config_attachment.yaml | 12 +++++ inst/WORDLIST | 97 ++++++++++++++++++++++++++++++++++++++ tests/spelling.R | 3 ++ 6 files changed, 156 insertions(+), 32 deletions(-) create mode 100644 dev/config_attachment.yaml create mode 100644 inst/WORDLIST create mode 100644 tests/spelling.R diff --git a/.Rbuildignore b/.Rbuildignore index c07187b..1864b60 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -26,3 +26,4 @@ cran-comments.md ^reconf\.sh$ ^pom\.xml$ +^dev$ diff --git a/.lintr b/.lintr index 3fe3049..b331a6d 100644 --- a/.lintr +++ b/.lintr @@ -18,6 +18,17 @@ linters: lintr::all_linters( implicit_integer_linter = NULL, nonportable_path_linter = NULL, undesirable_function_linter = NULL, - unnecessary_lambda_linter = NULL + unnecessary_lambda_linter = NULL, + paste_linter = NULL, + function_argument_linter = NULL, + condition_message_linter = NULL, + unnecessary_concatenation_linter = NULL, + keyword_quote_linter = NULL, + fixed_regex_linter = NULL, + strings_as_factors_linter = NULL, + todo_comment_linter = NULL, + if_not_else_linter = NULL, + unnecessary_nested_if_linter = NULL, + undesirable_operator_linter = NULL ) encoding: "UTF-8" diff --git a/DESCRIPTION b/DESCRIPTION index aeedb8e..1dc5712 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,44 +1,45 @@ -Package: rjd3toolkit Type: Package +Package: rjd3toolkit Title: Utility Functions around 'JDemetra+ 3.0' Version: 3.2.4.9000 Authors@R: c( - person(given = "Jean", - family = "Palate", role = c("aut"), - email = "palatejean@gmail.com"), - person(given = "Alain", - family = "Quartier-la-Tente", role = c("aut"), - email = "alain.quartier@yahoo.fr", + person("Jean", "Palate", , "palatejean@gmail.com", role = "aut"), + person("Alain", "Quartier-la-Tente", , "alain.quartier@yahoo.fr", role = "aut", comment = c(ORCID = "0000-0001-7890-3857")), - person(given = "Tanguy", - family = "Barthelemy", role = c("aut", "cre", "art"), - email ="tanguy.barthelemy@insee.fr"), - person(given = "Anna", - family = "Smyk", role = c("aut"), - email ="anna.smyk@insee.fr") - ) -Description: R Interface to 'JDemetra+ 3.x' () time series analysis software. - It provides functions allowing to model time series (create outlier regressors, user-defined calendar regressors, - UCARIMA models...), to test the presence of trading days or seasonal effects and also - to set specifications in pre-adjustment and benchmarking when using rjd3x13 or rjd3tramoseats. + person("Tanguy", "Barthelemy", , "tanguy.barthelemy@insee.fr", role = c("aut", "cre", "art")), + person("Anna", "Smyk", , "anna.smyk@insee.fr", role = "aut") + ) +Description: R Interface to 'JDemetra+ 3.x' + () time series analysis software. It + provides functions allowing to model time series (create outlier + regressors, user-defined calendar regressors, UCARIMA models...), to + test the presence of trading days or seasonal effects and also to set + specifications in pre-adjustment and benchmarking when using rjd3x13 + or rjd3tramoseats. +License: file LICENSE +URL: https://github.com/rjdverse/rjd3toolkit, + https://rjdverse.github.io/rjd3toolkit/ +BugReports: https://github.com/rjdverse/rjd3toolkit/issues Depends: R (>= 4.1.0) Imports: - RProtoBuf (>= 0.4.20), - rJava (>= 1.0-6), checkmate, - methods -SystemRequirements: Java (>= 17) -License: file LICENSE -URL: https://github.com/rjdverse/rjd3toolkit, https://rjdverse.github.io/rjd3toolkit/ -LazyData: TRUE + graphics, + methods, + rJava (>= 1.0-6), + RProtoBuf (>= 0.4.20), + stats, + utils Suggests: - knitr, - rmarkdown -RoxygenNote: 7.3.2 -Roxygen: list(markdown = TRUE) -BugReports: https://github.com/rjdverse/rjd3toolkit/issues + spelling +VignetteBuilder: + knitr Encoding: UTF-8 +Language: en-US +LazyData: TRUE +Roxygen: list(markdown = TRUE) +RoxygenNote: 7.3.2 +SystemRequirements: Java (>= 17) Collate: 'utils.R' 'jd2r.R' @@ -65,4 +66,3 @@ Collate: 'timeseries.R' 'variables.R' 'zzz.R' -VignetteBuilder: knitr diff --git a/dev/config_attachment.yaml b/dev/config_attachment.yaml new file mode 100644 index 0000000..46e24ec --- /dev/null +++ b/dev/config_attachment.yaml @@ -0,0 +1,12 @@ +path.n: NAMESPACE +path.d: DESCRIPTION +dir.r: R +dir.v: vignettes +dir.t: tests +extra.suggests: ~ +pkg_ignore: ~ +document: yes +normalize: yes +inside_rmd: no +must.exist: yes +check_if_suggests_is_installed: yes diff --git a/inst/WORDLIST b/inst/WORDLIST new file mode 100644 index 0000000..6e9ba23 --- /dev/null +++ b/inst/WORDLIST @@ -0,0 +1,97 @@ +AICC +ALLSAINTSDAY +AO +ASHWEDNESDAY +Anhalt +Arima +BPhi +BTheta +Benchmarking +Bera +CMD +CORPUSCHRISTI +CalendarTimeSeries +Canova +Changelog +Differencing +Doornik +EASTERMONDAY +EUPL +GH +GOODFRIDAY +Hannan +JDemetra +JULIANEASTER +Jarque +Kruskall +Labour +Ladiray +LeapYear +LengthOfPeriod +Licence +Ljung +LjungBox +MAUNDYTHURSDAY +Modelling +NEWYEAR +Periodicities +Pre +PreComputed +Proietti +QS +Quenneville +REGARIMA +ReduceCV +RegARIMA +RegArima +Rissanen +SARIMA +SHROVEMONDAY +SHROVETUESDAY +Shenton +TRAMO +TRAMOSEATS +Tramo +UC +UCARIMA +UserDefined +WHITMONDAY +Wurttemberg +YYYY +acf +ar +arima +arma +backcasts +bd +benchmarking +bp +cancelled +checkmodel +corrrelations +datesin +ddata +differencing +docstrings +easter +jdemetra +kolmogorov +len +modelling +moduli +nd +param +pos +pre +preeceding +regarima +rjd +rjdtramoseats +stdev +th +tha +tramo +tramoseats +userdefined +varance +xCV diff --git a/tests/spelling.R b/tests/spelling.R new file mode 100644 index 0000000..6713838 --- /dev/null +++ b/tests/spelling.R @@ -0,0 +1,3 @@ +if(requireNamespace('spelling', quietly = TRUE)) + spelling::spell_check_test(vignettes = TRUE, error = FALSE, + skip_on_cran = TRUE) From 45c7371850055910925436c38348ffa7f30c0e74 Mon Sep 17 00:00:00 2001 From: Tanguy BARTHELEMY Date: Fri, 13 Sep 2024 17:24:15 +0200 Subject: [PATCH 05/18] change spelling --- DESCRIPTION | 2 +- R/arima.R | 2 +- R/calendars.R | 4 +- R/differencing.R | 22 ++++---- R/generics.R | 2 +- R/modellingcontext.R | 4 +- R/spec_benchmarking.R | 2 +- R/spec_regarima.R | 22 ++++---- R/tests_regular.R | 2 +- R/timeseries.R | 8 +-- R/utils.R | 4 +- R/variables.R | 2 +- inst/WORDLIST | 112 ++++++++++++++++++++------------------- man/add_outlier.Rd | 2 +- man/add_usrdefvar.Rd | 2 +- man/calendar_td.Rd | 2 +- man/data_to_ts.Rd | 4 +- man/differencing_fast.Rd | 12 ++--- man/do_stationary.Rd | 10 ++-- man/ljungbox.Rd | 2 +- man/long_term_mean.Rd | 2 +- man/modelling_context.Rd | 2 +- man/periodic.dummies.Rd | 2 +- man/sa_decomposition.Rd | 2 +- man/set_arima.Rd | 2 +- man/set_automodel.Rd | 2 +- man/set_basic.Rd | 2 +- man/set_benchmarking.Rd | 2 +- man/set_easter.Rd | 2 +- man/set_estimate.Rd | 2 +- man/set_outlier.Rd | 2 +- man/set_tradingdays.Rd | 2 +- man/set_transform.Rd | 4 +- man/td.Rd | 2 +- man/ts_adjust.Rd | 4 +- man/tsdata_of.Rd | 2 +- man/ucarima_wk.Rd | 2 +- 37 files changed, 131 insertions(+), 129 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 1dc5712..38e55d1 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -35,7 +35,7 @@ Suggests: VignetteBuilder: knitr Encoding: UTF-8 -Language: en-US +Language: en-GB LazyData: TRUE Roxygen: list(markdown = TRUE) RoxygenNote: 7.3.2 diff --git a/R/arima.R b/R/arima.R index d72d520..af77660 100644 --- a/R/arima.R +++ b/R/arima.R @@ -276,7 +276,7 @@ ucarima_model<-function(model=NULL, components, complements=NULL, checkmodel=FAL #' @param cmp Index of the component for which we want to compute the filter #' @param signal TRUE for the signal (component), FALSE for the noise (complement) #' @param nspectrum Number of points used to compute the (pseudo-) spectrum of the estimator -#' @param nwk Number of weights of the wiener-kolmogorov filter returned in the result +#' @param nwk Number of weights of the Wiener-Kolmogorov filter returned in the result #' #' @return A list with the (pseudo-)spectrum, the weights of the filter and the squared-gain function (with the same number of points as the spectrum) #' @export diff --git a/R/calendars.R b/R/calendars.R index a5ff4b1..35d8596 100644 --- a/R/calendars.R +++ b/R/calendars.R @@ -318,7 +318,7 @@ special_day<-function(event, offset=0, weight=1, validity=NULL){ #' @param groups Groups of days. The length of the array must be 7. It indicates to what group each week day #' belongs. The first item corresponds to Mondays and the last one to Sundays. The group used for contrasts (usually Sundays) is identified by 0. #' The other groups are identified by 1, 2,... n (<= 6). For instance, usual trading days are defined by c(1,2,3,4,5,6,0), -#' week days by c(1,1,1,1,1,0,0), week days, Saturdays, Sundays by c(1,1,1,1,1,2,0) etc... +#' week days by c(1,1,1,1,1,0,0), week days, Saturdays, Sundays by c(1,1,1,1,1,2,0) etc. #' @param contrasts If true, the variables are defined by contrasts with the 0-group. Otherwise, raw number of days is provided. #' @return Time series (object of class \code{c("ts","mts","matrix")}) corresponding to each group, starting with the 0-group (\code{contrasts = FALSE}) #' or the 1-group (\code{contrasts = TRUE}). @@ -695,7 +695,7 @@ national_calendar <- function(days, mean_correction=TRUE){ return(structure(list(days=days, mean_correction=mean_correction), class=c('JD3_CALENDAR', 'JD3_CALENDARDEFINITION'))) } -#' Trading day regressors with pre-defined holidays +#' @title Trading day regressors with pre-defined holidays #' #' @description #' Allows to generate trading day regressors (as many as defined groups), taking into account diff --git a/R/differencing.R b/R/differencing.R index dbfc7d4..44ac908 100644 --- a/R/differencing.R +++ b/R/differencing.R @@ -25,11 +25,11 @@ NULL #' #' @return #' Stationary transformation -#' * ddata: data after differencing -#' * mean: mean correction -#' * differences: -#' * lag: ddata(t)=data(t)-data(t-lag) -#' * order: order of the differencing +#' * \code{ddata}: data after differencing +#' * \code{mean}: mean correction +#' * \code{differences}: +#' * \code{lag}: \eqn{ddata(t)=data(t)-data(t-lag)} +#' * \code{order}: order of the differencing #' @md #' @export #' @@ -56,15 +56,15 @@ do_stationary<-function(data, period){ #' @param period Period considered in the automatic differencing. #' @param mad Use of MAD in the computation of the variance (true by default). #' @param centile Percentage of the data used for computing the variance (90 by default). -#' @param k tolerance in the decrease of the variance. The algorithm stops if the new varance is higher than k*the old variance. +#' @param k tolerance in the decrease of the variance. The algorithm stops if the new variance is higher than k*the old variance. #' #' @return #' Stationary transformation -#' * ddata: data after differencing -#' * mean: mean correction -#' * differences: -#' * lag: ddata(t)=data(t)-data(t-lag) -#' * order: order of the differencing +#' * \code{ddata}: data after differencing +#' * \code{mean}: mean correction +#' * \code{differences}: +#' * \code{lag}: \eqn{ddata(t)=data(t)-data(t-lag)} +#' * \code{order}: order of the differencing #' @export #' #' @examples diff --git a/R/generics.R b/R/generics.R index b65c4cc..b75483a 100644 --- a/R/generics.R +++ b/R/generics.R @@ -41,7 +41,7 @@ sa_preprocessing<-function(x, ...){ #' @param type_chart the chart to plot: `"sa-trend"` (by default) plots the input time series, #' the seasonally adjusted and the trend; `"seas-irr"` plots the seasonal and the irregular components. #' @param caption the caption of the plot. -#' @param colors the colors used in the plot. +#' @param colors the colours used in the plot. #' @param ... further arguments. #' #' @return \code{"JD3_SADECOMPOSITION"} object. diff --git a/R/modellingcontext.R b/R/modellingcontext.R index 2bb05d6..2fae6cb 100644 --- a/R/modellingcontext.R +++ b/R/modellingcontext.R @@ -261,11 +261,11 @@ dynamic_ts<-function(moniker, data){ } -#' Create context +#' @title Create context #' @description #' Function allowing to include calendars and external regressors in a format that makes them usable #' in an estimation processes (seasonal adjustment or pre-processing). The regressors can be created with functions available in the package -#' or come from any other source, provided they are "TS" class objects. +#' or come from any other source, provided they are \code{ts} class objects. #' @param calendars list of calendars. #' @param variables list of variables. #' diff --git a/R/spec_benchmarking.R b/R/spec_benchmarking.R index 86629eb..4976ee8 100644 --- a/R/spec_benchmarking.R +++ b/R/spec_benchmarking.R @@ -15,7 +15,7 @@ #' @param forecast Boolean indicating if the forecasts of the seasonally adjusted series and of the target variable (\code{target}) are used in the benchmarking computation so that the benchmarking constrain is also applied to the forecasting period. #' @param bias TODO #' @details -#' \code{x} specification param must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} +#' \code{x} specification parameter must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} #' (or "JD3_REGARIMA_SPEC" generated with \code{rjd3x13::spec_regarima()} or "JD3_TRAMOSEATS_SPEC" #' generated with \code{rjd3tramoseats::spec_tramoseats()} or "JD3_TRAMO_SPEC" generated with #' \code{rjd3tramoseats::spec_tramo()}). diff --git a/R/spec_regarima.R b/R/spec_regarima.R index 2d4b1f9..ab1258d 100644 --- a/R/spec_regarima.R +++ b/R/spec_regarima.R @@ -12,7 +12,7 @@ #' @param coef the coefficient if needs to be fixed. If equal to 0 the outliers/ramps coefficients #' are estimated. #' @details -#' \code{x} specification param must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} +#' \code{x} specification parameter must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} #' (or "JD3_REGARIMA_SPEC" generated with \code{rjd3x13::spec_regarima()} or "JD3_TRAMOSEATS_SPEC" #' generated with \code{rjd3tramoseats::spec_tramoseats()} or "JD3_TRAMO_SPEC" generated with #' \code{rjd3tramoseats::spec_tramo()}). @@ -230,7 +230,7 @@ remove_ramp.default <- function(x, #' @param preprocessing (REGARIMA/X13 Specific) a Boolean to enable/disable the pre-processing. #' Option disabled for the moment. #' @details -#' \code{x} specification param must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} +#' \code{x} specification parameter must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} #' (or "JD3_REGARIMA_SPEC" generated with \code{rjd3x13::spec_regarima()} or "JD3_TRAMOSEATS_SPEC" #' generated with \code{rjd3tramoseats::spec_tramoseats()} or "JD3_TRAMO_SPEC" generated with #' \code{rjd3tramoseats::spec_tramo()}). @@ -312,7 +312,7 @@ set_basic.default <- function(x, #' (non-seasonal, seasonal) is increased.(Default value: 0.96) #' #' @details -#' \code{x} specification param must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} +#' \code{x} specification parameter must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} #' (or "JD3_REGARIMA_SPEC" generated with \code{rjd3x13::spec_regarima()} or "JD3_TRAMOSEATS_SPEC" #' generated with \code{rjd3tramoseats::spec_tramoseats()} or "JD3_TRAMO_SPEC" generated with #' \code{rjd3tramoseats::spec_tramo()}). @@ -402,7 +402,7 @@ set_estimate.default <- function(x, #' for parameter estimation in the intermediate steps. If \code{TRUE}, an exact likelihood estimation method is used. #' When \code{FALSE}, the fast Hannan-Rissanen method is used. #' @details -#' \code{x} specification param must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} +#' \code{x} specification parameter must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} #' (or "JD3_REGARIMA_SPEC" generated with \code{rjd3x13::spec_regarima()} or "JD3_TRAMOSEATS_SPEC" #' generated with \code{rjd3tramoseats::spec_tramoseats()} or "JD3_TRAMO_SPEC" generated with #' \code{rjd3tramoseats::spec_tramo()}). @@ -578,7 +578,7 @@ set_outlier.default <- function(x, #' @param amicompare (TRAMO Specific) \code{logical}. If `TRUE`, the program compares the model identified by the automatic procedure to the default model (\eqn{ARIMA(0,1,1)(0,1,1)}) #' and the model with the best fit is selected. Criteria considered are residual diagnostics, the model structure and the number of outliers. #' @details -#' \code{x} specification param must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} +#' \code{x} specification parameter must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} #' (or "JD3_REGARIMA_SPEC" generated with \code{rjd3x13::spec_regarima()} or "JD3_TRAMOSEATS_SPEC" #' generated with \code{rjd3tramoseats::spec_tramoseats()} or "JD3_TRAMO_SPEC" generated with #' \code{rjd3tramoseats::spec_tramo()}). @@ -712,7 +712,7 @@ set_automodel.default <- function(x, #' \code{"Fixed"} = the coefficients are fixed at the value provided by the user, #' \code{"Initial"} = the value defined by the user is used as the initial condition. #' @details -#' \code{x} specification param must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} +#' \code{x} specification parameter must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} #' (or "JD3_REGARIMA_SPEC" generated with \code{rjd3x13::spec_regarima()} or "JD3_TRAMOSEATS_SPEC" #' generated with \code{rjd3tramoseats::spec_tramoseats()} or "JD3_TRAMO_SPEC" generated with #' \code{rjd3tramoseats::spec_tramo()}). @@ -921,7 +921,7 @@ set_arima.default <- function(x, #' @param leapyear.coef coefficient of the leap year regressor. #' @param coef.type,leapyear.coef.type vector defining if the coefficients are fixed or estimated. #' @details -#' \code{x} specification param must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} +#' \code{x} specification parameter must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} #' (or "JD3_REGARIMA_SPEC" generated with \code{rjd3x13::spec_regarima()} or "JD3_TRAMOSEATS_SPEC" #' generated with \code{rjd3tramoseats::spec_tramoseats()} or "JD3_TRAMO_SPEC" generated with #' \code{rjd3tramoseats::spec_tramo()}). @@ -1191,7 +1191,7 @@ set_tradingdays.default <- function(x, #' \code{"IncludeEaster"} = influences the entire period (\code{n}) up to and including Easter Sunday; #' \code{"IncludeEasterMonday"} = influences the entire period (\code{n}) up to and including Easter Monday. #' @details -#' \code{x} specification param must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} +#' \code{x} specification parameter must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} #' (or "JD3_REGARIMA_SPEC" generated with \code{rjd3x13::spec_regarima()} or "JD3_TRAMOSEATS_SPEC" #' generated with \code{rjd3tramoseats::spec_tramoseats()} or "JD3_TRAMO_SPEC" generated with #' \code{rjd3tramoseats::spec_tramo()}). @@ -1309,10 +1309,10 @@ set_easter.default <- function(x, enabled = NA, #' @param aicdiff (REGARIMA/X-13 specific) a numeric defining the difference in AICC needed to accept no transformation when the automatic #' transformation selection is chosen (considered only when \code{fun = "Auto"}). Default= -2. #' @param fct (TRAMO specific) \code{numeric} controlling the bias in the log/level pre-test: -#' \code{transform.fct}> 1 favors levels, \code{transform.fct}< 1 favors logs. +#' \code{transform.fct}> 1 favours levels, \code{transform.fct}< 1 favours logs. #' Considered only when \code{fun = "Auto"}. #' @details -#' \code{x} specification param must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} +#' \code{x} specification parameter must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} #' (or "JD3_REGARIMA_SPEC" generated with \code{rjd3x13::spec_regarima()} or "JD3_TRAMOSEATS_SPEC" #' generated with \code{rjd3tramoseats::spec_tramoseats()} or "JD3_TRAMO_SPEC" generated with #' \code{rjd3tramoseats::spec_tramo()}). @@ -1401,7 +1401,7 @@ set_transform.default <- function(x, #' @param regeffect component to which the effect of the user-defined variable will be assigned. #' By default (`"Undefined"`), see details. #' @details -#' \code{x} specification param must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} +#' \code{x} specification parameter must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} #' (or "JD3_REGARIMA_SPEC" generated with \code{rjd3x13::spec_regarima()} or "JD3_TRAMOSEATS_SPEC" #' generated with \code{rjd3tramoseats::spec_tramoseats()} or "JD3_TRAMO_SPEC" generated with #' \code{rjd3tramoseats::spec_tramo()}). diff --git a/R/tests_regular.R b/R/tests_regular.R index d9ca469..d477cdc 100644 --- a/R/tests_regular.R +++ b/R/tests_regular.R @@ -55,7 +55,7 @@ print.JD3_TEST<-function(x, details=FALSE, ...){ #' @param k number of auto-correlations used in the test #' @param nhp number of hyper parameters (to correct the degree of freedom) #' @param lag number of lags used between two auto-correlations. -#' @param sign if `sign = 1`, only positive auto-corrrelations are considered in the test. +#' @param sign if `sign = 1`, only positive auto-correlations are considered in the test. #' If `sign = -1`, only negative auto-correlations are considered. #' If `sign = 0`, all auto-correlations are integrated in the test. #' @param mean Mean correction. If \code{TRUE}, the auto-correlations are computed as usual. diff --git a/R/timeseries.R b/R/timeseries.R index 3dab634..fe702d4 100644 --- a/R/timeseries.R +++ b/R/timeseries.R @@ -143,8 +143,8 @@ ts_interpolate.data.frame <- function(s, method=c("airline", "average")){ #' #' @param s The original time series #' @param method -#' LeapYear: correction for leap year -#' LengthOfPeriod: correction for the length of periods +#' \code{"LeapYear"}: correction for leap year +#' \code{"LengthOfPeriod"}: correction for the length of periods #' @param reverse Adjustment or reverse operation #' @return The interpolated series #' @@ -242,7 +242,7 @@ to_tscollection<-function(source, id, type="All"){ return(.p2r_tscollection(p)) } -#' Promote a R time series to a "full" ts of jdemetra +#' Promote a R time series to a "full" \code{ts} of JDemetra+ #' #' @param s R time series #' @param name name of the series @@ -288,7 +288,7 @@ data_to_ts<-function(s, name){ #' @param values Values of the time series #' @param dates Dates of the values (could be any date inside the considered period) #' -#' @return A ts object. The frequency will be identified automatically and missing values will be added in need be. +#' @return A \code{ts} object. The frequency will be identified automatically and missing values will be added in need be. #' The identified frequency will be the lowest frequency that match the figures. #' The provided data can contain missing values (NA) #' @export diff --git a/R/utils.R b/R/utils.R index 4658100..af588c9 100644 --- a/R/utils.R +++ b/R/utils.R @@ -53,7 +53,7 @@ test_anova<-function(ssm, dfm, ssr, dfr){ return(statisticaltest(val, pval, desc)) } -#' Title +#' Create an object JD3_LIKELIHOOD #' #' @param nobs #' @param neffectiveobs @@ -70,7 +70,7 @@ test_anova<-function(ssm, dfm, ssr, dfr){ #' @export #' #' @examples -likelihood<-function(nobs, neffectiveobs=NA, nparams=0, ll, adjustedll=NA, aic, aicc, bic, bicc, ssq){ +.likelihood<-function(nobs, neffectiveobs=NA, nparams=0, ll, adjustedll=NA, aic, aicc, bic, bicc, ssq){ if (is.na(neffectiveobs)) neffectiveobs<-nobs if (is.na(adjustedll)) adjustedll<-ll diff --git a/R/variables.R b/R/variables.R index 01d6658..865c585 100644 --- a/R/variables.R +++ b/R/variables.R @@ -297,7 +297,7 @@ intervention_variable<-function(frequency, start, length, s, starts, ends, delta #'@details #' The function periodic.dummies creates as many time series as types of periods in a year (4 or 12) #' with the value one only for one given type of period (ex Q1) -#' The function periodic.contrasts is based on periodic.dummies but adds -1 to the period preeceding a 1. +#' The periodic.contrasts function is based on periodic.dummies but adds -1 to the period preceding a 1. #'@examples #' # periodic dummies for a quarterly series #' p<-periodic.dummies(4, c(2000,1), 60) diff --git a/inst/WORDLIST b/inst/WORDLIST index 6e9ba23..53b7617 100644 --- a/inst/WORDLIST +++ b/inst/WORDLIST @@ -1,97 +1,99 @@ -AICC + ALLSAINTSDAY -AO ASHWEDNESDAY -Anhalt -Arima -BPhi -BTheta -Benchmarking -Bera -CMD CORPUSCHRISTI -CalendarTimeSeries -Canova -Changelog -Differencing -Doornik EASTERMONDAY -EUPL -GH GOODFRIDAY -Hannan -JDemetra JULIANEASTER +MAUNDYTHURSDAY +NEWYEAR +SHROVEMONDAY +SHROVETUESDAY +WHITMONDAY + +Doornik +Hannan +Rissanen Jarque Kruskall -Labour Ladiray -LeapYear -LengthOfPeriod -Licence Ljung LjungBox -MAUNDYTHURSDAY -Modelling -NEWYEAR -Periodicities -Pre -PreComputed -Proietti -QS Quenneville +Proietti +Shenton +Wurttemberg +Kolmogorov +Bera + +JDemetra +JD + +ar +arima +arma +Arima +SARIMA +UCARIMA REGARIMA -ReduceCV RegARIMA RegArima -Rissanen -SARIMA -SHROVEMONDAY -SHROVETUESDAY -Shenton +regarima + +rjd +rjdtramoseats +tramo TRAMO TRAMOSEATS Tramo +tramoseats + +AICC +AO +Anhalt +BPhi +BTheta +Benchmarking +CMD +CalendarTimeSeries +Changelog +Differencing +EUPL +GH +Canova +Modelling +Periodicities +Pre +PreComputed +QS +ReduceCV UC -UCARIMA UserDefined -WHITMONDAY -Wurttemberg YYYY acf -ar -arima -arma backcasts bd benchmarking bp -cancelled checkmodel -corrrelations datesin -ddata differencing docstrings easter -jdemetra -kolmogorov len modelling moduli nd -param pos pre -preeceding -regarima -rjd -rjdtramoseats stdev +st th tha -tramo -tramoseats userdefined -varance xCV +Stat +obs +java +DD +etc diff --git a/man/add_outlier.Rd b/man/add_outlier.Rd index c77c8ec..2215ef9 100644 --- a/man/add_outlier.Rd +++ b/man/add_outlier.Rd @@ -34,7 +34,7 @@ Generic function to add outliers or Ramp regressors (\code{add_outlier()} and \c to a specification or to remove them (\code{remove_outlier()} and \code{remove_ramp()}). } \details{ -\code{x} specification param must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} +\code{x} specification parameter must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} (or "JD3_REGARIMA_SPEC" generated with \code{rjd3x13::spec_regarima()} or "JD3_TRAMOSEATS_SPEC" generated with \code{rjd3tramoseats::spec_tramoseats()} or "JD3_TRAMO_SPEC" generated with \code{rjd3tramoseats::spec_tramo()}). diff --git a/man/add_usrdefvar.Rd b/man/add_usrdefvar.Rd index ce51027..b0f9b04 100644 --- a/man/add_usrdefvar.Rd +++ b/man/add_usrdefvar.Rd @@ -39,7 +39,7 @@ a specification, the external regressor(s) will also have to be added to a model before being used in an estimation process. see \code{\link{modelling_context}} and example. } \details{ -\code{x} specification param must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} +\code{x} specification parameter must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} (or "JD3_REGARIMA_SPEC" generated with \code{rjd3x13::spec_regarima()} or "JD3_TRAMOSEATS_SPEC" generated with \code{rjd3tramoseats::spec_tramoseats()} or "JD3_TRAMO_SPEC" generated with \code{rjd3tramoseats::spec_tramo()}). diff --git a/man/calendar_td.Rd b/man/calendar_td.Rd index b572304..9837dc8 100644 --- a/man/calendar_td.Rd +++ b/man/calendar_td.Rd @@ -29,7 +29,7 @@ parameters \code{frequency}, \code{start} and \code{length} are ignored.} \item{groups}{Groups of days. The length of the array must be 7. It indicates to what group each week day belongs. The first item corresponds to Mondays and the last one to Sundays. The group used for contrasts (usually Sundays) is identified by 0. The other groups are identified by 1, 2,... n (<= 6). For instance, usual trading days are defined by c(1,2,3,4,5,6,0), -week days by c(1,1,1,1,1,0,0), week days, Saturdays, Sundays by c(1,1,1,1,1,2,0) etc...} +week days by c(1,1,1,1,1,0,0), week days, Saturdays, Sundays by c(1,1,1,1,1,2,0) etc.} \item{holiday}{Day to aggregate holidays with. (holidays are considered as that day). 1 for Monday... 7 for Sunday. Doesn't necessary belong to the 0-group.} diff --git a/man/data_to_ts.Rd b/man/data_to_ts.Rd index 3716675..1fb6a60 100644 --- a/man/data_to_ts.Rd +++ b/man/data_to_ts.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/timeseries.R \name{data_to_ts} \alias{data_to_ts} -\title{Promote a R time series to a "full" ts of jdemetra} +\title{Promote a R time series to a "full" \code{ts} of JDemetra+} \usage{ data_to_ts(s, name) } @@ -12,7 +12,7 @@ data_to_ts(s, name) \item{name}{name of the series} } \description{ -Promote a R time series to a "full" ts of jdemetra +Promote a R time series to a "full" \code{ts} of JDemetra+ } \examples{ s<-ABS$X0.2.09.10.M diff --git a/man/differencing_fast.Rd b/man/differencing_fast.Rd index 6567827..cc47c7a 100644 --- a/man/differencing_fast.Rd +++ b/man/differencing_fast.Rd @@ -15,17 +15,17 @@ differencing_fast(data, period, mad = TRUE, centile = 90, k = 1.2) \item{centile}{Percentage of the data used for computing the variance (90 by default).} -\item{k}{tolerance in the decrease of the variance. The algorithm stops if the new varance is higher than k*the old variance.} +\item{k}{tolerance in the decrease of the variance. The algorithm stops if the new variance is higher than k*the old variance.} } \value{ Stationary transformation \itemize{ -\item ddata: data after differencing -\item mean: mean correction -\item differences: +\item \code{ddata}: data after differencing +\item \code{mean}: mean correction +\item \code{differences}: \itemize{ -\item lag: ddata(t)=data(t)-data(t-lag) -\item order: order of the differencing +\item \code{lag}: \eqn{ddata(t)=data(t)-data(t-lag)} +\item \code{order}: order of the differencing } } } diff --git a/man/do_stationary.Rd b/man/do_stationary.Rd index c9ed90a..2cca62f 100644 --- a/man/do_stationary.Rd +++ b/man/do_stationary.Rd @@ -14,12 +14,12 @@ do_stationary(data, period) \value{ Stationary transformation \itemize{ -\item ddata: data after differencing -\item mean: mean correction -\item differences: +\item \code{ddata}: data after differencing +\item \code{mean}: mean correction +\item \code{differences}: \itemize{ -\item lag: ddata(t)=data(t)-data(t-lag) -\item order: order of the differencing +\item \code{lag}: \eqn{ddata(t)=data(t)-data(t-lag)} +\item \code{order}: order of the differencing } } } diff --git a/man/ljungbox.Rd b/man/ljungbox.Rd index 1947fd1..8ceda81 100644 --- a/man/ljungbox.Rd +++ b/man/ljungbox.Rd @@ -15,7 +15,7 @@ ljungbox(data, k = 1, lag = 1, nhp = 0, sign = 0, mean = TRUE) \item{nhp}{number of hyper parameters (to correct the degree of freedom)} -\item{sign}{if \code{sign = 1}, only positive auto-corrrelations are considered in the test. +\item{sign}{if \code{sign = 1}, only positive auto-correlations are considered in the test. If \code{sign = -1}, only negative auto-correlations are considered. If \code{sign = 0}, all auto-correlations are integrated in the test.} diff --git a/man/long_term_mean.Rd b/man/long_term_mean.Rd index cba3803..04f5034 100644 --- a/man/long_term_mean.Rd +++ b/man/long_term_mean.Rd @@ -19,7 +19,7 @@ long_term_mean( \item{groups}{Groups of days. The length of the array must be 7. It indicates to what group each week day belongs. The first item corresponds to Mondays and the last one to Sundays. The group used for contrasts (usually Sundays) is identified by 0. The other groups are identified by 1, 2,... n (<= 6). For instance, usual trading days are defined by c(1,2,3,4,5,6,0), -week days by c(1,1,1,1,1,0,0), week days, Saturdays, Sundays by c(1,1,1,1,1,2,0) etc...} +week days by c(1,1,1,1,1,0,0), week days, Saturdays, Sundays by c(1,1,1,1,1,2,0) etc.} \item{holiday}{Day to aggregate holidays with. (holidays are considered as that day). 1 for Monday... 7 for Sunday. Doesn't necessary belong to the 0-group.} diff --git a/man/modelling_context.Rd b/man/modelling_context.Rd index e2015d6..b00e486 100644 --- a/man/modelling_context.Rd +++ b/man/modelling_context.Rd @@ -17,7 +17,7 @@ list of calendars and variables \description{ Function allowing to include calendars and external regressors in a format that makes them usable in an estimation processes (seasonal adjustment or pre-processing). The regressors can be created with functions available in the package -or come from any other source, provided they are "TS" class objects. +or come from any other source, provided they are \code{ts} class objects. } \examples{ # creating one or several external regressors (TS objects), which will diff --git a/man/periodic.dummies.Rd b/man/periodic.dummies.Rd index 076561a..c5e5573 100644 --- a/man/periodic.dummies.Rd +++ b/man/periodic.dummies.Rd @@ -24,7 +24,7 @@ Periodic dummies and contrasts \details{ The function periodic.dummies creates as many time series as types of periods in a year (4 or 12) with the value one only for one given type of period (ex Q1) -The function periodic.contrasts is based on periodic.dummies but adds -1 to the period preeceding a 1. +The periodic.contrasts function is based on periodic.dummies but adds -1 to the period preceding a 1. } \examples{ # periodic dummies for a quarterly series diff --git a/man/sa_decomposition.Rd b/man/sa_decomposition.Rd index 4631ba5..ae15ca5 100644 --- a/man/sa_decomposition.Rd +++ b/man/sa_decomposition.Rd @@ -39,7 +39,7 @@ the seasonally adjusted and the trend; \code{"seas-irr"} plots the seasonal and \item{caption}{the caption of the plot.} -\item{colors}{the colors used in the plot.} +\item{colors}{the colours used in the plot.} } \value{ \code{"JD3_SADECOMPOSITION"} object. diff --git a/man/set_arima.Rd b/man/set_arima.Rd index 66e0134..ba38981 100644 --- a/man/set_arima.Rd +++ b/man/set_arima.Rd @@ -47,7 +47,7 @@ Function allowing to customize the ARIMA model structure when the automatic modelling is disabled.(see example) } \details{ -\code{x} specification param must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} +\code{x} specification parameter must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} (or "JD3_REGARIMA_SPEC" generated with \code{rjd3x13::spec_regarima()} or "JD3_TRAMOSEATS_SPEC" generated with \code{rjd3tramoseats::spec_tramoseats()} or "JD3_TRAMO_SPEC" generated with \code{rjd3tramoseats::spec_tramo()}). diff --git a/man/set_automodel.Rd b/man/set_automodel.Rd index bca1cfe..9f75648 100644 --- a/man/set_automodel.Rd +++ b/man/set_automodel.Rd @@ -90,7 +90,7 @@ and the model with the best fit is selected. Criteria considered are residual di Function allowing to customize Arima model identification procedure. } \details{ -\code{x} specification param must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} +\code{x} specification parameter must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} (or "JD3_REGARIMA_SPEC" generated with \code{rjd3x13::spec_regarima()} or "JD3_TRAMOSEATS_SPEC" generated with \code{rjd3tramoseats::spec_tramoseats()} or "JD3_TRAMO_SPEC" generated with \code{rjd3tramoseats::spec_tramo()}). diff --git a/man/set_basic.Rd b/man/set_basic.Rd index dcae4a5..37d6202 100644 --- a/man/set_basic.Rd +++ b/man/set_basic.Rd @@ -40,7 +40,7 @@ Function allowing to check if the series can be processed and to define a sub-sp estimation will be performed } \details{ -\code{x} specification param must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} +\code{x} specification parameter must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} (or "JD3_REGARIMA_SPEC" generated with \code{rjd3x13::spec_regarima()} or "JD3_TRAMOSEATS_SPEC" generated with \code{rjd3tramoseats::spec_tramoseats()} or "JD3_TRAMO_SPEC" generated with \code{rjd3tramoseats::spec_tramo()}). diff --git a/man/set_benchmarking.Rd b/man/set_benchmarking.Rd index b2913f2..cd9b280 100644 --- a/man/set_benchmarking.Rd +++ b/man/set_benchmarking.Rd @@ -37,7 +37,7 @@ seasonally adjusted and raw (or calendar adjusted) data, as seasonal adjustment and the corresponding annual totals of raw (or calendar adjusted) series. } \details{ -\code{x} specification param must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} +\code{x} specification parameter must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} (or "JD3_REGARIMA_SPEC" generated with \code{rjd3x13::spec_regarima()} or "JD3_TRAMOSEATS_SPEC" generated with \code{rjd3tramoseats::spec_tramoseats()} or "JD3_TRAMO_SPEC" generated with \code{rjd3tramoseats::spec_tramo()}). diff --git a/man/set_easter.Rd b/man/set_easter.Rd index 9d13af6..2b95528 100644 --- a/man/set_easter.Rd +++ b/man/set_easter.Rd @@ -49,7 +49,7 @@ Possible procedures are: \code{"Estimated"} = coefficient is estimated, Set Easter effect correction in Pre-Processing Specification } \details{ -\code{x} specification param must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} +\code{x} specification parameter must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} (or "JD3_REGARIMA_SPEC" generated with \code{rjd3x13::spec_regarima()} or "JD3_TRAMOSEATS_SPEC" generated with \code{rjd3tramoseats::spec_tramoseats()} or "JD3_TRAMO_SPEC" generated with \code{rjd3tramoseats::spec_tramo()}). diff --git a/man/set_estimate.Rd b/man/set_estimate.Rd index 2ebe48a..0e986e1 100644 --- a/man/set_estimate.Rd +++ b/man/set_estimate.Rd @@ -47,7 +47,7 @@ Function allowing to define numeric boundaries for estimation and to define a su reg-arima (tramo) modelling will be performed (pre-processing step) } \details{ -\code{x} specification param must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} +\code{x} specification parameter must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} (or "JD3_REGARIMA_SPEC" generated with \code{rjd3x13::spec_regarima()} or "JD3_TRAMOSEATS_SPEC" generated with \code{rjd3tramoseats::spec_tramoseats()} or "JD3_TRAMO_SPEC" generated with \code{rjd3tramoseats::spec_tramo()}). diff --git a/man/set_outlier.Rd b/man/set_outlier.Rd index c2581fd..5bf0993 100644 --- a/man/set_outlier.Rd +++ b/man/set_outlier.Rd @@ -58,7 +58,7 @@ Function allowing to customize the automatic outlier detection process built in in the pre-processing step (regarima or tramo) } \details{ -\code{x} specification param must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} +\code{x} specification parameter must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} (or "JD3_REGARIMA_SPEC" generated with \code{rjd3x13::spec_regarima()} or "JD3_TRAMOSEATS_SPEC" generated with \code{rjd3tramoseats::spec_tramoseats()} or "JD3_TRAMO_SPEC" generated with \code{rjd3tramoseats::spec_tramo()}). diff --git a/man/set_tradingdays.Rd b/man/set_tradingdays.Rd index 0cc5e5e..da242a1 100644 --- a/man/set_tradingdays.Rd +++ b/man/set_tradingdays.Rd @@ -90,7 +90,7 @@ All the built-in regressors are meant to correct for type of day effect but don't take into account any holiday. To do so user-defined regressors have to be built. } \details{ -\code{x} specification param must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} +\code{x} specification parameter must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} (or "JD3_REGARIMA_SPEC" generated with \code{rjd3x13::spec_regarima()} or "JD3_TRAMOSEATS_SPEC" generated with \code{rjd3tramoseats::spec_tramoseats()} or "JD3_TRAMO_SPEC" generated with \code{rjd3tramoseats::spec_tramo()}). diff --git a/man/set_transform.Rd b/man/set_transform.Rd index 0d17928..10dd107 100644 --- a/man/set_transform.Rd +++ b/man/set_transform.Rd @@ -30,14 +30,14 @@ in the test for the log-level specification (\code{fun = "Auto"}). By default to transformation selection is chosen (considered only when \code{fun = "Auto"}). Default= -2.} \item{fct}{(TRAMO specific) \code{numeric} controlling the bias in the log/level pre-test: -\code{transform.fct}> 1 favors levels, \code{transform.fct}< 1 favors logs. +\code{transform.fct}> 1 favours levels, \code{transform.fct}< 1 favours logs. Considered only when \code{fun = "Auto"}.} } \description{ Set Log-level Transformation and Decomposition scheme in Pre-Processing Specification } \details{ -\code{x} specification param must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} +\code{x} specification parameter must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} (or "JD3_REGARIMA_SPEC" generated with \code{rjd3x13::spec_regarima()} or "JD3_TRAMOSEATS_SPEC" generated with \code{rjd3tramoseats::spec_tramoseats()} or "JD3_TRAMO_SPEC" generated with \code{rjd3tramoseats::spec_tramo()}). diff --git a/man/td.Rd b/man/td.Rd index ff2d453..a93e9d4 100644 --- a/man/td.Rd +++ b/man/td.Rd @@ -25,7 +25,7 @@ parameters \code{frequency}, \code{start} and \code{length} are ignored.} \item{groups}{Groups of days. The length of the array must be 7. It indicates to what group each week day belongs. The first item corresponds to Mondays and the last one to Sundays. The group used for contrasts (usually Sundays) is identified by 0. The other groups are identified by 1, 2,... n (<= 6). For instance, usual trading days are defined by c(1,2,3,4,5,6,0), -week days by c(1,1,1,1,1,0,0), week days, Saturdays, Sundays by c(1,1,1,1,1,2,0) etc...} +week days by c(1,1,1,1,1,0,0), week days, Saturdays, Sundays by c(1,1,1,1,1,2,0) etc.} \item{contrasts}{If true, the variables are defined by contrasts with the 0-group. Otherwise, raw number of days is provided.} } diff --git a/man/ts_adjust.Rd b/man/ts_adjust.Rd index 9956025..f474864 100644 --- a/man/ts_adjust.Rd +++ b/man/ts_adjust.Rd @@ -9,8 +9,8 @@ ts_adjust(s, method = c("LeapYear", "LengthOfPeriod"), reverse = FALSE) \arguments{ \item{s}{The original time series} -\item{method}{LeapYear: correction for leap year -LengthOfPeriod: correction for the length of periods} +\item{method}{\code{"LeapYear"}: correction for leap year +\code{"LengthOfPeriod"}: correction for the length of periods} \item{reverse}{Adjustment or reverse operation} } diff --git a/man/tsdata_of.Rd b/man/tsdata_of.Rd index 06cb886..6d1a462 100644 --- a/man/tsdata_of.Rd +++ b/man/tsdata_of.Rd @@ -12,7 +12,7 @@ tsdata_of(values, dates) \item{dates}{Dates of the values (could be any date inside the considered period)} } \value{ -A ts object. The frequency will be identified automatically and missing values will be added in need be. +A \code{ts} object. The frequency will be identified automatically and missing values will be added in need be. The identified frequency will be the lowest frequency that match the figures. The provided data can contain missing values (NA) } diff --git a/man/ucarima_wk.Rd b/man/ucarima_wk.Rd index 1fdce24..54616b1 100644 --- a/man/ucarima_wk.Rd +++ b/man/ucarima_wk.Rd @@ -15,7 +15,7 @@ ucarima_wk(ucm, cmp, signal = TRUE, nspectrum = 601, nwk = 300) \item{nspectrum}{Number of points used to compute the (pseudo-) spectrum of the estimator} -\item{nwk}{Number of weights of the wiener-kolmogorov filter returned in the result} +\item{nwk}{Number of weights of the Wiener-Kolmogorov filter returned in the result} } \value{ A list with the (pseudo-)spectrum, the weights of the filter and the squared-gain function (with the same number of points as the spectrum) From b057b2e3a8e413be58e0cfd046ba4e8983056499 Mon Sep 17 00:00:00 2001 From: Tanguy BARTHELEMY Date: Fri, 13 Sep 2024 17:29:35 +0200 Subject: [PATCH 06/18] likelihood --> .likelihood --- NAMESPACE | 2 +- R/protobuf.R | 2 +- R/regarima_rslts.R | 1 - man/{likelihood.Rd => dot-likelihood.Rd} | 10 +++++----- 4 files changed, 7 insertions(+), 8 deletions(-) rename man/{likelihood.Rd => dot-likelihood.Rd} (66%) diff --git a/NAMESPACE b/NAMESPACE index 678c1ac..2b5296e 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -79,6 +79,7 @@ export(.jd2r_ucarima) export(.jd2r_variables) export(.jd3_object) export(.jdomain) +export(.likelihood) export(.p2jd_calendar) export(.p2jd_calendars) export(.p2jd_context) @@ -213,7 +214,6 @@ export(intervention_variable) export(jarquebera) export(julianeaster_variable) export(kurtosis) -export(likelihood) export(ljungbox) export(long_term_mean) export(lp_variable) diff --git a/R/protobuf.R b/R/protobuf.R index abd02d7..be53063 100644 --- a/R/protobuf.R +++ b/R/protobuf.R @@ -187,7 +187,7 @@ NULL #' @export #' @rdname jd3_utilities .p2r_likelihood<-function(p){ - return(likelihood(p$nobs, p$neffectiveobs, p$nparams, + return(.likelihood(p$nobs, p$neffectiveobs, p$nparams, p$log_likelihood, p$adjusted_log_likelihood, p$aic, p$aicc, p$bic, p$bicc, p$ssq)) } diff --git a/R/regarima_rslts.R b/R/regarima_rslts.R index 2296a88..f594341 100644 --- a/R/regarima_rslts.R +++ b/R/regarima_rslts.R @@ -33,7 +33,6 @@ NULL )) } - .p2r_regarima_diagnostics<-function(p){ tlist<-lapply(p$residuals_tests, function(z){.p2r_test(z$value)}) tnames<-lapply(p$residuals_tests, function(z){z$key}) diff --git a/man/likelihood.Rd b/man/dot-likelihood.Rd similarity index 66% rename from man/likelihood.Rd rename to man/dot-likelihood.Rd index 90ea9ca..86d035f 100644 --- a/man/likelihood.Rd +++ b/man/dot-likelihood.Rd @@ -1,10 +1,10 @@ % Generated by roxygen2: do not edit by hand % Please edit documentation in R/utils.R -\name{likelihood} -\alias{likelihood} -\title{Title} +\name{.likelihood} +\alias{.likelihood} +\title{Create an object JD3_LIKELIHOOD} \usage{ -likelihood( +.likelihood( nobs, neffectiveobs = NA, nparams = 0, @@ -21,5 +21,5 @@ likelihood( \item{ssq}{} } \description{ -Title +Create an object JD3_LIKELIHOOD } From 18a73a9d9de554f8c241325590850a7fe476aad0 Mon Sep 17 00:00:00 2001 From: Tanguy BARTHELEMY Date: Fri, 13 Sep 2024 17:31:05 +0200 Subject: [PATCH 07/18] =?UTF-8?q?=C3=82tsmoniker=20-->=20.tsmoniker?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NAMESPACE | 2 +- R/modellingcontext.R | 4 ++-- man/{tsmoniker.Rd => dot-tsmoniker.Rd} | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) rename man/{tsmoniker.Rd => dot-tsmoniker.Rd} (79%) diff --git a/NAMESPACE b/NAMESPACE index 2b5296e..5cb7ef8 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -167,6 +167,7 @@ export(.r2p_ts) export(.r2p_tscollection) export(.r2p_tsdata) export(.r2p_uservars) +export(.tsmoniker) export(DATE_MAX) export(DATE_MIN) export(add_outlier) @@ -281,7 +282,6 @@ export(trigonometric_variables) export(ts_adjust) export(ts_interpolate) export(tsdata_of) -export(tsmoniker) export(ucarima_canonical) export(ucarima_estimate) export(ucarima_model) diff --git a/R/modellingcontext.R b/R/modellingcontext.R index 2fae6cb..c05c0af 100644 --- a/R/modellingcontext.R +++ b/R/modellingcontext.R @@ -15,7 +15,7 @@ JD3_TSCOLLECTION<-'JD3_TSCOLLECTION' #' @export #' #' @examples -tsmoniker<-function(source, id){ +.tsmoniker<-function(source, id){ return(structure(list(source=source, id=id), class=c(JD3_TSMONIKER))) } @@ -32,7 +32,7 @@ tsmoniker<-function(source, id){ #' @rdname jd3_utilities .p2r_moniker<-function(p){ if (is.null(p)) return(NULL) - return(tsmoniker(p$source, p$id)) + return(.tsmoniker(p$source, p$id)) } diff --git a/man/tsmoniker.Rd b/man/dot-tsmoniker.Rd similarity index 79% rename from man/tsmoniker.Rd rename to man/dot-tsmoniker.Rd index c9dec48..7d552be 100644 --- a/man/tsmoniker.Rd +++ b/man/dot-tsmoniker.Rd @@ -1,10 +1,10 @@ % Generated by roxygen2: do not edit by hand % Please edit documentation in R/modellingcontext.R -\name{tsmoniker} -\alias{tsmoniker} +\name{.tsmoniker} +\alias{.tsmoniker} \title{Title} \usage{ -tsmoniker(source, id) +.tsmoniker(source, id) } \arguments{ \item{source}{Source of the time series.} From a35b4c7d9ede4cf13a7d74edb790d960bb08d4aa Mon Sep 17 00:00:00 2001 From: Tanguy BARTHELEMY Date: Tue, 17 Sep 2024 14:22:32 +0200 Subject: [PATCH 08/18] lint pkg --- .lintr | 5 ++--- R/spec_regarima.R | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.lintr b/.lintr index b331a6d..592ca17 100644 --- a/.lintr +++ b/.lintr @@ -3,14 +3,13 @@ linters: lintr::all_linters( brace_linter = NULL, infix_spaces_linter = NULL, paren_body_linter = NULL, - #function_left_parentheses_linter = NULL, spaces_left_parentheses_linter = NULL, commas_linter = NULL, quotes_linter = NULL, object_length_linter = NULL, semicolon_linter = NULL, cyclocomp_linter = NULL, - object_usage_linter = NULL, + #object_usage_linter = NULL, object_name_linter = NULL, line_length_linter = NULL, commented_code_linter = NULL, @@ -23,7 +22,7 @@ linters: lintr::all_linters( function_argument_linter = NULL, condition_message_linter = NULL, unnecessary_concatenation_linter = NULL, - keyword_quote_linter = NULL, + #keyword_quote_linter = NULL, fixed_regex_linter = NULL, strings_as_factors_linter = NULL, todo_comment_linter = NULL, diff --git a/R/spec_regarima.R b/R/spec_regarima.R index ab1258d..924502d 100644 --- a/R/spec_regarima.R +++ b/R/spec_regarima.R @@ -1356,7 +1356,7 @@ set_transform.default <- function(x, if (!is.na(fun)){ transform$fn <- switch(fun, - "NONE" = "LEVEL", + NONE = "LEVEL", fun) } adjust <- match.arg(toupper(adjust[1]), From 669069f39ddc583e7063447651d06141eab445e0 Mon Sep 17 00:00:00 2001 From: Tanguy BARTHELEMY Date: Tue, 17 Sep 2024 14:27:57 +0200 Subject: [PATCH 09/18] add CITATION.cff file --- .Rbuildignore | 9 +-- CITATION.cff | 157 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 158 insertions(+), 8 deletions(-) create mode 100644 CITATION.cff diff --git a/.Rbuildignore b/.Rbuildignore index 1864b60..343d3ab 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -3,27 +3,20 @@ ^\.git$ ^\.github$ - ^README\.Rmd$ ^README-.*\.png$ - ^Meta$ ^docs$ ^doc$ ^pkgdown$ ^_pkgdown\.yml$ - ^\.lintr$ - ^appveyor\.yml$ .travis.yml - cran-comments.md - ^\.DS_Store$ - ^revdep$ ^reconf\.sh$ ^pom\.xml$ - ^dev$ +^CITATION\.cff$ diff --git a/CITATION.cff b/CITATION.cff new file mode 100644 index 0000000..5b11859 --- /dev/null +++ b/CITATION.cff @@ -0,0 +1,157 @@ +# -------------------------------------------- +# CITATION file created with {cffr} R package +# See also: https://docs.ropensci.org/cffr/ +# -------------------------------------------- + +cff-version: 1.2.0 +message: 'To cite package "rjd3toolkit" in publications use:' +type: software +title: 'rjd3toolkit: Utility Functions around ''JDemetra+ 3.0''' +version: 3.2.4.9000 +abstract: R Interface to 'JDemetra+ 3.x' () time series + analysis software. It provides functions allowing to model time series (create outlier + regressors, user-defined calendar regressors, UCARIMA models...), to test the presence + of trading days or seasonal effects and also to set specifications in pre-adjustment + and benchmarking when using rjd3x13 or rjd3tramoseats. +authors: +- family-names: Palate + given-names: Jean + email: palatejean@gmail.com +- family-names: Quartier-la-Tente + given-names: Alain + email: alain.quartier@yahoo.fr + orcid: https://orcid.org/0000-0001-7890-3857 +- family-names: Barthelemy + given-names: Tanguy + email: tanguy.barthelemy@insee.fr +- family-names: Smyk + given-names: Anna + email: anna.smyk@insee.fr +repository-code: https://github.com/rjdverse/rjd3toolkit +url: https://rjdverse.github.io/rjd3toolkit/ +contact: +- family-names: Barthelemy + given-names: Tanguy + email: tanguy.barthelemy@insee.fr +keywords: +- jdemetra +- package +- r +- r-package +- rstats +- seasonal-adjustment +- timeseries +references: +- type: software + title: 'R: A Language and Environment for Statistical Computing' + notes: Depends + url: https://www.R-project.org/ + authors: + - name: R Core Team + institution: + name: R Foundation for Statistical Computing + address: Vienna, Austria + year: '2024' + version: '>= 4.1.0' +- type: software + title: checkmate + abstract: 'checkmate: Fast and Versatile Argument Checks' + notes: Imports + url: https://mllg.github.io/checkmate/ + repository: https://CRAN.R-project.org/package=checkmate + authors: + - family-names: Lang + given-names: Michel + email: michellang@gmail.com + orcid: https://orcid.org/0000-0001-9754-0393 + year: '2024' + doi: 10.32614/CRAN.package.checkmate +- type: software + title: graphics + abstract: 'R: A Language and Environment for Statistical Computing' + notes: Imports + authors: + - name: R Core Team + institution: + name: R Foundation for Statistical Computing + address: Vienna, Austria + year: '2024' +- type: software + title: methods + abstract: 'R: A Language and Environment for Statistical Computing' + notes: Imports + authors: + - name: R Core Team + institution: + name: R Foundation for Statistical Computing + address: Vienna, Austria + year: '2024' +- type: software + title: rJava + abstract: 'rJava: Low-Level R to Java Interface' + notes: Imports + url: http://www.rforge.net/rJava/ + repository: https://CRAN.R-project.org/package=rJava + authors: + - family-names: Urbanek + given-names: Simon + email: simon.urbanek@r-project.org + year: '2024' + doi: 10.32614/CRAN.package.rJava + version: '>= 1.0-6' +- type: software + title: RProtoBuf + abstract: 'RProtoBuf: R Interface to the ''Protocol Buffers'' ''API'' (Version 2 + or 3)' + notes: Imports + url: https://dirk.eddelbuettel.com/code/rprotobuf.html + repository: https://CRAN.R-project.org/package=RProtoBuf + authors: + - family-names: Francois + given-names: Romain + - family-names: Eddelbuettel + given-names: Dirk + - family-names: Stokely + given-names: Murray + - family-names: Ooms + given-names: Jeroen + year: '2024' + doi: 10.32614/CRAN.package.RProtoBuf + version: '>= 0.4.20' +- type: software + title: stats + abstract: 'R: A Language and Environment for Statistical Computing' + notes: Imports + authors: + - name: R Core Team + institution: + name: R Foundation for Statistical Computing + address: Vienna, Austria + year: '2024' +- type: software + title: utils + abstract: 'R: A Language and Environment for Statistical Computing' + notes: Imports + authors: + - name: R Core Team + institution: + name: R Foundation for Statistical Computing + address: Vienna, Austria + year: '2024' +- type: software + title: spelling + abstract: 'spelling: Tools for Spell Checking in R' + notes: Suggests + url: https://ropensci.r-universe.dev/spelling + repository: https://CRAN.R-project.org/package=spelling + authors: + - family-names: Ooms + given-names: Jeroen + email: jeroenooms@gmail.com + orcid: https://orcid.org/0000-0002-4035-0289 + - family-names: Hester + given-names: Jim + email: james.hester@rstudio.com + year: '2024' + doi: 10.32614/CRAN.package.spelling + From ab9846c863b61c46c0728410883859758e3521c8 Mon Sep 17 00:00:00 2001 From: Tanguy BARTHELEMY Date: Tue, 17 Sep 2024 15:11:04 +0200 Subject: [PATCH 10/18] add contributing file and code-of-conduct files --- .Rbuildignore | 39 ++++++++++------ .github/CODE_OF_CONDUCT.md | 25 ++++++++++ .github/CONTRIBUTING.md | 39 ++++++++++++++++ .gitignore | 95 +++++++++++++++++++------------------- 4 files changed, 136 insertions(+), 62 deletions(-) create mode 100644 .github/CODE_OF_CONDUCT.md create mode 100644 .github/CONTRIBUTING.md diff --git a/.Rbuildignore b/.Rbuildignore index 343d3ab..12b3974 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -1,22 +1,31 @@ + +.travis.yml ^.*\.Rproj$ +^CITATION\.cff$ +^LICENSE.md$ +^Meta$ +^README-.*\.png$ +^README\.Rmd$ +^\.DS_Store$ ^\.Rproj\.user$ - ^\.git$ ^\.github$ -^README\.Rmd$ -^README-.*\.png$ -^Meta$ -^docs$ -^doc$ -^pkgdown$ -^_pkgdown\.yml$ +^\.httr-oauth$ ^\.lintr$ +^\.zenodo\.json$ +^_pkgdown.yml$ +^_pkgdown\.yml$ ^appveyor\.yml$ -.travis.yml -cran-comments.md -^\.DS_Store$ -^revdep$ -^reconf\.sh$ -^pom\.xml$ +^checklist.yml$ +^codecov\.yml$ +^data-raw$ ^dev$ -^CITATION\.cff$ +^doc$ +^docs$ +^man-roxygen$ +^organisation.yml$ +^pkgdown$ +^pom\.xml$ +^reconf\.sh$ +^revdep$ +cran-comments.md diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..3236635 --- /dev/null +++ b/.github/CODE_OF_CONDUCT.md @@ -0,0 +1,25 @@ +# Contributor Code of Conduct + +As contributors and maintainers of this project, we pledge to respect all people who +contribute through reporting issues, posting feature requests, updating documentation, +submitting pull requests or patches, and other activities. + +We are committed to making participation in this project a harassment-free experience for +everyone, regardless of level of experience, gender, gender identity and expression, +sexual orientation, disability, personal appearance, body size, race, ethnicity, age, or religion. + +Examples of unacceptable behaviour by participants include the use of sexual language or +imagery, derogatory comments or personal attacks, trolling, public or private harassment, +insults, or other unprofessional conduct. + +Project maintainers have the right and responsibility to remove, edit, or reject comments, +commits, code, wiki edits, issues, and other contributions that are not aligned to this +Code of Conduct. Project maintainers who do not follow the Code of Conduct may be removed +from the project team. + +Instances of abusive, harassing, or otherwise unacceptable behaviour may be reported by +opening an issue or contacting one or more of the project maintainers. + +This Code of Conduct is adapted from the Contributor Covenant +(http://contributor-covenant.org), version 1.0.0, available at +http://contributor-covenant.org/version/1/0/0/ diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 0000000..8c4a0bf --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,39 @@ +# CONTRIBUTING # + +### Fixing typos + +Small typos or grammatical errors in documentation may be edited directly using the GitHub web interface, so long as the changes are made in the _source_ file. +E.g. edit a `roxygen2` comment in a `.R` file below `R/`, not in an `.Rd` file below `man/`. + +### Prerequisites + +Before you make a substantial pull request, you should always file an issue and make sure someone from the team agrees that it’s a problem. +If you’ve found a bug, create an associated issue and illustrate the bug with a minimal [reproducible example](https://www.tidyverse.org/help/#reprex). + +### Pull request process + +* We recommend that you create a Git branch for each pull request (PR). +* Look at the GitHub Actions build status before and after making changes. +The `README` should contain badges for any continuous integration services used by the package. +* We require the `tidyverse` [style guide](http://style.tidyverse.org). +You can use the [`lintr`](https://CRAN.R-project.org/package=lintr) package to check these styles and the [`styler`](https://CRAN.R-project.org/package=styler) package to apply these styles, but please don't restyle code that has nothing to do with your PR. +* We use [`roxygen2`](https://cran.r-project.org/package=roxygen2). +* We use [`testthat`](https://cran.r-project.org/package=testthat). +Contributions with test cases included are easier to accept. +* For user-facing changes, add a bullet to the top of `NEWS.md` below the current development version (UNRELEASED) header describing the changes made followed by your GitHub username, and links to relevant issue(s)/PR(s). + +### Code of Conduct + +Please note that this project is released with a [Contributor Code of Conduct](CODE_OF_CONDUCT.md). +By contributing to this project you agree to abide by its terms. + +### Prefer to Email? + +Email the person listed as maintainer in the `DESCRIPTION` file of this repo. + +Though note that private discussions over email don't help others - of course +email is totally warranted if it's a sensitive problem of any kind. + +### Thanks for contributing! + +This contributing guide is adapted from the `tidyverse` contributing guide available at https://raw.githubusercontent.com/r-lib/usethis/master/inst/templates/tidy-contributing.md diff --git a/.gitignore b/.gitignore index 11424ef..3363316 100644 --- a/.gitignore +++ b/.gitignore @@ -1,58 +1,59 @@ -# History files -.Rhistory -.Rapp.history - -# Session Data files -.RData -.RDataTmp - -# User-specific files -.Ruserdata # Example code in package build process -*-Ex.R - +# Hidden file from mac-os +# History files +# OAuth2 token, see https://github.com/hadley/httr/releases/tag/v0.3 # Output files from R CMD build -/*.tar.gz - # Output files from R CMD check -/*.Rcheck/ - +# R Environment Variables +# RStudio Connect folder # RStudio files -.Rproj.user/ - -# produced vignettes -vignettes/*.html -vignettes/*.pdf -Meta/ -inst/doc/ -doc/ - -# OAuth2 token, see https://github.com/hadley/httr/releases/tag/v0.3 -.httr-oauth - -# knitr and R markdown default cache directories -*_cache/ -/cache/ - +# Session Data files # Temporary files created by R markdown -*.utf8.md +# User-specific files +# knitr and R markdown default cache directories +# pkgdown site +# produced README.html +# produced vignettes +# translation temp files +*-Ex.R +*.dbf +*.doc* +*.gddoc +*.gdsheet +*.gpkg +*.html *.knit.md - -# R Environment Variables +*.mdb +*.shp* +*.shx +*.utf8.md +*.xls* +*_cache/ +*_files +.DS_Store +.RData +.RDataTmp +.Rapp.history .Renviron - -# pkgdown site +.Rhistory +.Rproj.user +.Rproj.user/ +.Ruserdata +.httr-oauth +/*.Rcheck/ +/*.tar.gz +/cache/ +Meta/ +README.html +doc/ +docs docs/ - -# translation temp files +inst/doc/ +libs +output po/*~ - -# RStudio Connect folder +renv/library rsconnect/ - -# Hidden file from mac-os -.DS_Store - -# produced README.html -README.html +vignettes/*.html +vignettes/*.pdf From 224835331267ad56f08f75e9bcc095cfd7fd0a57 Mon Sep 17 00:00:00 2001 From: Tanguy BARTHELEMY Date: Tue, 8 Oct 2024 15:00:39 +0200 Subject: [PATCH 11/18] update lintr with max length line --- .lintr | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.lintr b/.lintr index 592ca17..4f9850d 100644 --- a/.lintr +++ b/.lintr @@ -1,5 +1,7 @@ linters: lintr::all_linters( indentation_linter = NULL, + # line_length_linter = lintr::line_length_linter(80L), + line_length_linter = lintr::line_length_linter(200L), brace_linter = NULL, infix_spaces_linter = NULL, paren_body_linter = NULL, @@ -9,9 +11,7 @@ linters: lintr::all_linters( object_length_linter = NULL, semicolon_linter = NULL, cyclocomp_linter = NULL, - #object_usage_linter = NULL, object_name_linter = NULL, - line_length_linter = NULL, commented_code_linter = NULL, extraction_operator_linter = NULL, implicit_integer_linter = NULL, From f9c1e4048dec1e48f410cc86bef138e1fb062739 Mon Sep 17 00:00:00 2001 From: Tanguy BARTHELEMY Date: Mon, 14 Oct 2024 11:44:20 +0200 Subject: [PATCH 12/18] lint 1 output --- R/arima.R | 304 +++++++++++++++++++++++++++++------------------------- 1 file changed, 162 insertions(+), 142 deletions(-) diff --git a/R/arima.R b/R/arima.R index 71a8896..590af62 100644 --- a/R/arima.R +++ b/R/arima.R @@ -5,20 +5,40 @@ NULL #' Seasonal ARIMA model (Box-Jenkins) #' #' @param period period of the model. -#' @param phi coefficients of the regular auto-regressive polynomial (\eqn{1 + \phi_1B + \phi_2B + ...}). True signs. +#' @param phi coefficients of the regular auto-regressive polynomial +#' (\eqn{1 + \phi_1B + \phi_2B + ...}). True signs. #' @param d regular differencing order. -#' @param theta coefficients of the regular moving average polynomial (\eqn{1 + \theta_1B + \theta_2B + ...}). True signs. -#' @param bphi coefficients of the seasonal auto-regressive polynomial. True signs. +#' @param theta coefficients of the regular moving average polynomial +#' (\eqn{1 + \theta_1B + \theta_2B + ...}). True signs. +#' @param bphi coefficients of the seasonal auto-regressive polynomial. True +#' signs. #' @param bd seasonal differencing order. -#' @param btheta coefficients of the seasonal moving average polynomial. True signs. +#' @param btheta coefficients of the seasonal moving average polynomial. True +#' signs. #' @param name name of the model. #' #' @return A `"JD3_SARIMA"` model. #' @export -sarima_model<-function(name="sarima", period, phi=NULL, d=0, theta=NULL, bphi=NULL, bd=0, btheta=NULL){ - return(structure( - list(name = name, period = period, phi = phi, d = d, theta = theta, - bphi = bphi, bd = bd, btheta = btheta), class="JD3_SARIMA")) +sarima_model<-function(name="sarima", + period, + phi=NULL, + d=0, + theta=NULL, + bphi=NULL, + bd=0, + btheta=NULL) { + output <- list( + name = name, + period = period, + phi = phi, + d = d, + theta = theta, + bphi = bphi, + bd = bd, + btheta = btheta + ) + class(output) <- "JD3_SARIMA" + return(output) } #' SARIMA Properties @@ -32,10 +52,10 @@ sarima_model<-function(name="sarima", period, phi=NULL, d=0, theta=NULL, bphi=NU #' sarima_properties(mod1) #' @export sarima_properties<-function(model, nspectrum=601, nacf=36){ - jmodel<-.r2jd_sarima(model) - spectrum<-.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "[D", "spectrum", jmodel, as.integer(nspectrum)) - acf<-.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "[D", "acf", jmodel, as.integer(nacf)) - return(list(acf=acf, spectrum=spectrum)) + jmodel<-.r2jd_sarima(model) + spectrum<-.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "[D", "spectrum", jmodel, as.integer(nspectrum)) + acf<-.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "[D", "acf", jmodel, as.integer(nacf)) + return(list(acf=acf, spectrum=spectrum)) } @@ -56,20 +76,20 @@ sarima_properties<-function(model, nspectrum=601, nacf=36){ #' plot(x, type = "l") #' @export sarima_random<-function(model, length, stde=1, tdegree=0, seed=-1){ - if (!inherits(model, "JD3_SARIMA")) - stop("Invalid model") - return(.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "[D", "random", - as.integer(length), - as.integer(model$period), - .jarray(as.numeric(model$phi)), - as.integer(model$d), - .jarray(as.numeric(model$theta)), - .jarray(as.numeric(model$bphi)), - as.integer(model$bd), - .jarray(as.numeric(model$btheta)), - stde, - as.integer(tdegree), - as.integer(seed))) + if (!inherits(model, "JD3_SARIMA")) + stop("Invalid model") + return(.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "[D", "random", + as.integer(length), + as.integer(model$period), + .jarray(as.numeric(model$phi)), + as.integer(model$d), + .jarray(as.numeric(model$theta)), + .jarray(as.numeric(model$bphi)), + as.integer(model$bd), + .jarray(as.numeric(model$btheta)), + stde, + as.integer(tdegree), + as.integer(seed))) } #' Decompose SARIMA Model into three components trend, seasonal, irregular @@ -86,13 +106,13 @@ sarima_random<-function(model, length, stde=1, tdegree=0, seed=-1){ #' ucm <- sarima_decompose(model) #' sarima_decompose<-function(model, rmod=0, epsphi=0){ - if (!inherits(model, "JD3_SARIMA")) - stop("Invalid model") - jmodel<-.r2jd_sarima(model) - jucm<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/core/ucarima/UcarimaModel;", "decompose", - jmodel, as.numeric(rmod), as.numeric(epsphi)) - if (is.jnull(jucm)) return(NULL) - return(.jd2r_ucarima(jucm)) + if (!inherits(model, "JD3_SARIMA")) + stop("Invalid model") + jmodel<-.r2jd_sarima(model) + jucm<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/core/ucarima/UcarimaModel;", "decompose", + jmodel, as.numeric(rmod), as.numeric(epsphi)) + if (is.jnull(jucm)) return(NULL) + return(.jd2r_ucarima(jucm)) } @@ -110,48 +130,48 @@ sarima_decompose<-function(model, rmod=0, epsphi=0){ #' @examples #' model <- arima_model("trend", ar=c(1,-.8), delta = c(1,-1), ma=c(1,-.5), var=100) arima_model<-function(name="arima", ar=1, delta=1, ma=1, variance=1){ - return(structure(list(name=name, ar=ar, delta=delta, ma=ma, var=variance), class="JD3_ARIMA")) + return(structure(list(name=name, ar=ar, delta=delta, ma=ma, var=variance), class="JD3_ARIMA")) } .jd2r_doubleseq<-function(jobj, jprop){ - jseq<-.jcall(jobj, "Ljdplus/toolkit/base/api/data/DoubleSeq;", jprop) - return(.jcall(jseq, "[D", "toArray")) + jseq<-.jcall(jobj, "Ljdplus/toolkit/base/api/data/DoubleSeq;", jprop) + return(.jcall(jseq, "[D", "toArray")) } .jd2r_sarima<-function(jsarima){ - q<-.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "[B", "toBuffer", jsarima) - rq<-RProtoBuf::read(modelling.SarimaModel, q) - return(.p2r_sarima(rq)) + q<-.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "[B", "toBuffer", jsarima) + rq<-RProtoBuf::read(modelling.SarimaModel, q) + return(.p2r_sarima(rq)) } #' @export #' @rdname jd3_utilities .r2jd_sarima<-function(model){ - return(.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "Ljdplus/toolkit/base/core/sarima/SarimaModel;", "of", - as.integer(model$period), - .jarray(as.numeric(model$phi)), - as.integer(model$d), - .jarray(as.numeric(model$theta)), - .jarray(as.numeric(model$bphi)), - as.integer(model$bd), - .jarray(as.numeric(model$btheta)))) + return(.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "Ljdplus/toolkit/base/core/sarima/SarimaModel;", "of", + as.integer(model$period), + .jarray(as.numeric(model$phi)), + as.integer(model$d), + .jarray(as.numeric(model$theta)), + .jarray(as.numeric(model$bphi)), + as.integer(model$bd), + .jarray(as.numeric(model$btheta)))) } .jd2r_arima<-function(jarima){ - q<-.jcall("jdplus/toolkit/base/r/arima/ArimaModels", "[B", "toBuffer", jarima) - rq<-RProtoBuf::read(modelling.ArimaModel, q) - return(.p2r_arima(rq)) + q<-.jcall("jdplus/toolkit/base/r/arima/ArimaModels", "[B", "toBuffer", jarima) + rq<-RProtoBuf::read(modelling.ArimaModel, q) + return(.p2r_arima(rq)) } .r2jd_arima<-function(model){ - return(.jcall("jdplus/toolkit/base/r/arima/ArimaModels", "Ljdplus/toolkit/base/core/arima/ArimaModel;", "of", - .jarray(as.numeric(model$ar)), - .jarray(as.numeric(model$delta)), - .jarray(as.numeric(model$ma)), - as.numeric(model$var), FALSE)) + return(.jcall("jdplus/toolkit/base/r/arima/ArimaModels", "Ljdplus/toolkit/base/core/arima/ArimaModel;", "of", + .jarray(as.numeric(model$ar)), + .jarray(as.numeric(model$delta)), + .jarray(as.numeric(model$ma)), + as.numeric(model$var), FALSE)) } #' Sum ARIMA Models @@ -176,14 +196,14 @@ arima_model<-function(name="arima", ar=1, delta=1, ma=1, variance=1){ #' arima_sum(mod1, mod2) #' @export arima_sum<-function(...){ - components<-list(...) - return(arima_lsum(components)) + components<-list(...) + return(arima_lsum(components)) } arima_lsum<-function(components){ - q<-.jarray(lapply(components, .r2jd_arima), "jdplus/toolkit/base/core/arima/ArimaModel") - jsum<-.jcall("jdplus/toolkit/base/r/arima/ArimaModels", "Ljdplus/toolkit/base/core/arima/ArimaModel;", "sum", q) - return(.jd2r_arima(jsum)) + q<-.jarray(lapply(components, .r2jd_arima), "jdplus/toolkit/base/core/arima/ArimaModel") + jsum<-.jcall("jdplus/toolkit/base/r/arima/ArimaModels", "Ljdplus/toolkit/base/core/arima/ArimaModel;", "sum", q) + return(.jd2r_arima(jsum)) } #' Remove an arima model from an existing one. More exactly, m_diff = m_left - m_right iff m_left = m_right + m_diff. @@ -204,10 +224,10 @@ arima_lsum<-function(components){ #' # sum should be equal to mod1 #' arima_difference<-function(left, right, simplify=TRUE){ - jleft<-.r2jd_arima(left) - jright<-.r2jd_arima(right) - jdiff<-.jcall(jleft, "Ljdplus/toolkit/base/core/arima/ArimaModel;", "minus", jright, as.logical(simplify)) - return(.jd2r_arima(jdiff)) + jleft<-.r2jd_arima(left) + jright<-.r2jd_arima(right) + jdiff<-.jcall(jleft, "Ljdplus/toolkit/base/core/arima/ArimaModel;", "minus", jright, as.logical(simplify)) + return(.jd2r_arima(jdiff)) } @@ -223,10 +243,10 @@ arima_difference<-function(left, right, simplify=TRUE){ #' arima_properties(mod1) #' @export arima_properties<-function(model, nspectrum=601, nac=36){ - jmodel<-.r2jd_arima(model) - spectrum<-.jcall("jdplus/toolkit/base/r/arima/ArimaModels", "[D", "spectrum", jmodel, as.integer(nspectrum)) - acf<-.jcall("jdplus/toolkit/base/r/arima/ArimaModels", "[D", "acf", jmodel, as.integer(nac)) - return(list(acf=acf, spectrum=spectrum)) + jmodel<-.r2jd_arima(model) + spectrum<-.jcall("jdplus/toolkit/base/r/arima/ArimaModels", "[D", "spectrum", jmodel, as.integer(nspectrum)) + acf<-.jcall("jdplus/toolkit/base/r/arima/ArimaModels", "[D", "acf", jmodel, as.integer(nac)) + return(list(acf=acf, spectrum=spectrum)) } #' Creates an UCARIMA model, which is composed of ARIMA models with independent innovations. @@ -245,29 +265,29 @@ arima_properties<-function(model, nspectrum=601, nac=36){ #' hp<-ucarima_model(components=list(mod1, mod2)) #' print(hp$model) ucarima_model<-function(model=NULL, components, complements=NULL, checkmodel=FALSE){ - if (is.null(model)) - model<-arima_lsum(components) - else if (! is(model, "JD3_ARIMA") && ! is(model, "JD3_SARIMA")) stop("Invalid model") + if (is.null(model)) + model<-arima_lsum(components) + else if (! is(model, "JD3_ARIMA") && ! is(model, "JD3_SARIMA")) stop("Invalid model") - # TODO: checkmodel - return(structure(list(model=model, components=components, complements=complements), class="JD3_UCARIMA")) + # TODO: checkmodel + return(structure(list(model=model, components=components, complements=complements), class="JD3_UCARIMA")) } .r2jd_ucarima<-function(ucm){ - jmodel<-.r2jd_arima(ucm$model) - jcmps<-.jarray(lapply(ucm$components, .r2jd_arima), "jdplus/toolkit/base/core/arima/ArimaModel") - return(.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/core/ucarima/UcarimaModel;", "of", jmodel, jcmps)) + jmodel<-.r2jd_arima(ucm$model) + jcmps<-.jarray(lapply(ucm$components, .r2jd_arima), "jdplus/toolkit/base/core/arima/ArimaModel") + return(.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/core/ucarima/UcarimaModel;", "of", jmodel, jcmps)) } #' @export #' @rdname jd3_utilities .jd2r_ucarima<-function(jucm){ -# model<-.jcall(jucm, "Ljdplus/toolkit/base/core/arima/ArimaModel;", "sum") -# jcmps<-.jcall(jucm, "[Ljdplus/toolkit/base/core/arima/ArimaModel;", "getComponents") -# return(ucarima_model(.jd2r_arima(model), lapply(jcmps, .jd2r_arima))) - q<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "[B", "toBuffer", jucm) - rq<-RProtoBuf::read(modelling.UcarimaModel, q) - return(.p2r_ucarima(rq)) + # model<-.jcall(jucm, "Ljdplus/toolkit/base/core/arima/ArimaModel;", "sum") + # jcmps<-.jcall(jucm, "[Ljdplus/toolkit/base/core/arima/ArimaModel;", "getComponents") + # return(ucarima_model(.jd2r_arima(model), lapply(jcmps, .jd2r_arima))) + q<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "[B", "toBuffer", jucm) + rq<-RProtoBuf::read(modelling.UcarimaModel, q) + return(.p2r_ucarima(rq)) } @@ -290,15 +310,15 @@ ucarima_model<-function(model=NULL, components, complements=NULL, checkmodel=FAL #' wk2<-ucarima_wk(hp, 2) #' plot(wk1$filter, type='h') ucarima_wk<-function(ucm, cmp, signal=TRUE, nspectrum=601, nwk=300){ - jucm<-.r2jd_ucarima(ucm) - jwks<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/core/ucarima/WienerKolmogorovEstimators;", "wienerKolmogorovEstimators", jucm) - jwk<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/core/ucarima/WienerKolmogorovEstimator;", "finalEstimator", jwks, as.integer(cmp-1), signal) + jucm<-.r2jd_ucarima(ucm) + jwks<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/core/ucarima/WienerKolmogorovEstimators;", "wienerKolmogorovEstimators", jucm) + jwk<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/core/ucarima/WienerKolmogorovEstimator;", "finalEstimator", jwks, as.integer(cmp-1), signal) - spectrum<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "[D", "spectrum", jwk, as.integer(nspectrum)) - wk<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "[D", "filter", jwk, as.integer(nwk)) - gain<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "[D", "gain", jwk, as.integer(nspectrum)) + spectrum<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "[D", "spectrum", jwk, as.integer(nspectrum)) + wk<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "[D", "filter", jwk, as.integer(nwk)) + gain<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "[D", "gain", jwk, as.integer(nspectrum)) - return(structure(list(spectrum=spectrum, filter=wk, gain2=gain*gain), class="JD3_UCARIMA_WK")) + return(structure(list(spectrum=spectrum, filter=wk, gain2=gain*gain), class="JD3_UCARIMA_WK")) } #' Makes a UCARIMA model canonical; more specifically, put all the noise of the components in one dedicated component @@ -317,10 +337,10 @@ ucarima_wk<-function(ucm, cmp, signal=TRUE, nspectrum=601, nwk=300){ #' hpc <- ucarima_canonical(hp, cmp=2) ucarima_canonical<-function(ucm, cmp=0, adjust=TRUE){ - jucm<-.r2jd_ucarima(ucm) - jnucm<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/core/ucarima/UcarimaModel;", "doCanonical", - jucm, as.integer(cmp-1), as.logical(adjust)) - return(.jd2r_ucarima(jnucm)) + jucm<-.r2jd_ucarima(ucm) + jnucm<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/core/ucarima/UcarimaModel;", "doCanonical", + jucm, as.integer(cmp-1), as.logical(adjust)) + return(.jd2r_ucarima(jnucm)) } #' Estimate UCARIMA Model @@ -342,10 +362,10 @@ ucarima_canonical<-function(ucm, cmp=0, adjust=TRUE){ #' t <- ts(all[,1], frequency = frequency(s), start = start(s)) #' lines(t, col='blue') ucarima_estimate<-function(x, ucm, stdev=TRUE){ - jucm<-.r2jd_ucarima(ucm) - jcmps<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/api/math/matrices/Matrix;", "estimate", - as.numeric(x), jucm, as.logical(stdev)) - return(.jd2r_matrix(jcmps)) + jucm<-.r2jd_ucarima(ucm) + jcmps<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/api/math/matrices/Matrix;", "estimate", + as.numeric(x), jucm, as.logical(stdev)) + return(.jd2r_matrix(jcmps)) } #' Estimate SARIMA Model @@ -365,43 +385,43 @@ ucarima_estimate<-function(x, ucm, stdev=TRUE){ #' y <- ABS$X0.2.09.10.M #' sarima_estimate(y, order = c(0,1,1), seasonal = c(0,1,1)) sarima_estimate<-function(x, order=c(0,0,0), seasonal = list(order=c(0,0,0), period=NA), mean=FALSE, xreg=NULL, eps = 1e-9){ - if (!is.list(seasonal) && is.numeric(seasonal) && length(seasonal) == 3) { - seasonal <- list(order = seasonal, - period = NA) - } - if (is.na(seasonal$period)) - seasonal$period <- frequency(x) - jxreg<-.r2jd_matrix(xreg) - jestim<-.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "Ljdplus/toolkit/base/core/regarima/RegArimaEstimation;", "estimate", - as.numeric(x), as.integer(order), as.integer(seasonal$period), as.integer(seasonal$order), as.logical(mean), jxreg, .jnull("[D"), as.numeric(eps)) - bytes<-.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "[B", "toBuffer", jestim) - p<-RProtoBuf::read(regarima.RegArimaModel$Estimation, bytes) - res <- .p2r_regarima_estimation(p) - - if (length(res$b) > 0) { - - names_xreg <- colnames(xreg) - if (is.null(names_xreg) && !is.null(xreg)){ - if (is.matrix(xreg)) { - # unnamed matrix regressors - names_xreg <- sprintf("xreg_%i", seq_len(ncol(xreg))) - } else { - # vector external regressor - names_xreg <- "xreg_1" - } + if (!is.list(seasonal) && is.numeric(seasonal) && length(seasonal) == 3) { + seasonal <- list(order = seasonal, + period = NA) } - if (mean) { - names_xreg <- c("intercept", names_xreg) + if (is.na(seasonal$period)) + seasonal$period <- frequency(x) + jxreg<-.r2jd_matrix(xreg) + jestim<-.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "Ljdplus/toolkit/base/core/regarima/RegArimaEstimation;", "estimate", + as.numeric(x), as.integer(order), as.integer(seasonal$period), as.integer(seasonal$order), as.logical(mean), jxreg, .jnull("[D"), as.numeric(eps)) + bytes<-.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "[B", "toBuffer", jestim) + p<-RProtoBuf::read(regarima.RegArimaModel$Estimation, bytes) + res <- .p2r_regarima_estimation(p) + + if (length(res$b) > 0) { + + names_xreg <- colnames(xreg) + if (is.null(names_xreg) && !is.null(xreg)){ + if (is.matrix(xreg)) { + # unnamed matrix regressors + names_xreg <- sprintf("xreg_%i", seq_len(ncol(xreg))) + } else { + # vector external regressor + names_xreg <- "xreg_1" + } + } + if (mean) { + names_xreg <- c("intercept", names_xreg) + } + names(res$b) <- names_xreg } - names(res$b) <- names_xreg - } - names(res$parameters$val) <- c(sprintf("phi(%i)", seq_len(order[1])), - sprintf("bphi(%i)", seq_len(seasonal$order[1])), - sprintf("theta(%i)", seq_len(order[3])), - sprintf("btheta(%i)", seq_len(seasonal$order[3]))) - res$orders <- list(order = order, seasonal = seasonal) - class(res) <- c("JD3_SARIMA_ESTIMATE", "JD3_REGARIMA_RSLTS") - return(res) + names(res$parameters$val) <- c(sprintf("phi(%i)", seq_len(order[1])), + sprintf("bphi(%i)", seq_len(seasonal$order[1])), + sprintf("theta(%i)", seq_len(order[3])), + sprintf("btheta(%i)", seq_len(seasonal$order[3]))) + res$orders <- list(order = order, seasonal = seasonal) + class(res) <- c("JD3_SARIMA_ESTIMATE", "JD3_REGARIMA_RSLTS") + return(res) } #' Title @@ -421,14 +441,14 @@ sarima_estimate<-function(x, order=c(0,0,0), seasonal = list(order=c(0,0,0), per #' y <- ABS$X0.2.09.10.M #' sarima_hannan_rissanen(y, order = c(0,1,1), seasonal = c(0,1,1)) sarima_hannan_rissanen<-function(x, order=c(0,0,0), seasonal = list(order=c(0,0,0), period=NA), initialization=c("Ols", "Levinson", "Burg"), biasCorrection=TRUE, finalCorrection=TRUE){ - if (!is.list(seasonal) && is.numeric(seasonal) && length(seasonal) == 3) { - initialization<-match.arg(initialization) - seasonal <- list(order = seasonal, - period = NA) - } - if (is.na(seasonal$period)) - seasonal$period <- frequency(x) - jmodel<-.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "Ljdplus/toolkit/base/core/sarima/SarimaModel;", "hannanRissanen", - as.numeric(x), as.integer(order), as.integer(seasonal$period), as.integer(seasonal$order), as.character(initialization), as.logical(biasCorrection), as.logical(finalCorrection)) - return(.jd2r_sarima(jmodel)) + if (!is.list(seasonal) && is.numeric(seasonal) && length(seasonal) == 3) { + initialization<-match.arg(initialization) + seasonal <- list(order = seasonal, + period = NA) + } + if (is.na(seasonal$period)) + seasonal$period <- frequency(x) + jmodel<-.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "Ljdplus/toolkit/base/core/sarima/SarimaModel;", "hannanRissanen", + as.numeric(x), as.integer(order), as.integer(seasonal$period), as.integer(seasonal$order), as.character(initialization), as.logical(biasCorrection), as.logical(finalCorrection)) + return(.jd2r_sarima(jmodel)) } From eda01bc59b896b90e69f8932b452fdca92d35033 Mon Sep 17 00:00:00 2001 From: Tanguy BARTHELEMY Date: Mon, 14 Oct 2024 11:44:27 +0200 Subject: [PATCH 13/18] lint 1 output --- R/arima.R | 270 +++++++++++++++++++++++++++--------------------------- 1 file changed, 135 insertions(+), 135 deletions(-) diff --git a/R/arima.R b/R/arima.R index 590af62..e27810c 100644 --- a/R/arima.R +++ b/R/arima.R @@ -38,7 +38,7 @@ sarima_model<-function(name="sarima", btheta = btheta ) class(output) <- "JD3_SARIMA" - return(output) + return(output) } #' SARIMA Properties @@ -52,10 +52,10 @@ sarima_model<-function(name="sarima", #' sarima_properties(mod1) #' @export sarima_properties<-function(model, nspectrum=601, nacf=36){ - jmodel<-.r2jd_sarima(model) - spectrum<-.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "[D", "spectrum", jmodel, as.integer(nspectrum)) - acf<-.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "[D", "acf", jmodel, as.integer(nacf)) - return(list(acf=acf, spectrum=spectrum)) + jmodel<-.r2jd_sarima(model) + spectrum<-.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "[D", "spectrum", jmodel, as.integer(nspectrum)) + acf<-.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "[D", "acf", jmodel, as.integer(nacf)) + return(list(acf=acf, spectrum=spectrum)) } @@ -76,20 +76,20 @@ sarima_properties<-function(model, nspectrum=601, nacf=36){ #' plot(x, type = "l") #' @export sarima_random<-function(model, length, stde=1, tdegree=0, seed=-1){ - if (!inherits(model, "JD3_SARIMA")) - stop("Invalid model") - return(.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "[D", "random", - as.integer(length), - as.integer(model$period), - .jarray(as.numeric(model$phi)), - as.integer(model$d), - .jarray(as.numeric(model$theta)), - .jarray(as.numeric(model$bphi)), - as.integer(model$bd), - .jarray(as.numeric(model$btheta)), - stde, - as.integer(tdegree), - as.integer(seed))) + if (!inherits(model, "JD3_SARIMA")) + stop("Invalid model") + return(.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "[D", "random", + as.integer(length), + as.integer(model$period), + .jarray(as.numeric(model$phi)), + as.integer(model$d), + .jarray(as.numeric(model$theta)), + .jarray(as.numeric(model$bphi)), + as.integer(model$bd), + .jarray(as.numeric(model$btheta)), + stde, + as.integer(tdegree), + as.integer(seed))) } #' Decompose SARIMA Model into three components trend, seasonal, irregular @@ -106,13 +106,13 @@ sarima_random<-function(model, length, stde=1, tdegree=0, seed=-1){ #' ucm <- sarima_decompose(model) #' sarima_decompose<-function(model, rmod=0, epsphi=0){ - if (!inherits(model, "JD3_SARIMA")) - stop("Invalid model") - jmodel<-.r2jd_sarima(model) - jucm<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/core/ucarima/UcarimaModel;", "decompose", - jmodel, as.numeric(rmod), as.numeric(epsphi)) - if (is.jnull(jucm)) return(NULL) - return(.jd2r_ucarima(jucm)) + if (!inherits(model, "JD3_SARIMA")) + stop("Invalid model") + jmodel<-.r2jd_sarima(model) + jucm<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/core/ucarima/UcarimaModel;", "decompose", + jmodel, as.numeric(rmod), as.numeric(epsphi)) + if (is.jnull(jucm)) return(NULL) + return(.jd2r_ucarima(jucm)) } @@ -130,48 +130,48 @@ sarima_decompose<-function(model, rmod=0, epsphi=0){ #' @examples #' model <- arima_model("trend", ar=c(1,-.8), delta = c(1,-1), ma=c(1,-.5), var=100) arima_model<-function(name="arima", ar=1, delta=1, ma=1, variance=1){ - return(structure(list(name=name, ar=ar, delta=delta, ma=ma, var=variance), class="JD3_ARIMA")) + return(structure(list(name=name, ar=ar, delta=delta, ma=ma, var=variance), class="JD3_ARIMA")) } .jd2r_doubleseq<-function(jobj, jprop){ - jseq<-.jcall(jobj, "Ljdplus/toolkit/base/api/data/DoubleSeq;", jprop) - return(.jcall(jseq, "[D", "toArray")) + jseq<-.jcall(jobj, "Ljdplus/toolkit/base/api/data/DoubleSeq;", jprop) + return(.jcall(jseq, "[D", "toArray")) } .jd2r_sarima<-function(jsarima){ - q<-.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "[B", "toBuffer", jsarima) - rq<-RProtoBuf::read(modelling.SarimaModel, q) - return(.p2r_sarima(rq)) + q<-.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "[B", "toBuffer", jsarima) + rq<-RProtoBuf::read(modelling.SarimaModel, q) + return(.p2r_sarima(rq)) } #' @export #' @rdname jd3_utilities .r2jd_sarima<-function(model){ - return(.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "Ljdplus/toolkit/base/core/sarima/SarimaModel;", "of", - as.integer(model$period), - .jarray(as.numeric(model$phi)), - as.integer(model$d), - .jarray(as.numeric(model$theta)), - .jarray(as.numeric(model$bphi)), - as.integer(model$bd), - .jarray(as.numeric(model$btheta)))) + return(.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "Ljdplus/toolkit/base/core/sarima/SarimaModel;", "of", + as.integer(model$period), + .jarray(as.numeric(model$phi)), + as.integer(model$d), + .jarray(as.numeric(model$theta)), + .jarray(as.numeric(model$bphi)), + as.integer(model$bd), + .jarray(as.numeric(model$btheta)))) } .jd2r_arima<-function(jarima){ - q<-.jcall("jdplus/toolkit/base/r/arima/ArimaModels", "[B", "toBuffer", jarima) - rq<-RProtoBuf::read(modelling.ArimaModel, q) - return(.p2r_arima(rq)) + q<-.jcall("jdplus/toolkit/base/r/arima/ArimaModels", "[B", "toBuffer", jarima) + rq<-RProtoBuf::read(modelling.ArimaModel, q) + return(.p2r_arima(rq)) } .r2jd_arima<-function(model){ - return(.jcall("jdplus/toolkit/base/r/arima/ArimaModels", "Ljdplus/toolkit/base/core/arima/ArimaModel;", "of", - .jarray(as.numeric(model$ar)), - .jarray(as.numeric(model$delta)), - .jarray(as.numeric(model$ma)), - as.numeric(model$var), FALSE)) + return(.jcall("jdplus/toolkit/base/r/arima/ArimaModels", "Ljdplus/toolkit/base/core/arima/ArimaModel;", "of", + .jarray(as.numeric(model$ar)), + .jarray(as.numeric(model$delta)), + .jarray(as.numeric(model$ma)), + as.numeric(model$var), FALSE)) } #' Sum ARIMA Models @@ -196,14 +196,14 @@ arima_model<-function(name="arima", ar=1, delta=1, ma=1, variance=1){ #' arima_sum(mod1, mod2) #' @export arima_sum<-function(...){ - components<-list(...) - return(arima_lsum(components)) + components<-list(...) + return(arima_lsum(components)) } arima_lsum<-function(components){ - q<-.jarray(lapply(components, .r2jd_arima), "jdplus/toolkit/base/core/arima/ArimaModel") - jsum<-.jcall("jdplus/toolkit/base/r/arima/ArimaModels", "Ljdplus/toolkit/base/core/arima/ArimaModel;", "sum", q) - return(.jd2r_arima(jsum)) + q<-.jarray(lapply(components, .r2jd_arima), "jdplus/toolkit/base/core/arima/ArimaModel") + jsum<-.jcall("jdplus/toolkit/base/r/arima/ArimaModels", "Ljdplus/toolkit/base/core/arima/ArimaModel;", "sum", q) + return(.jd2r_arima(jsum)) } #' Remove an arima model from an existing one. More exactly, m_diff = m_left - m_right iff m_left = m_right + m_diff. @@ -224,10 +224,10 @@ arima_lsum<-function(components){ #' # sum should be equal to mod1 #' arima_difference<-function(left, right, simplify=TRUE){ - jleft<-.r2jd_arima(left) - jright<-.r2jd_arima(right) - jdiff<-.jcall(jleft, "Ljdplus/toolkit/base/core/arima/ArimaModel;", "minus", jright, as.logical(simplify)) - return(.jd2r_arima(jdiff)) + jleft<-.r2jd_arima(left) + jright<-.r2jd_arima(right) + jdiff<-.jcall(jleft, "Ljdplus/toolkit/base/core/arima/ArimaModel;", "minus", jright, as.logical(simplify)) + return(.jd2r_arima(jdiff)) } @@ -243,10 +243,10 @@ arima_difference<-function(left, right, simplify=TRUE){ #' arima_properties(mod1) #' @export arima_properties<-function(model, nspectrum=601, nac=36){ - jmodel<-.r2jd_arima(model) - spectrum<-.jcall("jdplus/toolkit/base/r/arima/ArimaModels", "[D", "spectrum", jmodel, as.integer(nspectrum)) - acf<-.jcall("jdplus/toolkit/base/r/arima/ArimaModels", "[D", "acf", jmodel, as.integer(nac)) - return(list(acf=acf, spectrum=spectrum)) + jmodel<-.r2jd_arima(model) + spectrum<-.jcall("jdplus/toolkit/base/r/arima/ArimaModels", "[D", "spectrum", jmodel, as.integer(nspectrum)) + acf<-.jcall("jdplus/toolkit/base/r/arima/ArimaModels", "[D", "acf", jmodel, as.integer(nac)) + return(list(acf=acf, spectrum=spectrum)) } #' Creates an UCARIMA model, which is composed of ARIMA models with independent innovations. @@ -265,29 +265,29 @@ arima_properties<-function(model, nspectrum=601, nac=36){ #' hp<-ucarima_model(components=list(mod1, mod2)) #' print(hp$model) ucarima_model<-function(model=NULL, components, complements=NULL, checkmodel=FALSE){ - if (is.null(model)) - model<-arima_lsum(components) - else if (! is(model, "JD3_ARIMA") && ! is(model, "JD3_SARIMA")) stop("Invalid model") + if (is.null(model)) + model<-arima_lsum(components) + else if (! is(model, "JD3_ARIMA") && ! is(model, "JD3_SARIMA")) stop("Invalid model") - # TODO: checkmodel - return(structure(list(model=model, components=components, complements=complements), class="JD3_UCARIMA")) + # TODO: checkmodel + return(structure(list(model=model, components=components, complements=complements), class="JD3_UCARIMA")) } .r2jd_ucarima<-function(ucm){ - jmodel<-.r2jd_arima(ucm$model) - jcmps<-.jarray(lapply(ucm$components, .r2jd_arima), "jdplus/toolkit/base/core/arima/ArimaModel") - return(.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/core/ucarima/UcarimaModel;", "of", jmodel, jcmps)) + jmodel<-.r2jd_arima(ucm$model) + jcmps<-.jarray(lapply(ucm$components, .r2jd_arima), "jdplus/toolkit/base/core/arima/ArimaModel") + return(.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/core/ucarima/UcarimaModel;", "of", jmodel, jcmps)) } #' @export #' @rdname jd3_utilities .jd2r_ucarima<-function(jucm){ - # model<-.jcall(jucm, "Ljdplus/toolkit/base/core/arima/ArimaModel;", "sum") - # jcmps<-.jcall(jucm, "[Ljdplus/toolkit/base/core/arima/ArimaModel;", "getComponents") - # return(ucarima_model(.jd2r_arima(model), lapply(jcmps, .jd2r_arima))) - q<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "[B", "toBuffer", jucm) - rq<-RProtoBuf::read(modelling.UcarimaModel, q) - return(.p2r_ucarima(rq)) +# model<-.jcall(jucm, "Ljdplus/toolkit/base/core/arima/ArimaModel;", "sum") +# jcmps<-.jcall(jucm, "[Ljdplus/toolkit/base/core/arima/ArimaModel;", "getComponents") +# return(ucarima_model(.jd2r_arima(model), lapply(jcmps, .jd2r_arima))) + q<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "[B", "toBuffer", jucm) + rq<-RProtoBuf::read(modelling.UcarimaModel, q) + return(.p2r_ucarima(rq)) } @@ -310,15 +310,15 @@ ucarima_model<-function(model=NULL, components, complements=NULL, checkmodel=FAL #' wk2<-ucarima_wk(hp, 2) #' plot(wk1$filter, type='h') ucarima_wk<-function(ucm, cmp, signal=TRUE, nspectrum=601, nwk=300){ - jucm<-.r2jd_ucarima(ucm) - jwks<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/core/ucarima/WienerKolmogorovEstimators;", "wienerKolmogorovEstimators", jucm) - jwk<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/core/ucarima/WienerKolmogorovEstimator;", "finalEstimator", jwks, as.integer(cmp-1), signal) + jucm<-.r2jd_ucarima(ucm) + jwks<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/core/ucarima/WienerKolmogorovEstimators;", "wienerKolmogorovEstimators", jucm) + jwk<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/core/ucarima/WienerKolmogorovEstimator;", "finalEstimator", jwks, as.integer(cmp-1), signal) - spectrum<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "[D", "spectrum", jwk, as.integer(nspectrum)) - wk<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "[D", "filter", jwk, as.integer(nwk)) - gain<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "[D", "gain", jwk, as.integer(nspectrum)) + spectrum<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "[D", "spectrum", jwk, as.integer(nspectrum)) + wk<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "[D", "filter", jwk, as.integer(nwk)) + gain<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "[D", "gain", jwk, as.integer(nspectrum)) - return(structure(list(spectrum=spectrum, filter=wk, gain2=gain*gain), class="JD3_UCARIMA_WK")) + return(structure(list(spectrum=spectrum, filter=wk, gain2=gain*gain), class="JD3_UCARIMA_WK")) } #' Makes a UCARIMA model canonical; more specifically, put all the noise of the components in one dedicated component @@ -337,10 +337,10 @@ ucarima_wk<-function(ucm, cmp, signal=TRUE, nspectrum=601, nwk=300){ #' hpc <- ucarima_canonical(hp, cmp=2) ucarima_canonical<-function(ucm, cmp=0, adjust=TRUE){ - jucm<-.r2jd_ucarima(ucm) - jnucm<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/core/ucarima/UcarimaModel;", "doCanonical", - jucm, as.integer(cmp-1), as.logical(adjust)) - return(.jd2r_ucarima(jnucm)) + jucm<-.r2jd_ucarima(ucm) + jnucm<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/core/ucarima/UcarimaModel;", "doCanonical", + jucm, as.integer(cmp-1), as.logical(adjust)) + return(.jd2r_ucarima(jnucm)) } #' Estimate UCARIMA Model @@ -362,10 +362,10 @@ ucarima_canonical<-function(ucm, cmp=0, adjust=TRUE){ #' t <- ts(all[,1], frequency = frequency(s), start = start(s)) #' lines(t, col='blue') ucarima_estimate<-function(x, ucm, stdev=TRUE){ - jucm<-.r2jd_ucarima(ucm) - jcmps<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/api/math/matrices/Matrix;", "estimate", - as.numeric(x), jucm, as.logical(stdev)) - return(.jd2r_matrix(jcmps)) + jucm<-.r2jd_ucarima(ucm) + jcmps<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/api/math/matrices/Matrix;", "estimate", + as.numeric(x), jucm, as.logical(stdev)) + return(.jd2r_matrix(jcmps)) } #' Estimate SARIMA Model @@ -385,43 +385,43 @@ ucarima_estimate<-function(x, ucm, stdev=TRUE){ #' y <- ABS$X0.2.09.10.M #' sarima_estimate(y, order = c(0,1,1), seasonal = c(0,1,1)) sarima_estimate<-function(x, order=c(0,0,0), seasonal = list(order=c(0,0,0), period=NA), mean=FALSE, xreg=NULL, eps = 1e-9){ - if (!is.list(seasonal) && is.numeric(seasonal) && length(seasonal) == 3) { - seasonal <- list(order = seasonal, - period = NA) + if (!is.list(seasonal) && is.numeric(seasonal) && length(seasonal) == 3) { + seasonal <- list(order = seasonal, + period = NA) + } + if (is.na(seasonal$period)) + seasonal$period <- frequency(x) + jxreg<-.r2jd_matrix(xreg) + jestim<-.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "Ljdplus/toolkit/base/core/regarima/RegArimaEstimation;", "estimate", + as.numeric(x), as.integer(order), as.integer(seasonal$period), as.integer(seasonal$order), as.logical(mean), jxreg, .jnull("[D"), as.numeric(eps)) + bytes<-.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "[B", "toBuffer", jestim) + p<-RProtoBuf::read(regarima.RegArimaModel$Estimation, bytes) + res <- .p2r_regarima_estimation(p) + + if (length(res$b) > 0) { + + names_xreg <- colnames(xreg) + if (is.null(names_xreg) && !is.null(xreg)){ + if (is.matrix(xreg)) { + # unnamed matrix regressors + names_xreg <- sprintf("xreg_%i", seq_len(ncol(xreg))) + } else { + # vector external regressor + names_xreg <- "xreg_1" + } } - if (is.na(seasonal$period)) - seasonal$period <- frequency(x) - jxreg<-.r2jd_matrix(xreg) - jestim<-.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "Ljdplus/toolkit/base/core/regarima/RegArimaEstimation;", "estimate", - as.numeric(x), as.integer(order), as.integer(seasonal$period), as.integer(seasonal$order), as.logical(mean), jxreg, .jnull("[D"), as.numeric(eps)) - bytes<-.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "[B", "toBuffer", jestim) - p<-RProtoBuf::read(regarima.RegArimaModel$Estimation, bytes) - res <- .p2r_regarima_estimation(p) - - if (length(res$b) > 0) { - - names_xreg <- colnames(xreg) - if (is.null(names_xreg) && !is.null(xreg)){ - if (is.matrix(xreg)) { - # unnamed matrix regressors - names_xreg <- sprintf("xreg_%i", seq_len(ncol(xreg))) - } else { - # vector external regressor - names_xreg <- "xreg_1" - } - } - if (mean) { - names_xreg <- c("intercept", names_xreg) - } - names(res$b) <- names_xreg + if (mean) { + names_xreg <- c("intercept", names_xreg) } - names(res$parameters$val) <- c(sprintf("phi(%i)", seq_len(order[1])), - sprintf("bphi(%i)", seq_len(seasonal$order[1])), - sprintf("theta(%i)", seq_len(order[3])), - sprintf("btheta(%i)", seq_len(seasonal$order[3]))) - res$orders <- list(order = order, seasonal = seasonal) - class(res) <- c("JD3_SARIMA_ESTIMATE", "JD3_REGARIMA_RSLTS") - return(res) + names(res$b) <- names_xreg + } + names(res$parameters$val) <- c(sprintf("phi(%i)", seq_len(order[1])), + sprintf("bphi(%i)", seq_len(seasonal$order[1])), + sprintf("theta(%i)", seq_len(order[3])), + sprintf("btheta(%i)", seq_len(seasonal$order[3]))) + res$orders <- list(order = order, seasonal = seasonal) + class(res) <- c("JD3_SARIMA_ESTIMATE", "JD3_REGARIMA_RSLTS") + return(res) } #' Title @@ -441,14 +441,14 @@ sarima_estimate<-function(x, order=c(0,0,0), seasonal = list(order=c(0,0,0), per #' y <- ABS$X0.2.09.10.M #' sarima_hannan_rissanen(y, order = c(0,1,1), seasonal = c(0,1,1)) sarima_hannan_rissanen<-function(x, order=c(0,0,0), seasonal = list(order=c(0,0,0), period=NA), initialization=c("Ols", "Levinson", "Burg"), biasCorrection=TRUE, finalCorrection=TRUE){ - if (!is.list(seasonal) && is.numeric(seasonal) && length(seasonal) == 3) { - initialization<-match.arg(initialization) - seasonal <- list(order = seasonal, - period = NA) - } - if (is.na(seasonal$period)) - seasonal$period <- frequency(x) - jmodel<-.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "Ljdplus/toolkit/base/core/sarima/SarimaModel;", "hannanRissanen", - as.numeric(x), as.integer(order), as.integer(seasonal$period), as.integer(seasonal$order), as.character(initialization), as.logical(biasCorrection), as.logical(finalCorrection)) - return(.jd2r_sarima(jmodel)) + if (!is.list(seasonal) && is.numeric(seasonal) && length(seasonal) == 3) { + initialization<-match.arg(initialization) + seasonal <- list(order = seasonal, + period = NA) + } + if (is.na(seasonal$period)) + seasonal$period <- frequency(x) + jmodel<-.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "Ljdplus/toolkit/base/core/sarima/SarimaModel;", "hannanRissanen", + as.numeric(x), as.integer(order), as.integer(seasonal$period), as.integer(seasonal$order), as.character(initialization), as.logical(biasCorrection), as.logical(finalCorrection)) + return(.jd2r_sarima(jmodel)) } From 7992251a1f837519d4ccd8835b2b4e1f2a6bc6f4 Mon Sep 17 00:00:00 2001 From: Tanguy BARTHELEMY Date: Mon, 14 Oct 2024 11:47:19 +0200 Subject: [PATCH 14/18] indentation --- R/arima.R | 270 ++++----- R/calendarts.R | 18 +- R/decomposition.R | 144 ++--- R/differencing.R | 98 ++-- R/display.R | 584 +++++++++---------- R/distributions.R | 30 +- R/generics.R | 12 +- R/jd2r.R | 168 +++--- R/jd3rslts.R | 2 +- R/modellingcontext.R | 398 ++++++------- R/procresults.R | 60 +- R/protobuf.R | 560 +++++++++--------- R/regarima_generic.R | 104 ++-- R/regarima_rslts.R | 50 +- R/spec_benchmarking.R | 48 +- R/spec_regarima.R | 1262 ++++++++++++++++++++--------------------- R/splines.R | 8 +- R/tests_regular.R | 92 +-- R/tests_seasonality.R | 82 +-- R/tests_td.R | 12 +- R/timeseries.R | 226 ++++---- R/utils.R | 52 +- R/variables.R | 292 +++++----- R/zzz.R | 26 +- 24 files changed, 2299 insertions(+), 2299 deletions(-) diff --git a/R/arima.R b/R/arima.R index e27810c..590af62 100644 --- a/R/arima.R +++ b/R/arima.R @@ -38,7 +38,7 @@ sarima_model<-function(name="sarima", btheta = btheta ) class(output) <- "JD3_SARIMA" - return(output) + return(output) } #' SARIMA Properties @@ -52,10 +52,10 @@ sarima_model<-function(name="sarima", #' sarima_properties(mod1) #' @export sarima_properties<-function(model, nspectrum=601, nacf=36){ - jmodel<-.r2jd_sarima(model) - spectrum<-.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "[D", "spectrum", jmodel, as.integer(nspectrum)) - acf<-.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "[D", "acf", jmodel, as.integer(nacf)) - return(list(acf=acf, spectrum=spectrum)) + jmodel<-.r2jd_sarima(model) + spectrum<-.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "[D", "spectrum", jmodel, as.integer(nspectrum)) + acf<-.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "[D", "acf", jmodel, as.integer(nacf)) + return(list(acf=acf, spectrum=spectrum)) } @@ -76,20 +76,20 @@ sarima_properties<-function(model, nspectrum=601, nacf=36){ #' plot(x, type = "l") #' @export sarima_random<-function(model, length, stde=1, tdegree=0, seed=-1){ - if (!inherits(model, "JD3_SARIMA")) - stop("Invalid model") - return(.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "[D", "random", - as.integer(length), - as.integer(model$period), - .jarray(as.numeric(model$phi)), - as.integer(model$d), - .jarray(as.numeric(model$theta)), - .jarray(as.numeric(model$bphi)), - as.integer(model$bd), - .jarray(as.numeric(model$btheta)), - stde, - as.integer(tdegree), - as.integer(seed))) + if (!inherits(model, "JD3_SARIMA")) + stop("Invalid model") + return(.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "[D", "random", + as.integer(length), + as.integer(model$period), + .jarray(as.numeric(model$phi)), + as.integer(model$d), + .jarray(as.numeric(model$theta)), + .jarray(as.numeric(model$bphi)), + as.integer(model$bd), + .jarray(as.numeric(model$btheta)), + stde, + as.integer(tdegree), + as.integer(seed))) } #' Decompose SARIMA Model into three components trend, seasonal, irregular @@ -106,13 +106,13 @@ sarima_random<-function(model, length, stde=1, tdegree=0, seed=-1){ #' ucm <- sarima_decompose(model) #' sarima_decompose<-function(model, rmod=0, epsphi=0){ - if (!inherits(model, "JD3_SARIMA")) - stop("Invalid model") - jmodel<-.r2jd_sarima(model) - jucm<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/core/ucarima/UcarimaModel;", "decompose", - jmodel, as.numeric(rmod), as.numeric(epsphi)) - if (is.jnull(jucm)) return(NULL) - return(.jd2r_ucarima(jucm)) + if (!inherits(model, "JD3_SARIMA")) + stop("Invalid model") + jmodel<-.r2jd_sarima(model) + jucm<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/core/ucarima/UcarimaModel;", "decompose", + jmodel, as.numeric(rmod), as.numeric(epsphi)) + if (is.jnull(jucm)) return(NULL) + return(.jd2r_ucarima(jucm)) } @@ -130,48 +130,48 @@ sarima_decompose<-function(model, rmod=0, epsphi=0){ #' @examples #' model <- arima_model("trend", ar=c(1,-.8), delta = c(1,-1), ma=c(1,-.5), var=100) arima_model<-function(name="arima", ar=1, delta=1, ma=1, variance=1){ - return(structure(list(name=name, ar=ar, delta=delta, ma=ma, var=variance), class="JD3_ARIMA")) + return(structure(list(name=name, ar=ar, delta=delta, ma=ma, var=variance), class="JD3_ARIMA")) } .jd2r_doubleseq<-function(jobj, jprop){ - jseq<-.jcall(jobj, "Ljdplus/toolkit/base/api/data/DoubleSeq;", jprop) - return(.jcall(jseq, "[D", "toArray")) + jseq<-.jcall(jobj, "Ljdplus/toolkit/base/api/data/DoubleSeq;", jprop) + return(.jcall(jseq, "[D", "toArray")) } .jd2r_sarima<-function(jsarima){ - q<-.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "[B", "toBuffer", jsarima) - rq<-RProtoBuf::read(modelling.SarimaModel, q) - return(.p2r_sarima(rq)) + q<-.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "[B", "toBuffer", jsarima) + rq<-RProtoBuf::read(modelling.SarimaModel, q) + return(.p2r_sarima(rq)) } #' @export #' @rdname jd3_utilities .r2jd_sarima<-function(model){ - return(.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "Ljdplus/toolkit/base/core/sarima/SarimaModel;", "of", - as.integer(model$period), - .jarray(as.numeric(model$phi)), - as.integer(model$d), - .jarray(as.numeric(model$theta)), - .jarray(as.numeric(model$bphi)), - as.integer(model$bd), - .jarray(as.numeric(model$btheta)))) + return(.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "Ljdplus/toolkit/base/core/sarima/SarimaModel;", "of", + as.integer(model$period), + .jarray(as.numeric(model$phi)), + as.integer(model$d), + .jarray(as.numeric(model$theta)), + .jarray(as.numeric(model$bphi)), + as.integer(model$bd), + .jarray(as.numeric(model$btheta)))) } .jd2r_arima<-function(jarima){ - q<-.jcall("jdplus/toolkit/base/r/arima/ArimaModels", "[B", "toBuffer", jarima) - rq<-RProtoBuf::read(modelling.ArimaModel, q) - return(.p2r_arima(rq)) + q<-.jcall("jdplus/toolkit/base/r/arima/ArimaModels", "[B", "toBuffer", jarima) + rq<-RProtoBuf::read(modelling.ArimaModel, q) + return(.p2r_arima(rq)) } .r2jd_arima<-function(model){ - return(.jcall("jdplus/toolkit/base/r/arima/ArimaModels", "Ljdplus/toolkit/base/core/arima/ArimaModel;", "of", - .jarray(as.numeric(model$ar)), - .jarray(as.numeric(model$delta)), - .jarray(as.numeric(model$ma)), - as.numeric(model$var), FALSE)) + return(.jcall("jdplus/toolkit/base/r/arima/ArimaModels", "Ljdplus/toolkit/base/core/arima/ArimaModel;", "of", + .jarray(as.numeric(model$ar)), + .jarray(as.numeric(model$delta)), + .jarray(as.numeric(model$ma)), + as.numeric(model$var), FALSE)) } #' Sum ARIMA Models @@ -196,14 +196,14 @@ arima_model<-function(name="arima", ar=1, delta=1, ma=1, variance=1){ #' arima_sum(mod1, mod2) #' @export arima_sum<-function(...){ - components<-list(...) - return(arima_lsum(components)) + components<-list(...) + return(arima_lsum(components)) } arima_lsum<-function(components){ - q<-.jarray(lapply(components, .r2jd_arima), "jdplus/toolkit/base/core/arima/ArimaModel") - jsum<-.jcall("jdplus/toolkit/base/r/arima/ArimaModels", "Ljdplus/toolkit/base/core/arima/ArimaModel;", "sum", q) - return(.jd2r_arima(jsum)) + q<-.jarray(lapply(components, .r2jd_arima), "jdplus/toolkit/base/core/arima/ArimaModel") + jsum<-.jcall("jdplus/toolkit/base/r/arima/ArimaModels", "Ljdplus/toolkit/base/core/arima/ArimaModel;", "sum", q) + return(.jd2r_arima(jsum)) } #' Remove an arima model from an existing one. More exactly, m_diff = m_left - m_right iff m_left = m_right + m_diff. @@ -224,10 +224,10 @@ arima_lsum<-function(components){ #' # sum should be equal to mod1 #' arima_difference<-function(left, right, simplify=TRUE){ - jleft<-.r2jd_arima(left) - jright<-.r2jd_arima(right) - jdiff<-.jcall(jleft, "Ljdplus/toolkit/base/core/arima/ArimaModel;", "minus", jright, as.logical(simplify)) - return(.jd2r_arima(jdiff)) + jleft<-.r2jd_arima(left) + jright<-.r2jd_arima(right) + jdiff<-.jcall(jleft, "Ljdplus/toolkit/base/core/arima/ArimaModel;", "minus", jright, as.logical(simplify)) + return(.jd2r_arima(jdiff)) } @@ -243,10 +243,10 @@ arima_difference<-function(left, right, simplify=TRUE){ #' arima_properties(mod1) #' @export arima_properties<-function(model, nspectrum=601, nac=36){ - jmodel<-.r2jd_arima(model) - spectrum<-.jcall("jdplus/toolkit/base/r/arima/ArimaModels", "[D", "spectrum", jmodel, as.integer(nspectrum)) - acf<-.jcall("jdplus/toolkit/base/r/arima/ArimaModels", "[D", "acf", jmodel, as.integer(nac)) - return(list(acf=acf, spectrum=spectrum)) + jmodel<-.r2jd_arima(model) + spectrum<-.jcall("jdplus/toolkit/base/r/arima/ArimaModels", "[D", "spectrum", jmodel, as.integer(nspectrum)) + acf<-.jcall("jdplus/toolkit/base/r/arima/ArimaModels", "[D", "acf", jmodel, as.integer(nac)) + return(list(acf=acf, spectrum=spectrum)) } #' Creates an UCARIMA model, which is composed of ARIMA models with independent innovations. @@ -265,29 +265,29 @@ arima_properties<-function(model, nspectrum=601, nac=36){ #' hp<-ucarima_model(components=list(mod1, mod2)) #' print(hp$model) ucarima_model<-function(model=NULL, components, complements=NULL, checkmodel=FALSE){ - if (is.null(model)) - model<-arima_lsum(components) - else if (! is(model, "JD3_ARIMA") && ! is(model, "JD3_SARIMA")) stop("Invalid model") + if (is.null(model)) + model<-arima_lsum(components) + else if (! is(model, "JD3_ARIMA") && ! is(model, "JD3_SARIMA")) stop("Invalid model") - # TODO: checkmodel - return(structure(list(model=model, components=components, complements=complements), class="JD3_UCARIMA")) + # TODO: checkmodel + return(structure(list(model=model, components=components, complements=complements), class="JD3_UCARIMA")) } .r2jd_ucarima<-function(ucm){ - jmodel<-.r2jd_arima(ucm$model) - jcmps<-.jarray(lapply(ucm$components, .r2jd_arima), "jdplus/toolkit/base/core/arima/ArimaModel") - return(.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/core/ucarima/UcarimaModel;", "of", jmodel, jcmps)) + jmodel<-.r2jd_arima(ucm$model) + jcmps<-.jarray(lapply(ucm$components, .r2jd_arima), "jdplus/toolkit/base/core/arima/ArimaModel") + return(.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/core/ucarima/UcarimaModel;", "of", jmodel, jcmps)) } #' @export #' @rdname jd3_utilities .jd2r_ucarima<-function(jucm){ -# model<-.jcall(jucm, "Ljdplus/toolkit/base/core/arima/ArimaModel;", "sum") -# jcmps<-.jcall(jucm, "[Ljdplus/toolkit/base/core/arima/ArimaModel;", "getComponents") -# return(ucarima_model(.jd2r_arima(model), lapply(jcmps, .jd2r_arima))) - q<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "[B", "toBuffer", jucm) - rq<-RProtoBuf::read(modelling.UcarimaModel, q) - return(.p2r_ucarima(rq)) + # model<-.jcall(jucm, "Ljdplus/toolkit/base/core/arima/ArimaModel;", "sum") + # jcmps<-.jcall(jucm, "[Ljdplus/toolkit/base/core/arima/ArimaModel;", "getComponents") + # return(ucarima_model(.jd2r_arima(model), lapply(jcmps, .jd2r_arima))) + q<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "[B", "toBuffer", jucm) + rq<-RProtoBuf::read(modelling.UcarimaModel, q) + return(.p2r_ucarima(rq)) } @@ -310,15 +310,15 @@ ucarima_model<-function(model=NULL, components, complements=NULL, checkmodel=FAL #' wk2<-ucarima_wk(hp, 2) #' plot(wk1$filter, type='h') ucarima_wk<-function(ucm, cmp, signal=TRUE, nspectrum=601, nwk=300){ - jucm<-.r2jd_ucarima(ucm) - jwks<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/core/ucarima/WienerKolmogorovEstimators;", "wienerKolmogorovEstimators", jucm) - jwk<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/core/ucarima/WienerKolmogorovEstimator;", "finalEstimator", jwks, as.integer(cmp-1), signal) + jucm<-.r2jd_ucarima(ucm) + jwks<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/core/ucarima/WienerKolmogorovEstimators;", "wienerKolmogorovEstimators", jucm) + jwk<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/core/ucarima/WienerKolmogorovEstimator;", "finalEstimator", jwks, as.integer(cmp-1), signal) - spectrum<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "[D", "spectrum", jwk, as.integer(nspectrum)) - wk<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "[D", "filter", jwk, as.integer(nwk)) - gain<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "[D", "gain", jwk, as.integer(nspectrum)) + spectrum<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "[D", "spectrum", jwk, as.integer(nspectrum)) + wk<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "[D", "filter", jwk, as.integer(nwk)) + gain<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "[D", "gain", jwk, as.integer(nspectrum)) - return(structure(list(spectrum=spectrum, filter=wk, gain2=gain*gain), class="JD3_UCARIMA_WK")) + return(structure(list(spectrum=spectrum, filter=wk, gain2=gain*gain), class="JD3_UCARIMA_WK")) } #' Makes a UCARIMA model canonical; more specifically, put all the noise of the components in one dedicated component @@ -337,10 +337,10 @@ ucarima_wk<-function(ucm, cmp, signal=TRUE, nspectrum=601, nwk=300){ #' hpc <- ucarima_canonical(hp, cmp=2) ucarima_canonical<-function(ucm, cmp=0, adjust=TRUE){ - jucm<-.r2jd_ucarima(ucm) - jnucm<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/core/ucarima/UcarimaModel;", "doCanonical", - jucm, as.integer(cmp-1), as.logical(adjust)) - return(.jd2r_ucarima(jnucm)) + jucm<-.r2jd_ucarima(ucm) + jnucm<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/core/ucarima/UcarimaModel;", "doCanonical", + jucm, as.integer(cmp-1), as.logical(adjust)) + return(.jd2r_ucarima(jnucm)) } #' Estimate UCARIMA Model @@ -362,10 +362,10 @@ ucarima_canonical<-function(ucm, cmp=0, adjust=TRUE){ #' t <- ts(all[,1], frequency = frequency(s), start = start(s)) #' lines(t, col='blue') ucarima_estimate<-function(x, ucm, stdev=TRUE){ - jucm<-.r2jd_ucarima(ucm) - jcmps<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/api/math/matrices/Matrix;", "estimate", - as.numeric(x), jucm, as.logical(stdev)) - return(.jd2r_matrix(jcmps)) + jucm<-.r2jd_ucarima(ucm) + jcmps<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/api/math/matrices/Matrix;", "estimate", + as.numeric(x), jucm, as.logical(stdev)) + return(.jd2r_matrix(jcmps)) } #' Estimate SARIMA Model @@ -385,43 +385,43 @@ ucarima_estimate<-function(x, ucm, stdev=TRUE){ #' y <- ABS$X0.2.09.10.M #' sarima_estimate(y, order = c(0,1,1), seasonal = c(0,1,1)) sarima_estimate<-function(x, order=c(0,0,0), seasonal = list(order=c(0,0,0), period=NA), mean=FALSE, xreg=NULL, eps = 1e-9){ - if (!is.list(seasonal) && is.numeric(seasonal) && length(seasonal) == 3) { - seasonal <- list(order = seasonal, - period = NA) - } - if (is.na(seasonal$period)) - seasonal$period <- frequency(x) - jxreg<-.r2jd_matrix(xreg) - jestim<-.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "Ljdplus/toolkit/base/core/regarima/RegArimaEstimation;", "estimate", - as.numeric(x), as.integer(order), as.integer(seasonal$period), as.integer(seasonal$order), as.logical(mean), jxreg, .jnull("[D"), as.numeric(eps)) - bytes<-.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "[B", "toBuffer", jestim) - p<-RProtoBuf::read(regarima.RegArimaModel$Estimation, bytes) - res <- .p2r_regarima_estimation(p) - - if (length(res$b) > 0) { - - names_xreg <- colnames(xreg) - if (is.null(names_xreg) && !is.null(xreg)){ - if (is.matrix(xreg)) { - # unnamed matrix regressors - names_xreg <- sprintf("xreg_%i", seq_len(ncol(xreg))) - } else { - # vector external regressor - names_xreg <- "xreg_1" - } + if (!is.list(seasonal) && is.numeric(seasonal) && length(seasonal) == 3) { + seasonal <- list(order = seasonal, + period = NA) } - if (mean) { - names_xreg <- c("intercept", names_xreg) + if (is.na(seasonal$period)) + seasonal$period <- frequency(x) + jxreg<-.r2jd_matrix(xreg) + jestim<-.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "Ljdplus/toolkit/base/core/regarima/RegArimaEstimation;", "estimate", + as.numeric(x), as.integer(order), as.integer(seasonal$period), as.integer(seasonal$order), as.logical(mean), jxreg, .jnull("[D"), as.numeric(eps)) + bytes<-.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "[B", "toBuffer", jestim) + p<-RProtoBuf::read(regarima.RegArimaModel$Estimation, bytes) + res <- .p2r_regarima_estimation(p) + + if (length(res$b) > 0) { + + names_xreg <- colnames(xreg) + if (is.null(names_xreg) && !is.null(xreg)){ + if (is.matrix(xreg)) { + # unnamed matrix regressors + names_xreg <- sprintf("xreg_%i", seq_len(ncol(xreg))) + } else { + # vector external regressor + names_xreg <- "xreg_1" + } + } + if (mean) { + names_xreg <- c("intercept", names_xreg) + } + names(res$b) <- names_xreg } - names(res$b) <- names_xreg - } - names(res$parameters$val) <- c(sprintf("phi(%i)", seq_len(order[1])), - sprintf("bphi(%i)", seq_len(seasonal$order[1])), - sprintf("theta(%i)", seq_len(order[3])), - sprintf("btheta(%i)", seq_len(seasonal$order[3]))) - res$orders <- list(order = order, seasonal = seasonal) - class(res) <- c("JD3_SARIMA_ESTIMATE", "JD3_REGARIMA_RSLTS") - return(res) + names(res$parameters$val) <- c(sprintf("phi(%i)", seq_len(order[1])), + sprintf("bphi(%i)", seq_len(seasonal$order[1])), + sprintf("theta(%i)", seq_len(order[3])), + sprintf("btheta(%i)", seq_len(seasonal$order[3]))) + res$orders <- list(order = order, seasonal = seasonal) + class(res) <- c("JD3_SARIMA_ESTIMATE", "JD3_REGARIMA_RSLTS") + return(res) } #' Title @@ -441,14 +441,14 @@ sarima_estimate<-function(x, order=c(0,0,0), seasonal = list(order=c(0,0,0), per #' y <- ABS$X0.2.09.10.M #' sarima_hannan_rissanen(y, order = c(0,1,1), seasonal = c(0,1,1)) sarima_hannan_rissanen<-function(x, order=c(0,0,0), seasonal = list(order=c(0,0,0), period=NA), initialization=c("Ols", "Levinson", "Burg"), biasCorrection=TRUE, finalCorrection=TRUE){ - if (!is.list(seasonal) && is.numeric(seasonal) && length(seasonal) == 3) { - initialization<-match.arg(initialization) - seasonal <- list(order = seasonal, - period = NA) - } - if (is.na(seasonal$period)) - seasonal$period <- frequency(x) - jmodel<-.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "Ljdplus/toolkit/base/core/sarima/SarimaModel;", "hannanRissanen", - as.numeric(x), as.integer(order), as.integer(seasonal$period), as.integer(seasonal$order), as.character(initialization), as.logical(biasCorrection), as.logical(finalCorrection)) - return(.jd2r_sarima(jmodel)) + if (!is.list(seasonal) && is.numeric(seasonal) && length(seasonal) == 3) { + initialization<-match.arg(initialization) + seasonal <- list(order = seasonal, + period = NA) + } + if (is.na(seasonal$period)) + seasonal$period <- frequency(x) + jmodel<-.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "Ljdplus/toolkit/base/core/sarima/SarimaModel;", "hannanRissanen", + as.numeric(x), as.integer(order), as.integer(seasonal$period), as.integer(seasonal$order), as.character(initialization), as.logical(biasCorrection), as.logical(finalCorrection)) + return(.jd2r_sarima(jmodel)) } diff --git a/R/calendarts.R b/R/calendarts.R index 569f22f..03a8448 100644 --- a/R/calendarts.R +++ b/R/calendarts.R @@ -11,13 +11,13 @@ #' ) #' jobj<-r2jd_calendarts(obs) r2jd_calendarts<-function(calendarobs){ - if (is.null(calendarobs) || !is.list(calendarobs)){ - return(NULL) - } - starts<-sapply(calendarobs, function(z){as.character(z$start)}) - ends<-sapply(calendarobs, function(z){as.character(z$end)}) - values<-sapply(calendarobs, function(z){as.numeric(z$value)}) - jts<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/CalendarTimeSeries;", "of", - .jarray(starts, "Ljava/lang/String;"), .jarray(ends, "Ljava/lang/String;"), .jarray(values)) - return(jts) + if (is.null(calendarobs) || !is.list(calendarobs)){ + return(NULL) + } + starts<-sapply(calendarobs, function(z){as.character(z$start)}) + ends<-sapply(calendarobs, function(z){as.character(z$end)}) + values<-sapply(calendarobs, function(z){as.numeric(z$value)}) + jts<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/CalendarTimeSeries;", "of", + .jarray(starts, "Ljava/lang/String;"), .jarray(ends, "Ljava/lang/String;"), .jarray(values)) + return(jts) } diff --git a/R/decomposition.R b/R/decomposition.R index 4c53527..261002d 100644 --- a/R/decomposition.R +++ b/R/decomposition.R @@ -7,97 +7,97 @@ NULL #' @rdname sa_decomposition #' @export sadecomposition<-function(y, sa, t, s, i, mul){ - if (! is.logical(mul))stop("Invalid SA decomposition") - if (is.null(y))stop("Invalid SA decomposition") - if (! is.ts(y))stop("Invalid SA decomposition") - n<-length(y) - if (is.null(s)){ - if (mul){ - s<-ts(rep(1,1,n), start = start(y), frequency = frequency(y)) - } else { - s <- ts(rep(0,1,n), start = start(y), frequency = frequency(y)) - } - } else if (! is.ts(s))stop("Invalid SA decomposition") - if (is.null(i)){ - if (mul){ - i<-ts(rep(1,1,n), start = start(y), frequency = frequency(y)) - } else { - i<-ts(rep(0,1,n), start = start(y), frequency = frequency(y)) - } - } else if (! is.ts(i))stop("Invalid SA decomposition") + if (! is.logical(mul))stop("Invalid SA decomposition") + if (is.null(y))stop("Invalid SA decomposition") + if (! is.ts(y))stop("Invalid SA decomposition") + n<-length(y) + if (is.null(s)){ + if (mul){ + s<-ts(rep(1,1,n), start = start(y), frequency = frequency(y)) + } else { + s <- ts(rep(0,1,n), start = start(y), frequency = frequency(y)) + } + } else if (! is.ts(s))stop("Invalid SA decomposition") + if (is.null(i)){ + if (mul){ + i<-ts(rep(1,1,n), start = start(y), frequency = frequency(y)) + } else { + i<-ts(rep(0,1,n), start = start(y), frequency = frequency(y)) + } + } else if (! is.ts(i))stop("Invalid SA decomposition") - if (! is.ts(sa))stop("Invalid SA decomposition") - if (! is.ts(t))stop("Invalid SA decomposition") + if (! is.ts(sa))stop("Invalid SA decomposition") + if (! is.ts(t))stop("Invalid SA decomposition") - return(structure(list(series=y, sa=sa, trend=t, seas=s, irr=i, multiplicative=mul), class=c("JD3_SADECOMPOSITION", "JD3"))) + return(structure(list(series=y, sa=sa, trend=t, seas=s, irr=i, multiplicative=mul), class=c("JD3_SADECOMPOSITION", "JD3"))) } #' @rdname sa_decomposition #' @export print.JD3_SADECOMPOSITION<-function(x, n_last_obs = frequency(x$series), ...){ - cat("Last values\n") - print(tail( - .preformat.ts(ts.union(series=x$series,sa=x$sa,trend=x$trend,seas=x$seas,irr=x$irr),...), - n_last_obs + cat("Last values\n") + print(tail( + .preformat.ts(ts.union(series=x$series,sa=x$sa,trend=x$trend,seas=x$seas,irr=x$irr),...), + n_last_obs + ) ) - ) } #' @rdname sa_decomposition #' @export plot.JD3_SADECOMPOSITION <- function(x, first_date = NULL, last_date = NULL, - type_chart = c("sa-trend", "seas-irr"), - caption = c("sa-trend" = "Y, Sa, trend", - "seas-irr" = "Sea., irr.")[type_chart], - colors = c(y = "#F0B400", t = "#1E6C0B", sa = "#155692", - s = "#1E6C0B", i = "#155692"), - ...){ + type_chart = c("sa-trend", "seas-irr"), + caption = c("sa-trend" = "Y, Sa, trend", + "seas-irr" = "Sea., irr.")[type_chart], + colors = c(y = "#F0B400", t = "#1E6C0B", sa = "#155692", + s = "#1E6C0B", i = "#155692"), + ...){ - type_chart <- match.arg(type_chart) + type_chart <- match.arg(type_chart) - data_plot <- ts.union(y=x$series,sa=x$sa,t=x$trend,s=x$seas,i=x$irr) - if (!missing(first_date)) { - data_plot <- window(data_plot, start = first_date) - } - if (!missing(last_date)) { - data_plot <- window(data_plot, end = last_date) - } + data_plot <- ts.union(y=x$series,sa=x$sa,t=x$trend,s=x$seas,i=x$irr) + if (!missing(first_date)) { + data_plot <- window(data_plot, start = first_date) + } + if (!missing(last_date)) { + data_plot <- window(data_plot, end = last_date) + } - if ("sa-trend" %in% type_chart) { - # Graph 1: Sa, trend, and y - series_graph <- c("y", "t", "sa") + if ("sa-trend" %in% type_chart) { + # Graph 1: Sa, trend, and y + series_graph <- c("y", "t", "sa") - lty <- rep(1, length(series_graph)) - # lty[grep("_f$", series_graph)] <- 1 - # col <- colors[gsub("_.*$", "", series_graph)] - # par(mar = c(5, 4, 4, 2) + 0.1) - ts.plot(data_plot[, series_graph], - col = colors[series_graph], - main = caption[1], lty = lty, - ...) - legend("bottomleft", legend = c("Series", "Trend","Seasonally adjusted"), - col = colors[series_graph], lty = 1, - pch = NA_integer_, - inset = c(0,1), xpd = TRUE, bty = "n") - } + lty <- rep(1, length(series_graph)) + # lty[grep("_f$", series_graph)] <- 1 + # col <- colors[gsub("_.*$", "", series_graph)] + # par(mar = c(5, 4, 4, 2) + 0.1) + ts.plot(data_plot[, series_graph], + col = colors[series_graph], + main = caption[1], lty = lty, + ...) + legend("bottomleft", legend = c("Series", "Trend","Seasonally adjusted"), + col = colors[series_graph], lty = 1, + pch = NA_integer_, + inset = c(0,1), xpd = TRUE, bty = "n") + } - if ("seas-irr" %in% type_chart) { - # Graph 2: Calendar, seasonal and irregular - series_graph <- c("s", "i") - lty <- rep(1, length(series_graph)) - # lty[grep("_f$", series_graph, invert = TRUE)] <- 1 - # col <- colors[gsub("_.*$", "", series_graph)] - ts.plot(data_plot[, series_graph], - col = colors[series_graph], - main = caption[1], lty = lty, - ...) - legend("bottomleft", legend = c("Seas (component)", - "Irregular"), - col= colors[series_graph], lty = 1, - pch = NA_integer_, - inset=c(0,1), xpd=TRUE, bty="n") + if ("seas-irr" %in% type_chart) { + # Graph 2: Calendar, seasonal and irregular + series_graph <- c("s", "i") + lty <- rep(1, length(series_graph)) + # lty[grep("_f$", series_graph, invert = TRUE)] <- 1 + # col <- colors[gsub("_.*$", "", series_graph)] + ts.plot(data_plot[, series_graph], + col = colors[series_graph], + main = caption[1], lty = lty, + ...) + legend("bottomleft", legend = c("Seas (component)", + "Irregular"), + col= colors[series_graph], lty = 1, + pch = NA_integer_, + inset=c(0,1), xpd=TRUE, bty="n") } - invisible() + invisible() } diff --git a/R/differencing.R b/R/differencing.R index 34d8383..3d4a281 100644 --- a/R/differencing.R +++ b/R/differencing.R @@ -2,15 +2,15 @@ NULL .p2r_differencing<-function(p){ - if (is.null(p)){ - return(NULL) - } else { - del<-sapply(p$differences, function(z){(return(c(z$lag,z$order)))}) - del<-`rownames<-`(del, c("lag", "order")) - return(list(ddata=p$stationary_series, - mean=p$mean_correction, - differences=del)) - } + if (is.null(p)){ + return(NULL) + } else { + del<-sapply(p$differences, function(z){(return(c(z$lag,z$order)))}) + del<-`rownames<-`(del, c("lag", "order")) + return(list(ddata=p$stationary_series, + mean=p$mean_correction, + differences=del)) + } } #' Automatic stationary transformation @@ -35,16 +35,16 @@ NULL #' @examples #' do_stationary(log(ABS$X0.2.09.10.M),12) do_stationary<-function(data, period){ - if (is.ts(data) && missing(period)) - period <- frequency(data) - jst<-.jcall("jdplus/toolkit/base/r/modelling/Differencing", "Ljdplus/toolkit/base/core/modelling/StationaryTransformation;", "doStationary", - as.numeric(data), as.integer(period)) - q<-.jcall("jdplus/toolkit/base/r/modelling/Differencing", "[B", "toBuffer", jst) - p<-RProtoBuf::read(modelling.StationaryTransformation, q) - res <- .p2r_differencing(p) - if (is.ts(data)) - res$ddata <- ts(res$ddata, end = end(data), frequency = frequency(data)) - return(res) + if (is.ts(data) && missing(period)) + period <- frequency(data) + jst<-.jcall("jdplus/toolkit/base/r/modelling/Differencing", "Ljdplus/toolkit/base/core/modelling/StationaryTransformation;", "doStationary", + as.numeric(data), as.integer(period)) + q<-.jcall("jdplus/toolkit/base/r/modelling/Differencing", "[B", "toBuffer", jst) + p<-RProtoBuf::read(modelling.StationaryTransformation, q) + res <- .p2r_differencing(p) + if (is.ts(data)) + res$ddata <- ts(res$ddata, end = end(data), frequency = frequency(data)) + return(res) } #' Automatic differencing @@ -70,16 +70,16 @@ do_stationary<-function(data, period){ #' differencing_fast(log(ABS$X0.2.09.10.M),12) #' differencing_fast<-function(data, period, mad=TRUE, centile=90, k=1.2){ - if (is.ts(data) && missing(period)) - period <- frequency(data) - jst<-.jcall("jdplus/toolkit/base/r/modelling/Differencing", "Ljdplus/toolkit/base/core/modelling/StationaryTransformation;", "fastDifferencing", - as.numeric(data), as.integer(period), as.logical(mad), centile, k) - q<-.jcall("jdplus/toolkit/base/r/modelling/Differencing", "[B", "toBuffer", jst) - p<-RProtoBuf::read(modelling.StationaryTransformation, q) - res <- .p2r_differencing(p) - if (is.ts(data)) - res$ddata <- ts(res$ddata, end = end(data), frequency = frequency(data)) - return(res) + if (is.ts(data) && missing(period)) + period <- frequency(data) + jst<-.jcall("jdplus/toolkit/base/r/modelling/Differencing", "Ljdplus/toolkit/base/core/modelling/StationaryTransformation;", "fastDifferencing", + as.numeric(data), as.integer(period), as.logical(mad), centile, k) + q<-.jcall("jdplus/toolkit/base/r/modelling/Differencing", "[B", "toBuffer", jst) + p<-RProtoBuf::read(modelling.StationaryTransformation, q) + res <- .p2r_differencing(p) + if (is.ts(data)) + res$ddata <- ts(res$ddata, end = end(data), frequency = frequency(data)) + return(res) } #' Differencing of a series @@ -95,31 +95,31 @@ differencing_fast<-function(data, period, mad=TRUE, centile=90, k=1.2){ #' differences(retail$BookStores, c(1,1,12), FALSE) #' differences<-function(data, lags=1, mean=TRUE){ - UseMethod("differences", data) + UseMethod("differences", data) } #' @export differences.default<-function(data, lags=1, mean=TRUE){ - res <- .jcall("jdplus/toolkit/base/r/modelling/Differencing", "[D", "differences", - as.numeric(data), .jarray(as.integer(lags)), mean) - if (is.ts(data)) - res <- ts(res, end = end(data), frequency = frequency(data)) - return(res) + res <- .jcall("jdplus/toolkit/base/r/modelling/Differencing", "[D", "differences", + as.numeric(data), .jarray(as.integer(lags)), mean) + if (is.ts(data)) + res <- ts(res, end = end(data), frequency = frequency(data)) + return(res) } #' @export differences.matrix<-function(data, lags=1, mean=TRUE){ - result <- data[-(1:sum(lags)),] - for (i in seq_len(ncol(data))){ - result[, i] <- differences(data[,i], lags = lags, mean = mean) - } - result + result <- data[-(1:sum(lags)),] + for (i in seq_len(ncol(data))){ + result[, i] <- differences(data[,i], lags = lags, mean = mean) + } + result } #' @export differences.data.frame<-function(data, lags=1, mean=TRUE){ - result <- data[-(1:sum(lags)),] - for (i in seq_len(ncol(data))){ - result[, i] <- differences(data[,i], lags = lags, mean = mean) - } - result + result <- data[-(1:sum(lags)),] + for (i in seq_len(ncol(data))){ + result[, i] <- differences(data[,i], lags = lags, mean = mean) + } + result } #' Range-Mean Regression @@ -176,9 +176,9 @@ differences.data.frame<-function(data, lags=1, mean=TRUE){ #' pt(rm_t_log, period - 2, lower.tail = FALSE) #' @export rangemean_tstat<-function(data, period=0, groupsize = 0, trim = 0){ - if (is.ts(data) && missing(period)) - period <- frequency(data) - return(.jcall("jdplus/toolkit/base/r/modelling/AutoModelling", "D", "rangeMean", - as.numeric(data), as.integer(period), as.integer(groupsize), as.integer(trim))) + if (is.ts(data) && missing(period)) + period <- frequency(data) + return(.jcall("jdplus/toolkit/base/r/modelling/AutoModelling", "D", "rangeMean", + as.numeric(data), as.integer(period), as.integer(groupsize), as.integer(trim))) } diff --git a/R/display.R b/R/display.R index 199bff7..d9e363f 100644 --- a/R/display.R +++ b/R/display.R @@ -12,207 +12,207 @@ NULL #' @rdname jd3_print #' @export print.JD3_ARIMA<-function(x, ...){ - m <- x - if (m$var > 0 || length(m$delta)>1){ - cat(m$name, "\n\n") - if (length(m$ar)>1) cat("AR:", m$ar, "\n") - if (length(m$delta)>1)cat("DIF:", m$delta, "\n") - if (length(m$ma)>1)cat("MA:", m$ma, "\n") - cat("var: ", m$var, "\n\n") - } - invisible(x) + m <- x + if (m$var > 0 || length(m$delta)>1){ + cat(m$name, "\n\n") + if (length(m$ar)>1) cat("AR:", m$ar, "\n") + if (length(m$delta)>1)cat("DIF:", m$delta, "\n") + if (length(m$ma)>1)cat("MA:", m$ma, "\n") + cat("var: ", m$var, "\n\n") + } + invisible(x) } #' @rdname jd3_print #' @export print.JD3_UCARIMA<-function(x,...){ - ucm <- x - print(ucm$model) - lapply(ucm$components, function(z){print(z)}) - invisible(x) + ucm <- x + print(ucm$model) + lapply(ucm$components, function(z){print(z)}) + invisible(x) } .arima_node<-function(p,d,q){ - s<-paste(p,d,q,sep=',') - return(paste0('(', s, ')')) + s<-paste(p,d,q,sep=',') + return(paste0('(', s, ')')) } #' @rdname jd3_print #' @export print.JD3_SARIMA<-function(x, ...){ - m <- x - cat("SARIMA model: ", .arima_node(length(m$phi), m$d, length(m$theta)), .arima_node(length(m$bphi), m$bd, length(m$btheta)), m$period, "\n") - if (length(m$phi)>0) cat("phi:", m$phi, "\n") - if (length(m$theta)>0)cat("theta:", m$theta, "\n") - if (length(m$bphi)>0) cat("bphi:", m$bphi, "\n") - if (length(m$btheta)>0)cat("btheta:", m$btheta, "\n") + m <- x + cat("SARIMA model: ", .arima_node(length(m$phi), m$d, length(m$theta)), .arima_node(length(m$bphi), m$bd, length(m$btheta)), m$period, "\n") + if (length(m$phi)>0) cat("phi:", m$phi, "\n") + if (length(m$theta)>0)cat("theta:", m$theta, "\n") + if (length(m$bphi)>0) cat("bphi:", m$bphi, "\n") + if (length(m$btheta)>0)cat("btheta:", m$btheta, "\n") } #' @rdname jd3_print #' @export print.JD3_SARIMA_ESTIMATION<-function(x, digits = max(3L, getOption("digits") - 3L), ...){ - tables <- .sarima_coef_table(x, ...) - orders <- tables$sarima_orders - - cat("SARIMA model:", - .arima_node(orders$p, orders$d, orders$q), - .arima_node(orders$bp, orders$bd, orders$bq)) - if (!is.null(orders$period)) # when sarima_estimate() is used - cat(sprintf(" [%i]", orders$period)) - - cat("\n") - - cat("\nSARIMA coefficients:\n") - if (is.null(tables$coef_table)){ - cat("No SARIMA variables\n") - } else { - coef <- tables$coef_table[, 1] - names(coef) <- rownames(tables$coef_table) - print(coef, digits = digits, na.print = "NA", ...) - } - invisible(x) + tables <- .sarima_coef_table(x, ...) + orders <- tables$sarima_orders + + cat("SARIMA model:", + .arima_node(orders$p, orders$d, orders$q), + .arima_node(orders$bp, orders$bd, orders$bq)) + if (!is.null(orders$period)) # when sarima_estimate() is used + cat(sprintf(" [%i]", orders$period)) + + cat("\n") + + cat("\nSARIMA coefficients:\n") + if (is.null(tables$coef_table)){ + cat("No SARIMA variables\n") + } else { + coef <- tables$coef_table[, 1] + names(coef) <- rownames(tables$coef_table) + print(coef, digits = digits, na.print = "NA", ...) + } + invisible(x) } #' @export summary.JD3_SARIMA_ESTIMATION<-function(object, ...){ - tables <- .sarima_coef_table(object, ...) - class(tables) <- "summary.JD3_SARIMA_ESTIMATION" - tables + tables <- .sarima_coef_table(object, ...) + class(tables) <- "summary.JD3_SARIMA_ESTIMATION" + tables } #' @importFrom stats printCoefmat #' @export print.summary.JD3_SARIMA_ESTIMATION<-function(x, digits = max(3L, getOption("digits") - 3L), signif.stars = getOption("show.signif.stars"), ...){ - orders <- x$sarima_orders - - cat("SARIMA model:", - .arima_node(orders$p, orders$d, orders$q), - .arima_node(orders$bp, orders$bd, orders$bq)) - if (!is.null(orders$period)) # when sarima_estimate() is used - cat(sprintf(" [%i]", orders$period)) - - cat("\n") - cat("\nCoefficients\n") - if (is.null(x$coef_table)){ - cat("No SARIMA variables\n") - } else if (ncol(x$coef_table) == 2){ - print(x$coef_table, ...) - } else { - printCoefmat(x$coef_table[-2], digits = digits, signif.stars = signif.stars, - na.print = "NA", ...) - } - invisible(x) + orders <- x$sarima_orders + + cat("SARIMA model:", + .arima_node(orders$p, orders$d, orders$q), + .arima_node(orders$bp, orders$bd, orders$bq)) + if (!is.null(orders$period)) # when sarima_estimate() is used + cat(sprintf(" [%i]", orders$period)) + + cat("\n") + cat("\nCoefficients\n") + if (is.null(x$coef_table)){ + cat("No SARIMA variables\n") + } else if (ncol(x$coef_table) == 2){ + print(x$coef_table, ...) + } else { + printCoefmat(x$coef_table[-2], digits = digits, signif.stars = signif.stars, + na.print = "NA", ...) + } + invisible(x) } .sarima_coef_table <- function(x, ...){ - UseMethod(".sarima_coef_table", x) + UseMethod(".sarima_coef_table", x) } .sarima_coef_table.default <- function(x, cov = NULL, ndf = NULL,...){ - m <- x - if (! is.null(m$phi)) p<-dim(m$phi)[2]else p<-0 - if (! is.null(m$theta)) q<-dim(m$theta)[2]else q<-0 - if (! is.null(m$bphi)) bp<-dim(m$bphi)[2]else bp<-0 - if (! is.null(m$btheta)) bq<-dim(m$btheta)[2]else bq<-0 - sarima_orders <- list(p = p, d = m$d, q = q, bp = bp, bd = m$bd, bq = bq) - names<-NULL - if (p > 0){names<-c(names,paste0("phi(", 1:p, ')')) } - if (q > 0){names<-c(names,paste0("theta(", 1:q, ')')) } - if (bp > 0){names<-c(names,paste0("bphi(", 1:bp, ')')) } - if (bq > 0){names<-c(names,paste0("btheta(", 1:bq,')')) } - if (! is.null(names)){ - all<-t(cbind(m$phi, m$theta, m$bphi, m$btheta)) - fr<-as.data.frame(all, row.names = names) - for(i in colnames(fr)){ - fr[,i] <- unlist(fr[,i]) - } - if (!is.null(cov) && !is.null(ndf)){ - fr$pvalue <- fr$t <- fr$stde <- NA - stde<-sqrt(diag(cov)) - sel<-fr$type=='ESTIMATED' - t<-fr$value[sel]/stde - pval<-2*pt(abs(t), ndf, lower.tail = FALSE) - fr$stde[sel]<-stde - fr$t[sel]<-t - fr$pvalue[sel]<-pval - colnames(fr) <- c("Estimate", "Type", "Std. Error", - "T-stat", "Pr(>|t|)") + m <- x + if (! is.null(m$phi)) p<-dim(m$phi)[2]else p<-0 + if (! is.null(m$theta)) q<-dim(m$theta)[2]else q<-0 + if (! is.null(m$bphi)) bp<-dim(m$bphi)[2]else bp<-0 + if (! is.null(m$btheta)) bq<-dim(m$btheta)[2]else bq<-0 + sarima_orders <- list(p = p, d = m$d, q = q, bp = bp, bd = m$bd, bq = bq) + names<-NULL + if (p > 0){names<-c(names,paste0("phi(", 1:p, ')')) } + if (q > 0){names<-c(names,paste0("theta(", 1:q, ')')) } + if (bp > 0){names<-c(names,paste0("bphi(", 1:bp, ')')) } + if (bq > 0){names<-c(names,paste0("btheta(", 1:bq,')')) } + if (! is.null(names)){ + all<-t(cbind(m$phi, m$theta, m$bphi, m$btheta)) + fr<-as.data.frame(all, row.names = names) + for(i in colnames(fr)){ + fr[,i] <- unlist(fr[,i]) + } + if (!is.null(cov) && !is.null(ndf)){ + fr$pvalue <- fr$t <- fr$stde <- NA + stde<-sqrt(diag(cov)) + sel<-fr$type=='ESTIMATED' + t<-fr$value[sel]/stde + pval<-2*pt(abs(t), ndf, lower.tail = FALSE) + fr$stde[sel]<-stde + fr$t[sel]<-t + fr$pvalue[sel]<-pval + colnames(fr) <- c("Estimate", "Type", "Std. Error", + "T-stat", "Pr(>|t|)") + } else { + colnames(fr) <- c("Estimate", "Type") + } } else { - colnames(fr) <- c("Estimate", "Type") + fr <- NULL } - } else { - fr <- NULL - } - list(sarima_orders = sarima_orders, - coef_table = fr) + list(sarima_orders = sarima_orders, + coef_table = fr) } .sarima_coef_table.JD3_REGARIMA_RSLTS <- function(x, cov = NULL, ndf = NULL,...) { - .sarima_coef_table(x$description$arima, cov = cov, ndf = ndf, ...) + .sarima_coef_table(x$description$arima, cov = cov, ndf = ndf, ...) } .sarima_coef_table.JD3_SARIMA_ESTIMATE <- function(x,...){ - ndf<-x$likelihood$neffectiveobs-x$likelihood$nparams - sarima_orders <- list(p = x$orders$order[1], - d = x$orders$order[2], - q = x$orders$order[3], - bp = x$orders$seasonal$order[1], - bd = x$orders$seasonal$order[2], - bq = x$orders$seasonal$order[3], - period = x$orders$seasonal$period) - estimate <- x$parameters$val - - if (length(estimate) > 0){ - stde <- sqrt(diag(x$parameters$cov)) - t<-estimate/stde - pval<-2*pt(abs(t), ndf, lower.tail = FALSE) - table <- data.frame(estimate, "ESTIMATED", stde, t, pval) - colnames(table) <- c("Estimate", "Type", "Std. Error", - "T-stat", "Pr(>|t|)") - } else { - table <- NULL - } - list(sarima_orders = sarima_orders, - coef_table = table) + ndf<-x$likelihood$neffectiveobs-x$likelihood$nparams + sarima_orders <- list(p = x$orders$order[1], + d = x$orders$order[2], + q = x$orders$order[3], + bp = x$orders$seasonal$order[1], + bd = x$orders$seasonal$order[2], + bq = x$orders$seasonal$order[3], + period = x$orders$seasonal$period) + estimate <- x$parameters$val + + if (length(estimate) > 0){ + stde <- sqrt(diag(x$parameters$cov)) + t<-estimate/stde + pval<-2*pt(abs(t), ndf, lower.tail = FALSE) + table <- data.frame(estimate, "ESTIMATED", stde, t, pval) + colnames(table) <- c("Estimate", "Type", "Std. Error", + "T-stat", "Pr(>|t|)") + } else { + table <- NULL + } + list(sarima_orders = sarima_orders, + coef_table = table) } #' @rdname jd3_print #' @export print.JD3_SPAN <- function(x, ...){ - span <- x - type <- span$type - d0 <- span$d0 - d1 <- span$d1 - n0 <- span$n0 - n1 <- span$n1 - - if (type == "ALL") { x <- "All"} - else if (type == "FROM") { x <- paste("From", d0, sep = " ")} - else if (type == "TO") { x <- paste("Until", d1, sep = " ")} - else if (type == "BETWEEN") { x <- paste(d0, d1, sep = " - ")} - else if (type == "FIRST") { x <- paste("First", n0, "periods", sep = " ")} - else if (type == "LAST") { x <- paste("Last", n1, "periods", sep = " ")} - else if (type == "EXCLUDING") { x <- paste("All but first", n0, "periods and last", n1, "periods", sep = " ")} - else { x <- "Undefined"} - - cat(x, "\n") - - return(invisible(x)) + span <- x + type <- span$type + d0 <- span$d0 + d1 <- span$d1 + n0 <- span$n0 + n1 <- span$n1 + + if (type == "ALL") { x <- "All"} + else if (type == "FROM") { x <- paste("From", d0, sep = " ")} + else if (type == "TO") { x <- paste("Until", d1, sep = " ")} + else if (type == "BETWEEN") { x <- paste(d0, d1, sep = " - ")} + else if (type == "FIRST") { x <- paste("First", n0, "periods", sep = " ")} + else if (type == "LAST") { x <- paste("Last", n1, "periods", sep = " ")} + else if (type == "EXCLUDING") { x <- paste("All but first", n0, "periods and last", n1, "periods", sep = " ")} + else { x <- "Undefined"} + + cat(x, "\n") + + return(invisible(x)) } #' @rdname jd3_print #' @export print.JD3_LIKELIHOOD<-function(x, ...){ - ll <- x - cat("Number of observations:", ll$nobs, "\n") - cat("Number of effective observations:", ll$neffectiveobs, "\n") - cat("Number of parameters:", ll$nparams, "\n\n") - cat("Loglikelihood:", ll$ll, "\n") - if (ll$ll != ll$adjustedll)cat("Adjusted loglikelihood:", ll$adjustedll, "\n\n") - cat("Standard error of the regression (ML estimate):", sqrt(ll$ssq/ll$neffectiveobs), "\n") - cat("AIC:", ll$aic, "\n") - cat("AICC:", ll$aicc, "\n") - cat("BIC:", ll$bic, "\n\n") - invisible(x) + ll <- x + cat("Number of observations:", ll$nobs, "\n") + cat("Number of effective observations:", ll$neffectiveobs, "\n") + cat("Number of parameters:", ll$nparams, "\n\n") + cat("Loglikelihood:", ll$ll, "\n") + if (ll$ll != ll$adjustedll)cat("Adjusted loglikelihood:", ll$adjustedll, "\n\n") + cat("Standard error of the regression (ML estimate):", sqrt(ll$ssq/ll$neffectiveobs), "\n") + cat("AIC:", ll$aic, "\n") + cat("AICC:", ll$aicc, "\n") + cat("BIC:", ll$bic, "\n\n") + invisible(x) } #' @export summary.JD3_LIKELIHOOD<-function(object, ...){ @@ -232,174 +232,174 @@ summary.JD3_LIKELIHOOD<-function(object, ...){ } #' @export print.summary.JD3_LIKELIHOOD<-function(x, ...){ - cat("Number of observations: ", x$nobs, - ", Number of effective observations: ", x$neffectiveobs, - ", Number of parameters: ", x$nparams, "\n", sep = "") - cat("Loglikelihood:", x$ll) - if (x$ll != x$adjustedll)cat(", Adjusted loglikelihood:", x$adjustedll) - cat("\nStandard error of the regression (ML estimate):", x$se, "\n") - cat("AIC: ", x$aic, ", ", - "AICc: ", x$aicc, ", ", - "BIC: ", x$bic, "\n", sep = "") - invisible(x) + cat("Number of observations: ", x$nobs, + ", Number of effective observations: ", x$neffectiveobs, + ", Number of parameters: ", x$nparams, "\n", sep = "") + cat("Loglikelihood:", x$ll) + if (x$ll != x$adjustedll)cat(", Adjusted loglikelihood:", x$adjustedll) + cat("\nStandard error of the regression (ML estimate):", x$se, "\n") + cat("AIC: ", x$aic, ", ", + "AICc: ", x$aicc, ", ", + "BIC: ", x$bic, "\n", sep = "") + invisible(x) } #' @rdname jd3_print #' @export print.JD3_REGARIMA_RSLTS<-function(x, digits = max(3L, getOption("digits") - 3L), summary_info = getOption("summary_info"), ...){ - cat("Log-transformation:",if (x$description$log) {"yes"} else {"no"}, - "\n", sep=" ") - - ndf<-x$estimation$likelihood$neffectiveobs-x$estimation$likelihood$nparams - print(x$description$arima, cov = x$estimation$parameters$cov, - ndf = ndf, - digits = digits, - ...) - xregs <- .regarima_coef_table(x, ...) - cat("\n") - if (!is.null(xregs)){ - cat("Regression model:\n") - xregs_coef <- xregs[,1] - names(xregs_coef) <- rownames(xregs) - print(xregs_coef, digits = digits, na.print = "NA", ...) - } else { - cat("No regression variables\n") - } - if (summary_info) - cat("\nFor a more detailed output, use the 'summary()' function.\n") - - invisible(x) + cat("Log-transformation:",if (x$description$log) {"yes"} else {"no"}, + "\n", sep=" ") + + ndf<-x$estimation$likelihood$neffectiveobs-x$estimation$likelihood$nparams + print(x$description$arima, cov = x$estimation$parameters$cov, + ndf = ndf, + digits = digits, + ...) + xregs <- .regarima_coef_table(x, ...) + cat("\n") + if (!is.null(xregs)){ + cat("Regression model:\n") + xregs_coef <- xregs[,1] + names(xregs_coef) <- rownames(xregs) + print(xregs_coef, digits = digits, na.print = "NA", ...) + } else { + cat("No regression variables\n") + } + if (summary_info) + cat("\nFor a more detailed output, use the 'summary()' function.\n") + + invisible(x) } #' @export print.JD3_SARIMA_ESTIMATE<-function(x, digits = max(3L, getOption("digits") - 3L), summary_info = getOption("summary_info"), ...){ - tables <- .sarima_coef_table(x, ...) - orders <- tables$sarima_orders - - cat("SARIMA model:", - .arima_node(orders$p, orders$d, orders$q), - .arima_node(orders$bp, orders$bd, orders$bq)) - if (!is.null(orders$period)) # when sarima_estimate() is used - cat(sprintf(" [%i]", orders$period)) - - cat("\n") - - cat("\nCoefficients\n") - if (is.null(tables$coef_table)){ - cat("No SARIMA variables\n") - } else { - coef <- tables$coef_table[, 1] - names(coef) <- rownames(tables$coef_table) - print(coef, digits = digits, na.print = "NA", ...) - } - xregs <- .regarima_coef_table(x, ...) - cat("\n") - if (!is.null(xregs)){ - cat("Regression model:\n") - xregs_coef <- xregs[,1] - names(xregs_coef) <- rownames(xregs) - print(xregs_coef, digits = digits, na.print = "NA", ...) - } else { - cat("No regression variables\n") - } - if (summary_info) - cat("\nFor a more detailed output, use the 'summary()' function.\n") - invisible(x) + tables <- .sarima_coef_table(x, ...) + orders <- tables$sarima_orders + + cat("SARIMA model:", + .arima_node(orders$p, orders$d, orders$q), + .arima_node(orders$bp, orders$bd, orders$bq)) + if (!is.null(orders$period)) # when sarima_estimate() is used + cat(sprintf(" [%i]", orders$period)) + + cat("\n") + + cat("\nCoefficients\n") + if (is.null(tables$coef_table)){ + cat("No SARIMA variables\n") + } else { + coef <- tables$coef_table[, 1] + names(coef) <- rownames(tables$coef_table) + print(coef, digits = digits, na.print = "NA", ...) + } + xregs <- .regarima_coef_table(x, ...) + cat("\n") + if (!is.null(xregs)){ + cat("Regression model:\n") + xregs_coef <- xregs[,1] + names(xregs_coef) <- rownames(xregs) + print(xregs_coef, digits = digits, na.print = "NA", ...) + } else { + cat("No regression variables\n") + } + if (summary_info) + cat("\nFor a more detailed output, use the 'summary()' function.\n") + invisible(x) } .regarima_coef_table <- function(x,...){ - UseMethod(".regarima_coef_table", x) + UseMethod(".regarima_coef_table", x) } .regarima_coef_table.default <- function(x,...){ - q <- x - if (length(q$description$variables)>0){ - regs<-do.call("rbind", lapply(q$description$variables, function(z){z$coef})) - xregs<-cbind(regs, stde=NA, t=NA, pvalue=NA) - stde<-sqrt(diag(q$estimation$bvar)) - sel<-xregs$type=='ESTIMATED' - t<-xregs$value[sel]/stde - ndf<-q$estimation$likelihood$neffectiveobs-q$estimation$likelihood$nparams - pval<-2*pt(abs(t), ndf, lower.tail = FALSE) - xregs$stde[sel]<-stde - xregs$t[sel]<-t - xregs$pvalue[sel]<-pval - colnames(xregs) <- c("Estimate", "Type", "Std. Error", - "T-stat", "Pr(>|t|)") - xregs - } else { - NULL - } + q <- x + if (length(q$description$variables)>0){ + regs<-do.call("rbind", lapply(q$description$variables, function(z){z$coef})) + xregs<-cbind(regs, stde=NA, t=NA, pvalue=NA) + stde<-sqrt(diag(q$estimation$bvar)) + sel<-xregs$type=='ESTIMATED' + t<-xregs$value[sel]/stde + ndf<-q$estimation$likelihood$neffectiveobs-q$estimation$likelihood$nparams + pval<-2*pt(abs(t), ndf, lower.tail = FALSE) + xregs$stde[sel]<-stde + xregs$t[sel]<-t + xregs$pvalue[sel]<-pval + colnames(xregs) <- c("Estimate", "Type", "Std. Error", + "T-stat", "Pr(>|t|)") + xregs + } else { + NULL + } } .regarima_coef_table.JD3_SARIMA_ESTIMATE <- function(x,...){ - ndf<-x$likelihood$neffectiveobs-x$likelihood$nparams - - estimate <- x$b - if (length(estimate) > 0){ - stde <- sqrt(diag(x$bvar)) - t<-estimate/stde - pval<-2*pt(abs(t), ndf, lower.tail = FALSE) - table <- data.frame(estimate, "ESTIMATED", stde, t, pval) - colnames(table) <- c("Estimate", "Type", "Std. Error", - "T-stat", "Pr(>|t|)") - } else { - table <- NULL - } - table + ndf<-x$likelihood$neffectiveobs-x$likelihood$nparams + + estimate <- x$b + if (length(estimate) > 0){ + stde <- sqrt(diag(x$bvar)) + t<-estimate/stde + pval<-2*pt(abs(t), ndf, lower.tail = FALSE) + table <- data.frame(estimate, "ESTIMATED", stde, t, pval) + colnames(table) <- c("Estimate", "Type", "Std. Error", + "T-stat", "Pr(>|t|)") + } else { + table <- NULL + } + table } #' @export summary.JD3_REGARIMA_RSLTS<-function(object, ...){ - log <- object$description$log - ndf<-object$estimation$likelihood$neffectiveobs-object$estimation$likelihood$nparams+1 - sarima_sum <- summary(object$description$arima, cov = object$estimation$parameters$cov, - ndf = ndf, ...) - xregs <- .regarima_coef_table(object, ...) - likelihood <- summary(object$estimation$likelihood) - res <- list(log = log, - sarima = sarima_sum, - xregs = xregs, - likelihood = likelihood) - class(res) <- "summary.JD3_REGARIMA_RSLTS" - res + log <- object$description$log + ndf<-object$estimation$likelihood$neffectiveobs-object$estimation$likelihood$nparams+1 + sarima_sum <- summary(object$description$arima, cov = object$estimation$parameters$cov, + ndf = ndf, ...) + xregs <- .regarima_coef_table(object, ...) + likelihood <- summary(object$estimation$likelihood) + res <- list(log = log, + sarima = sarima_sum, + xregs = xregs, + likelihood = likelihood) + class(res) <- "summary.JD3_REGARIMA_RSLTS" + res } #' @export summary.JD3_SARIMA_ESTIMATE <-function(object, ...){ - sarima_sum <- .sarima_coef_table(object, ...) - class(sarima_sum) <- "summary.JD3_SARIMA_ESTIMATION" - likelihood <- summary(object$likelihood) - res <- list(log = NULL, - sarima = sarima_sum, - xregs = .regarima_coef_table(object, ...), - likelihood = likelihood) - class(res) <- "summary.JD3_REGARIMA_RSLTS" - return(res) + sarima_sum <- .sarima_coef_table(object, ...) + class(sarima_sum) <- "summary.JD3_SARIMA_ESTIMATION" + likelihood <- summary(object$likelihood) + res <- list(log = NULL, + sarima = sarima_sum, + xregs = .regarima_coef_table(object, ...), + likelihood = likelihood) + class(res) <- "summary.JD3_REGARIMA_RSLTS" + return(res) } #' @export print.summary.JD3_REGARIMA_RSLTS <- function(x, digits = max(3L, getOption("digits") - 3L), signif.stars = getOption("show.signif.stars"), ...){ - if (!is.null(x$method)) # Used to add the method when regarima/tramo function is used - cat("Method:", x$method, "\n") - - if (!is.null(x$log)) - cat("Log-transformation:",if (x$log) {"yes"} else {"no"},"\n",sep=" ") - - print(x$sarima, digits = digits, signif.stars = signif.stars, ...) - cat("\n") - if (!is.null(x$xregs)){ - cat("Regression model:\n") - printCoefmat(x$xregs[-2], digits = digits, signif.stars = signif.stars, - na.print = "NA", ...) - } else { - cat("No regression variables\n") - } - print(x$likelihood, ...) - invisible(x) + if (!is.null(x$method)) # Used to add the method when regarima/tramo function is used + cat("Method:", x$method, "\n") + + if (!is.null(x$log)) + cat("Log-transformation:",if (x$log) {"yes"} else {"no"},"\n",sep=" ") + + print(x$sarima, digits = digits, signif.stars = signif.stars, ...) + cat("\n") + if (!is.null(x$xregs)){ + cat("Regression model:\n") + printCoefmat(x$xregs[-2], digits = digits, signif.stars = signif.stars, + na.print = "NA", ...) + } else { + cat("No regression variables\n") + } + print(x$likelihood, ...) + invisible(x) } #' @export diagnostics.JD3_REGARIMA_RSLTS<-function(x, ...){ - if (is.null(x)) return(NULL) - residuals_test <- x$diagnostics - residuals_test <- data.frame(Statistic = sapply(residuals_test, function(test) test[["value"]]), - P.value = sapply(residuals_test, function(test) test[["pvalue"]]), - Description = sapply(residuals_test, function(test) attr(test, "distribution"))) - residuals_test + if (is.null(x)) return(NULL) + residuals_test <- x$diagnostics + residuals_test <- data.frame(Statistic = sapply(residuals_test, function(test) test[["value"]]), + P.value = sapply(residuals_test, function(test) test[["pvalue"]]), + Description = sapply(residuals_test, function(test) attr(test, "distribution"))) + residuals_test } diff --git a/R/distributions.R b/R/distributions.R index fede4c7..b9f7303 100644 --- a/R/distributions.R +++ b/R/distributions.R @@ -17,21 +17,21 @@ #' @order 3 #' @export random_t<-function(df, n){ - .jcall("jdplus/toolkit/base/r/stats/Distributions", "[D", "randomsT", df, as.integer(n)) + .jcall("jdplus/toolkit/base/r/stats/Distributions", "[D", "randomsT", df, as.integer(n)) } #' @rdname studentdistribution #' @order 1 #' @export density_t<-function(df, x){ - .jcall("jdplus/toolkit/base/r/stats/Distributions", "[D", "densityT", df, .jarray(as.numeric(x))) + .jcall("jdplus/toolkit/base/r/stats/Distributions", "[D", "densityT", df, .jarray(as.numeric(x))) } #' @rdname studentdistribution #' @order 2 #' @export cdf_t<-function(df, x){ - .jcall("jdplus/toolkit/base/r/stats/Distributions", "[D", "cdfT", df, .jarray(as.numeric(x))) + .jcall("jdplus/toolkit/base/r/stats/Distributions", "[D", "cdfT", df, .jarray(as.numeric(x))) } #' The Chi-Squared Distribution @@ -45,21 +45,21 @@ cdf_t<-function(df, x){ #' @order 3 #' @export random_chi2<-function(df, n){ - .jcall("jdplus/toolkit/base/r/stats/Distributions", "[D", "randomsChi2", df, as.integer(n)) + .jcall("jdplus/toolkit/base/r/stats/Distributions", "[D", "randomsChi2", df, as.integer(n)) } #' @rdname chi2distribution #' @order 1 #' @export density_chi2<-function(df, x){ - .jcall("jdplus/toolkit/base/r/stats/Distributions", "[D", "densityChi2", df, .jarray(as.numeric(x))) + .jcall("jdplus/toolkit/base/r/stats/Distributions", "[D", "densityChi2", df, .jarray(as.numeric(x))) } #' @rdname chi2distribution #' @order 2 #' @export cdf_chi2<-function(df, x){ - .jcall("jdplus/toolkit/base/r/stats/Distributions", "[D", "cdfChi2", df, .jarray(as.numeric(x))) + .jcall("jdplus/toolkit/base/r/stats/Distributions", "[D", "cdfChi2", df, .jarray(as.numeric(x))) } #' The Gamma Distribution @@ -74,21 +74,21 @@ cdf_chi2<-function(df, x){ #' @order 3 #' @export random_gamma<-function(shape, scale, n){ - .jcall("jdplus/toolkit/base/r/stats/Distributions", "[D", "randomsGamma", shape, scale, as.integer(n)) + .jcall("jdplus/toolkit/base/r/stats/Distributions", "[D", "randomsGamma", shape, scale, as.integer(n)) } #' @rdname gammadistribution #' @order 1 #' @export density_gamma<-function(shape, scale, x){ - .jcall("jdplus/toolkit/base/r/stats/Distributions", "[D", "densityGamma", shape, scale, .jarray(as.numeric(x))) + .jcall("jdplus/toolkit/base/r/stats/Distributions", "[D", "densityGamma", shape, scale, .jarray(as.numeric(x))) } #' @rdname gammadistribution #' @order 2 #' @export cdf_gamma<-function(shape, scale, x){ - .jcall("jdplus/toolkit/base/r/stats/Distributions", "[D", "cdfGamma", shape, scale, .jarray(as.numeric(x))) + .jcall("jdplus/toolkit/base/r/stats/Distributions", "[D", "cdfGamma", shape, scale, .jarray(as.numeric(x))) } #' The Inverse-Gamma Distribution @@ -102,21 +102,21 @@ cdf_gamma<-function(shape, scale, x){ #' @order 3 #' @export random_inverse_gamma<-function(shape, scale, n){ - .jcall("jdplus/toolkit/base/r/stats/Distributions", "[D", "randomsInverseGamma", shape, scale, as.integer(n)) + .jcall("jdplus/toolkit/base/r/stats/Distributions", "[D", "randomsInverseGamma", shape, scale, as.integer(n)) } #' @rdname invgammadistribution #' @order 1 #' @export density_inverse_gamma<-function(shape, scale, x){ - .jcall("jdplus/toolkit/base/r/stats/Distributions", "[D", "densityInverseGamma", shape, scale, .jarray(as.numeric(x))) + .jcall("jdplus/toolkit/base/r/stats/Distributions", "[D", "densityInverseGamma", shape, scale, .jarray(as.numeric(x))) } #' @rdname invgammadistribution #' @order 2 #' @export cdf_inverse_gamma<-function(shape, scale, x){ - .jcall("jdplus/toolkit/base/r/stats/Distributions", "[D", "cdfInverseGamma", shape, scale, .jarray(as.numeric(x))) + .jcall("jdplus/toolkit/base/r/stats/Distributions", "[D", "cdfInverseGamma", shape, scale, .jarray(as.numeric(x))) } #' The Inverse-Gaussian Distribution @@ -130,19 +130,19 @@ cdf_inverse_gamma<-function(shape, scale, x){ #' @order 3 #' @export random_inverse_gaussian<-function(shape, scale, n){ - .jcall("jdplus/toolkit/base/r/stats/Distributions", "[D", "randomsInverseGaussian", shape, scale, as.integer(n)) + .jcall("jdplus/toolkit/base/r/stats/Distributions", "[D", "randomsInverseGaussian", shape, scale, as.integer(n)) } #' @rdname invgaussiandistribution #' @order 1 #' @export density_inverse_gaussian<-function(shape, scale, x){ - .jcall("jdplus/toolkit/base/r/stats/Distributions", "[D", "densityInverseGaussian", shape, scale, .jarray(as.numeric(x))) + .jcall("jdplus/toolkit/base/r/stats/Distributions", "[D", "densityInverseGaussian", shape, scale, .jarray(as.numeric(x))) } #' @rdname invgaussiandistribution #' @order 2 #' @export cdf_inverse_gaussian<-function(shape, scale, x){ - .jcall("jdplus/toolkit/base/r/stats/Distributions", "[D", "cdfInverseGaussian", shape, scale, .jarray(as.numeric(x))) + .jcall("jdplus/toolkit/base/r/stats/Distributions", "[D", "cdfInverseGaussian", shape, scale, .jarray(as.numeric(x))) } diff --git a/R/generics.R b/R/generics.R index b75483a..adcddd1 100644 --- a/R/generics.R +++ b/R/generics.R @@ -6,14 +6,14 @@ #' #' @export diagnostics<-function(x, ...){ - UseMethod("diagnostics", x) + UseMethod("diagnostics", x) } #' @rdname diagnostics #' @export diagnostics.JD3<-function(x, ...){ - cat("No diagnostic\n") + cat("No diagnostic\n") } @@ -25,7 +25,7 @@ diagnostics.JD3<-function(x, ...){ #' #' @export sa_preprocessing<-function(x, ...){ - UseMethod("sa_preprocessing", x) + UseMethod("sa_preprocessing", x) } @@ -51,7 +51,7 @@ NULL #' @export #' @rdname sa_decomposition sa_decomposition<-function(x, ...){ - UseMethod("sa_decomposition", x) + UseMethod("sa_decomposition", x) } #' Deprecated functions @@ -64,6 +64,6 @@ sa_decomposition<-function(x, ...){ #' @export #' @export sa.decomposition<-function(x, ...){ - .Deprecated("sa_decomposition") - UseMethod("sa_decomposition", x) + .Deprecated("sa_decomposition") + UseMethod("sa_decomposition", x) } diff --git a/R/jd2r.R b/R/jd2r.R index 387c21e..801f164 100644 --- a/R/jd2r.R +++ b/R/jd2r.R @@ -4,14 +4,14 @@ NULL .jd2r_test<-function(jtest){ - if (is.jnull(jtest)) - return(NULL) - else { - desc<-.jcall(jtest, "S", "getDescription") - val<-.jcall(jtest, "D", "getValue") - pval<-.jcall(jtest, "D", "getPvalue") - return(statisticaltest(val, pval, desc)) - } + if (is.jnull(jtest)) + return(NULL) + else { + desc<-.jcall(jtest, "S", "getDescription") + val<-.jcall(jtest, "D", "getValue") + pval<-.jcall(jtest, "D", "getPvalue") + return(statisticaltest(val, pval, desc)) + } } @@ -28,52 +28,52 @@ NULL #' @export #' @rdname jd3_utilities .r2jd_tsdata<-function(s){ - if (is.null(s)){ - return(NULL) - } - freq<-frequency(s) - start<-start(s) - .jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/TsData;", "of", - as.integer(freq), as.integer(start[1]), as.integer(start[2]), as.double(s)) + if (is.null(s)){ + return(NULL) + } + freq<-frequency(s) + start<-start(s) + .jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/TsData;", "of", + as.integer(freq), as.integer(start[1]), as.integer(start[2]), as.double(s)) } #' @export #' @rdname jd3_utilities .r2jd_tsdomain<-function(period, startYear, startPeriod, length){ - .jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/TsDomain;", "of", - as.integer(period), as.integer(startYear), as.integer(startPeriod), as.integer(length)) + .jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/TsDomain;", "of", + as.integer(period), as.integer(startYear), as.integer(startPeriod), as.integer(length)) } #' @export #' @rdname jd3_utilities .jd2r_tsdata<-function(s){ - if (is.jnull(s)){ - return(NULL) - } - jx<-.jcall(s, "Ljdplus/toolkit/base/api/data/DoubleSeq;", "getValues") - x<-.jcall(jx, "[D", "toArray") - if (is.null(x)) return(NULL) - if (length(x) == 0) return(NULL) - pstart<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "[I", "startPeriod", s) - ts(x,start=pstart[2:3], frequency=pstart[1]) + if (is.jnull(s)){ + return(NULL) + } + jx<-.jcall(s, "Ljdplus/toolkit/base/api/data/DoubleSeq;", "getValues") + x<-.jcall(jx, "[D", "toArray") + if (is.null(x)) return(NULL) + if (length(x) == 0) return(NULL) + pstart<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "[I", "startPeriod", s) + ts(x,start=pstart[2:3], frequency=pstart[1]) } #' @export #' @rdname jd3_utilities .jd2r_mts<-function(s){ - if (is.jnull(s)){ - return(NULL) - } - jx<-.jcall(s, "Ljdplus/toolkit/base/api/math/matrices/Matrix;", "toMatrix") - x<-.jd2r_matrix(jx) - if (is.jnull(x)) return(NULL) - pstart<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "[I", "startPeriod", s) - ts(x,start=pstart[2:3], frequency=pstart[1]) + if (is.jnull(s)){ + return(NULL) + } + jx<-.jcall(s, "Ljdplus/toolkit/base/api/math/matrices/Matrix;", "toMatrix") + x<-.jd2r_matrix(jx) + if (is.jnull(x)) return(NULL) + pstart<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "[I", "startPeriod", s) + ts(x,start=pstart[2:3], frequency=pstart[1]) } .extract_jts<-function(collection, index){ - js<- .jcall(collection, "Ljdplus/toolkit/base/api/timeseries/Ts;", "get", as.integer(index-1)) - return(js) + js<- .jcall(collection, "Ljdplus/toolkit/base/api/timeseries/Ts;", "get", as.integer(index-1)) + return(js) } #' @export @@ -97,77 +97,77 @@ NULL #' @export #' @rdname jd3_utilities .jd2r_matrix<-function(s){ - if (is.jnull(s)){ - return(NULL) - } - nr<-.jcall(s, "I", "getRowsCount") - nc<-.jcall(s, "I", "getColumnsCount") - d<-.jcall(s, "[D", "toArray") - return(array(d, dim=c(nr, nc))) + if (is.jnull(s)){ + return(NULL) + } + nr<-.jcall(s, "I", "getRowsCount") + nc<-.jcall(s, "I", "getColumnsCount") + d<-.jcall(s, "[D", "toArray") + return(array(d, dim=c(nr, nc))) } #' @export #' @rdname jd3_utilities .r2jd_matrix<-function(s){ - if (is.null(s)) - return(.jnull("jdplus/toolkit/base/api/math/matrices/Matrix")) - if (!is.matrix(s)){ - s<-matrix(s, nrow=length(s), ncol=1) - } - sdim<-dim(s) - return(.jcall("jdplus/toolkit/base/api/math/matrices/Matrix","Ljdplus/toolkit/base/api/math/matrices/Matrix;", "of", .jarray(as.double(s)), as.integer(sdim[1]), as.integer(sdim[2]))) + if (is.null(s)) + return(.jnull("jdplus/toolkit/base/api/math/matrices/Matrix")) + if (!is.matrix(s)){ + s<-matrix(s, nrow=length(s), ncol=1) + } + sdim<-dim(s) + return(.jcall("jdplus/toolkit/base/api/math/matrices/Matrix","Ljdplus/toolkit/base/api/math/matrices/Matrix;", "of", .jarray(as.double(s)), as.integer(sdim[1]), as.integer(sdim[2]))) } .j2r_ldt<-function(ldt){ - if (is.jnull(ldt)) - return(NULL) - dt<-.jcall(ldt, "Ljava/time/LocalDate;", "toLocalDate") - return(as.Date(.jcall(dt, "S", "toString"))) + if (is.jnull(ldt)) + return(NULL) + dt<-.jcall(ldt, "Ljava/time/LocalDate;", "toLocalDate") + return(as.Date(.jcall(dt, "S", "toString"))) } .j2r_dt<-function(dt){ - if (is.jnull(dt)) - return(NULL) - return(as.Date(.jcall(dt, "S", "toString"))) + if (is.jnull(dt)) + return(NULL) + return(as.Date(.jcall(dt, "S", "toString"))) } .r2j_dt<-function(dt){ - jdt<-.jnew("java/lang/String", as.character(dt)) - return(.jcall("java/time/LocalDate", "Ljava/time/LocalDate;", "parse", .jcast(jdt, "java/lang/CharSequence"))) + jdt<-.jnew("java/lang/String", as.character(dt)) + return(.jcall("java/time/LocalDate", "Ljava/time/LocalDate;", "parse", .jcast(jdt, "java/lang/CharSequence"))) } .r2j_ldt<-function(dt){ - jdt<-.r2j_dt(dt) - return(.jcall(jdt, "Ljava/time/LocalDateTime;", "atStartOfDay")) + jdt<-.r2j_dt(dt) + return(.jcall(jdt, "Ljava/time/LocalDateTime;", "atStartOfDay")) } .jd2r_parameters <- function(jparams){ - if (is.jnull(jparams)) - return(NULL) - param<-.jcastToArray(jparams) - len <- length(param) - if (len==0) - return(NULL) - param_name <- deparse(substitute(jparams)) - Type <- sapply(param, function(x) .jcall(.jcall(x, "Ljdplus/toolkit/base/api/data/ParameterType;", "getType"), "S", "name")) - Value <- sapply(param, function(x) .jcall(x, "D", "getValue")) - data_param <- data.frame(Type = Type, Value = Value) - rownames(data_param) <- sprintf("%s(%i)", - param_name, - 1:len) - data_param + if (is.jnull(jparams)) + return(NULL) + param<-.jcastToArray(jparams) + len <- length(param) + if (len==0) + return(NULL) + param_name <- deparse(substitute(jparams)) + Type <- sapply(param, function(x) .jcall(.jcall(x, "Ljdplus/toolkit/base/api/data/ParameterType;", "getType"), "S", "name")) + Value <- sapply(param, function(x) .jcall(x, "D", "getValue")) + data_param <- data.frame(Type = Type, Value = Value) + rownames(data_param) <- sprintf("%s(%i)", + param_name, + 1:len) + data_param } #' @export #' @rdname jd3_utilities .jdomain<-function(period, start, end){ - if (period == 0)return(.jnull("jdplus/toolkit/base/api/timeseries/TsDomain")) - if (is.null(start)) - start<-c(1900,1) - if (is.null(end)) - end<-c(2100, 1) - n<-period*(end[1]-start[1])+end[2]-start[2] - jdom<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/TsDomain;", "of" - , as.integer(period), as.integer(start[1]), as.integer(start[2]), as.integer(n)) - return(jdom) + if (period == 0)return(.jnull("jdplus/toolkit/base/api/timeseries/TsDomain")) + if (is.null(start)) + start<-c(1900,1) + if (is.null(end)) + end<-c(2100, 1) + n<-period*(end[1]-start[1])+end[2]-start[2] + jdom<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/TsDomain;", "of" + , as.integer(period), as.integer(start[1]), as.integer(start[2]), as.integer(n)) + return(jdom) } diff --git a/R/jd3rslts.R b/R/jd3rslts.R index 4a825fb..5deaf24 100644 --- a/R/jd3rslts.R +++ b/R/jd3rslts.R @@ -133,7 +133,7 @@ } else if (.jinstanceof(s, "jdplus/toolkit/base/api/stats/StatisticalTest")) { return(.jd2r_test(s)) } else if (.jinstanceof(s, "jdplus/toolkit/base/api/timeseries/regression/RegressionItem")) { - return(.jd2r_regression_item(s)) + return(.jd2r_regression_item(s)) } else { return(.jcall(s, "S", "toString")) } diff --git a/R/modellingcontext.R b/R/modellingcontext.R index c05c0af..846b4c2 100644 --- a/R/modellingcontext.R +++ b/R/modellingcontext.R @@ -16,214 +16,214 @@ JD3_TSCOLLECTION<-'JD3_TSCOLLECTION' #' #' @examples .tsmoniker<-function(source, id){ - return(structure(list(source=source, id=id), class=c(JD3_TSMONIKER))) + return(structure(list(source=source, id=id), class=c(JD3_TSMONIKER))) } #' @export #' @rdname jd3_utilities .r2p_moniker<-function(r){ - p<-jd3.TsMoniker$new() - p$source<-r$source - p$id<-r$id - return(p) + p<-jd3.TsMoniker$new() + p$source<-r$source + p$id<-r$id + return(p) } #' @export #' @rdname jd3_utilities .p2r_moniker<-function(p){ - if (is.null(p)) return(NULL) - return(.tsmoniker(p$source, p$id)) + if (is.null(p)) return(NULL) + return(.tsmoniker(p$source, p$id)) } #' @export #' @rdname jd3_utilities .r2p_datasupplier<-function(name, r){ - p<-jd3.TsDataSuppliers$Item$new() - p$name<-name - if (is.ts(r)) p$data<-.r2p_tsdata(r) - else if (is(r, JD3_DYNAMICTS)) p$dynamic_data<-.r2p_dynamic_ts(r) - else return(NULL) - return(p) + p<-jd3.TsDataSuppliers$Item$new() + p$name<-name + if (is.ts(r)) p$data<-.r2p_tsdata(r) + else if (is(r, JD3_DYNAMICTS)) p$dynamic_data<-.r2p_dynamic_ts(r) + else return(NULL) + return(p) } dynamic_ts<-function(moniker, data){ - return(structure(list(moniker=moniker, data=data), class=c(JD3_DYNAMICTS))) + return(structure(list(moniker=moniker, data=data), class=c(JD3_DYNAMICTS))) } .ts<-function(name, moniker, metadata, data){ - return(structure(list(name=name, moniker=moniker, metadata=metadata, data=data), class=c(JD3_TS))) + return(structure(list(name=name, moniker=moniker, metadata=metadata, data=data), class=c(JD3_TS))) } .tscollection<-function(name, moniker, metadata, series){ - return(structure(list(name=name, moniker=moniker, metadata=metadata, series=series), class=c(JD3_TSCOLLECTION))) + return(structure(list(name=name, moniker=moniker, metadata=metadata, series=series), class=c(JD3_TSCOLLECTION))) } #' @export #' @rdname jd3_utilities .p2r_metadata<-function(p){ - n<-length(p) - if (n > 0){ - lv<-lapply(p, function(v){return(v$value)}) - ns<-sapply(p, function(v){return(v$key)}) - names(lv)<-ns - return(lv) - } - return(NULL) + n<-length(p) + if (n > 0){ + lv<-lapply(p, function(v){return(v$value)}) + ns<-sapply(p, function(v){return(v$key)}) + names(lv)<-ns + return(lv) + } + return(NULL) } .entry<-function(key, value, type){ - p<-type$new() - p$key<-key - p$value<-value - return(p) + p<-type$new() + p$key<-key + p$value<-value + return(p) } #' @export #' @rdname jd3_utilities .r2p_metadata<-function(r, type){ - n<-names(r) - pm<-lapply(n, function(item){ return(.entry(item, r[[item]], type)) }) - return(pm) + n<-names(r) + pm<-lapply(n, function(item){ return(.entry(item, r[[item]], type)) }) + return(pm) } #' @export #' @rdname jd3_utilities .p2r_ts<-function(p){ - if (is.null(p)) return(NULL) - s<-.p2r_tsdata(p$data) - m<-.p2r_moniker(p$moniker) - md<-.p2r_metadata(p$metadata) - return(.ts(p$name, m, md, s)) + if (is.null(p)) return(NULL) + s<-.p2r_tsdata(p$data) + m<-.p2r_moniker(p$moniker) + md<-.p2r_metadata(p$metadata) + return(.ts(p$name, m, md, s)) } #' @export #' @rdname jd3_utilities .r2p_ts<-function(r){ - p<-jd3.Ts$new() - p$name<-r$name - p$moniker<-.r2p_moniker(r$moniker) - p$metadata<-.r2p_metadata(r$metadata,jd3.Ts$MetadataEntry) - p$data<- .r2p_tsdata(r$data) - return(p) + p<-jd3.Ts$new() + p$name<-r$name + p$moniker<-.r2p_moniker(r$moniker) + p$metadata<-.r2p_metadata(r$metadata,jd3.Ts$MetadataEntry) + p$data<- .r2p_tsdata(r$data) + return(p) } #' @export #' @rdname jd3_utilities .p2r_tscollection<-function(p){ - if (is.null(p)) - return(NULL) - else { - rs<-lapply(p$series, function(s){return(.p2r_ts(s))}) - names<-lapply(rs, function(s){return(s$name)}) - rs<-`names<-`(rs, names) - return(.tscollection(p$name, .p2r_moniker(p$moniker), .p2r_metadata(p$metadata), rs)) - } + if (is.null(p)) + return(NULL) + else { + rs<-lapply(p$series, function(s){return(.p2r_ts(s))}) + names<-lapply(rs, function(s){return(s$name)}) + rs<-`names<-`(rs, names) + return(.tscollection(p$name, .p2r_moniker(p$moniker), .p2r_metadata(p$metadata), rs)) + } } #' @export #' @rdname jd3_utilities .r2p_tscollection<-function(r){ - p<-jd3.TsCollection$new() - p$name<-r$name - p$moniker<-.r2p_moniker(r$moniker) - p$metadata<-.r2p_metadata(r$metadata,jd3.TsCollection$MetadataEntry) - p$series<- lapply(r$series, function(s){return(.r2p_ts(s))}) - return(p) + p<-jd3.TsCollection$new() + p$name<-r$name + p$moniker<-.r2p_moniker(r$moniker) + p$metadata<-.r2p_metadata(r$metadata,jd3.TsCollection$MetadataEntry) + p$series<- lapply(r$series, function(s){return(.r2p_ts(s))}) + return(p) } #' @export #' @rdname jd3_utilities .r2jd_ts<-function(s){ - if (is.null(s)) - return(.jnull("jdplus/toolkit/base/api/timeseries/Ts")) - ps<-.r2p_ts(s) - bytes<-RProtoBuf::serialize(ps, NULL) - return(.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/Ts;", "tsOfBytes", bytes)) + if (is.null(s)) + return(.jnull("jdplus/toolkit/base/api/timeseries/Ts")) + ps<-.r2p_ts(s) + bytes<-RProtoBuf::serialize(ps, NULL) + return(.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/Ts;", "tsOfBytes", bytes)) } #' @export #' @rdname jd3_utilities .jd2r_ts<-function(js){ - if (is.jnull(js)) - return(NULL) - q<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "[B", "toBuffer", js) - p<-RProtoBuf::read(jd3.Ts, q) - return(.p2r_ts(p)) + if (is.jnull(js)) + return(NULL) + q<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "[B", "toBuffer", js) + p<-RProtoBuf::read(jd3.Ts, q) + return(.p2r_ts(p)) } #' @export #' @rdname jd3_utilities .r2jd_tscollection<-function(s){ - if (is.null(s)) - return(.jnull("jdplus/toolkit/base/api/timeseries/TsCollection")) - ps<-.r2p_tscollection(s) - bytes<-RProtoBuf::serialize(ps, NULL) - return(.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/Ts;", "tsCollectionOfBytes", bytes)) + if (is.null(s)) + return(.jnull("jdplus/toolkit/base/api/timeseries/TsCollection")) + ps<-.r2p_tscollection(s) + bytes<-RProtoBuf::serialize(ps, NULL) + return(.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/Ts;", "tsCollectionOfBytes", bytes)) } #' @export #' @rdname jd3_utilities .jd2r_tscollection<-function(js){ - if (is.jnull(js)) - return(NULL) - q<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "[B", "toBuffer", js) - p<-RProtoBuf::read(jd3.TsCollection, q) - return(.p2r_tscollection(p)) + if (is.jnull(js)) + return(NULL) + q<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "[B", "toBuffer", js) + p<-RProtoBuf::read(jd3.TsCollection, q) + return(.p2r_tscollection(p)) } .r2p_dynamic_ts<-function(r){ - p<-jd3.DynamicTsData$new() - p$current<- .r2p_tsdata(r$data) - p$moniker<-.r2p_moniker(r$moniker) - return(p) + p<-jd3.DynamicTsData$new() + p$current<- .r2p_tsdata(r$data) + p$moniker<-.r2p_moniker(r$moniker) + return(p) } .p2r_dynamic_ts<-function(p){ - if (is.null(p)) return(NULL) - s<-.p2r_tsdata(p$current) - m<-.p2r_moniker(p$moniker) - return(dynamic_ts(m, s)) + if (is.null(p)) return(NULL) + s<-.p2r_tsdata(p$current) + m<-.p2r_moniker(p$moniker) + return(dynamic_ts(m, s)) } .r2p_dynamic_ts<-function(r){ - p<-jd3.DynamicTsData$new() - p$current<- .r2p_tsdata(r$data) - p$moniker<-.r2p_moniker(r$moniker) - return(p) + p<-jd3.DynamicTsData$new() + p$current<- .r2p_tsdata(r$data) + p$moniker<-.r2p_moniker(r$moniker) + return(p) } #' @export #' @rdname jd3_utilities .p2r_datasupplier<-function(p){ - if (p$has('dynamic_data')) return(.p2r_dynamic_ts(p$dynamic_data)) - if (p$has('data')) return(.p2r_tsdata(p$data)) - return(NULL) + if (p$has('dynamic_data')) return(.p2r_dynamic_ts(p$dynamic_data)) + if (p$has('data')) return(.p2r_tsdata(p$data)) + return(NULL) } #' @export #' @rdname jd3_utilities .r2p_datasuppliers<-function(r){ - if (! is.list(r)) stop("Suppliers should be a list") - ns<-names(r) - if (is.null(ns)) - stop("All the variables of the list should be named") - n<-length(ns) - all<-lapply(1:n, function(z){.r2p_datasupplier(ns[z], r[[z]])}) - p<-jd3.TsDataSuppliers$new() - p$items<-all - return(p) + if (! is.list(r)) stop("Suppliers should be a list") + ns<-names(r) + if (is.null(ns)) + stop("All the variables of the list should be named") + n<-length(ns) + all<-lapply(1:n, function(z){.r2p_datasupplier(ns[z], r[[z]])}) + p<-jd3.TsDataSuppliers$new() + p$items<-all + return(p) } #' @export #' @rdname jd3_utilities .p2r_datasuppliers<-function(p){ - n<-length(p$items) - if (n == 0){return(list())} - l<-lapply(1:n, function(i){return(.p2r_datasupplier(p$items[[i]]))}) - ns<-sapply(1:n, function(i){return(p$items[[i]]$name)}) - names(l)<-ns - return(l) + n<-length(p$items) + if (n == 0){return(list())} + l<-lapply(1:n, function(i){return(.p2r_datasupplier(p$items[[i]]))}) + ns<-sapply(1:n, function(i){return(p$items[[i]]$name)}) + names(l)<-ns + return(l) } #' @export @@ -293,130 +293,130 @@ dynamic_ts<-function(moniker, data){ #' More information on auxiliary variables in JDemetra+ online documentation: #' \url{https://jdemetra-new-documentation.netlify.app/} modelling_context<-function(calendars=NULL, variables=NULL){ - if (is.null(calendars))calendars<-list() - if (is.null(variables))variables<-list() - if (! is.list(calendars)) stop("calendars should be a list of calendars") - if (length(calendars)>0) if (length(calendars) != length(which(sapply(calendars,function(z) is(z, 'JD3_CALENDARDEFINITION'))))) stop("calendars should be a list of calendars") - if (! is.list(variables)) stop("variables should be a list of vars") - if (length(variables) != 0){ - list_var <- sapply(variables, is.list) - mts_var <- sapply(variables, is.mts) - ts_var <- (!list_var) & (!mts_var) - if (any(mts_var)) { - # case of a simple mts dictionary - for (i in which(mts_var)) { - all_var <- lapply(seq_len(ncol(variables[[i]])), function(j) { - variables[[i]][, j] - }) - names(all_var) <- colnames(variables[[i]]) - variables[[i]] <- all_var - } - } - if (any(ts_var)) { - # case of a simple ts dictionary - # Use 'r' as the name of the dictionary - variables <- c(variables[!ts_var], list(r = variables[ts_var])) - } - if (sum(names(variables) == "r") >= 2){ - # handle case with multiple r groups defined - combined_var <- do.call(c, variables[names(variables) == "r"]) - names(combined_var) <- unlist(lapply(variables[names(variables) == "r"], names)) - combined_var <- list(r = combined_var) - variables <- c(variables[names(variables) != "r"], combined_var) + if (is.null(calendars))calendars<-list() + if (is.null(variables))variables<-list() + if (! is.list(calendars)) stop("calendars should be a list of calendars") + if (length(calendars)>0) if (length(calendars) != length(which(sapply(calendars,function(z) is(z, 'JD3_CALENDARDEFINITION'))))) stop("calendars should be a list of calendars") + if (! is.list(variables)) stop("variables should be a list of vars") + if (length(variables) != 0){ + list_var <- sapply(variables, is.list) + mts_var <- sapply(variables, is.mts) + ts_var <- (!list_var) & (!mts_var) + if (any(mts_var)) { + # case of a simple mts dictionary + for (i in which(mts_var)) { + all_var <- lapply(seq_len(ncol(variables[[i]])), function(j) { + variables[[i]][, j] + }) + names(all_var) <- colnames(variables[[i]]) + variables[[i]] <- all_var + } + } + if (any(ts_var)) { + # case of a simple ts dictionary + # Use 'r' as the name of the dictionary + variables <- c(variables[!ts_var], list(r = variables[ts_var])) + } + if (sum(names(variables) == "r") >= 2){ + # handle case with multiple r groups defined + combined_var <- do.call(c, variables[names(variables) == "r"]) + names(combined_var) <- unlist(lapply(variables[names(variables) == "r"], names)) + combined_var <- list(r = combined_var) + variables <- c(variables[names(variables) != "r"], combined_var) + } } - } - return(list(calendars=calendars, variables=variables)) + return(list(calendars=calendars, variables=variables)) } #' @export #' @rdname jd3_utilities .p2r_context<-function(p){ - n<-length(p$calendars) - lcal <- lvar <- NULL - if (n > 0){ - lcal<-lapply(1:n, function(i){return(.p2r_calendardef(p$calendars[[i]]$value))}) - ns<-sapply(1:n, function(i){return(p$calendars[[i]]$key)}) - names(lcal)<-ns - } - n<-length(p$variables) - if (n > 0){ - lvar<-lapply(1:n, function(i){return(.p2r_datasuppliers(p$variables[[i]]$value))}) - ns<-sapply(1:n, function(i){return(p$variables[[i]]$key)}) - names(lvar)<-ns - } - return(list(calendars=lcal, variables=lvar)) + n<-length(p$calendars) + lcal <- lvar <- NULL + if (n > 0){ + lcal<-lapply(1:n, function(i){return(.p2r_calendardef(p$calendars[[i]]$value))}) + ns<-sapply(1:n, function(i){return(p$calendars[[i]]$key)}) + names(lcal)<-ns + } + n<-length(p$variables) + if (n > 0){ + lvar<-lapply(1:n, function(i){return(.p2r_datasuppliers(p$variables[[i]]$value))}) + ns<-sapply(1:n, function(i){return(p$variables[[i]]$key)}) + names(lvar)<-ns + } + return(list(calendars=lcal, variables=lvar)) } #' @export #' @rdname jd3_utilities .r2p_context<-function(r){ - p<-jd3.ModellingContext$new() - n<-length(r$calendars) - if (n > 0){ - ns<-names(r$calendars) - # To take into account empty calendars - length_cal <- lengths(r$calendars) - - lcal<-lapply((1:n)[length_cal!=0], function(i){ - entry<-jd3.ModellingContext$CalendarsEntry$new() - entry$key<-ns[i] - entry$value<-.r2p_calendardef(r$calendars[[i]]) - return(entry) - }) - if (length(lcal) > 0) { - p$calendars<-lcal + p<-jd3.ModellingContext$new() + n<-length(r$calendars) + if (n > 0){ + ns<-names(r$calendars) + # To take into account empty calendars + length_cal <- lengths(r$calendars) + + lcal<-lapply((1:n)[length_cal!=0], function(i){ + entry<-jd3.ModellingContext$CalendarsEntry$new() + entry$key<-ns[i] + entry$value<-.r2p_calendardef(r$calendars[[i]]) + return(entry) + }) + if (length(lcal) > 0) { + p$calendars<-lcal + } } - } - n<-length(r$variables) - if (n > 0){ - ns<-names(r$variables) - length_var <- lengths(r$variables) - lvar<-lapply((1:n)[length_var!=0], function(i){ - entry<-jd3.ModellingContext$VariablesEntry$new() - entry$key<-ns[i] - entry$value<-.r2p_datasuppliers(r$variables[[i]]) - return(entry) - }) - if (length(lvar) > 0) { - p$variables <- lvar + n<-length(r$variables) + if (n > 0){ + ns<-names(r$variables) + length_var <- lengths(r$variables) + lvar<-lapply((1:n)[length_var!=0], function(i){ + entry<-jd3.ModellingContext$VariablesEntry$new() + entry$key<-ns[i] + entry$value<-.r2p_datasuppliers(r$variables[[i]]) + return(entry) + }) + if (length(lvar) > 0) { + p$variables <- lvar + } } - } - return(p) + return(p) } #' @export #' @rdname jd3_utilities .p2jd_context<-function(p){ - bytes<-p$serialize(NULL) - jcal <- .jcall("jdplus/toolkit/base/r/util/Modelling", "Ljdplus/toolkit/base/api/timeseries/regression/ModellingContext;", - "of", - bytes) - return(jcal) + bytes<-p$serialize(NULL) + jcal <- .jcall("jdplus/toolkit/base/r/util/Modelling", "Ljdplus/toolkit/base/api/timeseries/regression/ModellingContext;", + "of", + bytes) + return(jcal) } #' @export #' @rdname jd3_utilities .jd2p_context<-function(jd){ - bytes<-.jcall("jdplus/toolkit/base/r/util/Modelling", "[B", "toBuffer", jd) - p<-RProtoBuf::read(jd3.ModellingContext, bytes) - return(p) + bytes<-.jcall("jdplus/toolkit/base/r/util/Modelling", "[B", "toBuffer", jd) + p<-RProtoBuf::read(jd3.ModellingContext, bytes) + return(p) } #' @export #' @rdname jd3_utilities .jd2r_modellingcontext<-function(jcontext){ - p<-.jd2p_context(jcontext) - return(.p2r_context(p)) + p<-.jd2p_context(jcontext) + return(.p2r_context(p)) } #' @export #' @rdname jd3_utilities .r2jd_modellingcontext<-function(r){ - p<-.r2p_context(r) - return(.p2jd_context(p)) + p<-.r2p_context(r) + return(.p2jd_context(p)) } #' @export @@ -442,11 +442,11 @@ modelling_context<-function(calendars=NULL, variables=NULL){ length_cal <- lengths(r) p$calendars<-lapply((1:n)[length_cal!=0], function(i){ - entry<-jd3.Calendars$CalendarsEntry$new() - entry$key<-ns[i] - entry$value<-.r2p_calendardef(r[[i]]) - return(entry) - }) + entry<-jd3.Calendars$CalendarsEntry$new() + entry$key<-ns[i] + entry$value<-.r2p_calendardef(r[[i]]) + return(entry) + }) return(p) } diff --git a/R/procresults.R b/R/procresults.R index 93f5771..8cce272 100644 --- a/R/procresults.R +++ b/R/procresults.R @@ -7,11 +7,11 @@ RSLT<-'JD3_ProcResults' #' @export #' @rdname jd3_utilities .jd3_object<-function(jobjRef, subclasses=NULL, result=FALSE){ - if (result) - classes<-c(OBJ, RSLT, subclasses) - else - classes<-c(OBJ, subclasses) - return(structure(list(internal=jobjRef), class=classes)) + if (result) + classes<-c(OBJ, RSLT, subclasses) + else + classes<-c(OBJ, subclasses) + return(structure(list(internal=jobjRef), class=classes)) } @@ -25,42 +25,42 @@ RSLT<-'JD3_ProcResults' #' #' @export dictionary<-function(object){ - if (! is(object, RSLT)) - stop("No dictionary for this type of object") - if (is.jnull(object$internal)){ - stop("No java object") - } else { - if (.jinstanceof(object$internal, "jdplus/toolkit/base/api/information/Explorable")){ - .proc_dictionary2(object$internal) + if (! is(object, RSLT)) + stop("No dictionary for this type of object") + if (is.jnull(object$internal)){ + stop("No java object") } else { - .proc_dictionary(.jclass(object$internal)) + if (.jinstanceof(object$internal, "jdplus/toolkit/base/api/information/Explorable")){ + .proc_dictionary2(object$internal) + } else { + .proc_dictionary(.jclass(object$internal)) + } } - } } #' @rdname dictionary #' @export result<-function(object, id){ - if (! is(object, RSLT)) - stop("No result for this type of object") - if (is.jnull(object$internal)){ - stop("No java object") - } else { - .proc_data(object$internal, id) + if (! is(object, RSLT)) + stop("No result for this type of object") + if (is.jnull(object$internal)){ + stop("No java object") + } else { + .proc_data(object$internal, id) } } #' @rdname dictionary #' @export user_defined <- function(object, userdefined = NULL){ - if (is.null(userdefined)){ - result <- list() - } else { - result <- lapply(userdefined, - function(var) result(object, var)) - if (is.null(names(userdefined))) - names(result) <- userdefined - } - class(result) <- c("user_defined") - result + if (is.null(userdefined)){ + result <- list() + } else { + result <- lapply(userdefined, + function(var) result(object, var)) + if (is.null(names(userdefined))) + names(result) <- userdefined + } + class(result) <- c("user_defined") + result } diff --git a/R/protobuf.R b/R/protobuf.R index 131eb25..50d8c99 100644 --- a/R/protobuf.R +++ b/R/protobuf.R @@ -26,19 +26,19 @@ NULL #' @export #' @rdname jd3_utilities .enum_sextract<-function(type, p){ - return(type$value(number=p)$name()) + return(type$value(number=p)$name()) } #' @export #' @rdname jd3_utilities .enum_sof<-function(type, code){ - return(type$value(name=code)$number()) + return(type$value(name=code)$number()) } #' @export #' @rdname jd3_utilities .enum_extract<-function(type, p){ - name<-type$value(number=p)$name() - return(substring(name, regexpr("_", name)+1)) + name<-type$value(number=p)$name() + return(substring(name, regexpr("_", name)+1)) } #' @export @@ -51,32 +51,32 @@ NULL #' @export #' @rdname jd3_utilities .r2p_parameter<-function(r){ - p<-jd3.Parameter$new() - if (is.null(r)) { - p$value<-0 - p$type<-.enum_of(jd3.ParameterType, "UNUSED", "PARAMETER") - } else { - p$value<-r$value - p$type<-.enum_of(jd3.ParameterType, r$type, "PARAMETER") - } - return(p) + p<-jd3.Parameter$new() + if (is.null(r)) { + p$value<-0 + p$type<-.enum_of(jd3.ParameterType, "UNUSED", "PARAMETER") + } else { + p$value<-r$value + p$type<-.enum_of(jd3.ParameterType, r$type, "PARAMETER") + } + return(p) } #' @export #' @rdname jd3_utilities .p2r_parameter<-function(p){ - if (! p$has("type")) return(NULL) - return(list(value = p$value, type=.enum_extract(jd3.ParameterType, p$type))) + if (! p$has("type")) return(NULL) + return(list(value = p$value, type=.enum_extract(jd3.ParameterType, p$type))) } #' @export #' @rdname jd3_utilities .r2p_parameters<-function(r){ - n<-length(r) - if (n == 0) return(NULL) - p<-apply(r, 2, function(z){.r2p_parameter(z)}) - return(p) + n<-length(r) + if (n == 0) return(NULL) + p<-apply(r, 2, function(z){.r2p_parameter(z)}) + return(p) } # .r2p_parameters<-function(data, type){ @@ -92,11 +92,11 @@ NULL #' @export #' @rdname jd3_utilities .r2p_lparameters<-function(r){ - # r is a list of lists with value/type entries - n<-length(r) - if (n == 0) return(NULL) - p<-lapply(r, function(z){.r2p_parameter(z)}) - return(p) + # r is a list of lists with value/type entries + n<-length(r) + if (n == 0) return(NULL) + p<-lapply(r, function(z){.r2p_parameter(z)}) + return(p) } @@ -104,119 +104,119 @@ NULL #' @export #' @rdname jd3_utilities .p2r_parameters<-function(p){ - n<-length(p) - if (n == 0) return(NULL) - r<-sapply(p, function(z){list(value=z$value, type=.enum_extract(jd3.ParameterType, z$type))}) - return(r) + n<-length(p) + if (n == 0) return(NULL) + r<-sapply(p, function(z){list(value=z$value, type=.enum_extract(jd3.ParameterType, z$type))}) + return(r) } #' @export #' @rdname jd3_utilities .p2r_parameters_rslt<-function(p){ - if (is.null(p)) - return(NULL) - if (length(p) == 0) - return(NULL) - value<-sapply(p, function(z){z$value}) - type<-sapply(p, function(z){.enum_extract(jd3.ParameterType, z$type)}) - return(data.frame(value=value, type=type)) + if (is.null(p)) + return(NULL) + if (length(p) == 0) + return(NULL) + value<-sapply(p, function(z){z$value}) + type<-sapply(p, function(z){.enum_extract(jd3.ParameterType, z$type)}) + return(data.frame(value=value, type=type)) } #' @export #' @rdname jd3_utilities .p2r_parameters_rsltx<-function(p){ - if (is.null(p)) - return(NULL) - if (length(p) == 0) - return(NULL) - value<-sapply(p, function(z){z$value}) - type<-sapply(p, function(z){.enum_extract(jd3.ParameterType, z$type)}) - description<-sapply(p, function(z){z$description}) + if (is.null(p)) + return(NULL) + if (length(p) == 0) + return(NULL) + value<-sapply(p, function(z){z$value}) + type<-sapply(p, function(z){.enum_extract(jd3.ParameterType, z$type)}) + description<-sapply(p, function(z){z$description}) - rslt<-data.frame(value=value, type=type) - row.names(rslt)<-description + rslt<-data.frame(value=value, type=type) + row.names(rslt)<-description - return(rslt) + return(rslt) } #' @export #' @rdname jd3_utilities .p2r_test<-function(p){ - if (is.null(p)) - return(NULL) - p <- p$as.list() - return(statisticaltest(p$value, p$pvalue, p$description)) + if (is.null(p)) + return(NULL) + p <- p$as.list() + return(statisticaltest(p$value, p$pvalue, p$description)) } #' @export #' @rdname jd3_utilities .p2r_matrix<-function(p){ - m<-matrix(data=p$values, nrow = p$nrows, ncol = p$ncols) - `attr<-`(m, "name", p$name) - return(m) + m<-matrix(data=p$values, nrow = p$nrows, ncol = p$ncols) + `attr<-`(m, "name", p$name) + return(m) } .r2p_matrix<-function(r){ - p<-jd3.Matrix$new() - p$name<-attr(r, "name") - p$nrows<-nrow(r) - p$ncols<-ncol(r) - p$values<-as.numeric(r) - return(p) + p<-jd3.Matrix$new() + p$name<-attr(r, "name") + p$nrows<-nrow(r) + p$ncols<-ncol(r) + p$values<-as.numeric(r) + return(p) } #' @export #' @rdname jd3_utilities .p2r_tsdata<-function(p){ - if (length(p$values) == 0) - return(NULL) - s<-ts(data=p$values, frequency = p$annual_frequency, start = c(p$start_year, p$start_period)) - s<-`attr<-`(s, "name", p$name) - return(s) + if (length(p$values) == 0) + return(NULL) + s<-ts(data=p$values, frequency = p$annual_frequency, start = c(p$start_year, p$start_period)) + s<-`attr<-`(s, "name", p$name) + return(s) } #' @export #' @rdname jd3_utilities .r2p_tsdata<-function(r){ - p<-jd3.TsData$new() - p$name<-attr(r, "name") - p$annual_frequency<-frequency(r) - s<-start(r) - p$start_year<-s[1] - p$start_period<-s[2] - p$values<-as.numeric(r) - return(p) + p<-jd3.TsData$new() + p$name<-attr(r, "name") + p$annual_frequency<-frequency(r) + s<-start(r) + p$start_year<-s[1] + p$start_period<-s[2] + p$values<-as.numeric(r) + return(p) } #' @export #' @rdname jd3_utilities .p2r_parameters_estimation<-function(p){ - if (is.null(p)) - return(NULL) - return(list(val=p$value, score=p$score, cov=.p2r_matrix(p$covariance), description=p$description)) + if (is.null(p)) + return(NULL) + return(list(val=p$value, score=p$score, cov=.p2r_matrix(p$covariance), description=p$description)) } #' @export #' @rdname jd3_utilities .p2r_likelihood<-function(p){ - return(.likelihood(p$nobs, p$neffectiveobs, p$nparams, - p$log_likelihood, p$adjusted_log_likelihood, - p$aic, p$aicc, p$bic, p$bicc, p$ssq)) + return(.likelihood(p$nobs, p$neffectiveobs, p$nparams, + p$log_likelihood, p$adjusted_log_likelihood, + p$aic, p$aicc, p$bic, p$bicc, p$ssq)) } #' @export #' @rdname jd3_utilities .p2r_date<-function(p){ - if (p$has('year')){ - return(ymd(p$year, p$month, p$day)) - } else { - return(NULL) - } + if (p$has('year')){ + return(ymd(p$year, p$month, p$day)) + } else { + return(NULL) + } } #' @export #' @rdname jd3_utilities .r2p_date<-function(s){ - if (is.null(s)) return(jd3.Date$new()) - else return(parseDate(s)) + if (is.null(s)) return(jd3.Date$new()) + else return(parseDate(s)) } @@ -224,40 +224,40 @@ NULL #' @export #' @rdname jd3_utilities .p2r_span<-function(span){ - type<-.enum_extract(jd3.SelectionType, span$type) - dt0<-.p2r_date(span$d0) - dt1<-.p2r_date(span$d1) + type<-.enum_extract(jd3.SelectionType, span$type) + dt0<-.p2r_date(span$d0) + dt1<-.p2r_date(span$d1) - return(structure(list(type=type, d0=dt0, d1=dt1, n0=span$n0, n1=span$n1), class= "JD3_SPAN")) + return(structure(list(type=type, d0=dt0, d1=dt1, n0=span$n0, n1=span$n1), class= "JD3_SPAN")) } #' @export #' @rdname jd3_utilities .r2p_span<-function(rspan){ - pspan<-jd3.TimeSelector$new() - pspan$type<-.enum_of(jd3.SelectionType, rspan$type, "SPAN") - pspan$n0<-rspan$n0 - pspan$n1<-rspan$n1 - pspan$d0<-.r2p_date(rspan$d0) - pspan$d1<-.r2p_date(rspan$d1) - return(pspan) + pspan<-jd3.TimeSelector$new() + pspan$type<-.enum_of(jd3.SelectionType, rspan$type, "SPAN") + pspan$n0<-rspan$n0 + pspan$n1<-rspan$n1 + pspan$d0<-.r2p_date(rspan$d0) + pspan$d1<-.r2p_date(rspan$d1) + return(pspan) } .p2r_sarima<-function(p){ - return(sarima_model(p$name, p$period, p$phi, p$d, p$theta, - p$bphi, p$bd, p$btheta)) + return(sarima_model(p$name, p$period, p$phi, p$d, p$theta, + p$bphi, p$bd, p$btheta)) } #' @export #' @rdname jd3_utilities .p2r_arima<-function(p){ - return(arima_model(p$name, p$ar, p$delta, p$ma, p$innovation_variance)) + return(arima_model(p$name, p$ar, p$delta, p$ma, p$innovation_variance)) } #' @export #' @rdname jd3_utilities .p2r_ucarima<-function(p){ - model<-.p2r_arima(p$model) - return(ucarima_model(model,lapply(p$components, function(z){.p2r_arima(z)}), lapply(p$complements, function(z){.p2r_arima(z)}), FALSE)) + model<-.p2r_arima(p$model) + return(ucarima_model(model,lapply(p$components, function(z){.p2r_arima(z)}), lapply(p$complements, function(z){.p2r_arima(z)}), FALSE)) } @@ -266,71 +266,71 @@ NULL #' @export #' @rdname jd3_utilities .p2r_spec_sarima<-function(spec){ - return(structure( - list( - period=spec$period, - d=spec$d, - bd=spec$bd, - phi=.p2r_parameters(spec$phi), - theta=.p2r_parameters(spec$theta), - bphi=.p2r_parameters(spec$bphi), - btheta=.p2r_parameters(spec$btheta) - ), - class="JD3_SARIMA_ESTIMATION")) + return(structure( + list( + period=spec$period, + d=spec$d, + bd=spec$bd, + phi=.p2r_parameters(spec$phi), + theta=.p2r_parameters(spec$theta), + bphi=.p2r_parameters(spec$bphi), + btheta=.p2r_parameters(spec$btheta) + ), + class="JD3_SARIMA_ESTIMATION")) } #' @export #' @rdname jd3_utilities .r2p_spec_sarima<-function(r){ - p<-regarima.SarimaSpec$new() - p$period<-r$period - p$d<-r$d - p$bd<-r$bd - p$phi<-.r2p_parameters(r$phi) - p$theta<-.r2p_parameters(r$theta) - p$bphi<-.r2p_parameters(r$bphi) - p$btheta<-.r2p_parameters(r$btheta) - return(p) + p<-regarima.SarimaSpec$new() + p$period<-r$period + p$d<-r$d + p$bd<-r$bd + p$phi<-.r2p_parameters(r$phi) + p$theta<-.r2p_parameters(r$theta) + p$bphi<-.r2p_parameters(r$bphi) + p$btheta<-.r2p_parameters(r$btheta) + return(p) } .p2r_outlier<-function(p){ - return(list( - name=p$name, - pos=.p2r_date(p$position), - code=p$code, - coef=.p2r_parameter(p$coefficient) - )) + return(list( + name=p$name, + pos=.p2r_date(p$position), + code=p$code, + coef=.p2r_parameter(p$coefficient) + )) } .r2p_outlier<-function(r){ - p<-modelling.Outlier$new() - p$name<-r$name - p$code<-r$code - p$position<-.r2p_date(r$pos) - p$coefficient<-.r2p_parameter(r$coef) - return(p) + p<-modelling.Outlier$new() + p$name<-r$name + p$code<-r$code + p$position<-.r2p_date(r$pos) + p$coefficient<-.r2p_parameter(r$coef) + return(p) } #' @export #' @rdname jd3_utilities .p2r_outliers<-function(p){ - if (length(p) == 0){return(NULL)} - return(lapply(p, function(z){.p2r_outlier(z)})) + if (length(p) == 0){return(NULL)} + return(lapply(p, function(z){.p2r_outlier(z)})) } #' @export #' @rdname jd3_utilities .r2p_outliers<-function(r){ - if (length(r) == 0){return(list())} - return(lapply(r, function(z){.r2p_outlier(z)})) + if (length(r) == 0){return(list())} + return(lapply(r, function(z){.r2p_outlier(z)})) } .p2r_sequence<-function(p){ return(list( start=.p2r_date(p$start), end=.p2r_date(p$end) - )) + )) } .r2p_sequence<-function(r){ @@ -396,217 +396,217 @@ NULL .p2r_ramp<-function(p){ - return(list( - name=p$name, - start=.p2r_date(p$start), - end=.p2r_date(p$end), - coef=.p2r_parameter(p$coefficient) - )) + return(list( + name=p$name, + start=.p2r_date(p$start), + end=.p2r_date(p$end), + coef=.p2r_parameter(p$coefficient) + )) } .r2p_ramp<-function(r){ - p<-modelling.Ramp$new() - p$name<-r$name - p$start<-.r2p_date(r$start) - p$end<-.r2p_date(r$end) - p$coefficient<-.r2p_parameter(r$coef) - return(p) + p<-modelling.Ramp$new() + p$name<-r$name + p$start<-.r2p_date(r$start) + p$end<-.r2p_date(r$end) + p$coefficient<-.r2p_parameter(r$coef) + return(p) } #' @export #' @rdname jd3_utilities .p2r_ramps<-function(p){ - if (length(p) == 0){return(NULL)} - return(lapply(p, function(z){.p2r_ramp(z)})) + if (length(p) == 0){return(NULL)} + return(lapply(p, function(z){.p2r_ramp(z)})) } #' @export #' @rdname jd3_utilities .r2p_ramps<-function(r){ - if (length(r) == 0){return(list())} - return(lapply(r, function(z){.r2p_ramp(z)})) + if (length(r) == 0){return(list())} + return(lapply(r, function(z){.r2p_ramp(z)})) } .regeffect<-function(map){ - if (length(map) == 0) - return("Undefined") - r<-which(sapply(map, function(z){z$key == "regeffect"})) - if (length(r) == 0) return("Undefined") - return(map[[min(r)]]$value) + if (length(map) == 0) + return("Undefined") + r<-which(sapply(map, function(z){z$key == "regeffect"})) + if (length(r) == 0) return("Undefined") + return(map[[min(r)]]$value) } .p2r_uservar<-function(p){ - l<-p$lag - return(list( - id=p$id, - name=p$name, - lag=l, - coef=.p2r_parameter(p$coefficient), - regeffect=.regeffect(p$metadata) - )) + l<-p$lag + return(list( + id=p$id, + name=p$name, + lag=l, + coef=.p2r_parameter(p$coefficient), + regeffect=.regeffect(p$metadata) + )) } .r2p_uservar<-function(r){ - p<-modelling.TsVariable$new() - p$name<-r$name - p$id<-r$id - p$lag<-r$lag - p$coefficient<-.r2p_parameter(r$coef) - p$metadata<-modelling.TsVariable.MetadataEntry$new(key = "regeffect", value=r$regeffect) - return(p) + p<-modelling.TsVariable$new() + p$name<-r$name + p$id<-r$id + p$lag<-r$lag + p$coefficient<-.r2p_parameter(r$coef) + p$metadata<-modelling.TsVariable.MetadataEntry$new(key = "regeffect", value=r$regeffect) + return(p) } #' @export #' @rdname jd3_utilities .p2r_uservars<-function(p){ - if (length(p) == 0){return(NULL)} - return(lapply(p, function(z){.p2r_uservar(z)})) + if (length(p) == 0){return(NULL)} + return(lapply(p, function(z){.p2r_uservar(z)})) } #' @export #' @rdname jd3_utilities .r2p_uservars<-function(r){ - if (length(r) == 0){return(list())} - return(lapply(r, function(z){.r2p_uservar(z)})) + if (length(r) == 0){return(list())} + return(lapply(r, function(z){.r2p_uservar(z)})) } #' @export #' @rdname jd3_utilities .p2r_variables<-function(p){ - return(lapply(p, function(v){.p2r_variable(v)})) + return(lapply(p, function(v){.p2r_variable(v)})) } .p2r_variable<-function(p){ - name<-p$name - type<-.enum_extract(modelling.VariableType, p$var_type) - coef<-.p2r_parameters_rsltx(p$coefficients) - return(list(name=name, type=type, coef=coef)) + name<-p$name + type<-.enum_extract(modelling.VariableType, p$var_type) + coef<-.p2r_parameters_rsltx(p$coefficients) + return(list(name=name, type=type, coef=coef)) } .p2r_component<-function(p){ - s<-p$data$values - n<-length(s) - if (n == 0) return(NULL) - freq<-p$data$annual_frequency - start<-c(p$data$start_year, p$data$start_period) - nb<-p$nbcasts - nf<-p$nfcasts - - val<-ts(s[(nb+1):(n-nf)], frequency = freq, start=.ts_move(start, freq, nb)) - rslt<-list(data=val) - if (nb > 0){ - bcasts<-ts(s[1:nb], frequency = freq, start=start) - rslt[['bcasts']]<-bcasts - } - if (nf > 0){ - fcasts<-ts(s[(n-nf+1):n], frequency = freq, start=.ts_move(start, freq, n-nf)) - rslt[['fcasts']]<-fcasts - } - return(rslt) + s<-p$data$values + n<-length(s) + if (n == 0) return(NULL) + freq<-p$data$annual_frequency + start<-c(p$data$start_year, p$data$start_period) + nb<-p$nbcasts + nf<-p$nfcasts + + val<-ts(s[(nb+1):(n-nf)], frequency = freq, start=.ts_move(start, freq, nb)) + rslt<-list(data=val) + if (nb > 0){ + bcasts<-ts(s[1:nb], frequency = freq, start=start) + rslt[['bcasts']]<-bcasts + } + if (nf > 0){ + fcasts<-ts(s[(n-nf+1):n], frequency = freq, start=.ts_move(start, freq, n-nf)) + rslt[['fcasts']]<-fcasts + } + return(rslt) } .p2r_sa_component<-function(p){ - e<-p$stde - if (length(e) == 0) return(.p2r_component(p)) - - s<-p$data$values - n<-length(s) - if (n == 0) return(NULL) - freq<-p$data$annual_frequency - start<-c(p$data$start_year, p$data$start_period) - nb<-p$nbcasts - nf<-p$nfcasts - dstart<-.ts_move(start, freq, nb) - fstart<-.ts_move(start, freq, n-nf) - - idx<-(nb+1):(n-nf) - data<-ts(s[idx], frequency = freq, dstart) - edata<-ts(e[idx], frequency = freq, dstart) - - rslt<-list(data=data, data.stde=edata) - if (nb > 0){ - idx<-1:nb - bcasts<-ts(s[idx], frequency = freq, start=start) - ebcasts<-ts(e[idx], frequency = freq, start=start) - rslt[['bcasts']]<-bcasts - rslt[['bcasts.stde']]<-ebcasts - } - if (nf > 0){ - idx<-(n-nf+1):n - fcasts<-ts(s[idx], frequency = freq, start=fstart) - efcasts<-ts(e[idx], frequency = freq, start=fstart) - rslt[['fcasts']]<-fcasts - rslt[['fcasts.stde']]<-efcasts - } - - return(rslt) + e<-p$stde + if (length(e) == 0) return(.p2r_component(p)) + + s<-p$data$values + n<-length(s) + if (n == 0) return(NULL) + freq<-p$data$annual_frequency + start<-c(p$data$start_year, p$data$start_period) + nb<-p$nbcasts + nf<-p$nfcasts + dstart<-.ts_move(start, freq, nb) + fstart<-.ts_move(start, freq, n-nf) + + idx<-(nb+1):(n-nf) + data<-ts(s[idx], frequency = freq, dstart) + edata<-ts(e[idx], frequency = freq, dstart) + + rslt<-list(data=data, data.stde=edata) + if (nb > 0){ + idx<-1:nb + bcasts<-ts(s[idx], frequency = freq, start=start) + ebcasts<-ts(e[idx], frequency = freq, start=start) + rslt[['bcasts']]<-bcasts + rslt[['bcasts.stde']]<-ebcasts + } + if (nf > 0){ + idx<-(n-nf+1):n + fcasts<-ts(s[idx], frequency = freq, start=fstart) + efcasts<-ts(e[idx], frequency = freq, start=fstart) + rslt[['fcasts']]<-fcasts + rslt[['fcasts.stde']]<-efcasts + } + + return(rslt) } #' @export #' @rdname jd3_utilities .p2r_sa_decomposition<-function(p, full=FALSE){ - if (full){ - return(list(mode = .enum_extract(sa.DecompositionMode, p$mode), - series=.p2r_sa_component(p$series), - sa=.p2r_sa_component(p$seasonally_adjusted), - t=.p2r_sa_component(p$trend), - s=.p2r_sa_component(p$seasonal), - i=.p2r_sa_component(p$irregular) - )) - } else { - return(list(mode = .enum_extract(sa.DecompositionMode, p$mode), - series=.p2r_component(p$series), - sa=.p2r_component(p$seasonally_adjusted), - t=.p2r_component(p$trend), - s=.p2r_component(p$seasonal), - i=.p2r_component(p$irregular) - )) - } + if (full){ + return(list(mode = .enum_extract(sa.DecompositionMode, p$mode), + series=.p2r_sa_component(p$series), + sa=.p2r_sa_component(p$seasonally_adjusted), + t=.p2r_sa_component(p$trend), + s=.p2r_sa_component(p$seasonal), + i=.p2r_sa_component(p$irregular) + )) + } else { + return(list(mode = .enum_extract(sa.DecompositionMode, p$mode), + series=.p2r_component(p$series), + sa=.p2r_component(p$seasonally_adjusted), + t=.p2r_component(p$trend), + s=.p2r_component(p$seasonal), + i=.p2r_component(p$irregular) + )) + } } #' @export #' @rdname jd3_utilities .p2r_sa_diagnostics<-function(p){ - return(list(vardecomposition =p$variance_decomposition$as.list(), - seas.ftest.i=.p2r_test(p$seasonal_ftest_on_irregular), - seas.ftest.sa=.p2r_test(p$seasonal_ftest_on_sa), - seas.qstest.i=.p2r_test(p$seasonal_qtest_on_irregular), - seas.qstest.sa=.p2r_test(p$seasonal_qtest_on_sa), - td.ftest.i=.p2r_test(p$td_ftest_on_irregular), - td.ftest.sa=.p2r_test(p$td_ftest_on_sa) - )) + return(list(vardecomposition =p$variance_decomposition$as.list(), + seas.ftest.i=.p2r_test(p$seasonal_ftest_on_irregular), + seas.ftest.sa=.p2r_test(p$seasonal_ftest_on_sa), + seas.qstest.i=.p2r_test(p$seasonal_qtest_on_irregular), + seas.qstest.sa=.p2r_test(p$seasonal_qtest_on_sa), + td.ftest.i=.p2r_test(p$td_ftest_on_irregular), + td.ftest.sa=.p2r_test(p$td_ftest_on_sa) + )) } .ts_move<-function(period, freq, delta){ - if (delta == 0)return(period) - if (freq == 1)return(c(period[1]+delta, 1)) - x<-period[1]*freq+(period[2]+delta-1) - return(c(x %/% freq, (x %% freq)+1)) + if (delta == 0)return(period) + if (freq == 1)return(c(period[1]+delta, 1)) + x<-period[1]*freq+(period[2]+delta-1) + return(c(x %/% freq, (x %% freq)+1)) } # Benchmarking #' @export #' @rdname jd3_utilities .p2r_spec_benchmarking<-function(p){ - return(list( - enabled=p$enabled, - target=.enum_extract(sa.BenchmarkingTarget, p$target), - lambda=p$lambda, - rho=p$rho, - bias=.enum_extract(sa.BenchmarkingBias, p$bias), - forecast=p$forecast - )) + return(list( + enabled=p$enabled, + target=.enum_extract(sa.BenchmarkingTarget, p$target), + lambda=p$lambda, + rho=p$rho, + bias=.enum_extract(sa.BenchmarkingBias, p$bias), + forecast=p$forecast + )) } #' @export #' @rdname jd3_utilities .r2p_spec_benchmarking<-function(r){ - p<-sa.BenchmarkingSpec$new() - p$enabled<-r$enabled - p$target<-.enum_of(sa.BenchmarkingTarget, r$target, "BENCH") - p$lambda<-r$lambda - p$rho<-r$rho - p$bias<-.enum_of(sa.BenchmarkingBias, r$bias, "BENCH") - p$forecast<-r$forecast - return(p) + p<-sa.BenchmarkingSpec$new() + p$enabled<-r$enabled + p$target<-.enum_of(sa.BenchmarkingTarget, r$target, "BENCH") + p$lambda<-r$lambda + p$rho<-r$rho + p$bias<-.enum_of(sa.BenchmarkingBias, r$bias, "BENCH") + p$forecast<-r$forecast + return(p) } diff --git a/R/regarima_generic.R b/R/regarima_generic.R index 9049ea8..fe3be62 100644 --- a/R/regarima_generic.R +++ b/R/regarima_generic.R @@ -2,76 +2,76 @@ #' @importFrom stats coef df.residual logLik residuals vcov nobs #' @export coef.JD3_REGARIMA_RSLTS <- function(object, component = c("regression", "arima", "both"), ...){ - if (is.null(object)) - return(NULL) + if (is.null(object)) + return(NULL) - component <- match.arg(component) - if (component == "regression") { - coefs <- .regarima_coef_table(object) - } else if (component == "arima") { - coefs <- .sarima_coef_table(object)$coef_table - } else { - coefs <- rbind(.sarima_coef_table(object)$coef_table[,1:2], - .regarima_coef_table(object)[,1:2]) - } - res <- coefs[,1] - names(res) <- rownames(coefs) - res + component <- match.arg(component) + if (component == "regression") { + coefs <- .regarima_coef_table(object) + } else if (component == "arima") { + coefs <- .sarima_coef_table(object)$coef_table + } else { + coefs <- rbind(.sarima_coef_table(object)$coef_table[,1:2], + .regarima_coef_table(object)[,1:2]) + } + res <- coefs[,1] + names(res) <- rownames(coefs) + res } # Method "JD3_REGARIMA_RSLTS" for the function logLik #' @export logLik.JD3_REGARIMA_RSLTS <- function(object, ...) { - if (!is.null(object$estimation)) # for sarima_estimate outputs - object <- object$estimation - if (is.null(object) || - is.null(object$likelihood$ll)) { - res <- NA - } else { - res <- structure(object$likelihood$ll, - df = object$likelihood$nparams, - nall = object$likelihood$nobs, - nobs = object$likelihood$neffectiveobs) - } - class(res) <- "logLik" - res + if (!is.null(object$estimation)) # for sarima_estimate outputs + object <- object$estimation + if (is.null(object) || + is.null(object$likelihood$ll)) { + res <- NA + } else { + res <- structure(object$likelihood$ll, + df = object$likelihood$nparams, + nall = object$likelihood$nobs, + nobs = object$likelihood$neffectiveobs) + } + class(res) <- "logLik" + res } #' @export vcov.JD3_REGARIMA_RSLTS <- function(object, component = c("regression", "arima"), ...){ - if (!is.null(object$estimation)) # for sarima_estimate outputs - object <- object$estimation + if (!is.null(object$estimation)) # for sarima_estimate outputs + object <- object$estimation - if (is.null(object)) - return(NULL) - component <- match.arg(component) - if (component == "regression") { - object$bvar - } else { - object$parameters$cov - } + if (is.null(object)) + return(NULL) + component <- match.arg(component) + if (component == "regression") { + object$bvar + } else { + object$parameters$cov + } } #' @export df.residual.JD3_REGARIMA_RSLTS <- function(object, ...){ - if (is.null(object)) - return(NULL) - if (!is.null(object$estimation)) # for sarima_estimate outputs - object <- object$estimation - object$likelihood$neffectiveobs - object$likelihood$nparams + if (is.null(object)) + return(NULL) + if (!is.null(object$estimation)) # for sarima_estimate outputs + object <- object$estimation + object$likelihood$neffectiveobs - object$likelihood$nparams } #' @export nobs.JD3_REGARIMA_RSLTS <- function(object, ...){ - if (is.null(object)) - return(NULL) - if (!is.null(object$estimation)) # for sarima_estimate outputs - object <- object$estimation - object$likelihood$neffectiveobs + if (is.null(object)) + return(NULL) + if (!is.null(object$estimation)) # for sarima_estimate outputs + object <- object$estimation + object$likelihood$neffectiveobs } #' @export residuals.JD3_REGARIMA_RSLTS <- function(object, ...){ - if (is.null(object)) - return(NULL) - if (!is.null(object$estimation)) # for sarima_estimate outputs - object <- object$estimation - object$res + if (is.null(object)) + return(NULL) + if (!is.null(object$estimation)) # for sarima_estimate outputs + object <- object$estimation + object$res } diff --git a/R/regarima_rslts.R b/R/regarima_rslts.R index f594341..df11411 100644 --- a/R/regarima_rslts.R +++ b/R/regarima_rslts.R @@ -4,38 +4,38 @@ NULL #' @export #' @rdname jd3_utilities .p2r_regarima_rslts<-function(p){ - return(structure(list( - description=.p2r_regarima_description(p$description), - estimation=.p2r_regarima_estimation(p$estimation), - diagnostics=.p2r_regarima_diagnostics(p$diagnostics)), - class="JD3_REGARIMA_RSLTS") - ) + return(structure(list( + description=.p2r_regarima_description(p$description), + estimation=.p2r_regarima_estimation(p$estimation), + diagnostics=.p2r_regarima_diagnostics(p$diagnostics)), + class="JD3_REGARIMA_RSLTS") + ) } .p2r_regarima_description<-function(p){ - return(list( - log=p$log, - preadjustment = .enum_extract(modelling.LengthOfPeriod, p$preadjustment), - arima=.p2r_spec_sarima(p$arima), - variables=.p2r_variables(p$variables) - )) + return(list( + log=p$log, + preadjustment = .enum_extract(modelling.LengthOfPeriod, p$preadjustment), + arima=.p2r_spec_sarima(p$arima), + variables=.p2r_variables(p$variables) + )) } .p2r_regarima_estimation<-function(p){ - return(list( - y=p$y, - X=.p2r_matrix(p$x), - parameters=.p2r_parameters_estimation(p$parameters), - b=p$b, - bvar=.p2r_matrix(p$bcovariance), - likelihood=.p2r_likelihood(p$likelihood), - res=p$residuals - )) + return(list( + y=p$y, + X=.p2r_matrix(p$x), + parameters=.p2r_parameters_estimation(p$parameters), + b=p$b, + bvar=.p2r_matrix(p$bcovariance), + likelihood=.p2r_likelihood(p$likelihood), + res=p$residuals + )) } .p2r_regarima_diagnostics<-function(p){ - tlist<-lapply(p$residuals_tests, function(z){.p2r_test(z$value)}) - tnames<-lapply(p$residuals_tests, function(z){z$key}) - testonresiduals<-`names<-`(tlist, tnames) - return(testonresiduals) + tlist<-lapply(p$residuals_tests, function(z){.p2r_test(z$value)}) + tnames<-lapply(p$residuals_tests, function(z){z$key}) + testonresiduals<-`names<-`(tlist, tnames) + return(testonresiduals) } diff --git a/R/spec_benchmarking.R b/R/spec_benchmarking.R index 4976ee8..6ea3641 100644 --- a/R/spec_benchmarking.R +++ b/R/spec_benchmarking.R @@ -38,7 +38,7 @@ set_benchmarking <- function(x, enabled = NA, lambda = NA, forecast = NA, bias = c(NA, "None")) { - UseMethod("set_benchmarking", x) + UseMethod("set_benchmarking", x) } #' @export set_benchmarking.default <- function(x, enabled = NA, @@ -47,28 +47,28 @@ set_benchmarking.default <- function(x, enabled = NA, lambda = NA, forecast = NA, bias = c(NA, "None")) { - target <- match.arg(toupper(target[1]), - c(NA, "CALENDARADJUSTED", "ORIGINAL")) - bias <- match.arg(toupper(bias)[1], - c(NA, "NONE")) - if (!is.na(enabled) && is.logical(enabled)) { - x$enabled <- enabled - } - if (!is.na(target)) { - x$target <- sprintf("TARGET_%s", target) - } - if (!is.na(lambda)) { - x$lambda <- lambda - } - if (!is.na(rho)) { - x$rho <- rho - } - if (!is.na(bias)) { - x$bias <- sprintf("BIAS_%s", bias) - } - if (!is.na(forecast) && is.logical(forecast)) { - x$forecast <- forecast - } + target <- match.arg(toupper(target[1]), + c(NA, "CALENDARADJUSTED", "ORIGINAL")) + bias <- match.arg(toupper(bias)[1], + c(NA, "NONE")) + if (!is.na(enabled) && is.logical(enabled)) { + x$enabled <- enabled + } + if (!is.na(target)) { + x$target <- sprintf("TARGET_%s", target) + } + if (!is.na(lambda)) { + x$lambda <- lambda + } + if (!is.na(rho)) { + x$rho <- rho + } + if (!is.na(bias)) { + x$bias <- sprintf("BIAS_%s", bias) + } + if (!is.na(forecast) && is.logical(forecast)) { + x$forecast <- forecast + } - x + x } diff --git a/R/spec_regarima.R b/R/spec_regarima.R index 924502d..b908fde 100644 --- a/R/spec_regarima.R +++ b/R/spec_regarima.R @@ -33,7 +33,7 @@ add_outlier <- function(x, date, name = sprintf("%s (%s)", type, date), coef = 0){ - UseMethod("add_outlier", x) + UseMethod("add_outlier", x) } #' @export add_outlier.default <- function(x, @@ -41,44 +41,44 @@ add_outlier.default <- function(x, date, name = sprintf("%s (%s)", type, date), coef = 0){ - type <- match.arg(toupper(type), - choices = c("AO", "TC", "LS", "SO"), - several.ok = TRUE) - # data.frame to recycle arguments - new_out <- data.frame(type, date, name, coef) - new_out <- as.list(new_out) - new_out <- mapply(.create_outlier, - as.list(new_out)[[1]], - as.list(new_out)[[2]], - as.list(new_out)[[3]], - as.list(new_out)[[4]], - SIMPLIFY = FALSE) - names(new_out) <- NULL - x$regression$outliers <- c(x$regression$outliers, - new_out) - all_out <- t(simplify2array(x$regression$outliers)[c("pos","code"),]) - dupl_out <- duplicated(all_out,fromLast = TRUE) - if (any(dupl_out)){ - warning("Duplicated outliers removed: last outliers kept") - x$regression$outliers <- x$regression$outliers[!dupl_out] - } - x + type <- match.arg(toupper(type), + choices = c("AO", "TC", "LS", "SO"), + several.ok = TRUE) + # data.frame to recycle arguments + new_out <- data.frame(type, date, name, coef) + new_out <- as.list(new_out) + new_out <- mapply(.create_outlier, + as.list(new_out)[[1]], + as.list(new_out)[[2]], + as.list(new_out)[[3]], + as.list(new_out)[[4]], + SIMPLIFY = FALSE) + names(new_out) <- NULL + x$regression$outliers <- c(x$regression$outliers, + new_out) + all_out <- t(simplify2array(x$regression$outliers)[c("pos","code"),]) + dupl_out <- duplicated(all_out,fromLast = TRUE) + if (any(dupl_out)){ + warning("Duplicated outliers removed: last outliers kept") + x$regression$outliers <- x$regression$outliers[!dupl_out] + } + x } .create_outlier<-function(code, pos, name = NULL, coef=NULL){ - res <- list(name=name, pos=pos, code=code, coef = .fixed_parameter(coef)) - return(res) + res <- list(name=name, pos=pos, code=code, coef = .fixed_parameter(coef)) + return(res) } .fixed_parameters<-function(coef){ - ncoef<-length(coef) - if (ncoef == 0) return(NULL) - l<-lapply(coef, function(v){list(value=v, type='FIXED')}) - return(l) + ncoef<-length(coef) + if (ncoef == 0) return(NULL) + l<-lapply(coef, function(v){list(value=v, type='FIXED')}) + return(l) } .fixed_parameter<-function(coef){ - if (is.null(coef)) return(NULL) - if (coef == 0) return(NULL) - return(list(value=coef, type='FIXED')) + if (is.null(coef)) return(NULL) + if (coef == 0) return(NULL) + return(list(value=coef, type='FIXED')) } @@ -89,41 +89,41 @@ remove_outlier <- function(x, type = NULL, date = NULL, name = NULL){ - UseMethod("remove_outlier", x) + UseMethod("remove_outlier", x) } #' @export remove_outlier.default <- function(x, type = NULL, date = NULL, name = NULL){ - if (is.null(x$regression$outliers)) - return(x) - out_mat <- simplify2array(x$regression$outliers)[c("code", "pos", "name"),, drop = FALSE] - if (is.null(type)) { - out_mat["code",] <- "" - } else { - type <- match.arg(toupper(type), - choices = c("AO", "TC", "LS", "SO"), - several.ok = TRUE) - } - if (is.null(date)) { - out_mat["pos",] <- "" - } - if (is.null(name)) { - out_mat["name",] <- "" - } - out_id <- apply(out_mat,2, paste0, collapse = "") - rm_out_id <- rbind(type = type, date = date, name = name) - if (is.null(rm_out_id)) - return(x) - rm_out_id <- apply(rm_out_id,2, paste0, collapse = "") + if (is.null(x$regression$outliers)) + return(x) + out_mat <- simplify2array(x$regression$outliers)[c("code", "pos", "name"),, drop = FALSE] + if (is.null(type)) { + out_mat["code",] <- "" + } else { + type <- match.arg(toupper(type), + choices = c("AO", "TC", "LS", "SO"), + several.ok = TRUE) + } + if (is.null(date)) { + out_mat["pos",] <- "" + } + if (is.null(name)) { + out_mat["name",] <- "" + } + out_id <- apply(out_mat,2, paste0, collapse = "") + rm_out_id <- rbind(type = type, date = date, name = name) + if (is.null(rm_out_id)) + return(x) + rm_out_id <- apply(rm_out_id,2, paste0, collapse = "") - remove_out <- out_id %in% rm_out_id - x$regression$outliers <- x$regression$outliers[!remove_out] - if (length(x$regression$outliers) == 0) { - x$regression["outliers"] <- list(NULL) - } - x + remove_out <- out_id %in% rm_out_id + x$regression$outliers <- x$regression$outliers[!remove_out] + if (length(x$regression$outliers) == 0) { + x$regression["outliers"] <- list(NULL) + } + x } #' @rdname add_outlier #' @export @@ -132,7 +132,7 @@ add_ramp <- function(x, end, name = sprintf("rp.%s - %s", start, end), coef = 0){ - UseMethod("add_ramp", x) + UseMethod("add_ramp", x) } #' @export add_ramp.default <- function(x, @@ -140,30 +140,30 @@ add_ramp.default <- function(x, end, name = sprintf("rp.%s - %s", start, end), coef = 0){ - # data.frame to recycle arguments - new_ramp <- data.frame(start, end, name, coef) - new_ramp <- as.list(new_ramp) - new_ramp <- mapply(.create_ramp, - as.list(new_ramp)[[1]], - as.list(new_ramp)[[2]], - as.list(new_ramp)[[3]], - as.list(new_ramp)[[4]], - SIMPLIFY = FALSE) - names(new_ramp) <- NULL - x$regression$ramps <- c(x$regression$ramps, - new_ramp) - all_out <- t(simplify2array(x$regression$ramps)[c("start", "end"),]) - dupl_out <- duplicated(all_out,fromLast = TRUE) - if (any(dupl_out)){ - warning("Duplicated ramps removed") - x$regression$ramps <- x$regression$ramps[!dupl_out] - } - x + # data.frame to recycle arguments + new_ramp <- data.frame(start, end, name, coef) + new_ramp <- as.list(new_ramp) + new_ramp <- mapply(.create_ramp, + as.list(new_ramp)[[1]], + as.list(new_ramp)[[2]], + as.list(new_ramp)[[3]], + as.list(new_ramp)[[4]], + SIMPLIFY = FALSE) + names(new_ramp) <- NULL + x$regression$ramps <- c(x$regression$ramps, + new_ramp) + all_out <- t(simplify2array(x$regression$ramps)[c("start", "end"),]) + dupl_out <- duplicated(all_out,fromLast = TRUE) + if (any(dupl_out)){ + warning("Duplicated ramps removed") + x$regression$ramps <- x$regression$ramps[!dupl_out] + } + x } .create_ramp<-function(start, end, name = NULL, coef=NULL){ - res <- list(name=name, start=start, end=end, coef = .fixed_parameter(coef)) - return(res) + res <- list(name=name, start=start, end=end, coef = .fixed_parameter(coef)) + return(res) } #' @rdname add_outlier #' @export @@ -171,37 +171,37 @@ remove_ramp <- function(x, start = NULL, end = NULL, name = NULL){ - UseMethod("remove_ramp", x) + UseMethod("remove_ramp", x) } #' @export remove_ramp.default <- function(x, start = NULL, end = NULL, name = NULL){ - if (is.null(x$regression$ramps)) - return(x) - rp_mat <- simplify2array(x$regression$ramps)[c("start", "end", "name"),, drop = FALSE] - if (is.null(start)) { - rp_mat["start",] <- "" - } - if (is.null(end)) { - rp_mat["end",] <- "" - } - if (is.null(name)) { - rp_mat["name",] <- "" - } - rp_id <- apply(rp_mat,2, paste0, collapse = "") - rm_rp_id <- rbind(start = start, end = end, name = name) - if (is.null(rm_rp_id)) - return(x) - rm_rp_id <- apply(rm_rp_id,2, paste0, collapse = "") + if (is.null(x$regression$ramps)) + return(x) + rp_mat <- simplify2array(x$regression$ramps)[c("start", "end", "name"),, drop = FALSE] + if (is.null(start)) { + rp_mat["start",] <- "" + } + if (is.null(end)) { + rp_mat["end",] <- "" + } + if (is.null(name)) { + rp_mat["name",] <- "" + } + rp_id <- apply(rp_mat,2, paste0, collapse = "") + rm_rp_id <- rbind(start = start, end = end, name = name) + if (is.null(rm_rp_id)) + return(x) + rm_rp_id <- apply(rm_rp_id,2, paste0, collapse = "") - remove_rp <- rp_id %in% rm_rp_id - x$regression$ramps <- x$regression$ramps[!remove_rp] - if (length(x$regression$ramps) == 0) { - x$regression["ramps"] <- list(NULL) - } - x + remove_rp <- rp_id %in% rm_rp_id + x$regression$ramps <- x$regression$ramps[!remove_rp] + if (length(x$regression$ramps) == 0) { + x$regression["ramps"] <- list(NULL) + } + x } #' Set estimation sub-span and quality check specification @@ -264,7 +264,7 @@ set_basic <- function(x, n1 = 0, preliminary.check = NA, preprocessing = NA){ - UseMethod("set_basic", x) + UseMethod("set_basic", x) } #' @export set_basic.default <- function(x, @@ -275,21 +275,21 @@ set_basic.default <- function(x, n1 = 0, preliminary.check = NA, preprocessing = NA){ - basic <- x$basic - is_tramo <- inherits(x, "JD3_TRAMO_SPEC") + basic <- x$basic + is_tramo <- inherits(x, "JD3_TRAMO_SPEC") - basic$span <- set_span(basic$span, - type = type, - d0 = d0, d1 = d1, - n0 = n0, n1 = n1) - if (!missing(preprocessing) && !is.na(preprocessing) && !is_tramo){ - basic$preprocessing <- preprocessing - } - if (!missing(preliminary.check) && !is.na(preliminary.check)){ - # basic$preliminaryCheck <- preliminary.check - } - x$basic <- basic - x + basic$span <- set_span(basic$span, + type = type, + d0 = d0, d1 = d1, + n0 = n0, n1 = n1) + if (!missing(preprocessing) && !is.na(preprocessing) && !is_tramo){ + basic$preprocessing <- preprocessing + } + if (!missing(preliminary.check) && !is.na(preliminary.check)){ + # basic$preliminaryCheck <- preliminary.check + } + x$basic <- basic + x } #' Set Numeric Estimation Parameters and Modelling Span #' @@ -337,7 +337,7 @@ set_estimate <- function(x, # TRAMO SPECIFIC exact.ml = NA, unit.root.limit = NA){ - UseMethod("set_estimate", x) + UseMethod("set_estimate", x) } #' @export set_estimate.default <- function(x, @@ -350,25 +350,25 @@ set_estimate.default <- function(x, # TRAMO SPECIFIC exact.ml = NA, unit.root.limit = NA){ - estimate <- x$estimate - is_tramo <- inherits(x, "JD3_TRAMO_SPEC") - estimate$span <- set_span(estimate$span, - type = type, - d0 = d0, d1 = d1, - n0 = n0, n1 = n1) - if (!missing(tol) && !is.na(tol)) { - estimate$tol <- tol - } - # TRAMO-SEATS SPECIFIC - if (!missing(exact.ml) && !is.na(exact.ml) && is_tramo) { - estimate$ml <- exact.ml - } - if (!missing(unit.root.limit) && !is.na(unit.root.limit) && is_tramo) { - estimate$ubp <- unit.root.limit - } - # END TRAMO-SEATS SPECIFIC - x$estimate <- estimate - x + estimate <- x$estimate + is_tramo <- inherits(x, "JD3_TRAMO_SPEC") + estimate$span <- set_span(estimate$span, + type = type, + d0 = d0, d1 = d1, + n0 = n0, n1 = n1) + if (!missing(tol) && !is.na(tol)) { + estimate$tol <- tol + } + # TRAMO-SEATS SPECIFIC + if (!missing(exact.ml) && !is.na(exact.ml) && is_tramo) { + estimate$ml <- exact.ml + } + if (!missing(unit.root.limit) && !is.na(unit.root.limit) && is_tramo) { + estimate$ubp <- unit.root.limit + } + # END TRAMO-SEATS SPECIFIC + x$estimate <- estimate + x } #' Set Outlier Detection Parameters #' @@ -435,7 +435,7 @@ set_outlier <- function(x, lsrun = NA, # TRAMO SPECIFIC eml.est = NA){ - UseMethod("set_outlier", x) + UseMethod("set_outlier", x) } #' @export set_outlier.default <- function(x, @@ -453,70 +453,70 @@ set_outlier.default <- function(x, lsrun = NA, # TRAMO SPECIFIC eml.est = NA){ - outlier <- x$outlier - outlier$span <- set_span(outlier$span, - type = span.type, - d0 = d0, d1 = d1, - n0 = n0, n1 = n1) - # to set specific TRAMO/REGARIMA values - is_tramo <- inherits(x, "JD3_TRAMO_SPEC") + outlier <- x$outlier + outlier$span <- set_span(outlier$span, + type = span.type, + d0 = d0, d1 = d1, + n0 = n0, n1 = n1) + # to set specific TRAMO/REGARIMA values + is_tramo <- inherits(x, "JD3_TRAMO_SPEC") - va_name <- ifelse(is_tramo, "va", "defva") - tcr_name <- ifelse(is_tramo, "tcrate", "monthlytcrate") + va_name <- ifelse(is_tramo, "va", "defva") + tcr_name <- ifelse(is_tramo, "tcrate", "monthlytcrate") - if (missing(critical.value) || anyNA(critical.value)){ - critical.value <- outlier[[va_name]] - } else { - outlier[[va_name]] <- critical.value[1] - } - if (is.null(outliers.type) || length(outliers.type) == 0){ - if (is_tramo) { - outlier$enabled <- FALSE + if (missing(critical.value) || anyNA(critical.value)){ + critical.value <- outlier[[va_name]] } else { - outlier$outliers <- list() + outlier[[va_name]] <- critical.value[1] } - } else if (!missing(outliers.type) && !all(is.na(outliers.type))){ - outliers.type <- match.arg(toupper(outliers.type), - choices = c("AO", "LS", "TC", "SO"), - several.ok = TRUE) - outliers.type <- unique(outliers.type) - if (is_tramo) { - outlier$enabled <- TRUE - for (out.name in c("ao", "ls", "ts", "so")) { - outlier[[out.name]] <- out.name %in% tolower(outliers.type) - } - } else { - critical.value <- rep(critical.value, length(outliers.type)) - outlier$outliers <- lapply(seq_along(outliers.type), function(i){ - list(type = outliers.type[i], va = critical.value[i]) - }) + if (is.null(outliers.type) || length(outliers.type) == 0){ + if (is_tramo) { + outlier$enabled <- FALSE + } else { + outlier$outliers <- list() + } + } else if (!missing(outliers.type) && !all(is.na(outliers.type))){ + outliers.type <- match.arg(toupper(outliers.type), + choices = c("AO", "LS", "TC", "SO"), + several.ok = TRUE) + outliers.type <- unique(outliers.type) + if (is_tramo) { + outlier$enabled <- TRUE + for (out.name in c("ao", "ls", "ts", "so")) { + outlier[[out.name]] <- out.name %in% tolower(outliers.type) + } + } else { + critical.value <- rep(critical.value, length(outliers.type)) + outlier$outliers <- lapply(seq_along(outliers.type), function(i){ + list(type = outliers.type[i], va = critical.value[i]) + }) + } } - } - if (!is.na(tc.rate)) { - outlier[[tcr_name]] <- tc.rate - } - if (is_tramo) { - # TRAMO SPECIFIC PARAMETERS - if (!is.na(eml.est) && is_tramo) { - outlier$ml <- eml.est - } - } else { - # REGARIMA SPECIFIC PARAMETERS - if (!missing(method) && !is.null(method) && !all(is.na(method))) { - method <- match.arg(toupper(method)[1], - choices = c("ADDONE", "ADDALL")) - outlier$method <- method + if (!is.na(tc.rate)) { + outlier[[tcr_name]] <- tc.rate } - if (!is.na(maxiter)) { - outlier$maxiter <- maxiter - } - if (!is.na(lsrun)) { - outlier$lsrun <- lsrun + if (is_tramo) { + # TRAMO SPECIFIC PARAMETERS + if (!is.na(eml.est) && is_tramo) { + outlier$ml <- eml.est + } + } else { + # REGARIMA SPECIFIC PARAMETERS + if (!missing(method) && !is.null(method) && !all(is.na(method))) { + method <- match.arg(toupper(method)[1], + choices = c("ADDONE", "ADDALL")) + outlier$method <- method + } + if (!is.na(maxiter)) { + outlier$maxiter <- maxiter + } + if (!is.na(lsrun)) { + outlier$lsrun <- lsrun + } } - } - x$outlier <- outlier - x + x$outlier <- outlier + x } #' Set Arima Model Identification in Pre-Processing Specification @@ -610,7 +610,7 @@ set_automodel <- function(x, balanced = NA, # TRAMO SPECIFIC amicompare=NA){ - UseMethod("set_automodel", x) + UseMethod("set_automodel", x) } #' @export set_automodel.default <- function(x, @@ -630,63 +630,63 @@ set_automodel.default <- function(x, balanced = NA, # TRAMO SPECIFIC amicompare = NA){ - automodel <- x$automodel + automodel <- x$automodel - is_tramo <- inherits(x, "JD3_TRAMO_SPEC") - reducecv_col <- ifelse(is_tramo, "pc", "predcv") - lblim_col <- ifelse(is_tramo, "pcr", "ljungbox") - if (!is.na(enabled) && is.logical(enabled)){ - automodel$enabled <- enabled - } - - if (!is.na(ub1)){ - automodel$ub1 <- ub1 - } - if (!is.na(ub2)){ - automodel$ub2 <- ub2 - } - if (!is.na(cancel)){ - automodel$cancel <- cancel - } - if (!is.na(fct)){ - automodel$fct <- fct - } - if (!is.na(ljungboxlimit)){ - automodel[[lblim_col]] <- ljungboxlimit - } - if (!is.na(reducecv)){ - automodel[[reducecv_col]] <- reducecv - } - if (!is.na(acceptdefault) && is.logical(acceptdefault)){ - automodel$acceptdef <- acceptdefault - } + is_tramo <- inherits(x, "JD3_TRAMO_SPEC") + reducecv_col <- ifelse(is_tramo, "pc", "predcv") + lblim_col <- ifelse(is_tramo, "pcr", "ljungbox") + if (!is.na(enabled) && is.logical(enabled)){ + automodel$enabled <- enabled + } - if (!is.na(tsig)){ - automodel$tsig <- tsig - } - if (is_tramo) { - # TRAMO SPECIFIC - if (!is.na(amicompare) && is.logical(amicompare)){ - automodel$amicompare <- amicompare + if (!is.na(ub1)){ + automodel$ub1 <- ub1 + } + if (!is.na(ub2)){ + automodel$ub2 <- ub2 + } + if (!is.na(cancel)){ + automodel$cancel <- cancel + } + if (!is.na(fct)){ + automodel$fct <- fct + } + if (!is.na(ljungboxlimit)){ + automodel[[lblim_col]] <- ljungboxlimit } - } else { - # REGARIMA SPECIFIC - if (!is.na(ubfinal)){ - automodel$ubfinal <- ubfinal + if (!is.na(reducecv)){ + automodel[[reducecv_col]] <- reducecv } - if (!is.na(checkmu) && is.logical(checkmu)){ - automodel$checkmu <- checkmu + if (!is.na(acceptdefault) && is.logical(acceptdefault)){ + automodel$acceptdef <- acceptdefault } - if (!is.na(mixed) && is.logical(mixed)){ - automodel$mixed <- mixed + + if (!is.na(tsig)){ + automodel$tsig <- tsig } - if (!is.na(balanced) && is.logical(balanced)){ - automodel$balanced <- balanced + if (is_tramo) { + # TRAMO SPECIFIC + if (!is.na(amicompare) && is.logical(amicompare)){ + automodel$amicompare <- amicompare + } + } else { + # REGARIMA SPECIFIC + if (!is.na(ubfinal)){ + automodel$ubfinal <- ubfinal + } + if (!is.na(checkmu) && is.logical(checkmu)){ + automodel$checkmu <- checkmu + } + if (!is.na(mixed) && is.logical(mixed)){ + automodel$mixed <- mixed + } + if (!is.na(balanced) && is.logical(balanced)){ + automodel$balanced <- balanced + } } - } - x$automodel <- automodel - x + x$automodel <- automodel + x } #' Set ARIMA Model Structure in Pre-Processing Specification #' @@ -744,7 +744,7 @@ set_arima <- function(x, bq = NA, coef = NA, coef.type = c(NA, "Undefined", "Fixed", "Initial")){ - UseMethod("set_arima", x) + UseMethod("set_arima", x) } #' @export set_arima.default <- function(x, @@ -758,103 +758,103 @@ set_arima.default <- function(x, bq = NA, coef = NA, coef.type = c(NA, "Undefined", "Fixed", "Initial")){ - arima <- x$arima - if (x$automodel$enabled){ - warning("autmodel enabled: the parameters will not impact the final parameters") - } - if (!is.na(d)){ - arima$d <- d - } - if (!is.na(bd)){ - arima$bd <- bd - } - if (missing(coef.type) || is.null(coef.type)){ - coef.type <- "UNDEFINED" - } else { - coef.type <- match.arg(toupper(coef.type), - choices = c(NA, "UNDEFINED", "FIXED", "INITIAL"), - several.ok = TRUE) - coef.type[is.na(coef.type)] <- "UNDEFINED" - } - if (missing(coef) || is.null(coef)){ - coef <- 0 - } else { - coef[is.na(coef)] <- 0 - } - - if (!all(is.na(c(p, bp, q, bq)))) { - np <- ifelse(is.na(p), 0, p) - nbp <- ifelse(is.na(bp), 0, bp) - nq <- ifelse(is.na(q), 0, q) - nbq <- ifelse(is.na(bq), 0, bq) - if (np + nq + nbp + nbq == 0) { - arima_params <- NULL + arima <- x$arima + if (x$automodel$enabled){ + warning("autmodel enabled: the parameters will not impact the final parameters") + } + if (!is.na(d)){ + arima$d <- d + } + if (!is.na(bd)){ + arima$bd <- bd + } + if (missing(coef.type) || is.null(coef.type)){ + coef.type <- "UNDEFINED" + } else { + coef.type <- match.arg(toupper(coef.type), + choices = c(NA, "UNDEFINED", "FIXED", "INITIAL"), + several.ok = TRUE) + coef.type[is.na(coef.type)] <- "UNDEFINED" + } + if (missing(coef) || is.null(coef)){ + coef <- 0 } else { - arima_params <- data.frame(arima_order = c(rep("p", np), - rep("phi", nq), - rep("bp", nbp), - rep("bphi", nbq)), - value = coef, - type = coef.type) - arima_params$value <- as.list(arima_params$value) - arima_params$type <- as.list(arima_params$type) + coef[is.na(coef)] <- 0 } + if (!all(is.na(c(p, bp, q, bq)))) { + np <- ifelse(is.na(p), 0, p) + nbp <- ifelse(is.na(bp), 0, bp) + nq <- ifelse(is.na(q), 0, q) + nbq <- ifelse(is.na(bq), 0, bq) + if (np + nq + nbp + nbq == 0) { + arima_params <- NULL + } else { + arima_params <- data.frame(arima_order = c(rep("p", np), + rep("phi", nq), + rep("bp", nbp), + rep("bphi", nbq)), + value = coef, + type = coef.type) + arima_params$value <- as.list(arima_params$value) + arima_params$type <- as.list(arima_params$type) + } - if (!is.na(p)) { - if (p == 0) { - arima["phi"] <- NULL - } else { - arima$phi <- t(arima_params[1:p, c("value", "type")]) - colnames(arima$phi) <- NULL - arima_params <- arima_params[-c(1:p),] - } - } - if (!is.na(q)) { - if (q == 0) { - arima["theta"] <- NULL - } else { - arima$theta <- t(arima_params[1:q, c("value", "type")]) - colnames(arima$theta) <- NULL - arima_params <- arima_params[-c(1:q),] - } + + if (!is.na(p)) { + if (p == 0) { + arima["phi"] <- NULL + } else { + arima$phi <- t(arima_params[1:p, c("value", "type")]) + colnames(arima$phi) <- NULL + arima_params <- arima_params[-c(1:p),] + } + } + if (!is.na(q)) { + if (q == 0) { + arima["theta"] <- NULL + } else { + arima$theta <- t(arima_params[1:q, c("value", "type")]) + colnames(arima$theta) <- NULL + arima_params <- arima_params[-c(1:q),] + } + } + if (!is.na(bp)) { + if (bp == 0) { + arima["bphi"] <- NULL + } else { + arima$bphi <- t(arima_params[1:bp, c("value", "type")]) + colnames(arima$bphi) <- NULL + arima_params <- arima_params[-c(1:bp),] + } + } + if (!is.na(bq)) { + if (bq == 0) { + arima["btheta"] <- NULL + } else { + arima$btheta <- t(arima_params[1:bq, c("value", "type")]) + colnames(arima$btheta) <- NULL + } + } } - if (!is.na(bp)) { - if (bp == 0) { - arima["bphi"] <- NULL - } else { - arima$bphi <- t(arima_params[1:bp, c("value", "type")]) - colnames(arima$bphi) <- NULL - arima_params <- arima_params[-c(1:bp),] - } + x$arima <- arima + + regression <- x$regression + if (missing(mean.type) || anyNA(mean.type)) { + mean.type <- "UNDEFINED" + } else { + mean.type <- match.arg(toupper(mean.type)[1], + choices = c("UNDEFINED", "FIXED", "INITIAL")) } - if (!is.na(bq)) { - if (bq == 0) { - arima["btheta"] <- NULL - } else { - arima$btheta <- t(arima_params[1:bq, c("value", "type")]) - colnames(arima$btheta) <- NULL - } + if (is.null(mean) || is.na(mean)) { + regression["mean"] <- list(NULL) + } else { + regression$mean$value <- mean + regression$mean$type <- mean.type } - } - x$arima <- arima - - regression <- x$regression - if (missing(mean.type) || anyNA(mean.type)) { - mean.type <- "UNDEFINED" - } else { - mean.type <- match.arg(toupper(mean.type)[1], - choices = c("UNDEFINED", "FIXED", "INITIAL")) - } - if (is.null(mean) || is.na(mean)) { - regression["mean"] <- list(NULL) - } else { - regression$mean$value <- mean - regression$mean$type <- mean.type - } - x$regression <- regression + x$regression <- regression - x + x } @@ -995,7 +995,7 @@ set_tradingdays<- function(x, leapyear = c(NA, "LeapYear", "LengthOfPeriod", "None"), leapyear.coef = NA, leapyear.coef.type = c(NA, "Fixed", "Estimated")){ - UseMethod("set_tradingdays", x) + UseMethod("set_tradingdays", x) } #' @export @@ -1015,152 +1015,152 @@ set_tradingdays.default <- function(x, leapyear = c(NA, "LeapYear", "LengthOfPeriod", "None"), leapyear.coef = NA, leapyear.coef.type = c(NA, "Estimated", "Fixed")){ - td <- x$regression$td - - is_tramo <- inherits(x, "JD3_TRAMO_SPEC") + td <- x$regression$td - if (!missing(option) && !anyNA(option)){ - option <- match.arg(toupper(option)[1], - choices = c("TRADINGDAYS", "WORKINGDAYS", "NONE","USERDEFINED", - "TD3", "TD3C", "TD4", "HOLIDAYS")) - td$td <- switch(option, - WORKINGDAYS = "TD2", - TRADINGDAYS = "TD7", - USERDEFINED = "TD_NONE", - NONE = "TD_NONE", - option) - td$users <- character() - } + is_tramo <- inherits(x, "JD3_TRAMO_SPEC") - if (!missing(calendar.name) && !anyNA(calendar.name)){ - td$holidays <- calendar.name - } - if (!is.null(uservariable) && - !anyNA(uservariable) && - length(uservariable) > 0){ - td$td <- "TD_NONE" - td$holidays <- "" - - td$users <- uservariable + if (!missing(option) && !anyNA(option)){ + option <- match.arg(toupper(option)[1], + choices = c("TRADINGDAYS", "WORKINGDAYS", "NONE","USERDEFINED", + "TD3", "TD3C", "TD4", "HOLIDAYS")) + td$td <- switch(option, + WORKINGDAYS = "TD2", + TRADINGDAYS = "TD7", + USERDEFINED = "TD_NONE", + NONE = "TD_NONE", + option) + td$users <- character() + } - if (missing(coef) || is.null(coef)){ - coef <- 0 - coef.type <- "ESTIMATED" + if (!missing(calendar.name) && !anyNA(calendar.name)){ + td$holidays <- calendar.name } - } - if (!missing(stocktd) && !is.na(stocktd)){ - td$users <- character() - td$td <- "TD_NONE" - td$holidays <- "" - td$w <- stocktd - } - if (!missing(autoadjust) && !is.na(autoadjust)){ - td$autoadjust <- autoadjust - } + if (!is.null(uservariable) && + !anyNA(uservariable) && + length(uservariable) > 0){ + td$td <- "TD_NONE" + td$holidays <- "" - if (!is.null(test) && !anyNA(test)){ - if (is_tramo) { - test <- match.arg(toupper(test)[1], - choices = c("SEPARATE_T", "JOINT_F", "NONE")) - td$test <- sprintf("TEST_%s", - switch(test, - NONE = "NO", - test)) - } else { - test <- match.arg(toupper(test)[1], - choices = c("REMOVE", "ADD", "NONE")) - td$test <- switch(test, - NONE = "NO", - test) + td$users <- uservariable + + if (missing(coef) || is.null(coef)){ + coef <- 0 + coef.type <- "ESTIMATED" + } } - } - if (!missing(automatic) && !anyNA(automatic)){ - if (is_tramo) { - automatic <- match.arg(toupper(automatic)[1], - choices = c("UNUSED", "FTEST", "WALDTEST", "AIC", "BIC")) - td$auto <- switch(automatic, - UNUSED = "AUTO_NO", - FTEST = "AUTO_FTEST", - AIC = "AUTO_AIC", - BIC = "AUTO_BIC", - WALDTEST = "AUTO_WALDTEST") - } else { - automatic <- match.arg(toupper(automatic)[1], - choices = c("UNUSED", "WALDTEST", "AIC", "BIC")) - td$auto <- switch(automatic, - UNUSED = "AUTO_NO", - AIC = "AUTO_AIC", - BIC = "AUTO_BIC", - WALDTEST = "AUTO_WALD") + if (!missing(stocktd) && !is.na(stocktd)){ + td$users <- character() + td$td <- "TD_NONE" + td$holidays <- "" + td$w <- stocktd } - - } - if (is_tramo) { - if (!missing(pftd) && !anyNA(pftd)){ - td$ptest <- pftd + if (!missing(autoadjust) && !is.na(autoadjust)){ + td$autoadjust <- autoadjust } - } - if (!is.null(leapyear) && !anyNA(leapyear)) { - leapyear <- match.arg(toupper(leapyear), - choices = c("LEAPYEAR", "LENGTHOFPERIOD", "NONE")) - if (leapyear != "LENGTHOFPERIOD" || (leapyear == "LENGTHOFPERIOD" && !is_tramo)) { - # LENGTHOFPERIOD not available on TRAMO - td$lp <- leapyear + if (!is.null(test) && !anyNA(test)){ + if (is_tramo) { + test <- match.arg(toupper(test)[1], + choices = c("SEPARATE_T", "JOINT_F", "NONE")) + td$test <- sprintf("TEST_%s", + switch(test, + NONE = "NO", + test)) + } else { + test <- match.arg(toupper(test)[1], + choices = c("REMOVE", "ADD", "NONE")) + td$test <- switch(test, + NONE = "NO", + test) + } } - } + if (!missing(automatic) && !anyNA(automatic)){ + if (is_tramo) { + automatic <- match.arg(toupper(automatic)[1], + choices = c("UNUSED", "FTEST", "WALDTEST", "AIC", "BIC")) + td$auto <- switch(automatic, + UNUSED = "AUTO_NO", + FTEST = "AUTO_FTEST", + AIC = "AUTO_AIC", + BIC = "AUTO_BIC", + WALDTEST = "AUTO_WALDTEST") + } else { + automatic <- match.arg(toupper(automatic)[1], + choices = c("UNUSED", "WALDTEST", "AIC", "BIC")) + td$auto <- switch(automatic, + UNUSED = "AUTO_NO", + AIC = "AUTO_AIC", + BIC = "AUTO_BIC", + WALDTEST = "AUTO_WALD") + } - if (missing(coef) || is.null(coef)){ - # coef <- 0 - } else { - if (missing(coef.type) || is.null(coef.type)){ - coef.type <- "FIXED" - } else { - coef.type <- match.arg(toupper(coef.type), - choices = c(NA, "ESTIMATED", "FIXED"), - several.ok = TRUE) - coef.type[is.na(coef.type)] <- "FIXED" } - ntd <- switch(td$td, - TD2 = 1, - TD3 = 2, - TD3C = 3, - TD4 = 3, - TD7 = 6, - length(td$users)) - if (length(coef) == 1){ - coef <- rep(coef, ntd) + if (is_tramo) { + if (!missing(pftd) && !anyNA(pftd)){ + td$ptest <- pftd + } } - tdcoefficients <- data.frame(value = coef, - type = coef.type) - tdcoefficients$value <- as.list(tdcoefficients$value) - tdcoefficients$type <- as.list(tdcoefficients$type) - td$tdcoefficients <- t(tdcoefficients) - if (td$test != "NO" && any(coef.type == "FIXED")) { - warning("You must set the test parameter to NONE to specify coef") + if (!is.null(leapyear) && !anyNA(leapyear)) { + leapyear <- match.arg(toupper(leapyear), + choices = c("LEAPYEAR", "LENGTHOFPERIOD", "NONE")) + if (leapyear != "LENGTHOFPERIOD" || (leapyear == "LENGTHOFPERIOD" && !is_tramo)) { + # LENGTHOFPERIOD not available on TRAMO + td$lp <- leapyear + } } - } - if (missing(leapyear.coef) || is.null(leapyear.coef)){ - # coef <- 0 - } else { - if (missing(leapyear.coef.type) || is.null(leapyear.coef.type)){ - leapyear.coef.type <- "FIXED" + if (missing(coef) || is.null(coef)){ + # coef <- 0 } else { - leapyear.coef.type <- match.arg(toupper(leapyear.coef.type), - choices = c(NA, "ESTIMATED", "FIXED")) - leapyear.coef.type[is.na(leapyear.coef.type)] <- "FIXED" + if (missing(coef.type) || is.null(coef.type)){ + coef.type <- "FIXED" + } else { + coef.type <- match.arg(toupper(coef.type), + choices = c(NA, "ESTIMATED", "FIXED"), + several.ok = TRUE) + coef.type[is.na(coef.type)] <- "FIXED" + } + ntd <- switch(td$td, + TD2 = 1, + TD3 = 2, + TD3C = 3, + TD4 = 3, + TD7 = 6, + length(td$users)) + if (length(coef) == 1){ + coef <- rep(coef, ntd) + } + tdcoefficients <- data.frame(value = coef, + type = coef.type) + tdcoefficients$value <- as.list(tdcoefficients$value) + tdcoefficients$type <- as.list(tdcoefficients$type) + + td$tdcoefficients <- t(tdcoefficients) + if (td$test != "NO" && any(coef.type == "FIXED")) { + warning("You must set the test parameter to NONE to specify coef") + } + } - td$lpcoefficient$value <- leapyear.coef - td$lpcoefficient$type <- leapyear.coef.type - if (td$test != "NO" && any(coef.type == "FIXED")) { - warning("You must set the test parameter to NONE to specify leapyear.coef") + if (missing(leapyear.coef) || is.null(leapyear.coef)){ + # coef <- 0 + } else { + if (missing(leapyear.coef.type) || is.null(leapyear.coef.type)){ + leapyear.coef.type <- "FIXED" + } else { + leapyear.coef.type <- match.arg(toupper(leapyear.coef.type), + choices = c(NA, "ESTIMATED", "FIXED")) + leapyear.coef.type[is.na(leapyear.coef.type)] <- "FIXED" + } + td$lpcoefficient$value <- leapyear.coef + td$lpcoefficient$type <- leapyear.coef.type + if (td$test != "NO" && any(coef.type == "FIXED")) { + warning("You must set the test parameter to NONE to specify leapyear.coef") + } } - } - x$regression$td <- td - x + x$regression$td <- td + x } #' Set Easter effect correction in Pre-Processing Specification @@ -1216,7 +1216,7 @@ set_easter<- function(x, enabled = NA, coef.type = c(NA, "Estimated", "Fixed"), # TRAMO SPECIFIC type = c(NA, "Unused", "Standard", "IncludeEaster", "IncludeEasterMonday")){ - UseMethod("set_easter", x) + UseMethod("set_easter", x) } #' @export set_easter.default <- function(x, enabled = NA, @@ -1227,72 +1227,72 @@ set_easter.default <- function(x, enabled = NA, coef.type = c(NA, "Estimated", "Fixed"), # TRAMO SPECIFIC type = c(NA, "Unused", "Standard", "IncludeEaster", "IncludeEasterMonday")){ - easter <- x$regression$easter + easter <- x$regression$easter - # to set specific TRAMO/REGARIMA values - is_tramo <- inherits(x, "JD3_TRAMO_SPEC") + # to set specific TRAMO/REGARIMA values + is_tramo <- inherits(x, "JD3_TRAMO_SPEC") - if (!is.null(test) && !anyNA(test)){ - if (is_tramo) { - if (!is.logical(test)) { - test <- match.arg(toupper(test)[1], - choices = c("REMOVE", "ADD", "NONE")) != "NONE" - } - easter$test <- test - } else { - test <- match.arg(toupper(test)[1], - choices = c("REMOVE", "ADD", "NONE")) - easter$test <- switch(test, - NONE = "NO", - test) + if (!is.null(test) && !anyNA(test)){ + if (is_tramo) { + if (!is.logical(test)) { + test <- match.arg(toupper(test)[1], + choices = c("REMOVE", "ADD", "NONE")) != "NONE" + } + easter$test <- test + } else { + test <- match.arg(toupper(test)[1], + choices = c("REMOVE", "ADD", "NONE")) + easter$test <- switch(test, + NONE = "NO", + test) + } } - } - if (!missing(enabled) && !is.na(enabled)){ - easter$type <- ifelse(enabled, "STANDARD", "UNUSED") - } - if (is_tramo && !is.null(type) && !anyNA(type)) { - # TRAMO SPECIFIC - type <- match.arg(toupper(type)[1], - choices = c("UNUSED", "STANDARD", "INCLUDEEASTER", "INCLUDEEASTERMONDAY")) - easter$type <- type - } - if (!missing(julian) && !is.na(julian)){ - if (is_tramo) { - easter$julian <- julian - } else { - easter$type <- ifelse(julian, "JULIAN", easter$type) + if (!missing(enabled) && !is.na(enabled)){ + easter$type <- ifelse(enabled, "STANDARD", "UNUSED") } - } - if (easter$type == "UNUSED"){ - if (is_tramo) { - easter$test <- FALSE - } else { - easter$test <- "NO" + if (is_tramo && !is.null(type) && !anyNA(type)) { + # TRAMO SPECIFIC + type <- match.arg(toupper(type)[1], + choices = c("UNUSED", "STANDARD", "INCLUDEEASTER", "INCLUDEEASTERMONDAY")) + easter$type <- type } - } - if (!missing(duration) && !is.na(duration)){ - easter$duration <- duration - } - if (missing(coef) ||is.null(coef) || is.na(coef)) { - - } else { - if (missing(coef.type) || anyNA(coef.type)) { - coef.type <- "FIXED" - } else { - coef.type <- match.arg(toupper(coef.type)[1], - choices = c("ESTIMATED", "FIXED")) + if (!missing(julian) && !is.na(julian)){ + if (is_tramo) { + easter$julian <- julian + } else { + easter$type <- ifelse(julian, "JULIAN", easter$type) + } + } + if (easter$type == "UNUSED"){ + if (is_tramo) { + easter$test <- FALSE + } else { + easter$test <- "NO" + } } + if (!missing(duration) && !is.na(duration)){ + easter$duration <- duration + } + if (missing(coef) ||is.null(coef) || is.na(coef)) { - if (coef.type == "ESTIMATED") { - easter["coefficient"] <- list(NULL) } else { - easter$coefficient$value <- coef - easter$coefficient$type <- coef.type - } + if (missing(coef.type) || anyNA(coef.type)) { + coef.type <- "FIXED" + } else { + coef.type <- match.arg(toupper(coef.type)[1], + choices = c("ESTIMATED", "FIXED")) + } + + if (coef.type == "ESTIMATED") { + easter["coefficient"] <- list(NULL) + } else { + easter$coefficient$value <- coef + easter$coefficient$type <- coef.type + } - } - x$regression$easter <- easter - x + } + x$regression$easter <- easter + x } #' Set Log-level Transformation and Decomposition scheme in Pre-Processing Specification @@ -1336,7 +1336,7 @@ set_transform<- function(x, aicdiff = NA, # TRAMO SPECIFIC fct = NA){ - UseMethod("set_transform", x) + UseMethod("set_transform", x) } #' @export set_transform.default <- function(x, @@ -1347,40 +1347,40 @@ set_transform.default <- function(x, aicdiff = NA, # TRAMO SPECIFIC fct = NA){ - transform <- x$transform + transform <- x$transform - fun <- match.arg(toupper(fun[1]), - c(NA, "AUTO", "LOG", "NONE")) - # to set specific TRAMO/REGARIMA values - is_tramo <- inherits(x, "JD3_TRAMO_SPEC") + fun <- match.arg(toupper(fun[1]), + c(NA, "AUTO", "LOG", "NONE")) + # to set specific TRAMO/REGARIMA values + is_tramo <- inherits(x, "JD3_TRAMO_SPEC") - if (!is.na(fun)){ - transform$fn <- switch(fun, - NONE = "LEVEL", - fun) - } - adjust <- match.arg(toupper(adjust[1]), - c(NA, "NONE", "LEAPYEAR", "LENGTHOFPERIOD")) - if (!is.na(adjust)){ - transform$adjust <- adjust - } + if (!is.na(fun)){ + transform$fn <- switch(fun, + NONE = "LEVEL", + fun) + } + adjust <- match.arg(toupper(adjust[1]), + c(NA, "NONE", "LEAPYEAR", "LENGTHOFPERIOD")) + if (!is.na(adjust)){ + transform$adjust <- adjust + } - if (!is.na(outliers)) { - transform$outliers <- outliers - } - if (is_tramo) { - # TRAMO SPECIFIC PARAMETER - if (!is.na(fct)){ - transform$fct <- fct + if (!is.na(outliers)) { + transform$outliers <- outliers } - } else { - if (!is.na(aicdiff)){ - transform$aicdiff <- aicdiff + if (is_tramo) { + # TRAMO SPECIFIC PARAMETER + if (!is.na(fct)){ + transform$fct <- fct + } + } else { + if (!is.na(aicdiff)){ + transform$aicdiff <- aicdiff + } } - } - x$transform <- transform - x + x$transform <- transform + x } #' Add a User-Defined Variable to Pre-Processing Specification. @@ -1446,13 +1446,13 @@ set_transform.default <- function(x, #' \url{https://jdemetra-new-documentation.netlify.app/} #' @export add_usrdefvar <- function(x, - group="r", - name, - label = paste0(group,".",name), - lag = 0, - coef = NULL, - regeffect=c("Undefined", "Trend", "Seasonal", "Irregular", "Series", "SeasonallyAdjusted")) { - UseMethod("add_usrdefvar", x) + group="r", + name, + label = paste0(group,".",name), + lag = 0, + coef = NULL, + regeffect=c("Undefined", "Trend", "Seasonal", "Irregular", "Series", "SeasonallyAdjusted")) { + UseMethod("add_usrdefvar", x) } #' @export add_usrdefvar.default <- function(x, @@ -1462,19 +1462,19 @@ add_usrdefvar.default <- function(x, lag = 0, coef = NULL, regeffect=c("Undefined", "Trend", "Seasonal", "Irregular", "Series", "SeasonallyAdjusted")) { - x$regression$users[[length(x$regression$users) + 1]] <- - .create_variable(id =paste0(group,".",name), label = label, lag = lag, coef = coef, regeffect = regeffect) - x + x$regression$users[[length(x$regression$users) + 1]] <- + .create_variable(id =paste0(group,".",name), label = label, lag = lag, coef = coef, regeffect = regeffect) + x } # read in protofile .create_variable<-function(id, label=NULL, lag = 0, coef = NULL, regeffect=c("Undefined", "Trend", "Seasonal", "Irregular", "Series", "SeasonallyAdjusted")){ - regeffect <- match.arg(regeffect) - if (is.null(label)) { - label<-id - } - res <- list(id = id, name=label, lag=lag, coef = .fixed_parameter(coef), regeffect=regeffect) - return(res) + regeffect <- match.arg(regeffect) + if (is.null(label)) { + label<-id + } + res <- list(id = id, name=label, lag=lag, coef = .fixed_parameter(coef), regeffect=regeffect) + return(res) } @@ -1484,68 +1484,68 @@ set_span <- function(x, d1 = NULL, n0 = 0, n1 = 0){ - if (!missing(type) && !is.null(type) && !is.na(type[1])){ - type <- match.arg(toupper(type), - choices = c("ALL", "FROM", "TO", "BETWEEN", "LAST", "FIRST", "EXCLUDING")) - if (type == "ALL") { - x$type <- type - x$d1 <- x$d1 <- NULL - x$n0 <- x$n1 <- 0 - } else if (type == "FROM"){ - if (is.null(d0)){ - warning("d0 parameter must be defined") - } else { - x$type <- type - x$d0 <- d0 - x$d1 <- NULL - x$n0 <- x$n1 <- 0 - } - } else if (type == "TO"){ - if (is.na(d1)){ - warning("d1 parameter must be defined") - } else { - x$type <- type - x$d1 <- d1 - x$d0 <- NULL - x$n0 <- x$n1 <- 0 - } - } else if (type=="BETWEEN"){ - if (is.na(d0) || is.na(d1)){ - warning("d0 and d1 parameters must be defined") - } else { - x$type <- type - x$d0 <- d0 - x$d1 <- d1 - x$n0 <- x$n1 <- 0 - } - } else if (type=="FIRST"){ - if (is.na(n0)){ - warning("n0 parameter must be defined") - } else { - x$type <- type - x$d0 <- x$d1 <- NULL - x$n0 <- n0 - x$n1 <- 0 - } - } else if (type=="LAST"){ - if (is.na(n1)){ - warning("n1 parameter must be defined") - } else { - x$type <- type - x$d0 <- x$d1 <- NULL - x$n0 <- 0 - x$n1 <- n1 - } - } else if (type=="EXCLUDING"){ - if (is.na(n0) || is.na(n1)){ - warning("n0 and n1 parameters must be defined") - } else { - x$type <- type - x$d0 <- x$d1 <- NULL - x$n0 <- n0 - x$n1 <- n1 - } + if (!missing(type) && !is.null(type) && !is.na(type[1])){ + type <- match.arg(toupper(type), + choices = c("ALL", "FROM", "TO", "BETWEEN", "LAST", "FIRST", "EXCLUDING")) + if (type == "ALL") { + x$type <- type + x$d1 <- x$d1 <- NULL + x$n0 <- x$n1 <- 0 + } else if (type == "FROM"){ + if (is.null(d0)){ + warning("d0 parameter must be defined") + } else { + x$type <- type + x$d0 <- d0 + x$d1 <- NULL + x$n0 <- x$n1 <- 0 + } + } else if (type == "TO"){ + if (is.na(d1)){ + warning("d1 parameter must be defined") + } else { + x$type <- type + x$d1 <- d1 + x$d0 <- NULL + x$n0 <- x$n1 <- 0 + } + } else if (type=="BETWEEN"){ + if (is.na(d0) || is.na(d1)){ + warning("d0 and d1 parameters must be defined") + } else { + x$type <- type + x$d0 <- d0 + x$d1 <- d1 + x$n0 <- x$n1 <- 0 + } + } else if (type=="FIRST"){ + if (is.na(n0)){ + warning("n0 parameter must be defined") + } else { + x$type <- type + x$d0 <- x$d1 <- NULL + x$n0 <- n0 + x$n1 <- 0 + } + } else if (type=="LAST"){ + if (is.na(n1)){ + warning("n1 parameter must be defined") + } else { + x$type <- type + x$d0 <- x$d1 <- NULL + x$n0 <- 0 + x$n1 <- n1 + } + } else if (type=="EXCLUDING"){ + if (is.na(n0) || is.na(n1)){ + warning("n0 and n1 parameters must be defined") + } else { + x$type <- type + x$d0 <- x$d1 <- NULL + x$n0 <- n0 + x$n1 <- n1 + } + } } - } - x + x } diff --git a/R/splines.R b/R/splines.R index 6697948..533941c 100644 --- a/R/splines.R +++ b/R/splines.R @@ -11,9 +11,9 @@ #' @examples periodic_splines<-function(order=4, period=1, knots, pos){ - jm<-.jcall("jdplus/toolkit/base/r/math/BSplines", "Ljdplus/toolkit/base/core//math/matrices/Matrix;", - "periodic", as.integer(order), as.numeric(period), .jarray(as.numeric(knots)), .jarray(as.numeric(pos))) - res <- .jd2r_matrix(jm) - return(res) + jm<-.jcall("jdplus/toolkit/base/r/math/BSplines", "Ljdplus/toolkit/base/core//math/matrices/Matrix;", + "periodic", as.integer(order), as.numeric(period), .jarray(as.numeric(knots)), .jarray(as.numeric(pos))) + res <- .jd2r_matrix(jm) + return(res) } diff --git a/R/tests_regular.R b/R/tests_regular.R index c89097a..eb195f7 100644 --- a/R/tests_regular.R +++ b/R/tests_regular.R @@ -24,25 +24,25 @@ NULL #' #' @export statisticaltest<-function(val, pval, dist=NULL){ - if (pval<0){ - pval <- 0 - } else if (pval>1){ - pval <- 1 - } - return(structure(list(value=val, pvalue=pval), distribution=dist, class=c("JD3_TEST", "JD3"))) + if (pval<0){ + pval <- 0 + } else if (pval>1){ + pval <- 1 + } + return(structure(list(value=val, pvalue=pval), distribution=dist, class=c("JD3_TEST", "JD3"))) } #' @rdname statisticaltest #' @export print.JD3_TEST<-function(x, details=FALSE, ...){ - cat('Value:', x$value, '\n') - cat('P-Value:', sprintf('%.4f', x$pvalue), '\n') - if (details){ - dist<-attr(x, "distribution") - if (! is.null(dist)){ - cat('[', dist, ']\n') + cat('Value:', x$value, '\n') + cat('P-Value:', sprintf('%.4f', x$pvalue), '\n') + if (details){ + dist<-attr(x, "distribution") + if (! is.null(dist)){ + cat('[', dist, ']\n') + } } - } } @@ -68,9 +68,9 @@ print.JD3_TEST<-function(x, details=FALSE, ...){ #' ljungbox(ABS$X0.2.09.10.M, lag = 24, k =1) #' @export ljungbox<-function(data, k=1, lag=1, nhp=0, sign=0, mean=TRUE){ - jtest<-.jcall("jdplus/toolkit/base/r/stats/Tests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "ljungBox", - as.numeric(data), as.integer(k), as.integer(lag), as.integer(nhp), as.integer(sign), as.logical(mean)) - return(.jd2r_test(jtest)) + jtest<-.jcall("jdplus/toolkit/base/r/stats/Tests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "ljungBox", + as.numeric(data), as.integer(k), as.integer(lag), as.integer(nhp), as.integer(sign), as.logical(mean)) + return(.jd2r_test(jtest)) } #' Normality Tests @@ -99,23 +99,23 @@ NULL #' @export #' @describeIn normality_tests Bowman-Shenton test bowmanshenton<-function(data){ - jtest<-.jcall("jdplus/toolkit/base/r/stats/Tests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "bowmanShenton",as.numeric(data)) - return(.jd2r_test(jtest)) + jtest<-.jcall("jdplus/toolkit/base/r/stats/Tests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "bowmanShenton",as.numeric(data)) + return(.jd2r_test(jtest)) } #' @export #' @describeIn normality_tests Doornik-Hansen test doornikhansen<-function(data){ - jtest<-.jcall("jdplus/toolkit/base/r/stats/Tests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "doornikHansen",as.numeric(data)) - return(.jd2r_test(jtest)) + jtest<-.jcall("jdplus/toolkit/base/r/stats/Tests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "doornikHansen",as.numeric(data)) + return(.jd2r_test(jtest)) } #' @export #' @describeIn normality_tests Jarque-Bera test jarquebera<-function(data, k=0, sample=TRUE){ - jtest<-.jcall("jdplus/toolkit/base/r/stats/Tests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "jarqueBera", - as.numeric(data), as.integer(k), as.logical(sample)) - return(.jd2r_test(jtest)) + jtest<-.jcall("jdplus/toolkit/base/r/stats/Tests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "jarqueBera", + as.numeric(data), as.integer(k), as.logical(sample)) + return(.jd2r_test(jtest)) } #' Runs Tests around the mean or the median @@ -142,17 +142,17 @@ NULL #' @describeIn runstests Runs test around mean or median #' @export testofruns<-function(data, mean=TRUE, number=TRUE){ - jtest<-.jcall("jdplus/toolkit/base/r/stats/Tests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "testOfRuns", - as.numeric(data), as.logical(mean), as.logical(number)) - return(.jd2r_test(jtest)) + jtest<-.jcall("jdplus/toolkit/base/r/stats/Tests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "testOfRuns", + as.numeric(data), as.logical(mean), as.logical(number)) + return(.jd2r_test(jtest)) } #' @describeIn runstests up and down runs test #' @export testofupdownruns<-function(data, number=TRUE){ - jtest<-.jcall("jdplus/toolkit/base/r/stats/Tests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "testOfUpDownRuns", - as.numeric(data), as.logical(number)) - return(.jd2r_test(jtest)) + jtest<-.jcall("jdplus/toolkit/base/r/stats/Tests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "testOfUpDownRuns", + as.numeric(data), as.logical(number)) + return(.jd2r_test(jtest)) } #' Autocorrelation Functions @@ -168,40 +168,40 @@ testofupdownruns<-function(data, number=TRUE){ #' autocorrelations_inverse(x) #' @export autocorrelations<-function(data, mean=TRUE, n=15){ - res <- .jcall("jdplus/toolkit/base/r/stats/Tests", "[D", "autocorrelations", - as.numeric(data), as.logical(mean), as.integer(n)) - names(res) <- seq_len(n) - return(res) + res <- .jcall("jdplus/toolkit/base/r/stats/Tests", "[D", "autocorrelations", + as.numeric(data), as.logical(mean), as.integer(n)) + names(res) <- seq_len(n) + return(res) } #' @export #' @rdname autocorrelations autocorrelations_partial<-function(data, mean=TRUE, n=15){ - res <- .jcall("jdplus/toolkit/base/r/stats/Tests", "[D", "partialAutocorrelations", - as.numeric(data), as.logical(mean), as.integer(n)) - names(res) <- seq_len(n) - return(res) + res <- .jcall("jdplus/toolkit/base/r/stats/Tests", "[D", "partialAutocorrelations", + as.numeric(data), as.logical(mean), as.integer(n)) + names(res) <- seq_len(n) + return(res) } #' @export #' @rdname autocorrelations autocorrelations_inverse<-function(data, nar=30, n=15){ - res <- .jcall("jdplus/toolkit/base/r/stats/Tests", "[D", "inverseAutocorrelations", - as.numeric(data), as.integer(nar), as.integer(n)) - names(res) <- seq_len(n) - return(res) + res <- .jcall("jdplus/toolkit/base/r/stats/Tests", "[D", "inverseAutocorrelations", + as.numeric(data), as.integer(nar), as.integer(n)) + names(res) <- seq_len(n) + return(res) } #' @export #' @describeIn normality_tests Skewness test skewness<-function(data){ - jtest<-.jcall("jdplus/toolkit/base/r/stats/Tests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "skewness",as.numeric(data)) - return(.jd2r_test(jtest)) + jtest<-.jcall("jdplus/toolkit/base/r/stats/Tests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "skewness",as.numeric(data)) + return(.jd2r_test(jtest)) } #' @export #' @describeIn normality_tests Kurtosis test kurtosis<-function(data){ - jtest<-.jcall("jdplus/toolkit/base/r/stats/Tests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "kurtosis",as.numeric(data)) - return(.jd2r_test(jtest)) + jtest<-.jcall("jdplus/toolkit/base/r/stats/Tests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "kurtosis",as.numeric(data)) + return(.jd2r_test(jtest)) } #' Compute a robust median absolute deviation (MAD) @@ -217,5 +217,5 @@ kurtosis<-function(data){ #' y<-rnorm(1000) #' m<-rjd3toolkit::mad(y, centile=70) mad<-function(data, centile=50, medianCorrected=TRUE){ - return(.jcall("jdplus/toolkit/base/r/stats/Tests", "D", "mad",as.numeric(data), as.numeric(centile), as.logical(medianCorrected))) + return(.jcall("jdplus/toolkit/base/r/stats/Tests", "D", "mad",as.numeric(data), as.numeric(centile), as.logical(medianCorrected))) } diff --git a/R/tests_seasonality.R b/R/tests_seasonality.R index d7dc986..75098a6 100644 --- a/R/tests_seasonality.R +++ b/R/tests_seasonality.R @@ -20,11 +20,11 @@ NULL #' seasonality_qs(s) #' seasonality_qs(random_t(2, 1000), 7) seasonality_qs<-function(data, period=NA, nyears=0, type=1){ - if (is.ts(data) && missing(period)) - period <- frequency(data) - jtest<-.jcall("jdplus/sa/base/r/SeasonalityTests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "qsTest", - as.numeric(data), as.integer(period), as.integer(nyears), as.integer((type))) - return(.jd2r_test(jtest)) + if (is.ts(data) && missing(period)) + period <- frequency(data) + jtest<-.jcall("jdplus/sa/base/r/SeasonalityTests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "qsTest", + as.numeric(data), as.integer(period), as.integer(nyears), as.integer((type))) + return(.jd2r_test(jtest)) } #' Modified QS Seasonality Test (Maravall) @@ -52,7 +52,7 @@ seasonality_modified_qs<-function(data, period=NA, nyears=0){ if (is.ts(data) && missing(period)) period <- frequency(data) test<-.jcall("jdplus/sa/base/r/SeasonalityTests", "D", "modifiedQsTest", - as.numeric(data), as.integer(period), as.integer(nyears)) + as.numeric(data), as.integer(period), as.integer(nyears)) return(test) } @@ -76,11 +76,11 @@ seasonality_modified_qs<-function(data, period=NA, nyears=0){ #' seasonality_kruskalwallis(s) #' seasonality_kruskalwallis(random_t(2, 1000), 7) seasonality_kruskalwallis<-function(data, period, nyears=0){ - if (is.ts(data) && missing(period)) - period <- frequency(data) - jtest<-.jcall("jdplus/sa/base/r/SeasonalityTests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "kruskalWallisTest", - as.numeric(data), as.integer(period), as.integer(nyears)) - return(.jd2r_test(jtest)) + if (is.ts(data) && missing(period)) + period <- frequency(data) + jtest<-.jcall("jdplus/sa/base/r/SeasonalityTests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "kruskalWallisTest", + as.numeric(data), as.integer(period), as.integer(nyears)) + return(.jd2r_test(jtest)) } #' Periodogram Seasonality Test @@ -96,11 +96,11 @@ seasonality_kruskalwallis<-function(data, period, nyears=0){ #' seasonality_periodogram(s) #' seasonality_periodogram(random_t(2, 1000), 7) seasonality_periodogram<-function(data, period=NA, nyears=0){ - if (is.ts(data) && missing(period)) - period <- frequency(data) - jtest<-.jcall("jdplus/sa/base/r/SeasonalityTests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "periodogramTest", - as.numeric(data), as.integer(period), as.integer(nyears)) - return(.jd2r_test(jtest)) + if (is.ts(data) && missing(period)) + period <- frequency(data) + jtest<-.jcall("jdplus/sa/base/r/SeasonalityTests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "periodogramTest", + as.numeric(data), as.integer(period), as.integer(nyears)) + return(.jd2r_test(jtest)) } #' Friedman Seasonality Test @@ -116,11 +116,11 @@ seasonality_periodogram<-function(data, period=NA, nyears=0){ #' seasonality_friedman(s) #' seasonality_friedman(random_t(2, 1000), 12) seasonality_friedman<-function(data, period=NA, nyears=0){ - if (is.ts(data) && missing(period)) - period <- frequency(data) - jtest<-.jcall("jdplus/sa/base/r/SeasonalityTests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "friedmanTest", - as.numeric(data), as.integer(period), as.integer(nyears)) - return(.jd2r_test(jtest)) + if (is.ts(data) && missing(period)) + period <- frequency(data) + jtest<-.jcall("jdplus/sa/base/r/SeasonalityTests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "friedmanTest", + as.numeric(data), as.integer(period), as.integer(nyears)) + return(.jd2r_test(jtest)) } #' F-test on seasonal dummies @@ -138,12 +138,12 @@ seasonality_f<-function(data, period=NA, model=c("AR", "D1", "WN"), nyears=0){ - if (is.ts(data) && missing(period)) - period <- frequency(data) - model<-match.arg(model) - jtest<-.jcall("jdplus/sa/base/r/SeasonalityTests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "fTest", - as.numeric(data), as.integer(period), model, as.integer(nyears)) - return(.jd2r_test(jtest)) + if (is.ts(data) && missing(period)) + period <- frequency(data) + model<-match.arg(model) + jtest<-.jcall("jdplus/sa/base/r/SeasonalityTests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "fTest", + as.numeric(data), as.integer(period), model, as.integer(nyears)) + return(.jd2r_test(jtest)) } @@ -162,17 +162,17 @@ seasonality_f<-function(data, #' seasonality_combined(s) #' seasonality_combined(random_t(2, 1000), 7) seasonality_combined<-function(data, period=NA, firstperiod=cycle(data)[1], mul=TRUE){ - if (is.ts(data) && missing(period)) - period <- frequency(data) - jctest<-.jcall("jdplus/sa/base/r/SeasonalityTests", "Ljdplus/sa/base/core/tests/CombinedSeasonality;", "combinedTest", - as.numeric(data), as.integer(period), as.integer(firstperiod-1), as.logical(mul)) - q<-.jcall("jdplus/sa/base/r/SeasonalityTests", "[B", "toBuffer", jctest) - p<-RProtoBuf::read(sa.CombinedSeasonalityTest, q) - return(list( - seasonality=.enum_extract(sa.IdentifiableSeasonality, p$seasonality), - kruskalwallis=.p2r_test(p$kruskal_wallis), - stable=.p2r_anova(p$stable_seasonality), - evolutive=.p2r_anova(p$evolutive_seasonality))) + if (is.ts(data) && missing(period)) + period <- frequency(data) + jctest<-.jcall("jdplus/sa/base/r/SeasonalityTests", "Ljdplus/sa/base/core/tests/CombinedSeasonality;", "combinedTest", + as.numeric(data), as.integer(period), as.integer(firstperiod-1), as.logical(mul)) + q<-.jcall("jdplus/sa/base/r/SeasonalityTests", "[B", "toBuffer", jctest) + p<-RProtoBuf::read(sa.CombinedSeasonalityTest, q) + return(list( + seasonality=.enum_extract(sa.IdentifiableSeasonality, p$seasonality), + kruskalwallis=.p2r_test(p$kruskal_wallis), + stable=.p2r_anova(p$stable_seasonality), + evolutive=.p2r_anova(p$evolutive_seasonality))) } #' Canova-Hansen test using trigonometric variables @@ -227,9 +227,9 @@ seasonality_canovahansen<-function(data, period, type=c("Contrast", "Dummy", "Tr if (is.na(order)) order<--1 q<-.jcall("jdplus/sa/base/r/SeasonalityTests", "[D", "canovaHansen", - as.numeric(data), as.integer(period), - type, as.logical(lag1), - kernel, as.integer(order), as.integer(start-1)) + as.numeric(data), as.integer(period), + type, as.logical(lag1), + kernel, as.integer(order), as.integer(start-1)) last<-length(q) return(list(seasonality=list(value=q[last-1], pvalue=q[last]), joint=q[last-2], details=q[-c(last-2, last-1, last)])) } diff --git a/R/tests_td.R b/R/tests_td.R index fd08887..37b1fae 100644 --- a/R/tests_td.R +++ b/R/tests_td.R @@ -47,11 +47,11 @@ NULL #' td_f(ABS$X0.2.09.10.M) #' @export td_f<-function(s, model=c("D1", "DY", "DYD1", "WN", "AIRLINE", "R011", "R100"), nyears=0){ - model<-match.arg(model) - jts<-.r2jd_tsdata(s) - jtest<-.jcall("jdplus/toolkit/base/r/modelling/TradingDaysTests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "fTest", - jts, model, as.integer(nyears)) - return(.jd2r_test(jtest)) + model<-match.arg(model) + jts<-.r2jd_tsdata(s) + jtest<-.jcall("jdplus/toolkit/base/r/modelling/TradingDaysTests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "fTest", + jts, model, as.integer(nyears)) + return(.jd2r_test(jtest)) } #' Canova-Hansen test for stable trading days @@ -97,7 +97,7 @@ td_timevarying<-function(s, groups=c(1,2,3,4,5,6,0), contrasts=FALSE){ jts<-.r2jd_tsdata(s) igroups<-as.integer(groups) jtest<-.jcall("jdplus/toolkit/base/r/modelling/TradingDaysTests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "timeVaryingTradingDaysTest", - jts, igroups, as.logical(contrasts)) + jts, igroups, as.logical(contrasts)) return(.jd2r_test(jtest)) } diff --git a/R/timeseries.R b/R/timeseries.R index 8094451..9ca6926 100644 --- a/R/timeseries.R +++ b/R/timeseries.R @@ -26,44 +26,44 @@ NULL aggregate<-function(s, nfreq=1, conversion=c("Sum", "Average", "First", "Last", "Min", "Max"), complete=TRUE) { - UseMethod("aggregate", s) + UseMethod("aggregate", s) } #' @export aggregate.default<-function(s, nfreq=1, - conversion=c("Sum", "Average", "First", "Last", "Min", "Max"), - complete=TRUE){ - conversion <- match.arg(conversion) - if (is.null(s)){ - return(NULL) - } - jd_s<-.r2jd_tsdata(s) - jd_agg<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/TsData;", "aggregate", jd_s, as.integer(nfreq), conversion, complete) - if (is.jnull(jd_agg)){ - return(NULL) - } - else { - return(.jd2r_tsdata(jd_agg)) - } + conversion=c("Sum", "Average", "First", "Last", "Min", "Max"), + complete=TRUE){ + conversion <- match.arg(conversion) + if (is.null(s)){ + return(NULL) + } + jd_s<-.r2jd_tsdata(s) + jd_agg<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/TsData;", "aggregate", jd_s, as.integer(nfreq), conversion, complete) + if (is.jnull(jd_agg)){ + return(NULL) + } + else { + return(.jd2r_tsdata(jd_agg)) + } } #' @export aggregate.matrix <- function(s, nfreq=1, - conversion=c("Sum", "Average", "First", "Last", "Min", "Max"), - complete=TRUE) { - res <- do.call(cbind, lapply(seq_len(ncol(s)), function(i){ - aggregate(s[,i], nfreq = nfreq, conversion = conversion, complete = complete) - })) - colnames(res) <- colnames(s) - res + conversion=c("Sum", "Average", "First", "Last", "Min", "Max"), + complete=TRUE) { + res <- do.call(cbind, lapply(seq_len(ncol(s)), function(i){ + aggregate(s[,i], nfreq = nfreq, conversion = conversion, complete = complete) + })) + colnames(res) <- colnames(s) + res } #' @export aggregate.data.frame <- function(s, nfreq=1, - conversion=c("Sum", "Average", "First", "Last", "Min", "Max"), - complete=TRUE) { - res <- base::list2DF(lapply(seq_len(ncol(s)), function(i){ - aggregate(s[,i], nfreq = nfreq, conversion = conversion, complete = complete) - })) - colnames(res) <- colnames(s) - res + conversion=c("Sum", "Average", "First", "Last", "Min", "Max"), + complete=TRUE) { + res <- base::list2DF(lapply(seq_len(ncol(s)), function(i){ + aggregate(s[,i], nfreq = nfreq, conversion = conversion, complete = complete) + })) + colnames(res) <- colnames(s) + res } #' Removal of missing values at the beginning/end @@ -78,18 +78,18 @@ aggregate.data.frame <- function(s, nfreq=1, #' y #' clean_extremities(y) clean_extremities<-function(s){ - if (is.null(s)){ - return(NULL) - } - jd_s<-.r2jd_tsdata(s) - jd_scleaned<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/TsData;", "cleanExtremities", jd_s) + if (is.null(s)){ + return(NULL) + } + jd_s<-.r2jd_tsdata(s) + jd_scleaned<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/TsData;", "cleanExtremities", jd_s) - if (is.jnull(jd_scleaned)){ - return(NULL) - } - else { - return(.jd2r_tsdata(jd_scleaned)) - } + if (is.jnull(jd_scleaned)){ + return(NULL) + } + else { + return(.jd2r_tsdata(jd_scleaned)) + } } @@ -104,39 +104,39 @@ clean_extremities<-function(s){ #' @export #' ts_interpolate<-function(s, method=c("airline", "average")){ - UseMethod("ts_interpolate", s) + UseMethod("ts_interpolate", s) } #' @export ts_interpolate.default<-function(s, method=c("airline", "average")){ - method<-match.arg(method) - if (is.null(s)){ - return(NULL) - } - jd_s<-.r2jd_tsdata(s) - if (method == "airline"){ - jd_si<-.jcall("jdplus/toolkit/base/r/modelling/Interpolation", "Ljdplus/toolkit/base/api/timeseries/TsData;", "airlineInterpolation", jd_s) - return(.jd2r_tsdata(jd_si)) - } else if (method == "average"){ - jd_si<-.jcall("jdplus/toolkit/base/r/modelling/Interpolation", "Ljdplus/toolkit/base/api/timeseries/TsData;", "averageInterpolation", jd_s) - return(.jd2r_tsdata(jd_si)) - } else - return(NULL) + method<-match.arg(method) + if (is.null(s)){ + return(NULL) + } + jd_s<-.r2jd_tsdata(s) + if (method == "airline"){ + jd_si<-.jcall("jdplus/toolkit/base/r/modelling/Interpolation", "Ljdplus/toolkit/base/api/timeseries/TsData;", "airlineInterpolation", jd_s) + return(.jd2r_tsdata(jd_si)) + } else if (method == "average"){ + jd_si<-.jcall("jdplus/toolkit/base/r/modelling/Interpolation", "Ljdplus/toolkit/base/api/timeseries/TsData;", "averageInterpolation", jd_s) + return(.jd2r_tsdata(jd_si)) + } else + return(NULL) } #' @export ts_interpolate.matrix <- function(s, method=c("airline", "average")){ - result <- s - for (i in seq_len(ncol(s))){ - result[, i] <- ts_interpolate(s[,i], method = method) - } - result + result <- s + for (i in seq_len(ncol(s))){ + result[, i] <- ts_interpolate(s[,i], method = method) + } + result } #' @export ts_interpolate.data.frame <- function(s, method=c("airline", "average")){ - result <- s - for (i in seq_len(ncol(s))){ - result[, i] <- ts_interpolate(s[,i], method = method) - } - result + result <- s + for (i in seq_len(ncol(s))){ + result[, i] <- ts_interpolate(s[,i], method = method) + } + result } #' Multiplicative adjustment of a time series for leap year / length of periods @@ -156,38 +156,38 @@ ts_interpolate.data.frame <- function(s, method=c("airline", "average")){ #' # with reverse we can find the #' all.equal(ts_adjust(ts_adjust(y), reverse = TRUE), y) ts_adjust<-function(s, method=c("LeapYear", "LengthOfPeriod"), reverse = FALSE){ - UseMethod("ts_adjust", s) + UseMethod("ts_adjust", s) } #' @export ts_adjust.default<-function(s, method=c("LeapYear", "LengthOfPeriod"), reverse = FALSE){ - method<-match.arg(method) - if (is.null(s)){ - return(NULL) - } - jd_s<-.r2jd_tsdata(s) - jd_st<-.jcall("jdplus/toolkit/base/r/modelling/Transformation", "Ljdplus/toolkit/base/api/timeseries/TsData;", "adjust", jd_s, method, as.logical(reverse)) - if (is.jnull(jd_st)){ - return(NULL) - } - else { - return(.jd2r_tsdata(jd_st)) - } + method<-match.arg(method) + if (is.null(s)){ + return(NULL) + } + jd_s<-.r2jd_tsdata(s) + jd_st<-.jcall("jdplus/toolkit/base/r/modelling/Transformation", "Ljdplus/toolkit/base/api/timeseries/TsData;", "adjust", jd_s, method, as.logical(reverse)) + if (is.jnull(jd_st)){ + return(NULL) + } + else { + return(.jd2r_tsdata(jd_st)) + } } #' @export ts_adjust.matrix <- function(s, method=c("LeapYear", "LengthOfPeriod"), reverse = FALSE){ - result <- s - for (i in seq_len(ncol(s))){ - result[, i] <- ts_adjust(s[,i], method = method, reverse = reverse) - } - result + result <- s + for (i in seq_len(ncol(s))){ + result[, i] <- ts_adjust(s[,i], method = method, reverse = reverse) + } + result } #' @export ts_adjust.data.frame <- function(s, method=c("LeapYear", "LengthOfPeriod"), reverse = FALSE){ - result <- s - for (i in seq_len(ncol(s))){ - result[, i] <- ts_adjust(s[,i], method = method, reverse = reverse) - } - result + result <- s + for (i in seq_len(ncol(s))){ + result[, i] <- ts_adjust(s[,i], method = method, reverse = reverse) + } + result } #' Provides a list of dates corresponding to each period of the given time series @@ -200,10 +200,10 @@ ts_adjust.data.frame <- function(s, method=c("LeapYear", "LengthOfPeriod"), reve #' #' @examples daysOf(retail$BookStores) daysOf<-function(ts, pos=1){ - start<-start(ts) - jdom<-.r2jd_tsdomain(frequency(ts), start[1], start[2], length(ts)) - days<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "[S", "daysOf",jdom, as.integer(pos-1)) - return(as.Date(days)) + start<-start(ts) + jdom<-.r2jd_tsdomain(frequency(ts), start[1], start[2], length(ts)) + days<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "[S", "daysOf",jdom, as.integer(pos-1)) + return(as.Date(days)) } #' Creates a time series object @@ -217,11 +217,11 @@ daysOf<-function(ts, pos=1){ #' the data and the metadata #' @export to_ts<-function(source, id, type="All"){ - jmoniker<-.jcall("jdplus/toolkit/base/api/timeseries/TsMoniker", "Ljdplus/toolkit/base/api/timeseries/TsMoniker;", "of", source, id) - jts<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/Ts;", "makeTs", jmoniker, type) - bytes<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "[B", "toBuffer", jts) - p<-RProtoBuf::read(jd3.Ts, bytes) - return(.p2r_ts(p)) + jmoniker<-.jcall("jdplus/toolkit/base/api/timeseries/TsMoniker", "Ljdplus/toolkit/base/api/timeseries/TsMoniker;", "of", source, id) + jts<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/Ts;", "makeTs", jmoniker, type) + bytes<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "[B", "toBuffer", jts) + p<-RProtoBuf::read(jd3.Ts, bytes) + return(.p2r_ts(p)) } #' Creates a collection of time series @@ -237,11 +237,11 @@ to_ts<-function(source, id, type="All"){ #' #' @examples to_tscollection<-function(source, id, type="All"){ - jmoniker<-.jcall("jdplus/toolkit/base/api/timeseries/TsMoniker", "Ljdplus/toolkit/base/api/timeseries/TsMoniker;", "of", source, id) - jtscoll<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/Ts;", "makeTsCollection", jmoniker, type) - bytes<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "[B", "toBuffer", jtscoll) - p<-RProtoBuf::read(jd3.TsCollection, bytes) - return(.p2r_tscollection(p)) + jmoniker<-.jcall("jdplus/toolkit/base/api/timeseries/TsMoniker", "Ljdplus/toolkit/base/api/timeseries/TsMoniker;", "of", source, id) + jtscoll<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/Ts;", "makeTsCollection", jmoniker, type) + bytes<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "[B", "toBuffer", jtscoll) + p<-RProtoBuf::read(jd3.TsCollection, bytes) + return(.p2r_tscollection(p)) } #' Promote a R time series to a "full" \code{ts} of JDemetra+ @@ -256,33 +256,33 @@ to_tscollection<-function(source, id, type="All"){ #' s<-ABS$X0.2.09.10.M #' t<-data_to_ts(s,"test") data_to_ts<-function(s, name){ - jts<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/Ts;", "makeTs", .r2jd_tsdata(s), name) - bytes<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "[B", "toBuffer", jts) - p<-RProtoBuf::read(jd3.Ts, bytes) - return(.p2r_ts(p)) + jts<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/Ts;", "makeTs", .r2jd_tsdata(s), name) + bytes<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "[B", "toBuffer", jts) + p<-RProtoBuf::read(jd3.Ts, bytes) + return(.p2r_ts(p)) } #' @export #' @rdname jd3_utilities .r2jd_tmp_ts<-function(s, name){ - jts<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/Ts;", "makeTs", .r2jd_tsdata(s), name) - return(jts) + jts<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/Ts;", "makeTs", .r2jd_tsdata(s), name) + return(jts) } #' @export #' @rdname jd3_utilities .r2jd_make_ts<-function(source, id, type="All"){ - jmoniker<-.jcall("jdplus/toolkit/base/api/timeseries/TsMoniker", "Ljdplus/toolkit/base/api/timeseries/TsMoniker;", "of", source, id) - jts<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/Ts;", "makeTs", jmoniker, type) - return(jts) + jmoniker<-.jcall("jdplus/toolkit/base/api/timeseries/TsMoniker", "Ljdplus/toolkit/base/api/timeseries/TsMoniker;", "of", source, id) + jts<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/Ts;", "makeTs", jmoniker, type) + return(jts) } #' @export #' @rdname jd3_utilities .r2jd_make_tscollection<-function(source, id, type="All"){ - jmoniker<-.jcall("jdplus/toolkit/base/api/timeseries/TsMoniker", "Ljdplus/toolkit/base/api/timeseries/TsMoniker;", "of", source, id) - jtscoll<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/Ts;", "makeTsCollection", jmoniker, type) - return(jtscoll) + jmoniker<-.jcall("jdplus/toolkit/base/api/timeseries/TsMoniker", "Ljdplus/toolkit/base/api/timeseries/TsMoniker;", "of", source, id) + jtscoll<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/Ts;", "makeTsCollection", jmoniker, type) + return(jtscoll) } #' Title diff --git a/R/utils.R b/R/utils.R index ed6f982..813f6e7 100644 --- a/R/utils.R +++ b/R/utils.R @@ -24,38 +24,38 @@ NULL ymd<-function(y, m, d=1){ - return(as.Date(sprintf("%04i-%02i-%02i", y, m, d))) + return(as.Date(sprintf("%04i-%02i-%02i", y, m, d))) } yearOf<-function(s){ - return(as.integer(substr(s, 1, 4))) + return(as.integer(substr(s, 1, 4))) } monthOf<-function(s){ - return(as.integer(substr(s, 6, 7))) + return(as.integer(substr(s, 6, 7))) } dayOf<-function(s){ - return(as.integer(substr(s, 9, 10))) + return(as.integer(substr(s, 9, 10))) } dateOf<-function(year, month, day){ - d<-jd3.Date$new() - d$year<-year - d$month<-month - d$day<-day - return(d) + d<-jd3.Date$new() + d$year<-year + d$month<-month + d$day<-day + return(d) } parseDate<-function(s){ - d<-jd3.Date$new() - d$year<-yearOf(s) - d$month<-monthOf(s) - d$day<-dayOf(s) - return(d) + d<-jd3.Date$new() + d$year<-yearOf(s) + d$month<-monthOf(s) + d$day<-dayOf(s) + return(d) } #' Title #' #' @export reload_dictionaries<-function(){ - .jcall("jdplus/toolkit/base/api/information/InformationExtractors", "V", "reloadExtractors") + .jcall("jdplus/toolkit/base/api/information/InformationExtractors", "V", "reloadExtractors") } @@ -64,14 +64,14 @@ NULL .p2r_anova<-function(p){ - return(list(SSM=p$SSM, dfM=p$dfm, SSR=p$SSR, dfR=p$dfr, test=test_anova(p$SSM, p$dfm, p$SSR, p$dfr))) + return(list(SSM=p$SSM, dfM=p$dfm, SSR=p$SSR, dfR=p$dfr, test=test_anova(p$SSM, p$dfm, p$SSR, p$dfr))) } test_anova<-function(ssm, dfm, ssr, dfr){ - val<-(ssm/dfm)*(dfr/ssr) - desc<-paste0("F(",dfm,",",dfr,")") - pval<-1-pf(val, dfm, dfr) - return(statisticaltest(val, pval, desc)) + val<-(ssm/dfm)*(dfr/ssr) + desc<-paste0("F(",dfm,",",dfr,")") + pval<-1-pf(val, dfm, dfr) + return(statisticaltest(val, pval, desc)) } #' Information on the (log-)likelihood @@ -92,11 +92,11 @@ test_anova<-function(ssm, dfm, ssr, dfr){ #' @examples .likelihood<-function(nobs, neffectiveobs=NA, nparams=0, ll, adjustedll=NA, aic, aicc, bic, bicc, ssq){ - if (is.na(neffectiveobs)) neffectiveobs<-nobs - if (is.na(adjustedll)) adjustedll<-ll + if (is.na(neffectiveobs)) neffectiveobs<-nobs + if (is.na(adjustedll)) adjustedll<-ll - return(structure(list(nobs=nobs, neffectiveobs=neffectiveobs, nparams=nparams, - ll=ll, adjustedll=adjustedll, - aic=aic, aicc=aicc, bic=bic, bicc=bicc, ssq=ssq), - class = "JD3_LIKELIHOOD")) + return(structure(list(nobs=nobs, neffectiveobs=neffectiveobs, nparams=nparams, + ll=ll, adjustedll=adjustedll, + aic=aic, aicc=aicc, bic=bic, bicc=bicc, ssq=ssq), + class = "JD3_LIKELIHOOD")) } diff --git a/R/variables.R b/R/variables.R index 865c585..0b68a45 100644 --- a/R/variables.R +++ b/R/variables.R @@ -21,28 +21,28 @@ NULL #' @export easter_variable<-function(frequency, start, length, s, duration=6, endpos=-1, correction=c("Simple", "PreComputed", "Theoretical", "None")){ - correction<-match.arg(correction) - if (!missing(s) && is.ts(s)) { - frequency<-stats::frequency(s) - start<-stats::start(s) - length<-.length_ts(s) - } - jdom<-.r2jd_tsdomain(frequency, start[1], start[2], length) - data<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "easter", jdom, as.integer(duration), as.integer(endpos), correction) - return(ts(data, frequency = frequency, start= start)) + correction<-match.arg(correction) + if (!missing(s) && is.ts(s)) { + frequency<-stats::frequency(s) + start<-stats::start(s) + length<-.length_ts(s) + } + jdom<-.r2jd_tsdomain(frequency, start[1], start[2], length) + data<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "easter", jdom, as.integer(duration), as.integer(endpos), correction) + return(ts(data, frequency = frequency, start= start)) } #' @rdname easter_variable #' @export julianeaster_variable<-function(frequency, start, length, s, duration=6){ - if (!missing(s) && is.ts(s)) { - frequency<-stats::frequency(s) - start<-stats::start(s) - length<-.length_ts(s) - } - jdom<-.r2jd_tsdomain(frequency, start[1], start[2], length) - data<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "julianEaster", jdom, as.integer(duration)) - return(ts(data, frequency = frequency, start= start)) + if (!missing(s) && is.ts(s)) { + frequency<-stats::frequency(s) + start<-stats::start(s) + length<-.length_ts(s) + } + jdom<-.r2jd_tsdomain(frequency, start[1], start[2], length) + data<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "julianEaster", jdom, as.integer(duration)) + return(ts(data, frequency = frequency, start= start)) } #' Leap Year regressor @@ -64,16 +64,16 @@ julianeaster_variable<-function(frequency, start, length, s, duration=6){ #' lp_variable(4, start = c(2000, 1), length = 4*13) #' lper<-lp_variable(12,c(2000,1),length=10*12,type ="LengthOfPeriod") lp_variable<-function(frequency, start, length, s, type=c("LeapYear", "LengthOfPeriod")){ - type<-match.arg(type) - lp<-type == "LeapYear" - if (!missing(s) && is.ts(s)) { - frequency<-stats::frequency(s) - start<-stats::start(s) - length<-.length_ts(s) - } - jdom<-.r2jd_tsdomain(frequency, start[1], start[2], length) - data<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "leapYear", jdom, as.logical(lp)) - return(ts(data, frequency = frequency, start= start)) + type<-match.arg(type) + lp<-type == "LeapYear" + if (!missing(s) && is.ts(s)) { + frequency<-stats::frequency(s) + start<-stats::start(s) + length<-.length_ts(s) + } + jdom<-.r2jd_tsdomain(frequency, start[1], start[2], length) + data<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "leapYear", jdom, as.logical(lp)) + return(ts(data, frequency = frequency, start= start)) } #' Generating Outlier regressors @@ -113,69 +113,69 @@ lp_variable<-function(frequency, start, length, s, type=c("LeapYear", "LengthOfP #' @name outliers_variables #' @rdname outliers_variables ao_variable<-function(frequency, start, length, s, pos, date=NULL){ - if (!missing(s) && is.ts(s)) { - frequency<-stats::frequency(s) - start<-stats::start(s) - length<-.length_ts(s) - } - jdom<-.r2jd_tsdomain(frequency, start[1], start[2], length) - if (is.null(date)){ - data<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "ao", jdom, as.integer(pos-1)) - } else { - data<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "ao", jdom, as.character(date)) - } - return(ts(data, frequency = frequency, start= start)) + if (!missing(s) && is.ts(s)) { + frequency<-stats::frequency(s) + start<-stats::start(s) + length<-.length_ts(s) + } + jdom<-.r2jd_tsdomain(frequency, start[1], start[2], length) + if (is.null(date)){ + data<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "ao", jdom, as.integer(pos-1)) + } else { + data<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "ao", jdom, as.character(date)) + } + return(ts(data, frequency = frequency, start= start)) } #' @export #' @rdname outliers_variables tc_variable<-function(frequency, start, length, s, pos, date=NULL, rate=0.7){ - if (!missing(s) && is.ts(s)) { - frequency<-stats::frequency(s) - start<-stats::start(s) - length<-.length_ts(s) - } - jdom<-.r2jd_tsdomain(frequency, start[1], start[2], length) - if (is.null(date)){ - data<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "tc", jdom, as.integer(pos-1), rate) - } else { - data<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "tc", jdom, as.character(date), rate) - } - return(ts(data, frequency = frequency, start= start)) + if (!missing(s) && is.ts(s)) { + frequency<-stats::frequency(s) + start<-stats::start(s) + length<-.length_ts(s) + } + jdom<-.r2jd_tsdomain(frequency, start[1], start[2], length) + if (is.null(date)){ + data<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "tc", jdom, as.integer(pos-1), rate) + } else { + data<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "tc", jdom, as.character(date), rate) + } + return(ts(data, frequency = frequency, start= start)) } #' @export #' @rdname outliers_variables ls_variable<-function(frequency, start, length, s, pos, date=NULL, zeroended=TRUE){ - if (!missing(s) && is.ts(s)) { - frequency<-stats::frequency(s) - start<-stats::start(s) - length<-.length_ts(s) - } - jdom<-.r2jd_tsdomain(frequency, start[1], start[2], length) - if (is.null(date)){ - data<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "ls", jdom, as.integer(pos-1), as.logical(zeroended)) - } else { - data<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "ls", jdom, as.character(date), as.logical(zeroended)) - } - return(ts(data, frequency = frequency, start= start)) + if (!missing(s) && is.ts(s)) { + frequency<-stats::frequency(s) + start<-stats::start(s) + length<-.length_ts(s) + } + jdom<-.r2jd_tsdomain(frequency, start[1], start[2], length) + if (is.null(date)){ + data<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "ls", jdom, as.integer(pos-1), as.logical(zeroended)) + } else { + data<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "ls", jdom, as.character(date), as.logical(zeroended)) + } + return(ts(data, frequency = frequency, start= start)) } #' @export #' @rdname outliers_variables so_variable<-function(frequency, start, length, s, pos, date=NULL, zeroended=TRUE){ - if (!missing(s) && is.ts(s)) { - frequency<-stats::frequency(s) - start<-stats::start(s) - length<-.length_ts(s) - } - jdom<-.r2jd_tsdomain(frequency, start[1], start[2], length) - if (is.null(date)){ - data<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "so", jdom, as.integer(pos-1), as.logical(zeroended)) - } else { - data<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "so", jdom, as.character(date), - as.logical(zeroended)) - } - return(ts(data, frequency = frequency, start= start)) + if (!missing(s) && is.ts(s)) { + frequency<-stats::frequency(s) + start<-stats::start(s) + length<-.length_ts(s) + } + jdom<-.r2jd_tsdomain(frequency, start[1], start[2], length) + if (is.null(date)){ + data<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "so", jdom, as.integer(pos-1), as.logical(zeroended)) + } else { + data<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "so", jdom, as.character(date), + as.logical(zeroended)) + } + return(ts(data, frequency = frequency, start= start)) } #' Ramp regressor @@ -203,23 +203,23 @@ so_variable<-function(frequency, start, length, s, pos, date=NULL, zeroended=TRU #' rp<-ramp_variable(12, c(2000,1), length = 12*4, range = c("2001-01-01", "2001-09-02")) #' plot.ts(rp) ramp_variable<-function(frequency, start, length, s, range){ - if (!missing(s) && is.ts(s)) { - frequency<-stats::frequency(s) - start<-stats::start(s) - length<-.length_ts(s) - } - jdom<-.r2jd_tsdomain(frequency, start[1], start[2], length) - if (length(range) != 2) stop("Invalid range") - if (is.character(range)){ - data<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "ramp", jdom, - as.character(range[1]), - as.character(range[2])) - } else { - data<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "ramp", jdom, - as.integer(range[1]-1), - as.integer(range[2]-1)) - } - return(ts(data, frequency = frequency, start= start)) + if (!missing(s) && is.ts(s)) { + frequency<-stats::frequency(s) + start<-stats::start(s) + length<-.length_ts(s) + } + jdom<-.r2jd_tsdomain(frequency, start[1], start[2], length) + if (length(range) != 2) stop("Invalid range") + if (is.character(range)){ + data<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "ramp", jdom, + as.character(range[1]), + as.character(range[2])) + } else { + data<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "ramp", jdom, + as.integer(range[1]-1), + as.integer(range[2]-1)) + } + return(ts(data, frequency = frequency, start= start)) } #' Intervention variable @@ -267,28 +267,28 @@ ramp_variable<-function(frequency, start, length, s, range){ #' @export intervention_variable<-function(frequency, start, length, s, starts, ends, delta=0, seasonaldelta=0){ - if (!missing(s) && is.ts(s)) { - frequency<-stats::frequency(s) - start<-stats::start(s) - length<-.length_ts(s) - } - if (length(starts) != length(ends)) stop("Invalid spans in intervention variable") + if (!missing(s) && is.ts(s)) { + frequency<-stats::frequency(s) + start<-stats::start(s) + length<-.length_ts(s) + } + if (length(starts) != length(ends)) stop("Invalid spans in intervention variable") - jdom<-.r2jd_tsdomain(frequency, start[1], start[2], length) - if (is.character(starts) && is.character(ends)){ - data<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "interventionVariable", jdom, - delta, - seasonaldelta, - .jarray(as.character(starts)), - .jarray(as.character(ends))) - } else { - data<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "interventionVariable", jdom, - delta, - seasonaldelta, - .jarray(as.integer(starts-1)), - .jarray(as.integer(ends-1))) - } - return(ts(data, frequency = frequency, start= start)) + jdom<-.r2jd_tsdomain(frequency, start[1], start[2], length) + if (is.character(starts) && is.character(ends)){ + data<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "interventionVariable", jdom, + delta, + seasonaldelta, + .jarray(as.character(starts)), + .jarray(as.character(ends))) + } else { + data<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "interventionVariable", jdom, + delta, + seasonaldelta, + .jarray(as.integer(starts-1)), + .jarray(as.integer(ends-1))) + } + return(ts(data, frequency = frequency, start= start)) } #' Periodic dummies and contrasts @@ -306,28 +306,28 @@ intervention_variable<-function(frequency, start, length, s, starts, ends, delta #'q[1:9,] #'@export periodic.dummies <-function(frequency, start, length, s){ - if (!missing(s) && is.ts(s)) { - frequency<-stats::frequency(s) - start<-stats::start(s) - length<-.length_ts(s) - } - jdom <- .r2jd_tsdomain(frequency, start[1], start[2], length) - jm<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "Ljdplus/toolkit/base/api/math/matrices/Matrix;", "periodicDummies", jdom) - data <- .jd2r_matrix(jm) - return(ts(data, frequency = frequency, start= start)) + if (!missing(s) && is.ts(s)) { + frequency<-stats::frequency(s) + start<-stats::start(s) + length<-.length_ts(s) + } + jdom <- .r2jd_tsdomain(frequency, start[1], start[2], length) + jm<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "Ljdplus/toolkit/base/api/math/matrices/Matrix;", "periodicDummies", jdom) + data <- .jd2r_matrix(jm) + return(ts(data, frequency = frequency, start= start)) } #'@export #'@rdname periodic.dummies periodic.contrasts <-function(frequency, start, length, s){ - if (!missing(s) && is.ts(s)) { - frequency<-stats::frequency(s) - start<-stats::start(s) - length<-.length_ts(s) - } - jdom <- .r2jd_tsdomain(frequency, start[1], start[2], length) - jm<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "Ljdplus/toolkit/base/api/math/matrices/Matrix;", "periodicContrasts", jdom) - data <- .jd2r_matrix(jm) - return(ts(data, frequency = frequency, start= start)) + if (!missing(s) && is.ts(s)) { + frequency<-stats::frequency(s) + start<-stats::start(s) + length<-.length_ts(s) + } + jdom <- .r2jd_tsdomain(frequency, start[1], start[2], length) + jm<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "Ljdplus/toolkit/base/api/math/matrices/Matrix;", "periodicContrasts", jdom) + data <- .jd2r_matrix(jm) + return(ts(data, frequency = frequency, start= start)) } #' Trigonometric variables #' @@ -376,23 +376,23 @@ periodic.contrasts <-function(frequency, start, length, s){ #' @export trigonometric_variables <- function(frequency, start, length, s, seasonal_frequency = NULL){ - if (!missing(s) && is.ts(s)) { - frequency<-stats::frequency(s) - start<-stats::start(s) - length<-.length_ts(s) - } - jdom <- .r2jd_tsdomain(frequency, start[1], start[2], length) + if (!missing(s) && is.ts(s)) { + frequency<-stats::frequency(s) + start<-stats::start(s) + length<-.length_ts(s) + } + jdom <- .r2jd_tsdomain(frequency, start[1], start[2], length) - if (!is.null(seasonal_frequency)) - seasonal_frequency <- as.integer(seasonal_frequency) - jm<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "Ljdplus/toolkit/base/api/math/matrices/Matrix;", "trigonometricVariables", - jdom, .jarray(seasonal_frequency)) - data <- .jd2r_matrix(jm) + if (!is.null(seasonal_frequency)) + seasonal_frequency <- as.integer(seasonal_frequency) + jm<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "Ljdplus/toolkit/base/api/math/matrices/Matrix;", "trigonometricVariables", + jdom, .jarray(seasonal_frequency)) + data <- .jd2r_matrix(jm) - if (ncol(data) %% 2 == 1) - data <- cbind(data, 0) + if (ncol(data) %% 2 == 1) + data <- cbind(data, 0) - return(ts(data, frequency = frequency, start = start)) + return(ts(data, frequency = frequency, start = start)) } # Denote by \eqn{l} the value of \code{length}, diff --git a/R/zzz.R b/R/zzz.R index 53418a9..baf6ca8 100644 --- a/R/zzz.R +++ b/R/zzz.R @@ -16,22 +16,22 @@ NULL .onLoad <- function(libname, pkgname) { - result <- .jpackage(pkgname, lib.loc=libname) - if (!result) stop("Loading java packages failed") + result <- .jpackage(pkgname, lib.loc=libname) + if (!result) stop("Loading java packages failed") - # what's your java version? Need >= 17 - jversion <- .jcall('java.lang.System','S','getProperty','java.version') - if (jversion < "17") { - stop(sprintf("Your java version is %s. 17 or higher is needed.", jversion)) - } + # what's your java version? Need >= 17 + jversion <- .jcall('java.lang.System','S','getProperty','java.version') + if (jversion < "17") { + stop(sprintf("Your java version is %s. 17 or higher is needed.", jversion)) + } - proto.dir <- system.file("proto", package = pkgname) - readProtoFiles2(protoPath = proto.dir) + proto.dir <- system.file("proto", package = pkgname) + readProtoFiles2(protoPath = proto.dir) - DATE_MIN<<-dateOf(1,1,1) - DATE_MAX<<-dateOf(9999, 12, 31) + DATE_MIN<<-dateOf(1,1,1) + DATE_MAX<<-dateOf(9999, 12, 31) - if(is.null(getOption("summary_info"))) - options(summary_info = TRUE) + if(is.null(getOption("summary_info"))) + options(summary_info = TRUE) } From c39037b6c2fb8d2d36978af96883209c7eabf559 Mon Sep 17 00:00:00 2001 From: Tanguy BARTHELEMY Date: Mon, 14 Oct 2024 12:02:18 +0200 Subject: [PATCH 15/18] lint indentation --- .lintr | 3 +- R/arima.R | 30 ++++++++++---- R/calendars.R | 5 ++- R/display.R | 7 +++- R/jd3rslts.R | 4 +- R/protobuf.R | 36 ++++++++-------- R/regarima_generic.R | 4 +- R/regarima_rslts.R | 7 ++-- R/spec_benchmarking.R | 33 ++++++++++----- R/spec_regarima.R | 96 +++++++++++++++++++++++++------------------ R/tests_seasonality.R | 7 +++- tests/spelling.R | 10 +++-- 12 files changed, 149 insertions(+), 93 deletions(-) diff --git a/.lintr b/.lintr index 4f9850d..9135dcb 100644 --- a/.lintr +++ b/.lintr @@ -1,5 +1,5 @@ linters: lintr::all_linters( - indentation_linter = NULL, + indentation_linter = lintr::indentation_linter(indent = 4L), # line_length_linter = lintr::line_length_linter(80L), line_length_linter = lintr::line_length_linter(200L), brace_linter = NULL, @@ -22,7 +22,6 @@ linters: lintr::all_linters( function_argument_linter = NULL, condition_message_linter = NULL, unnecessary_concatenation_linter = NULL, - #keyword_quote_linter = NULL, fixed_regex_linter = NULL, strings_as_factors_linter = NULL, todo_comment_linter = NULL, diff --git a/R/arima.R b/R/arima.R index 590af62..6614acd 100644 --- a/R/arima.R +++ b/R/arima.R @@ -249,12 +249,15 @@ arima_properties<-function(model, nspectrum=601, nac=36){ return(list(acf=acf, spectrum=spectrum)) } -#' Creates an UCARIMA model, which is composed of ARIMA models with independent innovations. +#' Creates an UCARIMA model, which is composed of ARIMA models with independent +#' innovations. #' #' @param model The reduced model. Usually not provided. #' @param components The ARIMA models representing the components #' @param complements Complements of (some) components. Usually not provided -#' @param checkmodel When the model is provided and *checkmodel* is TRUE, we check that it indeed corresponds to the reduced form of the components; similar controls are applied on complements. Currently not implemented +#' @param checkmodel When the model is provided and *checkmodel* is TRUE, we +#' check that it indeed corresponds to the reduced form of the components; +#' similar controls are applied on complements. Currently not implemented #' #' @return A list with the reduced model, the components and their complements #' @export @@ -264,19 +267,30 @@ arima_properties<-function(model, nspectrum=601, nac=36){ #' mod2 <- arima_model("noise", var = 1600) #' hp<-ucarima_model(components=list(mod1, mod2)) #' print(hp$model) -ucarima_model<-function(model=NULL, components, complements=NULL, checkmodel=FALSE){ - if (is.null(model)) +ucarima_model<-function(model=NULL, + components, + complements=NULL, + checkmodel=FALSE){ + if (is.null(model)) { model<-arima_lsum(components) - else if (! is(model, "JD3_ARIMA") && ! is(model, "JD3_SARIMA")) stop("Invalid model") + } else if (! is(model, "JD3_ARIMA") && ! is(model, "JD3_SARIMA")) { + stop("Invalid model") + } # TODO: checkmodel - return(structure(list(model=model, components=components, complements=complements), class="JD3_UCARIMA")) + output <- list(model=model, components=components, complements=complements) + class(output) <- "JD3_UCARIMA" + return(output) } .r2jd_ucarima<-function(ucm){ jmodel<-.r2jd_arima(ucm$model) - jcmps<-.jarray(lapply(ucm$components, .r2jd_arima), "jdplus/toolkit/base/core/arima/ArimaModel") - return(.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/core/ucarima/UcarimaModel;", "of", jmodel, jcmps)) + jcmps<-.jarray(lapply(ucm$components, .r2jd_arima), + "jdplus/toolkit/base/core/arima/ArimaModel") + return(.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", + "Ljdplus/toolkit/base/core/ucarima/UcarimaModel;", + "of", + jmodel, jcmps)) } #' @export diff --git a/R/calendars.R b/R/calendars.R index 1391901..38ab9ce 100644 --- a/R/calendars.R +++ b/R/calendars.R @@ -521,8 +521,9 @@ stock_td<-function(frequency, start, length, s, w = 31){ lapply(p$easter_related_days, function(z) .p2r_easterday(z)), lapply(p$prespecified_holidays, function(z) .p2r_specialday(z)), lapply(p$single_dates, function(z) .p2r_singleday(z)), - mean_correction=p$mean_correction) - ), class=c('JD3_CALENDAR', 'JD3_CALENDARDEFINITION'))) + mean_correction=p$mean_correction)), + class=c('JD3_CALENDAR', 'JD3_CALENDARDEFINITION') + )) } #' @export diff --git a/R/display.R b/R/display.R index d9e363f..9113282 100644 --- a/R/display.R +++ b/R/display.R @@ -5,8 +5,11 @@ NULL #' JD3 print functions #' #' @param x the object to print. -#' @param digits minimum number of significant digits to be used for most numbers. -#' @param summary_info boolean indicating if a message suggesting the use of the summary function for more details should be printed. By default used the option `"summary_info"` it used, which initialized to `TRUE`. +#' @param digits minimum number of significant digits to be used for most +#' numbers. +#' @param summary_info boolean indicating if a message suggesting the use of the +#' summary function for more details should be printed. By default used the +#' option `"summary_info"` it used, which initialized to `TRUE`. #' @param ... further unused parameters. #' @name jd3_print #' @rdname jd3_print diff --git a/R/jd3rslts.R b/R/jd3rslts.R index 5deaf24..0409c59 100644 --- a/R/jd3rslts.R +++ b/R/jd3rslts.R @@ -188,6 +188,6 @@ bic=.proc_numeric(jrslt, paste(prefix,"bic", sep="")), bic2=.proc_numeric(jrslt, paste(prefix,"bic2", sep="")), bicc=.proc_numeric(jrslt, paste(prefix,"bicc", sep="")), - hannanquinn=.proc_numeric(jrslt, paste(prefix,"hannanquinn", sep=""))) - ) + hannanquinn=.proc_numeric(jrslt, paste(prefix,"hannanquinn", sep="")) + )) } diff --git a/R/protobuf.R b/R/protobuf.R index 50d8c99..fb26e78 100644 --- a/R/protobuf.R +++ b/R/protobuf.R @@ -276,7 +276,8 @@ NULL bphi=.p2r_parameters(spec$bphi), btheta=.p2r_parameters(spec$btheta) ), - class="JD3_SARIMA_ESTIMATION")) + class="JD3_SARIMA_ESTIMATION" + )) } #' @export @@ -544,23 +545,26 @@ NULL #' @export #' @rdname jd3_utilities .p2r_sa_decomposition<-function(p, full=FALSE){ - if (full){ - return(list(mode = .enum_extract(sa.DecompositionMode, p$mode), - series=.p2r_sa_component(p$series), - sa=.p2r_sa_component(p$seasonally_adjusted), - t=.p2r_sa_component(p$trend), - s=.p2r_sa_component(p$seasonal), - i=.p2r_sa_component(p$irregular) - )) + if (full) { + output <- list( + mode = .enum_extract(sa.DecompositionMode, p$mode), + series=.p2r_sa_component(p$series), + sa=.p2r_sa_component(p$seasonally_adjusted), + t=.p2r_sa_component(p$trend), + s=.p2r_sa_component(p$seasonal), + i=.p2r_sa_component(p$irregular) + ) } else { - return(list(mode = .enum_extract(sa.DecompositionMode, p$mode), - series=.p2r_component(p$series), - sa=.p2r_component(p$seasonally_adjusted), - t=.p2r_component(p$trend), - s=.p2r_component(p$seasonal), - i=.p2r_component(p$irregular) - )) + output <- list( + mode = .enum_extract(sa.DecompositionMode, p$mode), + series=.p2r_component(p$series), + sa=.p2r_component(p$seasonally_adjusted), + t=.p2r_component(p$trend), + s=.p2r_component(p$seasonal), + i=.p2r_component(p$irregular) + ) } + return(output) } #' @export diff --git a/R/regarima_generic.R b/R/regarima_generic.R index fe3be62..d5c6f80 100644 --- a/R/regarima_generic.R +++ b/R/regarima_generic.R @@ -24,8 +24,8 @@ coef.JD3_REGARIMA_RSLTS <- function(object, component = c("regression", "arima", logLik.JD3_REGARIMA_RSLTS <- function(object, ...) { if (!is.null(object$estimation)) # for sarima_estimate outputs object <- object$estimation - if (is.null(object) || - is.null(object$likelihood$ll)) { + if (is.null(object) + || is.null(object$likelihood$ll)) { res <- NA } else { res <- structure(object$likelihood$ll, diff --git a/R/regarima_rslts.R b/R/regarima_rslts.R index df11411..cd5d225 100644 --- a/R/regarima_rslts.R +++ b/R/regarima_rslts.R @@ -4,12 +4,13 @@ NULL #' @export #' @rdname jd3_utilities .p2r_regarima_rslts<-function(p){ - return(structure(list( + output <- list( description=.p2r_regarima_description(p$description), estimation=.p2r_regarima_estimation(p$estimation), - diagnostics=.p2r_regarima_diagnostics(p$diagnostics)), - class="JD3_REGARIMA_RSLTS") + diagnostics=.p2r_regarima_diagnostics(p$diagnostics) ) + class(output) <- "JD3_REGARIMA_RSLTS" + return(output) } .p2r_regarima_description<-function(p){ diff --git a/R/spec_benchmarking.R b/R/spec_benchmarking.R index 6ea3641..777d536 100644 --- a/R/spec_benchmarking.R +++ b/R/spec_benchmarking.R @@ -1,23 +1,34 @@ #' Set Benchmarking Specification #' #' @description -#' Function allowing to perform a benchmarking procedure after the decomposition step in a seasonal -#' adjustment (disabled by default). Here benchmarking refers to a procedure ensuring consistency over the year between -#' seasonally adjusted and raw (or calendar adjusted) data, as seasonal adjustment can cause discrepancies between the annual totals of seasonally adjusted series +#' Function allowing to perform a benchmarking procedure after the decomposition +#' step in a seasonal adjustment (disabled by default). Here benchmarking refers +#' to a procedure ensuring consistency over the year between seasonally +#' adjusted and raw (or calendar adjusted) data, as seasonal adjustment can +#' cause discrepancies between the annual totals of seasonally adjusted series #' and the corresponding annual totals of raw (or calendar adjusted) series. #' -#' @param x the specification to customize, must be a "SPEC" class object (see details). +#' @param x the specification to customize, must be a "SPEC" class object (see +#' details). #' @param enabled Boolean to enable the user to perform benchmarking. #' @param target specifies the target series for the benchmarking procedure, -#' which can be the raw series (\code{"Normal"}); or the series adjusted for calendar effects (\code{"CalendarAdjusted"}). -#' @param rho the value of the AR(1) parameter (set between 0 and 1) in the function used for benchmarking. Default =1. -#' @param lambda a parameter in the function used for benchmarking that relates to the weights in the regression equation; it is typically equal to 0, 1/2 or 1. -#' @param forecast Boolean indicating if the forecasts of the seasonally adjusted series and of the target variable (\code{target}) are used in the benchmarking computation so that the benchmarking constrain is also applied to the forecasting period. +#' which can be the raw series (\code{"Normal"}); or the series adjusted for +#' calendar effects (\code{"CalendarAdjusted"}). +#' @param rho the value of the AR(1) parameter (set between 0 and 1) in the +#' function used for benchmarking. Default =1. +#' @param lambda a parameter in the function used for benchmarking that relates +#' to the weights in the regression equation; it is typically equal to 0, 1/2 +#' or 1. +#' @param forecast Boolean indicating if the forecasts of the seasonally +#' adjusted series and of the target variable (\code{target}) are used in the +#' benchmarking computation so that the benchmarking constrain is also applied +#' to the forecasting period. #' @param bias TODO #' @details -#' \code{x} specification parameter must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} -#' (or "JD3_REGARIMA_SPEC" generated with \code{rjd3x13::spec_regarima()} or "JD3_TRAMOSEATS_SPEC" -#' generated with \code{rjd3tramoseats::spec_tramoseats()} or "JD3_TRAMO_SPEC" generated with +#' \code{x} specification parameter must be a JD3_X13_SPEC" class object +#' generated with \code{rjd3x13::x13_spec()} (or "JD3_REGARIMA_SPEC" generated +#' with \code{rjd3x13::spec_regarima()} or "JD3_TRAMOSEATS_SPEC" generated with +#' \code{rjd3tramoseats::spec_tramoseats()} or "JD3_TRAMO_SPEC" generated with #' \code{rjd3tramoseats::spec_tramo()}). #' @examples #' # init_spec <- rjd3x13::x13_spec("RSA5c") diff --git a/R/spec_regarima.R b/R/spec_regarima.R index b908fde..3d90814 100644 --- a/R/spec_regarima.R +++ b/R/spec_regarima.R @@ -1,23 +1,27 @@ #' Manage Outliers/Ramps in Specification #' -#' Generic function to add outliers or Ramp regressors (\code{add_outlier()} and \code{add_ramp()}) -#' to a specification or to remove them (\code{remove_outlier()} and \code{remove_ramp()}). +#' Generic function to add outliers or Ramp regressors (\code{add_outlier()} and +#' \code{add_ramp()}) to a specification or to remove them +#' (\code{remove_outlier()} and \code{remove_ramp()}). #' -#' @param x the specification to customize, must be a "SPEC" class object (see details). +#' @param x the specification to customize, must be a "SPEC" class object (see +#' details). #' @param type,date type and date of the outliers. Possible \code{type} are: -#' \code{"AO"} = additive, \code{"LS"} = level shift, \code{"TC"} = transitory change and -#' \code{"SO"} = seasonal outlier. +#' \code{"AO"} = additive, \code{"LS"} = level shift, \code{"TC"} = transitory +#' change and \code{"SO"} = seasonal outlier. #' @param start,end dates of the ramp regressor. #' @param name the name of the variable (to format print). -#' @param coef the coefficient if needs to be fixed. If equal to 0 the outliers/ramps coefficients -#' are estimated. +#' @param coef the coefficient if needs to be fixed. If equal to 0 the +#' outliers/ramps coefficients are estimated. #' @details -#' \code{x} specification parameter must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} -#' (or "JD3_REGARIMA_SPEC" generated with \code{rjd3x13::spec_regarima()} or "JD3_TRAMOSEATS_SPEC" -#' generated with \code{rjd3tramoseats::spec_tramoseats()} or "JD3_TRAMO_SPEC" generated with -#' \code{rjd3tramoseats::spec_tramo()}). -#' If a Seasonal adjustment process is performed, each type of Outlier will be allocated to a pre-defined -#' component after the decomposition: "AO" and "TC" to the irregular, "LS" and Ramps to the trend. +#' \code{x} specification parameter must be a JD3_X13_SPEC" class object +#' generated with \code{rjd3x13::x13_spec()} (or "JD3_REGARIMA_SPEC" generated +#' with \code{rjd3x13::spec_regarima()} or "JD3_TRAMOSEATS_SPEC" generated with +#' \code{rjd3tramoseats::spec_tramoseats()} or "JD3_TRAMO_SPEC" generated with +#' \code{rjd3tramoseats::spec_tramo()}). If a Seasonal adjustment process is +#' performed, each type of Outlier will be allocated to a pre-defined component +#' after the decomposition: "AO" and "TC" to the irregular, "LS" and Ramps to +#' the trend. #' @examples #' # init_spec <- rjd3x13::x13_spec("RSA5c") #' # new_spec<-rjd3toolkit::add_outlier(init_spec, type="AO", date="2012-01-01") @@ -207,33 +211,39 @@ remove_ramp.default <- function(x, #' Set estimation sub-span and quality check specification #' #' @description -#' Function allowing to check if the series can be processed and to define a sub-span on which -#' estimation will be performed -#' +#' Function allowing to check if the series can be processed and to define a +#' sub-span on which estimation will be performed #' #' @inheritParams add_outlier #' #' @param type,d0,d1,n0,n1 parameters to specify the sub-span . #' -#' \code{d0} and \code{d1} characters in the format "YYYY-MM-DD" to specify first/last date -#' of the span when \code{type} equals to \code{"From"}, \code{"To"} or \code{"Between"}. +#' \code{d0} and \code{d1} characters in the format "YYYY-MM-DD" to specify +#' first/last date of the span when \code{type} equals to \code{"From"}, +#' \code{"To"} or \code{"Between"}. #' Date corresponding to \code{d0} will be included in the sub-span #' Date corresponding to \code{d1} will be excluded from the sub span #' -#' \code{n0} and \code{n1} numeric to specify the number of periods at the beginning/end of the series -#' to be used for defining the sub-span -#' (\code{type} equals to \code{"First"}, \code{"Last"}) or to exclude (\code{type} equals to \code{"Excluding"}). +#' \code{n0} and \code{n1} numeric to specify the number of periods at the +#' beginning/end of the series to be used for defining the sub-span +#' (\code{type} equals to \code{"First"}, \code{"Last"}) or to exclude +#' (\code{type} equals to \code{"Excluding"}). #' -#' @param preliminary.check a Boolean to check the quality of the input series and exclude highly problematic ones -#' (e.g. the series with a number of identical observations and/or missing values above pre-specified threshold values). +#' @param preliminary.check a Boolean to check the quality of the input series +#' and exclude highly problematic ones (e.g. the series with a number of +#' identical observations and/or missing values above pre-specified threshold +#' values). #' #' @param preprocessing (REGARIMA/X13 Specific) a Boolean to enable/disable the pre-processing. #' Option disabled for the moment. +#' #' @details -#' \code{x} specification parameter must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} -#' (or "JD3_REGARIMA_SPEC" generated with \code{rjd3x13::spec_regarima()} or "JD3_TRAMOSEATS_SPEC" -#' generated with \code{rjd3tramoseats::spec_tramoseats()} or "JD3_TRAMO_SPEC" generated with +#' \code{x} specification parameter must be a JD3_X13_SPEC" class object +#' generated with \code{rjd3x13::x13_spec()} (or "JD3_REGARIMA_SPEC" generated +#' with \code{rjd3x13::spec_regarima()} or "JD3_TRAMOSEATS_SPEC" generated with +#' \code{rjd3tramoseats::spec_tramoseats()} or "JD3_TRAMO_SPEC" generated with #' \code{rjd3tramoseats::spec_tramo()}). +#' #' @examples #' # init_spec <- rjd3x13::x13_spec("RSA5c") #' # estimation on sub-span between two dates (date d1 is excluded) @@ -294,27 +304,33 @@ set_basic.default <- function(x, #' Set Numeric Estimation Parameters and Modelling Span #' #' @description -#' Function allowing to define numeric boundaries for estimation and to define a sub-span on which -#' reg-arima (tramo) modelling will be performed (pre-processing step) +#' Function allowing to define numeric boundaries for estimation and to define +#' a sub-span on which reg-arima (tramo) modelling will be performed +#' (pre-processing step) #' #' @inheritParams set_basic #' -#' @param tol a numeric, convergence tolerance. The absolute changes in the log-likelihood function -#' are compared to this value to check for the convergence of the estimation iterations. -#' (The default setting is 0.0000001) +#' @param tol a numeric, convergence tolerance. The absolute changes in the +#' log-likelihood function are compared to this value to check for the +#' convergence of the estimation iterations. (The default setting is 0.0000001) #' -#' @param exact.ml (TRAMO specific) \code{logical}, the exact maximum likelihood estimation. If \code{TRUE}, the program performs an exact -#' maximum likelihood estimation. If \code{FASLE}, the Unconditional Least Squares method is used.(Default=TRUE) +#' @param exact.ml (TRAMO specific) \code{logical}, the exact maximum likelihood +#' estimation. If \code{TRUE}, the program performs an exact maximum likelihood +#' estimation. If \code{FASLE}, the Unconditional Least Squares method is used. +#' (Default=TRUE) #' -#' @param unit.root.limit (TRAMO specific) \code{numeric}, the final unit root limit. The threshold value for the final unit root test -#' for identification of differencing orders. If the magnitude of an AR root for the final model is smaller than this number, -#' then a unit root is assumed, the order of the AR polynomial is reduced by one and the appropriate order of the differencing -#' (non-seasonal, seasonal) is increased.(Default value: 0.96) +#' @param unit.root.limit (TRAMO specific) \code{numeric}, the final unit root +#' limit. The threshold value for the final unit root test for identification of +#' differencing orders. If the magnitude of an AR root for the final model is +#' smaller than this number, then a unit root is assumed, the order of the AR +#' polynomial is reduced by one and the appropriate order of the differencing +#' (non-seasonal, seasonal) is increased.(Default value: 0.96) #' #' @details -#' \code{x} specification parameter must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} -#' (or "JD3_REGARIMA_SPEC" generated with \code{rjd3x13::spec_regarima()} or "JD3_TRAMOSEATS_SPEC" -#' generated with \code{rjd3tramoseats::spec_tramoseats()} or "JD3_TRAMO_SPEC" generated with +#' \code{x} specification parameter must be a JD3_X13_SPEC" class object +#' generated with \code{rjd3x13::x13_spec()} (or "JD3_REGARIMA_SPEC" generated +#' with \code{rjd3x13::spec_regarima()} or "JD3_TRAMOSEATS_SPEC" generated with +#' \code{rjd3tramoseats::spec_tramoseats()} or "JD3_TRAMO_SPEC" generated with #' \code{rjd3tramoseats::spec_tramo()}). #' #' @examples diff --git a/R/tests_seasonality.R b/R/tests_seasonality.R index 75098a6..d202393 100644 --- a/R/tests_seasonality.R +++ b/R/tests_seasonality.R @@ -168,11 +168,14 @@ seasonality_combined<-function(data, period=NA, firstperiod=cycle(data)[1], mul= as.numeric(data), as.integer(period), as.integer(firstperiod-1), as.logical(mul)) q<-.jcall("jdplus/sa/base/r/SeasonalityTests", "[B", "toBuffer", jctest) p<-RProtoBuf::read(sa.CombinedSeasonalityTest, q) - return(list( + + output <- list( seasonality=.enum_extract(sa.IdentifiableSeasonality, p$seasonality), kruskalwallis=.p2r_test(p$kruskal_wallis), stable=.p2r_anova(p$stable_seasonality), - evolutive=.p2r_anova(p$evolutive_seasonality))) + evolutive=.p2r_anova(p$evolutive_seasonality) + ) + return(output) } #' Canova-Hansen test using trigonometric variables diff --git a/tests/spelling.R b/tests/spelling.R index 6713838..cf7f9e8 100644 --- a/tests/spelling.R +++ b/tests/spelling.R @@ -1,3 +1,7 @@ -if(requireNamespace('spelling', quietly = TRUE)) - spelling::spell_check_test(vignettes = TRUE, error = FALSE, - skip_on_cran = TRUE) +if (requireNamespace("spelling", quietly = TRUE)) { + spelling::spell_check_test( + vignettes = TRUE, + error = FALSE, + skip_on_cran = TRUE + ) +} From 78907dcfc55f111ba00b54a72c959db81b1aafd6 Mon Sep 17 00:00:00 2001 From: Tanguy BARTHELEMY Date: Mon, 14 Oct 2024 12:08:12 +0200 Subject: [PATCH 16/18] additionnale linting --- R/protobuf.R | 20 +++++++++--------- R/spec_regarima.R | 24 ++++++++++++++------- man/add_outlier.Rd | 30 ++++++++++++++------------ man/add_usrdefvar.Rd | 3 ++- man/jd3_print.Rd | 7 ++++-- man/sarima_model.Rd | 12 +++++++---- man/set_arima.Rd | 3 ++- man/set_automodel.Rd | 3 ++- man/set_basic.Rd | 32 ++++++++++++++++------------ man/set_benchmarking.Rd | 33 +++++++++++++++++++---------- man/set_easter.Rd | 3 ++- man/set_estimate.Rd | 47 ++++++++++++++++++++++++----------------- man/set_outlier.Rd | 3 ++- man/set_tradingdays.Rd | 26 ++++++++++++++--------- man/set_transform.Rd | 3 ++- man/ucarima_model.Rd | 10 ++++++--- 16 files changed, 160 insertions(+), 99 deletions(-) diff --git a/R/protobuf.R b/R/protobuf.R index fb26e78..e0cfe0b 100644 --- a/R/protobuf.R +++ b/R/protobuf.R @@ -570,18 +570,18 @@ NULL #' @export #' @rdname jd3_utilities .p2r_sa_diagnostics<-function(p){ - return(list(vardecomposition =p$variance_decomposition$as.list(), - seas.ftest.i=.p2r_test(p$seasonal_ftest_on_irregular), - seas.ftest.sa=.p2r_test(p$seasonal_ftest_on_sa), - seas.qstest.i=.p2r_test(p$seasonal_qtest_on_irregular), - seas.qstest.sa=.p2r_test(p$seasonal_qtest_on_sa), - td.ftest.i=.p2r_test(p$td_ftest_on_irregular), - td.ftest.sa=.p2r_test(p$td_ftest_on_sa) - )) - + output <- list( + vardecomposition =p$variance_decomposition$as.list(), + seas.ftest.i=.p2r_test(p$seasonal_ftest_on_irregular), + seas.ftest.sa=.p2r_test(p$seasonal_ftest_on_sa), + seas.qstest.i=.p2r_test(p$seasonal_qtest_on_irregular), + seas.qstest.sa=.p2r_test(p$seasonal_qtest_on_sa), + td.ftest.i=.p2r_test(p$td_ftest_on_irregular), + td.ftest.sa=.p2r_test(p$td_ftest_on_sa) + ) + return(output) } - .ts_move<-function(period, freq, delta){ if (delta == 0)return(period) if (freq == 1)return(c(period[1]+delta, 1)) diff --git a/R/spec_regarima.R b/R/spec_regarima.R index 3d90814..b4a5574 100644 --- a/R/spec_regarima.R +++ b/R/spec_regarima.R @@ -878,14 +878,17 @@ set_arima.default <- function(x, #' #' #' @description -#' Function allowing to select the trading-days regressors to be used for calendar correction in the -#' pre-processing step of a seasonal adjustment procedure. The default is \code{"TradingDays"}, with easter specific effect enabled. -#' (see \code{\link{set_easter}}) +#' Function allowing to select the trading-days regressors to be used for +#' calendar correction in the pre-processing step of a seasonal adjustment +#' procedure. The default is \code{"TradingDays"}, with easter specific effect +#' enabled. (see \code{\link{set_easter}}) #' -#' All the built-in regressors are meant to correct for type -#' of day effect but don't take into account any holiday. To do so user-defined regressors have to be built. +#' All the built-in regressors are meant to correct for type of day effect but +#' don't take into account any holiday. To do so user-defined regressors have to +#' be built. #' #' @inheritParams set_basic +#' #' @param option to specify the set of trading days regression variables: #' \code{"TradingDays"} = six contrast variables, each type of day (from Monday to Saturday) vs Sundays; #' \code{"WorkingDays"} = one working (week days)/non-working (week-ends) day contrast variable; @@ -894,6 +897,7 @@ set_arima.default <- function(x, #' \code{"TD4"} = three contrast variables: week-days (Mondays to Thursdays) vs Sundays, Fridays vs Sundays, Saturdays vs Sundays; #' \code{"None"} = no correction for trading days; #' \code{"UserDefined"} = userdefined trading days regressors. +#' #' @param calendar.name name (string) of the user-defined calendar to be taken into account when generating #' built-in regressors set in 'option' (if not 'UserDefined).(see examples) #' @param uservariable a vector of characters to specify the name of user-defined calendar regressors. @@ -921,9 +925,13 @@ set_arima.default <- function(x, #' #' @param coef vector of coefficients for the trading-days regressors. #' -#' @param automatic defines whether the calendar effects should be added to the model manually (\code{"Unused"}) or automatically. -#' During the automatic selection, the choice of the number of calendar variables can be based on the F-Test (\code{"FTest"}, TRAMO specific), the Wald Test (\code{"WaldTest"}), or by minimizing AIC or BIC; -#' the model with higher F value is chosen, provided that it is higher than \code{pftd}). +#' @param automatic defines whether the calendar effects should be added to the +#' model manually (\code{"Unused"}) or automatically. During the automatic +#' selection, the choice of the number of calendar variables can be based on +#' the F-Test (\code{"FTest"}, TRAMO specific), the Wald Test +#' (\code{"WaldTest"}), or by minimizing AIC or BIC; the model with higher +#' F-value is chosen, provided that it is higher than \code{pftd}). +#' #' @param pftd (TRAMO SPECIFIC) \code{numeric}. The p-value used to assess the significance of the pre-tested calendar effects. #' #' @param autoadjust a logical indicating if the program corrects automatically the raw series for diff --git a/man/add_outlier.Rd b/man/add_outlier.Rd index 2215ef9..825815c 100644 --- a/man/add_outlier.Rd +++ b/man/add_outlier.Rd @@ -16,30 +16,34 @@ add_ramp(x, start, end, name = sprintf("rp.\%s - \%s", start, end), coef = 0) remove_ramp(x, start = NULL, end = NULL, name = NULL) } \arguments{ -\item{x}{the specification to customize, must be a "SPEC" class object (see details).} +\item{x}{the specification to customize, must be a "SPEC" class object (see +details).} \item{type, date}{type and date of the outliers. Possible \code{type} are: -\code{"AO"} = additive, \code{"LS"} = level shift, \code{"TC"} = transitory change and -\code{"SO"} = seasonal outlier.} +\code{"AO"} = additive, \code{"LS"} = level shift, \code{"TC"} = transitory +change and \code{"SO"} = seasonal outlier.} \item{name}{the name of the variable (to format print).} -\item{coef}{the coefficient if needs to be fixed. If equal to 0 the outliers/ramps coefficients -are estimated.} +\item{coef}{the coefficient if needs to be fixed. If equal to 0 the +outliers/ramps coefficients are estimated.} \item{start, end}{dates of the ramp regressor.} } \description{ -Generic function to add outliers or Ramp regressors (\code{add_outlier()} and \code{add_ramp()}) -to a specification or to remove them (\code{remove_outlier()} and \code{remove_ramp()}). +Generic function to add outliers or Ramp regressors (\code{add_outlier()} and +\code{add_ramp()}) to a specification or to remove them +(\code{remove_outlier()} and \code{remove_ramp()}). } \details{ -\code{x} specification parameter must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} -(or "JD3_REGARIMA_SPEC" generated with \code{rjd3x13::spec_regarima()} or "JD3_TRAMOSEATS_SPEC" -generated with \code{rjd3tramoseats::spec_tramoseats()} or "JD3_TRAMO_SPEC" generated with -\code{rjd3tramoseats::spec_tramo()}). -If a Seasonal adjustment process is performed, each type of Outlier will be allocated to a pre-defined -component after the decomposition: "AO" and "TC" to the irregular, "LS" and Ramps to the trend. +\code{x} specification parameter must be a JD3_X13_SPEC" class object +generated with \code{rjd3x13::x13_spec()} (or "JD3_REGARIMA_SPEC" generated +with \code{rjd3x13::spec_regarima()} or "JD3_TRAMOSEATS_SPEC" generated with +\code{rjd3tramoseats::spec_tramoseats()} or "JD3_TRAMO_SPEC" generated with +\code{rjd3tramoseats::spec_tramo()}). If a Seasonal adjustment process is +performed, each type of Outlier will be allocated to a pre-defined component +after the decomposition: "AO" and "TC" to the irregular, "LS" and Ramps to +the trend. } \examples{ # init_spec <- rjd3x13::x13_spec("RSA5c") diff --git a/man/add_usrdefvar.Rd b/man/add_usrdefvar.Rd index b0f9b04..311c330 100644 --- a/man/add_usrdefvar.Rd +++ b/man/add_usrdefvar.Rd @@ -16,7 +16,8 @@ add_usrdefvar( ) } \arguments{ -\item{x}{the specification to customize, must be a "SPEC" class object (see details).} +\item{x}{the specification to customize, must be a "SPEC" class object (see +details).} \item{group, name}{the name of the regressor in the format \code{"group.name"}, by default \code{"r.name"} by default if \code{group} NULL \code{"group.name"} has to be the same as in \code{\link{modelling_context}} (see examples)} diff --git a/man/jd3_print.Rd b/man/jd3_print.Rd index d658114..964a81a 100644 --- a/man/jd3_print.Rd +++ b/man/jd3_print.Rd @@ -35,9 +35,12 @@ \item{...}{further unused parameters.} -\item{digits}{minimum number of significant digits to be used for most numbers.} +\item{digits}{minimum number of significant digits to be used for most +numbers.} -\item{summary_info}{boolean indicating if a message suggesting the use of the summary function for more details should be printed. By default used the option \code{"summary_info"} it used, which initialized to \code{TRUE}.} +\item{summary_info}{boolean indicating if a message suggesting the use of the +summary function for more details should be printed. By default used the +option \code{"summary_info"} it used, which initialized to \code{TRUE}.} } \description{ JD3 print functions diff --git a/man/sarima_model.Rd b/man/sarima_model.Rd index 2e64694..f42d362 100644 --- a/man/sarima_model.Rd +++ b/man/sarima_model.Rd @@ -20,17 +20,21 @@ sarima_model( \item{period}{period of the model.} -\item{phi}{coefficients of the regular auto-regressive polynomial (\eqn{1 + \phi_1B + \phi_2B + ...}). True signs.} +\item{phi}{coefficients of the regular auto-regressive polynomial +(\eqn{1 + \phi_1B + \phi_2B + ...}). True signs.} \item{d}{regular differencing order.} -\item{theta}{coefficients of the regular moving average polynomial (\eqn{1 + \theta_1B + \theta_2B + ...}). True signs.} +\item{theta}{coefficients of the regular moving average polynomial +(\eqn{1 + \theta_1B + \theta_2B + ...}). True signs.} -\item{bphi}{coefficients of the seasonal auto-regressive polynomial. True signs.} +\item{bphi}{coefficients of the seasonal auto-regressive polynomial. True +signs.} \item{bd}{seasonal differencing order.} -\item{btheta}{coefficients of the seasonal moving average polynomial. True signs.} +\item{btheta}{coefficients of the seasonal moving average polynomial. True +signs.} } \value{ A \code{"JD3_SARIMA"} model. diff --git a/man/set_arima.Rd b/man/set_arima.Rd index ba38981..e372c88 100644 --- a/man/set_arima.Rd +++ b/man/set_arima.Rd @@ -19,7 +19,8 @@ set_arima( ) } \arguments{ -\item{x}{the specification to customize, must be a "SPEC" class object (see details).} +\item{x}{the specification to customize, must be a "SPEC" class object (see +details).} \item{mean}{to fix the coefficient of the mean. If \code{mean = 0}, the mean is disabled.} diff --git a/man/set_automodel.Rd b/man/set_automodel.Rd index 9f75648..3cf3d5a 100644 --- a/man/set_automodel.Rd +++ b/man/set_automodel.Rd @@ -23,7 +23,8 @@ set_automodel( ) } \arguments{ -\item{x}{the specification to customize, must be a "SPEC" class object (see details).} +\item{x}{the specification to customize, must be a "SPEC" class object (see +details).} \item{enabled}{\code{logical}. If \code{TRUE}, the automatic modelling of the ARIMA model is enabled. If \code{FALSE}, the parameters of the ARIMA model can be specified.} diff --git a/man/set_basic.Rd b/man/set_basic.Rd index 37d6202..1df19cc 100644 --- a/man/set_basic.Rd +++ b/man/set_basic.Rd @@ -16,33 +16,39 @@ set_basic( ) } \arguments{ -\item{x}{the specification to customize, must be a "SPEC" class object (see details).} +\item{x}{the specification to customize, must be a "SPEC" class object (see +details).} \item{type, d0, d1, n0, n1}{parameters to specify the sub-span . -\code{d0} and \code{d1} characters in the format "YYYY-MM-DD" to specify first/last date -of the span when \code{type} equals to \code{"From"}, \code{"To"} or \code{"Between"}. +\code{d0} and \code{d1} characters in the format "YYYY-MM-DD" to specify +first/last date of the span when \code{type} equals to \code{"From"}, +\code{"To"} or \code{"Between"}. Date corresponding to \code{d0} will be included in the sub-span Date corresponding to \code{d1} will be excluded from the sub span -\code{n0} and \code{n1} numeric to specify the number of periods at the beginning/end of the series -to be used for defining the sub-span -(\code{type} equals to \code{"First"}, \code{"Last"}) or to exclude (\code{type} equals to \code{"Excluding"}).} +\code{n0} and \code{n1} numeric to specify the number of periods at the +beginning/end of the series to be used for defining the sub-span +(\code{type} equals to \code{"First"}, \code{"Last"}) or to exclude +(\code{type} equals to \code{"Excluding"}).} -\item{preliminary.check}{a Boolean to check the quality of the input series and exclude highly problematic ones -(e.g. the series with a number of identical observations and/or missing values above pre-specified threshold values).} +\item{preliminary.check}{a Boolean to check the quality of the input series +and exclude highly problematic ones (e.g. the series with a number of +identical observations and/or missing values above pre-specified threshold +values).} \item{preprocessing}{(REGARIMA/X13 Specific) a Boolean to enable/disable the pre-processing. Option disabled for the moment.} } \description{ -Function allowing to check if the series can be processed and to define a sub-span on which -estimation will be performed +Function allowing to check if the series can be processed and to define a +sub-span on which estimation will be performed } \details{ -\code{x} specification parameter must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} -(or "JD3_REGARIMA_SPEC" generated with \code{rjd3x13::spec_regarima()} or "JD3_TRAMOSEATS_SPEC" -generated with \code{rjd3tramoseats::spec_tramoseats()} or "JD3_TRAMO_SPEC" generated with +\code{x} specification parameter must be a JD3_X13_SPEC" class object +generated with \code{rjd3x13::x13_spec()} (or "JD3_REGARIMA_SPEC" generated +with \code{rjd3x13::spec_regarima()} or "JD3_TRAMOSEATS_SPEC" generated with +\code{rjd3tramoseats::spec_tramoseats()} or "JD3_TRAMO_SPEC" generated with \code{rjd3tramoseats::spec_tramo()}). } \examples{ diff --git a/man/set_benchmarking.Rd b/man/set_benchmarking.Rd index cd9b280..c49aae8 100644 --- a/man/set_benchmarking.Rd +++ b/man/set_benchmarking.Rd @@ -15,31 +15,42 @@ set_benchmarking( ) } \arguments{ -\item{x}{the specification to customize, must be a "SPEC" class object (see details).} +\item{x}{the specification to customize, must be a "SPEC" class object (see +details).} \item{enabled}{Boolean to enable the user to perform benchmarking.} \item{target}{specifies the target series for the benchmarking procedure, -which can be the raw series (\code{"Normal"}); or the series adjusted for calendar effects (\code{"CalendarAdjusted"}).} +which can be the raw series (\code{"Normal"}); or the series adjusted for +calendar effects (\code{"CalendarAdjusted"}).} -\item{rho}{the value of the AR(1) parameter (set between 0 and 1) in the function used for benchmarking. Default =1.} +\item{rho}{the value of the AR(1) parameter (set between 0 and 1) in the +function used for benchmarking. Default =1.} -\item{lambda}{a parameter in the function used for benchmarking that relates to the weights in the regression equation; it is typically equal to 0, 1/2 or 1.} +\item{lambda}{a parameter in the function used for benchmarking that relates +to the weights in the regression equation; it is typically equal to 0, 1/2 +or 1.} -\item{forecast}{Boolean indicating if the forecasts of the seasonally adjusted series and of the target variable (\code{target}) are used in the benchmarking computation so that the benchmarking constrain is also applied to the forecasting period.} +\item{forecast}{Boolean indicating if the forecasts of the seasonally +adjusted series and of the target variable (\code{target}) are used in the +benchmarking computation so that the benchmarking constrain is also applied +to the forecasting period.} \item{bias}{TODO} } \description{ -Function allowing to perform a benchmarking procedure after the decomposition step in a seasonal -adjustment (disabled by default). Here benchmarking refers to a procedure ensuring consistency over the year between -seasonally adjusted and raw (or calendar adjusted) data, as seasonal adjustment can cause discrepancies between the annual totals of seasonally adjusted series +Function allowing to perform a benchmarking procedure after the decomposition +step in a seasonal adjustment (disabled by default). Here benchmarking refers +to a procedure ensuring consistency over the year between seasonally +adjusted and raw (or calendar adjusted) data, as seasonal adjustment can +cause discrepancies between the annual totals of seasonally adjusted series and the corresponding annual totals of raw (or calendar adjusted) series. } \details{ -\code{x} specification parameter must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} -(or "JD3_REGARIMA_SPEC" generated with \code{rjd3x13::spec_regarima()} or "JD3_TRAMOSEATS_SPEC" -generated with \code{rjd3tramoseats::spec_tramoseats()} or "JD3_TRAMO_SPEC" generated with +\code{x} specification parameter must be a JD3_X13_SPEC" class object +generated with \code{rjd3x13::x13_spec()} (or "JD3_REGARIMA_SPEC" generated +with \code{rjd3x13::spec_regarima()} or "JD3_TRAMOSEATS_SPEC" generated with +\code{rjd3tramoseats::spec_tramoseats()} or "JD3_TRAMO_SPEC" generated with \code{rjd3tramoseats::spec_tramo()}). } \examples{ diff --git a/man/set_easter.Rd b/man/set_easter.Rd index 2b95528..7d8dd3c 100644 --- a/man/set_easter.Rd +++ b/man/set_easter.Rd @@ -16,7 +16,8 @@ set_easter( ) } \arguments{ -\item{x}{the specification to customize, must be a "SPEC" class object (see details).} +\item{x}{the specification to customize, must be a "SPEC" class object (see +details).} \item{enabled}{a logical indicating if the program considers the Easter effect in the pre-processing model. Default = TRUE.} diff --git a/man/set_estimate.Rd b/man/set_estimate.Rd index 0e986e1..03886b0 100644 --- a/man/set_estimate.Rd +++ b/man/set_estimate.Rd @@ -17,39 +17,48 @@ set_estimate( ) } \arguments{ -\item{x}{the specification to customize, must be a "SPEC" class object (see details).} +\item{x}{the specification to customize, must be a "SPEC" class object (see +details).} \item{type, d0, d1, n0, n1}{parameters to specify the sub-span . -\code{d0} and \code{d1} characters in the format "YYYY-MM-DD" to specify first/last date -of the span when \code{type} equals to \code{"From"}, \code{"To"} or \code{"Between"}. +\code{d0} and \code{d1} characters in the format "YYYY-MM-DD" to specify +first/last date of the span when \code{type} equals to \code{"From"}, +\code{"To"} or \code{"Between"}. Date corresponding to \code{d0} will be included in the sub-span Date corresponding to \code{d1} will be excluded from the sub span -\code{n0} and \code{n1} numeric to specify the number of periods at the beginning/end of the series -to be used for defining the sub-span -(\code{type} equals to \code{"First"}, \code{"Last"}) or to exclude (\code{type} equals to \code{"Excluding"}).} +\code{n0} and \code{n1} numeric to specify the number of periods at the +beginning/end of the series to be used for defining the sub-span +(\code{type} equals to \code{"First"}, \code{"Last"}) or to exclude +(\code{type} equals to \code{"Excluding"}).} -\item{tol}{a numeric, convergence tolerance. The absolute changes in the log-likelihood function -are compared to this value to check for the convergence of the estimation iterations. -(The default setting is 0.0000001)} +\item{tol}{a numeric, convergence tolerance. The absolute changes in the +log-likelihood function are compared to this value to check for the +convergence of the estimation iterations. (The default setting is 0.0000001)} -\item{exact.ml}{(TRAMO specific) \code{logical}, the exact maximum likelihood estimation. If \code{TRUE}, the program performs an exact -maximum likelihood estimation. If \code{FASLE}, the Unconditional Least Squares method is used.(Default=TRUE)} +\item{exact.ml}{(TRAMO specific) \code{logical}, the exact maximum likelihood +estimation. If \code{TRUE}, the program performs an exact maximum likelihood +estimation. If \code{FASLE}, the Unconditional Least Squares method is used. +(Default=TRUE)} -\item{unit.root.limit}{(TRAMO specific) \code{numeric}, the final unit root limit. The threshold value for the final unit root test -for identification of differencing orders. If the magnitude of an AR root for the final model is smaller than this number, -then a unit root is assumed, the order of the AR polynomial is reduced by one and the appropriate order of the differencing +\item{unit.root.limit}{(TRAMO specific) \code{numeric}, the final unit root +limit. The threshold value for the final unit root test for identification of +differencing orders. If the magnitude of an AR root for the final model is +smaller than this number, then a unit root is assumed, the order of the AR +polynomial is reduced by one and the appropriate order of the differencing (non-seasonal, seasonal) is increased.(Default value: 0.96)} } \description{ -Function allowing to define numeric boundaries for estimation and to define a sub-span on which -reg-arima (tramo) modelling will be performed (pre-processing step) +Function allowing to define numeric boundaries for estimation and to define +a sub-span on which reg-arima (tramo) modelling will be performed +(pre-processing step) } \details{ -\code{x} specification parameter must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} -(or "JD3_REGARIMA_SPEC" generated with \code{rjd3x13::spec_regarima()} or "JD3_TRAMOSEATS_SPEC" -generated with \code{rjd3tramoseats::spec_tramoseats()} or "JD3_TRAMO_SPEC" generated with +\code{x} specification parameter must be a JD3_X13_SPEC" class object +generated with \code{rjd3x13::x13_spec()} (or "JD3_REGARIMA_SPEC" generated +with \code{rjd3x13::spec_regarima()} or "JD3_TRAMOSEATS_SPEC" generated with +\code{rjd3tramoseats::spec_tramoseats()} or "JD3_TRAMO_SPEC" generated with \code{rjd3tramoseats::spec_tramo()}). } \examples{ diff --git a/man/set_outlier.Rd b/man/set_outlier.Rd index 5bf0993..fa078da 100644 --- a/man/set_outlier.Rd +++ b/man/set_outlier.Rd @@ -21,7 +21,8 @@ set_outlier( ) } \arguments{ -\item{x}{the specification to customize, must be a "SPEC" class object (see details).} +\item{x}{the specification to customize, must be a "SPEC" class object (see +details).} \item{span.type, d0, d1, n0, n1}{parameters to specify the sub-span on which outliers will be detected. diff --git a/man/set_tradingdays.Rd b/man/set_tradingdays.Rd index da242a1..02ab1eb 100644 --- a/man/set_tradingdays.Rd +++ b/man/set_tradingdays.Rd @@ -23,7 +23,8 @@ set_tradingdays( ) } \arguments{ -\item{x}{the specification to customize, must be a "SPEC" class object (see details).} +\item{x}{the specification to customize, must be a "SPEC" class object (see +details).} \item{option}{to specify the set of trading days regression variables: \code{"TradingDays"} = six contrast variables, each type of day (from Monday to Saturday) vs Sundays; @@ -65,9 +66,12 @@ if at least one t-statistic is greater than 2.6 or if two t-statistics are great \item{coef.type, leapyear.coef.type}{vector defining if the coefficients are fixed or estimated.} -\item{automatic}{defines whether the calendar effects should be added to the model manually (\code{"Unused"}) or automatically. -During the automatic selection, the choice of the number of calendar variables can be based on the F-Test (\code{"FTest"}, TRAMO specific), the Wald Test (\code{"WaldTest"}), or by minimizing AIC or BIC; -the model with higher F value is chosen, provided that it is higher than \code{pftd}).} +\item{automatic}{defines whether the calendar effects should be added to the +model manually (\code{"Unused"}) or automatically. During the automatic +selection, the choice of the number of calendar variables can be based on +the F-Test (\code{"FTest"}, TRAMO specific), the Wald Test +(\code{"WaldTest"}), or by minimizing AIC or BIC; the model with higher +F-value is chosen, provided that it is higher than \code{pftd}).} \item{pftd}{(TRAMO SPECIFIC) \code{numeric}. The p-value used to assess the significance of the pre-tested calendar effects.} @@ -82,12 +86,14 @@ of trading day regressors.} \item{leapyear.coef}{coefficient of the leap year regressor.} } \description{ -Function allowing to select the trading-days regressors to be used for calendar correction in the -pre-processing step of a seasonal adjustment procedure. The default is \code{"TradingDays"}, with easter specific effect enabled. -(see \code{\link{set_easter}}) - -All the built-in regressors are meant to correct for type -of day effect but don't take into account any holiday. To do so user-defined regressors have to be built. +Function allowing to select the trading-days regressors to be used for +calendar correction in the pre-processing step of a seasonal adjustment +procedure. The default is \code{"TradingDays"}, with easter specific effect +enabled. (see \code{\link{set_easter}}) + +All the built-in regressors are meant to correct for type of day effect but +don't take into account any holiday. To do so user-defined regressors have to +be built. } \details{ \code{x} specification parameter must be a JD3_X13_SPEC" class object generated with \code{rjd3x13::x13_spec()} diff --git a/man/set_transform.Rd b/man/set_transform.Rd index 10dd107..ecdfe84 100644 --- a/man/set_transform.Rd +++ b/man/set_transform.Rd @@ -14,7 +14,8 @@ set_transform( ) } \arguments{ -\item{x}{the specification to customize, must be a "SPEC" class object (see details).} +\item{x}{the specification to customize, must be a "SPEC" class object (see +details).} \item{fun}{the transformation of the input series: \code{"None"} = no transformation of the series; \code{"Log"} = takes the log of the series; \code{"Auto"} = the program tests for the log-level specification.} diff --git a/man/ucarima_model.Rd b/man/ucarima_model.Rd index ba221ac..c7f7ae2 100644 --- a/man/ucarima_model.Rd +++ b/man/ucarima_model.Rd @@ -2,7 +2,8 @@ % Please edit documentation in R/arima.R \name{ucarima_model} \alias{ucarima_model} -\title{Creates an UCARIMA model, which is composed of ARIMA models with independent innovations.} +\title{Creates an UCARIMA model, which is composed of ARIMA models with independent +innovations.} \usage{ ucarima_model(model = NULL, components, complements = NULL, checkmodel = FALSE) } @@ -13,13 +14,16 @@ ucarima_model(model = NULL, components, complements = NULL, checkmodel = FALSE) \item{complements}{Complements of (some) components. Usually not provided} -\item{checkmodel}{When the model is provided and \emph{checkmodel} is TRUE, we check that it indeed corresponds to the reduced form of the components; similar controls are applied on complements. Currently not implemented} +\item{checkmodel}{When the model is provided and \emph{checkmodel} is TRUE, we +check that it indeed corresponds to the reduced form of the components; +similar controls are applied on complements. Currently not implemented} } \value{ A list with the reduced model, the components and their complements } \description{ -Creates an UCARIMA model, which is composed of ARIMA models with independent innovations. +Creates an UCARIMA model, which is composed of ARIMA models with independent +innovations. } \examples{ mod1 <- arima_model("trend", delta = c(1,-2,1)) From 2aef436d88b4ec7b44cb0efd42e0185e53ac71ce Mon Sep 17 00:00:00 2001 From: Tanguy BARTHELEMY Date: Mon, 14 Oct 2024 15:39:50 +0200 Subject: [PATCH 17/18] style package --- R/arima.R | 345 +++++++++++---------- R/calendars.R | 610 +++++++++++++++++++----------------- R/calendarts.R | 30 +- R/decomposition.R | 98 +++--- R/differencing.R | 111 ++++--- R/display.R | 397 ++++++++++++++---------- R/distributions.R | 30 +- R/generics.R | 11 +- R/jd2r.R | 174 ++++++----- R/jd3rslts.R | 194 ++++++------ R/modellingcontext.R | 457 +++++++++++++++------------ R/procresults.R | 46 +-- R/protobuf.R | 701 ++++++++++++++++++++++++------------------ R/regarima_generic.R | 59 ++-- R/regarima_rslts.R | 44 +-- R/spec_benchmarking.R | 12 +- R/spec_regarima.R | 614 +++++++++++++++++++----------------- R/splines.R | 10 +- R/tests_regular.R | 114 ++++--- R/tests_seasonality.R | 172 ++++++----- R/tests_td.R | 51 +-- R/timeseries.R | 195 ++++++------ R/utils.R | 63 ++-- R/variables.R | 302 +++++++++--------- R/zzz.R | 16 +- README.Rmd | 8 +- 26 files changed, 2703 insertions(+), 2161 deletions(-) diff --git a/R/arima.R b/R/arima.R index 6614acd..4d52386 100644 --- a/R/arima.R +++ b/R/arima.R @@ -19,14 +19,14 @@ NULL #' #' @return A `"JD3_SARIMA"` model. #' @export -sarima_model<-function(name="sarima", - period, - phi=NULL, - d=0, - theta=NULL, - bphi=NULL, - bd=0, - btheta=NULL) { +sarima_model <- function(name = "sarima", + period, + phi = NULL, + d = 0, + theta = NULL, + bphi = NULL, + bd = 0, + btheta = NULL) { output <- list( name = name, period = period, @@ -51,11 +51,11 @@ sarima_model<-function(name="sarima", #' mod1 <- sarima_model(period = 12, d = 1, bd = 1, theta = 0.2, btheta = 0.2) #' sarima_properties(mod1) #' @export -sarima_properties<-function(model, nspectrum=601, nacf=36){ - jmodel<-.r2jd_sarima(model) - spectrum<-.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "[D", "spectrum", jmodel, as.integer(nspectrum)) - acf<-.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "[D", "acf", jmodel, as.integer(nacf)) - return(list(acf=acf, spectrum=spectrum)) +sarima_properties <- function(model, nspectrum = 601, nacf = 36) { + jmodel <- .r2jd_sarima(model) + spectrum <- .jcall("jdplus/toolkit/base/r/arima/SarimaModels", "[D", "spectrum", jmodel, as.integer(nspectrum)) + acf <- .jcall("jdplus/toolkit/base/r/arima/SarimaModels", "[D", "acf", jmodel, as.integer(nacf)) + return(list(acf = acf, spectrum = spectrum)) } @@ -71,25 +71,28 @@ sarima_properties<-function(model, nspectrum=601, nacf=36){ #' #' @examples #' # Airline model -#' s_model <- sarima_model(period = 12, d =1, bd = 1, theta = 0.2, btheta = 0.2) +#' s_model <- sarima_model(period = 12, d = 1, bd = 1, theta = 0.2, btheta = 0.2) #' x <- sarima_random(s_model, length = 64, seed = 0) #' plot(x, type = "l") #' @export -sarima_random<-function(model, length, stde=1, tdegree=0, seed=-1){ - if (!inherits(model, "JD3_SARIMA")) +sarima_random <- function(model, length, stde = 1, tdegree = 0, seed = -1) { + if (!inherits(model, "JD3_SARIMA")) { stop("Invalid model") - return(.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "[D", "random", - as.integer(length), - as.integer(model$period), - .jarray(as.numeric(model$phi)), - as.integer(model$d), - .jarray(as.numeric(model$theta)), - .jarray(as.numeric(model$bphi)), - as.integer(model$bd), - .jarray(as.numeric(model$btheta)), - stde, - as.integer(tdegree), - as.integer(seed))) + } + return(.jcall( + "jdplus/toolkit/base/r/arima/SarimaModels", "[D", "random", + as.integer(length), + as.integer(model$period), + .jarray(as.numeric(model$phi)), + as.integer(model$d), + .jarray(as.numeric(model$theta)), + .jarray(as.numeric(model$bphi)), + as.integer(model$bd), + .jarray(as.numeric(model$btheta)), + stde, + as.integer(tdegree), + as.integer(seed) + )) } #' Decompose SARIMA Model into three components trend, seasonal, irregular @@ -102,18 +105,22 @@ sarima_random<-function(model, length, stde=1, tdegree=0, seed=-1){ #' @export #' #' @examples -#' model <- sarima_model(period = 12, d =1, bd = 1, theta = -0.6, btheta = -0.5) +#' model <- sarima_model(period = 12, d = 1, bd = 1, theta = -0.6, btheta = -0.5) #' ucm <- sarima_decompose(model) #' -sarima_decompose<-function(model, rmod=0, epsphi=0){ - if (!inherits(model, "JD3_SARIMA")) +sarima_decompose <- function(model, rmod = 0, epsphi = 0) { + if (!inherits(model, "JD3_SARIMA")) { stop("Invalid model") - jmodel<-.r2jd_sarima(model) - jucm<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/core/ucarima/UcarimaModel;", "decompose", - jmodel, as.numeric(rmod), as.numeric(epsphi)) - if (is.jnull(jucm)) return(NULL) + } + jmodel <- .r2jd_sarima(model) + jucm <- .jcall( + "jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/core/ucarima/UcarimaModel;", "decompose", + jmodel, as.numeric(rmod), as.numeric(epsphi) + ) + if (is.jnull(jucm)) { + return(NULL) + } return(.jd2r_ucarima(jucm)) - } #' ARIMA Model @@ -128,50 +135,54 @@ sarima_decompose<-function(model, rmod=0, epsphi=0){ #' @export #' #' @examples -#' model <- arima_model("trend", ar=c(1,-.8), delta = c(1,-1), ma=c(1,-.5), var=100) -arima_model<-function(name="arima", ar=1, delta=1, ma=1, variance=1){ - return(structure(list(name=name, ar=ar, delta=delta, ma=ma, var=variance), class="JD3_ARIMA")) +#' model <- arima_model("trend", ar = c(1, -.8), delta = c(1, -1), ma = c(1, -.5), var = 100) +arima_model <- function(name = "arima", ar = 1, delta = 1, ma = 1, variance = 1) { + return(structure(list(name = name, ar = ar, delta = delta, ma = ma, var = variance), class = "JD3_ARIMA")) } -.jd2r_doubleseq<-function(jobj, jprop){ - jseq<-.jcall(jobj, "Ljdplus/toolkit/base/api/data/DoubleSeq;", jprop) +.jd2r_doubleseq <- function(jobj, jprop) { + jseq <- .jcall(jobj, "Ljdplus/toolkit/base/api/data/DoubleSeq;", jprop) return(.jcall(jseq, "[D", "toArray")) } -.jd2r_sarima<-function(jsarima){ - q<-.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "[B", "toBuffer", jsarima) - rq<-RProtoBuf::read(modelling.SarimaModel, q) +.jd2r_sarima <- function(jsarima) { + q <- .jcall("jdplus/toolkit/base/r/arima/SarimaModels", "[B", "toBuffer", jsarima) + rq <- RProtoBuf::read(modelling.SarimaModel, q) return(.p2r_sarima(rq)) } #' @export #' @rdname jd3_utilities -.r2jd_sarima<-function(model){ - return(.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "Ljdplus/toolkit/base/core/sarima/SarimaModel;", "of", - as.integer(model$period), - .jarray(as.numeric(model$phi)), - as.integer(model$d), - .jarray(as.numeric(model$theta)), - .jarray(as.numeric(model$bphi)), - as.integer(model$bd), - .jarray(as.numeric(model$btheta)))) +.r2jd_sarima <- function(model) { + return(.jcall( + "jdplus/toolkit/base/r/arima/SarimaModels", "Ljdplus/toolkit/base/core/sarima/SarimaModel;", "of", + as.integer(model$period), + .jarray(as.numeric(model$phi)), + as.integer(model$d), + .jarray(as.numeric(model$theta)), + .jarray(as.numeric(model$bphi)), + as.integer(model$bd), + .jarray(as.numeric(model$btheta)) + )) } -.jd2r_arima<-function(jarima){ - q<-.jcall("jdplus/toolkit/base/r/arima/ArimaModels", "[B", "toBuffer", jarima) - rq<-RProtoBuf::read(modelling.ArimaModel, q) +.jd2r_arima <- function(jarima) { + q <- .jcall("jdplus/toolkit/base/r/arima/ArimaModels", "[B", "toBuffer", jarima) + rq <- RProtoBuf::read(modelling.ArimaModel, q) return(.p2r_arima(rq)) } -.r2jd_arima<-function(model){ - return(.jcall("jdplus/toolkit/base/r/arima/ArimaModels", "Ljdplus/toolkit/base/core/arima/ArimaModel;", "of", - .jarray(as.numeric(model$ar)), - .jarray(as.numeric(model$delta)), - .jarray(as.numeric(model$ma)), - as.numeric(model$var), FALSE)) +.r2jd_arima <- function(model) { + return(.jcall( + "jdplus/toolkit/base/r/arima/ArimaModels", "Ljdplus/toolkit/base/core/arima/ArimaModel;", "of", + .jarray(as.numeric(model$ar)), + .jarray(as.numeric(model$delta)), + .jarray(as.numeric(model$ma)), + as.numeric(model$var), FALSE + )) } #' Sum ARIMA Models @@ -191,18 +202,18 @@ arima_model<-function(name="arima", ar=1, delta=1, ma=1, variance=1){ #' polynomial and innovation variance of the sum. #' #' @examples -#' mod1 = arima_model(ar = c(0.1, 0.2), delta = 0, ma = 0) -#' mod2 = arima_model(ar = 0, delta = 0, ma = c(0.4)) +#' mod1 <- arima_model(ar = c(0.1, 0.2), delta = 0, ma = 0) +#' mod2 <- arima_model(ar = 0, delta = 0, ma = c(0.4)) #' arima_sum(mod1, mod2) #' @export -arima_sum<-function(...){ - components<-list(...) +arima_sum <- function(...) { + components <- list(...) return(arima_lsum(components)) } -arima_lsum<-function(components){ - q<-.jarray(lapply(components, .r2jd_arima), "jdplus/toolkit/base/core/arima/ArimaModel") - jsum<-.jcall("jdplus/toolkit/base/r/arima/ArimaModels", "Ljdplus/toolkit/base/core/arima/ArimaModel;", "sum", q) +arima_lsum <- function(components) { + q <- .jarray(lapply(components, .r2jd_arima), "jdplus/toolkit/base/core/arima/ArimaModel") + jsum <- .jcall("jdplus/toolkit/base/r/arima/ArimaModels", "Ljdplus/toolkit/base/core/arima/ArimaModel;", "sum", q) return(.jd2r_arima(jsum)) } @@ -217,16 +228,16 @@ arima_lsum<-function(components){ #' #' #' @examples -#' mod1 = arima_model(delta = c(1,-2,1)) -#' mod2 = arima_model(variance=.01) +#' mod1 <- arima_model(delta = c(1, -2, 1)) +#' mod2 <- arima_model(variance = .01) #' diff <- arima_difference(mod1, mod2) #' sum <- arima_sum(diff, mod2) #' # sum should be equal to mod1 #' -arima_difference<-function(left, right, simplify=TRUE){ - jleft<-.r2jd_arima(left) - jright<-.r2jd_arima(right) - jdiff<-.jcall(jleft, "Ljdplus/toolkit/base/core/arima/ArimaModel;", "minus", jright, as.logical(simplify)) +arima_difference <- function(left, right, simplify = TRUE) { + jleft <- .r2jd_arima(left) + jright <- .r2jd_arima(right) + jdiff <- .jcall(jleft, "Ljdplus/toolkit/base/core/arima/ArimaModel;", "minus", jright, as.logical(simplify)) return(.jd2r_arima(jdiff)) } @@ -239,14 +250,14 @@ arima_difference<-function(left, right, simplify=TRUE){ #' @returns A list with tha auto-covariances and with the (pseudo-)spectrum #' #' @examples -#' mod1 <- arima_model(ar = c(0.1, 0.2), delta = c(1,-1), ma = 0) +#' mod1 <- arima_model(ar = c(0.1, 0.2), delta = c(1, -1), ma = 0) #' arima_properties(mod1) #' @export -arima_properties<-function(model, nspectrum=601, nac=36){ - jmodel<-.r2jd_arima(model) - spectrum<-.jcall("jdplus/toolkit/base/r/arima/ArimaModels", "[D", "spectrum", jmodel, as.integer(nspectrum)) - acf<-.jcall("jdplus/toolkit/base/r/arima/ArimaModels", "[D", "acf", jmodel, as.integer(nac)) - return(list(acf=acf, spectrum=spectrum)) +arima_properties <- function(model, nspectrum = 601, nac = 36) { + jmodel <- .r2jd_arima(model) + spectrum <- .jcall("jdplus/toolkit/base/r/arima/ArimaModels", "[D", "spectrum", jmodel, as.integer(nspectrum)) + acf <- .jcall("jdplus/toolkit/base/r/arima/ArimaModels", "[D", "acf", jmodel, as.integer(nac)) + return(list(acf = acf, spectrum = spectrum)) } #' Creates an UCARIMA model, which is composed of ARIMA models with independent @@ -263,44 +274,48 @@ arima_properties<-function(model, nspectrum=601, nac=36){ #' @export #' #' @examples -#' mod1 <- arima_model("trend", delta = c(1,-2,1)) +#' mod1 <- arima_model("trend", delta = c(1, -2, 1)) #' mod2 <- arima_model("noise", var = 1600) -#' hp<-ucarima_model(components=list(mod1, mod2)) +#' hp <- ucarima_model(components = list(mod1, mod2)) #' print(hp$model) -ucarima_model<-function(model=NULL, - components, - complements=NULL, - checkmodel=FALSE){ +ucarima_model <- function(model = NULL, + components, + complements = NULL, + checkmodel = FALSE) { if (is.null(model)) { - model<-arima_lsum(components) - } else if (! is(model, "JD3_ARIMA") && ! is(model, "JD3_SARIMA")) { + model <- arima_lsum(components) + } else if (!is(model, "JD3_ARIMA") && !is(model, "JD3_SARIMA")) { stop("Invalid model") } # TODO: checkmodel - output <- list(model=model, components=components, complements=complements) + output <- list(model = model, components = components, complements = complements) class(output) <- "JD3_UCARIMA" return(output) } -.r2jd_ucarima<-function(ucm){ - jmodel<-.r2jd_arima(ucm$model) - jcmps<-.jarray(lapply(ucm$components, .r2jd_arima), - "jdplus/toolkit/base/core/arima/ArimaModel") - return(.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", - "Ljdplus/toolkit/base/core/ucarima/UcarimaModel;", - "of", - jmodel, jcmps)) +.r2jd_ucarima <- function(ucm) { + jmodel <- .r2jd_arima(ucm$model) + jcmps <- .jarray( + lapply(ucm$components, .r2jd_arima), + "jdplus/toolkit/base/core/arima/ArimaModel" + ) + return(.jcall( + "jdplus/toolkit/base/r/arima/UcarimaModels", + "Ljdplus/toolkit/base/core/ucarima/UcarimaModel;", + "of", + jmodel, jcmps + )) } #' @export #' @rdname jd3_utilities -.jd2r_ucarima<-function(jucm){ +.jd2r_ucarima <- function(jucm) { # model<-.jcall(jucm, "Ljdplus/toolkit/base/core/arima/ArimaModel;", "sum") # jcmps<-.jcall(jucm, "[Ljdplus/toolkit/base/core/arima/ArimaModel;", "getComponents") # return(ucarima_model(.jd2r_arima(model), lapply(jcmps, .jd2r_arima))) - q<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "[B", "toBuffer", jucm) - rq<-RProtoBuf::read(modelling.UcarimaModel, q) + q <- .jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "[B", "toBuffer", jucm) + rq <- RProtoBuf::read(modelling.UcarimaModel, q) return(.p2r_ucarima(rq)) } @@ -317,22 +332,22 @@ ucarima_model<-function(model=NULL, #' @export #' #' @examples -#' mod1 <- arima_model("trend", delta = c(1,-2,1)) +#' mod1 <- arima_model("trend", delta = c(1, -2, 1)) #' mod2 <- arima_model("noise", var = 1600) -#' hp<-ucarima_model(components=list(mod1, mod2)) -#' wk1<-ucarima_wk(hp, 1, nwk=50) -#' wk2<-ucarima_wk(hp, 2) -#' plot(wk1$filter, type='h') -ucarima_wk<-function(ucm, cmp, signal=TRUE, nspectrum=601, nwk=300){ - jucm<-.r2jd_ucarima(ucm) - jwks<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/core/ucarima/WienerKolmogorovEstimators;", "wienerKolmogorovEstimators", jucm) - jwk<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/core/ucarima/WienerKolmogorovEstimator;", "finalEstimator", jwks, as.integer(cmp-1), signal) - - spectrum<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "[D", "spectrum", jwk, as.integer(nspectrum)) - wk<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "[D", "filter", jwk, as.integer(nwk)) - gain<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "[D", "gain", jwk, as.integer(nspectrum)) - - return(structure(list(spectrum=spectrum, filter=wk, gain2=gain*gain), class="JD3_UCARIMA_WK")) +#' hp <- ucarima_model(components = list(mod1, mod2)) +#' wk1 <- ucarima_wk(hp, 1, nwk = 50) +#' wk2 <- ucarima_wk(hp, 2) +#' plot(wk1$filter, type = "h") +ucarima_wk <- function(ucm, cmp, signal = TRUE, nspectrum = 601, nwk = 300) { + jucm <- .r2jd_ucarima(ucm) + jwks <- .jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/core/ucarima/WienerKolmogorovEstimators;", "wienerKolmogorovEstimators", jucm) + jwk <- .jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/core/ucarima/WienerKolmogorovEstimator;", "finalEstimator", jwks, as.integer(cmp - 1), signal) + + spectrum <- .jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "[D", "spectrum", jwk, as.integer(nspectrum)) + wk <- .jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "[D", "filter", jwk, as.integer(nwk)) + gain <- .jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "[D", "gain", jwk, as.integer(nspectrum)) + + return(structure(list(spectrum = spectrum, filter = wk, gain2 = gain * gain), class = "JD3_UCARIMA_WK")) } #' Makes a UCARIMA model canonical; more specifically, put all the noise of the components in one dedicated component @@ -345,15 +360,16 @@ ucarima_wk<-function(ucm, cmp, signal=TRUE, nspectrum=601, nwk=300){ #' @export #' #' @examples -#' mod1 <- arima_model("trend", delta = c(1,-2,1)) +#' mod1 <- arima_model("trend", delta = c(1, -2, 1)) #' mod2 <- arima_model("noise", var = 1600) -#' hp <- ucarima_model(components=list(mod1, mod2)) -#' hpc <- ucarima_canonical(hp, cmp=2) - -ucarima_canonical<-function(ucm, cmp=0, adjust=TRUE){ - jucm<-.r2jd_ucarima(ucm) - jnucm<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/core/ucarima/UcarimaModel;", "doCanonical", - jucm, as.integer(cmp-1), as.logical(adjust)) +#' hp <- ucarima_model(components = list(mod1, mod2)) +#' hpc <- ucarima_canonical(hp, cmp = 2) +ucarima_canonical <- function(ucm, cmp = 0, adjust = TRUE) { + jucm <- .r2jd_ucarima(ucm) + jnucm <- .jcall( + "jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/core/ucarima/UcarimaModel;", "doCanonical", + jucm, as.integer(cmp - 1), as.logical(adjust) + ) return(.jd2r_ucarima(jnucm)) } @@ -367,18 +383,20 @@ ucarima_canonical<-function(ucm, cmp=0, adjust=TRUE){ #' @export #' #' @examples -#' mod1 <- arima_model("trend", delta = c(1,-2,1)) +#' mod1 <- arima_model("trend", delta = c(1, -2, 1)) #' mod2 <- arima_model("noise", var = 16) -#' hp <- ucarima_model(components=list(mod1, mod2)) +#' hp <- ucarima_model(components = list(mod1, mod2)) #' s <- log(aggregate(retail$AutomobileDealers)) -#' all <- ucarima_estimate(s, hp, stdev=TRUE) -#' plot(s, type = 'l') -#' t <- ts(all[,1], frequency = frequency(s), start = start(s)) -#' lines(t, col='blue') -ucarima_estimate<-function(x, ucm, stdev=TRUE){ - jucm<-.r2jd_ucarima(ucm) - jcmps<-.jcall("jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/api/math/matrices/Matrix;", "estimate", - as.numeric(x), jucm, as.logical(stdev)) +#' all <- ucarima_estimate(s, hp, stdev = TRUE) +#' plot(s, type = "l") +#' t <- ts(all[, 1], frequency = frequency(s), start = start(s)) +#' lines(t, col = "blue") +ucarima_estimate <- function(x, ucm, stdev = TRUE) { + jucm <- .r2jd_ucarima(ucm) + jcmps <- .jcall( + "jdplus/toolkit/base/r/arima/UcarimaModels", "Ljdplus/toolkit/base/api/math/matrices/Matrix;", "estimate", + as.numeric(x), jucm, as.logical(stdev) + ) return(.jd2r_matrix(jcmps)) } @@ -397,25 +415,29 @@ ucarima_estimate<-function(x, ucm, stdev=TRUE){ #' #' @examples #' y <- ABS$X0.2.09.10.M -#' sarima_estimate(y, order = c(0,1,1), seasonal = c(0,1,1)) -sarima_estimate<-function(x, order=c(0,0,0), seasonal = list(order=c(0,0,0), period=NA), mean=FALSE, xreg=NULL, eps = 1e-9){ +#' sarima_estimate(y, order = c(0, 1, 1), seasonal = c(0, 1, 1)) +sarima_estimate <- function(x, order = c(0, 0, 0), seasonal = list(order = c(0, 0, 0), period = NA), mean = FALSE, xreg = NULL, eps = 1e-9) { if (!is.list(seasonal) && is.numeric(seasonal) && length(seasonal) == 3) { - seasonal <- list(order = seasonal, - period = NA) + seasonal <- list( + order = seasonal, + period = NA + ) } - if (is.na(seasonal$period)) + if (is.na(seasonal$period)) { seasonal$period <- frequency(x) - jxreg<-.r2jd_matrix(xreg) - jestim<-.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "Ljdplus/toolkit/base/core/regarima/RegArimaEstimation;", "estimate", - as.numeric(x), as.integer(order), as.integer(seasonal$period), as.integer(seasonal$order), as.logical(mean), jxreg, .jnull("[D"), as.numeric(eps)) - bytes<-.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "[B", "toBuffer", jestim) - p<-RProtoBuf::read(regarima.RegArimaModel$Estimation, bytes) + } + jxreg <- .r2jd_matrix(xreg) + jestim <- .jcall( + "jdplus/toolkit/base/r/arima/SarimaModels", "Ljdplus/toolkit/base/core/regarima/RegArimaEstimation;", "estimate", + as.numeric(x), as.integer(order), as.integer(seasonal$period), as.integer(seasonal$order), as.logical(mean), jxreg, .jnull("[D"), as.numeric(eps) + ) + bytes <- .jcall("jdplus/toolkit/base/r/arima/SarimaModels", "[B", "toBuffer", jestim) + p <- RProtoBuf::read(regarima.RegArimaModel$Estimation, bytes) res <- .p2r_regarima_estimation(p) if (length(res$b) > 0) { - names_xreg <- colnames(xreg) - if (is.null(names_xreg) && !is.null(xreg)){ + if (is.null(names_xreg) && !is.null(xreg)) { if (is.matrix(xreg)) { # unnamed matrix regressors names_xreg <- sprintf("xreg_%i", seq_len(ncol(xreg))) @@ -429,10 +451,12 @@ sarima_estimate<-function(x, order=c(0,0,0), seasonal = list(order=c(0,0,0), per } names(res$b) <- names_xreg } - names(res$parameters$val) <- c(sprintf("phi(%i)", seq_len(order[1])), - sprintf("bphi(%i)", seq_len(seasonal$order[1])), - sprintf("theta(%i)", seq_len(order[3])), - sprintf("btheta(%i)", seq_len(seasonal$order[3]))) + names(res$parameters$val) <- c( + sprintf("phi(%i)", seq_len(order[1])), + sprintf("bphi(%i)", seq_len(seasonal$order[1])), + sprintf("theta(%i)", seq_len(order[3])), + sprintf("btheta(%i)", seq_len(seasonal$order[3])) + ) res$orders <- list(order = order, seasonal = seasonal) class(res) <- c("JD3_SARIMA_ESTIMATE", "JD3_REGARIMA_RSLTS") return(res) @@ -453,16 +477,21 @@ sarima_estimate<-function(x, order=c(0,0,0), seasonal = list(order=c(0,0,0), per #' #' @examples #' y <- ABS$X0.2.09.10.M -#' sarima_hannan_rissanen(y, order = c(0,1,1), seasonal = c(0,1,1)) -sarima_hannan_rissanen<-function(x, order=c(0,0,0), seasonal = list(order=c(0,0,0), period=NA), initialization=c("Ols", "Levinson", "Burg"), biasCorrection=TRUE, finalCorrection=TRUE){ +#' sarima_hannan_rissanen(y, order = c(0, 1, 1), seasonal = c(0, 1, 1)) +sarima_hannan_rissanen <- function(x, order = c(0, 0, 0), seasonal = list(order = c(0, 0, 0), period = NA), initialization = c("Ols", "Levinson", "Burg"), biasCorrection = TRUE, finalCorrection = TRUE) { if (!is.list(seasonal) && is.numeric(seasonal) && length(seasonal) == 3) { - initialization<-match.arg(initialization) - seasonal <- list(order = seasonal, - period = NA) + initialization <- match.arg(initialization) + seasonal <- list( + order = seasonal, + period = NA + ) } - if (is.na(seasonal$period)) + if (is.na(seasonal$period)) { seasonal$period <- frequency(x) - jmodel<-.jcall("jdplus/toolkit/base/r/arima/SarimaModels", "Ljdplus/toolkit/base/core/sarima/SarimaModel;", "hannanRissanen", - as.numeric(x), as.integer(order), as.integer(seasonal$period), as.integer(seasonal$order), as.character(initialization), as.logical(biasCorrection), as.logical(finalCorrection)) + } + jmodel <- .jcall( + "jdplus/toolkit/base/r/arima/SarimaModels", "Ljdplus/toolkit/base/core/sarima/SarimaModel;", "hannanRissanen", + as.numeric(x), as.integer(order), as.integer(seasonal$period), as.integer(seasonal$order), as.character(initialization), as.logical(biasCorrection), as.logical(finalCorrection) + ) return(.jd2r_sarima(jmodel)) } diff --git a/R/calendars.R b/R/calendars.R index 38ab9ce..dc413cd 100644 --- a/R/calendars.R +++ b/R/calendars.R @@ -4,51 +4,54 @@ #' @include protobuf.R jd2r.R NULL -HOLIDAY<-'JD3_HOLIDAY' -FIXEDDAY<-'JD3_FIXEDDAY' -FIXEDWEEKDAY<-'JD3_FIXEDWEEKDAY' -EASTERDAY<-'JD3_EASTERDAY' -SPECIALDAY<-'JD3_SPECIALDAY' -SINGLEDAY<-'JD3_SINGLEDAY' - -.r2p_validityPeriod<-function(start, end){ - vp<-jd3.ValidityPeriod$new() +HOLIDAY <- "JD3_HOLIDAY" +FIXEDDAY <- "JD3_FIXEDDAY" +FIXEDWEEKDAY <- "JD3_FIXEDWEEKDAY" +EASTERDAY <- "JD3_EASTERDAY" +SPECIALDAY <- "JD3_SPECIALDAY" +SINGLEDAY <- "JD3_SINGLEDAY" + +.r2p_validityPeriod <- function(start, end) { + vp <- jd3.ValidityPeriod$new() if (is.null(start)) { - pstart<-DATE_MIN + pstart <- DATE_MIN } else { - pstart<-parseDate(start) + pstart <- parseDate(start) } - if (is.null(end)){ - pend<-DATE_MAX + if (is.null(end)) { + pend <- DATE_MAX } else { - pend<-parseDate(end) + pend <- parseDate(end) } - vp$start<-pstart - vp$end<-pend + vp$start <- pstart + vp$end <- pend return(vp) } -.p2r_validityPeriod<-function(vp){ - pstart<-vp$start - if (pstart == DATE_MIN) - start<-NULL - else - start<-as.Date(sprintf("%04i-%02i-%02i", pstart$year, pstart$month, pstart$day)) +.p2r_validityPeriod <- function(vp) { + pstart <- vp$start + if (pstart == DATE_MIN) { + start <- NULL + } else { + start <- as.Date(sprintf("%04i-%02i-%02i", pstart$year, pstart$month, pstart$day)) + } - pend<-vp$end - if (pend == DATE_MAX) - end<-NULL - else - end<-as.Date(sprintf("%04i-%02i-%02i", pend$year, pend$month, pend$day)) - if (is.null(start) && is.null(end)) + pend <- vp$end + if (pend == DATE_MAX) { + end <- NULL + } else { + end <- as.Date(sprintf("%04i-%02i-%02i", pend$year, pend$month, pend$day)) + } + if (is.null(start) && is.null(end)) { return(NULL) - else - return(list(start=start, end=end)) + } else { + return(list(start = start, end = end)) + } } -.length_ts <- function(s){ - if (is.mts(s)){ +.length_ts <- function(s) { + if (is.mts(s)) { nrow(s) } else { length(s) @@ -69,32 +72,33 @@ SINGLEDAY<-'JD3_SINGLEDAY' #' #' @examples #' day <- fixed_day(7, 21, .9) -#' day # July 21st, with weight=0.9, on the whole sample +#' day # July 21st, with weight=0.9, on the whole sample #' day <- fixed_day(12, 25, .5, validity = list(start = "2010-01-01")) #' day # December 25th, with weight=0.5, from January 2010 -#' day <- fixed_day(12, 25, .5, validity = list(start="1968-02-01", end = "2010-01-01")) +#' day <- fixed_day(12, 25, .5, validity = list(start = "1968-02-01", end = "2010-01-01")) #' day # December 25th, with weight=0.9, from February 1968 until January 2010 #' @seealso \code{\link{national_calendar}}, \code{\link{special_day}},\code{\link{easter_day}} #' @references #' More information on calendar correction in JDemetra+ online documentation: #' \url{https://jdemetra-new-documentation.netlify.app/a-calendar-correction} -fixed_day<-function(month, day, weight=1, validity=NULL){ - return(structure(list(month=month, day=day, weight=weight, validity=validity), class=c(FIXEDDAY, HOLIDAY))) +fixed_day <- function(month, day, weight = 1, validity = NULL) { + return(structure(list(month = month, day = day, weight = weight, validity = validity), class = c(FIXEDDAY, HOLIDAY))) } -.p2r_fixedday<-function(p){ - return(structure(list(month=p$month, day=p$day, weight=p$weight, validity=.p2r_validityPeriod(p$validity)), class=FIXEDDAY)) +.p2r_fixedday <- function(p) { + return(structure(list(month = p$month, day = p$day, weight = p$weight, validity = .p2r_validityPeriod(p$validity)), class = FIXEDDAY)) } -.r2p_fixedday<-function(r){ - fd<-jd3.FixedDay$new() - fd$month<-r$month - fd$day<-r$day - fd$weight<-r$weight - if (is.null(r$validity)) - fd$validity<-.r2p_validityPeriod(NULL, NULL) - else - fd$validity<-.r2p_validityPeriod(r$validity$start, r$validity$end) +.r2p_fixedday <- function(r) { + fd <- jd3.FixedDay$new() + fd$month <- r$month + fd$day <- r$day + fd$weight <- r$weight + if (is.null(r$validity)) { + fd$validity <- .r2p_validityPeriod(NULL, NULL) + } else { + fd$validity <- .r2p_validityPeriod(r$validity$start, r$validity$end) + } return(fd) } @@ -124,24 +128,25 @@ fixed_day<-function(month, day, weight=1, validity=NULL){ #' More information on calendar correction in JDemetra+ online documentation: #' \url{https://jdemetra-new-documentation.netlify.app/a-calendar-correction} #' -fixed_week_day<-function(month, week, dayofweek, weight=1, validity=NULL){ - return(structure(list(month=month, week=week, dayofweek=dayofweek, weight=weight, validity=validity), class=c(FIXEDWEEKDAY, HOLIDAY))) +fixed_week_day <- function(month, week, dayofweek, weight = 1, validity = NULL) { + return(structure(list(month = month, week = week, dayofweek = dayofweek, weight = weight, validity = validity), class = c(FIXEDWEEKDAY, HOLIDAY))) } -.p2r_fixedweekday<-function(p){ - return(fixed_week_day(p$month, week=p$position, dayofweek=p$weekday, weight=p$weight, validity=.p2r_validityPeriod(p$validity))) +.p2r_fixedweekday <- function(p) { + return(fixed_week_day(p$month, week = p$position, dayofweek = p$weekday, weight = p$weight, validity = .p2r_validityPeriod(p$validity))) } -.r2p_fixedweekday<-function(r){ - fd<-jd3.FixedWeekDay$new() - fd$month<-r$month +.r2p_fixedweekday <- function(r) { + fd <- jd3.FixedWeekDay$new() + fd$month <- r$month fd$position <- r$week fd$weekday <- r$dayofweek - fd$weight<-r$weight - if (is.null(r$validity)) - fd$validity<-.r2p_validityPeriod(NULL, NULL) - else - fd$validity<-.r2p_validityPeriod(r$validity$start, r$validity$end) + fd$weight <- r$weight + if (is.null(r$validity)) { + fd$validity <- .r2p_validityPeriod(NULL, NULL) + } else { + fd$validity <- .r2p_validityPeriod(r$validity$start, r$validity$end) + } return(fd) } @@ -155,35 +160,38 @@ fixed_week_day<-function(month, week, dayofweek, weight=1, validity=NULL){ #' @param julian Boolean indicating if Julian calendar must be used. #' #' @examples -#' easter_day(1) #Easter Monday +#' easter_day(1) # Easter Monday #' easter_day(-2) # Easter Good Friday #' # Corpus Christi 60 days after Easter #' # Sunday in Julian calendar with weight 0.5, from January 2000 to December 2020 -#' easter_day(offset=60,julian=TRUE,weight=0.5, -#' validity = list(start="2000-01-01", end = "2020-12-01")) +#' easter_day( +#' offset = 60, julian = TRUE, weight = 0.5, +#' validity = list(start = "2000-01-01", end = "2020-12-01") +#' ) #' @seealso \code{\link{national_calendar}}, \code{\link{fixed_day}},\code{\link{special_day}},\code{\link{fixed_week_day}} #' @references #' More information on calendar correction in JDemetra+ online documentation: #' \url{https://jdemetra-new-documentation.netlify.app/a-calendar-correction} #' #' @export -easter_day<-function(offset, julian=FALSE, weight=1, validity=NULL){ - return(structure(list(offset=offset, julian=julian, weight=weight, validity=validity), class=c(EASTERDAY, HOLIDAY))) +easter_day <- function(offset, julian = FALSE, weight = 1, validity = NULL) { + return(structure(list(offset = offset, julian = julian, weight = weight, validity = validity), class = c(EASTERDAY, HOLIDAY))) } -.p2r_easterday<-function(p){ +.p2r_easterday <- function(p) { return(easter_day(p$offset, p$julian, p$weight, .p2r_validityPeriod(p$validity))) } -.r2p_easterday<-function(r){ - fd<-jd3.EasterRelatedDay$new() - fd$offset<-r$offset - fd$julian<-r$julian - fd$weight<-r$weight - if (is.null(r$validity)) - fd$validity<-.r2p_validityPeriod(NULL, NULL) - else - fd$validity<-.r2p_validityPeriod(r$validity$start, r$validity$end) +.r2p_easterday <- function(r) { + fd <- jd3.EasterRelatedDay$new() + fd$offset <- r$offset + fd$julian <- r$julian + fd$weight <- r$weight + if (is.null(r$validity)) { + fd$validity <- .r2p_validityPeriod(NULL, NULL) + } else { + fd$validity <- .r2p_validityPeriod(r$validity$start, r$validity$end) + } return(fd) } @@ -204,18 +212,18 @@ easter_day<-function(offset, julian=FALSE, weight=1, validity=NULL){ #' \url{https://jdemetra-new-documentation.netlify.app/a-calendar-correction} #' #' @export -single_day<-function(date, weight=1){ - return(structure(list(date=date, weight=weight), class=c(SINGLEDAY, HOLIDAY))) +single_day <- function(date, weight = 1) { + return(structure(list(date = date, weight = weight), class = c(SINGLEDAY, HOLIDAY))) } -.p2r_singleday<-function(p){ +.p2r_singleday <- function(p) { return(single_day(.p2r_date(p$date), p$weight)) } -.r2p_singleday<-function(r){ - sd<-jd3.SingleDate$new() - sd$date<-parseDate(r$date) - sd$weight<-r$weight +.r2p_singleday <- function(r) { + sd <- jd3.SingleDate$new() + sd$date <- parseDate(r$date) + sd$weight <- r$weight return(sd) } @@ -258,45 +266,51 @@ single_day<-function(date, weight=1){ #' # To add Easter Monday #' special_day("EASTERMONDAY") #' # To define a holiday for the day after Christmas, with validity and weight -#' special_day("CHRISTMAS", offset = 1, weight = 0.8, -#' validity = list(start="2000-01-01", end = "2020-12-01")) +#' special_day("CHRISTMAS", +#' offset = 1, weight = 0.8, +#' validity = list(start = "2000-01-01", end = "2020-12-01") +#' ) #' @seealso \code{\link{national_calendar}}, \code{\link{fixed_day}}, \code{\link{easter_day}} #' @references #' More information on calendar correction in JDemetra+ online documentation: #' \url{https://jdemetra-new-documentation.netlify.app/a-calendar-correction} -special_day<-function(event, offset=0, weight=1, validity=NULL){ - return(structure(list(event=event, offset=offset, weight=weight, validity=validity), class=c(SPECIALDAY, HOLIDAY))) +special_day <- function(event, offset = 0, weight = 1, validity = NULL) { + return(structure(list(event = event, offset = offset, weight = weight, validity = validity), class = c(SPECIALDAY, HOLIDAY))) } -.p2r_specialday<-function(p){ +.p2r_specialday <- function(p) { return(special_day(.enum_extract(jd3.CalendarEvent, p$event), p$offset, p$weight, .p2r_validityPeriod(p$validity))) } -.r2p_specialday<-function(r){ - pd<-jd3.PrespecifiedHoliday$new() - pd$event<-.enum_of(jd3.CalendarEvent, r$event, "HOLIDAY") - pd$offset<-r$offset - pd$weight<-r$weight - if (is.null(r$validity)) - pd$validity<-.r2p_validityPeriod(NULL, NULL) - else - pd$validity<-.r2p_validityPeriod(r$validity$start, r$validity$end) +.r2p_specialday <- function(r) { + pd <- jd3.PrespecifiedHoliday$new() + pd$event <- .enum_of(jd3.CalendarEvent, r$event, "HOLIDAY") + pd$offset <- r$offset + pd$weight <- r$weight + if (is.null(r$validity)) { + pd$validity <- .r2p_validityPeriod(NULL, NULL) + } else { + pd$validity <- .r2p_validityPeriod(r$validity$start, r$validity$end) + } return(pd) } #' @export #' @rdname jd3_utilities -.p2jd_calendar<-function(pcalendar){ - bytes<-pcalendar$serialize(NULL) - jcal<-.jcall("jdplus/toolkit/base/r/calendar/Calendars", "Ljdplus/toolkit/base/api/timeseries/calendars/Calendar;", - "calendarOf", bytes) +.p2jd_calendar <- function(pcalendar) { + bytes <- pcalendar$serialize(NULL) + jcal <- .jcall( + "jdplus/toolkit/base/r/calendar/Calendars", "Ljdplus/toolkit/base/api/timeseries/calendars/Calendar;", + "calendarOf", bytes + ) return(jcal) } -.group_names <- function(x, contrasts = TRUE){ - if (!is.matrix(x)) +.group_names <- function(x, contrasts = TRUE) { + if (!is.matrix(x)) { return(x) - col_names <- seq_len(ncol(x)) - !contrasts #if !contrast then it starts from 0 + } + col_names <- seq_len(ncol(x)) - !contrasts # if !contrast then it starts from 0 colnames(x) <- sprintf("group_%i", col_names) x } @@ -330,20 +344,22 @@ special_day<-function(event, offset=0, weight=1, validity=NULL){ #' @examples #' # Monthly regressors for Trading Days: each type of day is different #' # contrasts to Sundays (6 series) -#' regs_td<- td(12,c(2020,1),60, groups = c(1, 2, 3, 4, 5, 6, 0), contrasts = TRUE) +#' regs_td <- td(12, c(2020, 1), 60, groups = c(1, 2, 3, 4, 5, 6, 0), contrasts = TRUE) #' # Quarterly regressors for Working Days: week days are similar #' # contrasts to week-end days (1 series) -#' regs_wd<- td(4,c(2020,1),60, groups = c(1, 1, 1, 1, 1, 0, 0), contrasts = TRUE) -td<-function(frequency, start, length, s, groups=c(1,2,3,4,5,6,0), contrasts=TRUE){ +#' regs_wd <- td(4, c(2020, 1), 60, groups = c(1, 1, 1, 1, 1, 0, 0), contrasts = TRUE) +td <- function(frequency, start, length, s, groups = c(1, 2, 3, 4, 5, 6, 0), contrasts = TRUE) { if (!missing(s) && is.ts(s)) { frequency <- stats::frequency(s) start <- stats::start(s) length <- .length_ts(s) } - jdom<-.r2jd_tsdomain(frequency, start[1], start[2], length) - igroups<-as.integer(groups) - jm<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "Ljdplus/toolkit/base/api/math/matrices/Matrix;", - "td", jdom, igroups, contrasts) + jdom <- .r2jd_tsdomain(frequency, start[1], start[2], length) + igroups <- as.integer(groups) + jm <- .jcall( + "jdplus/toolkit/base/r/modelling/Variables", "Ljdplus/toolkit/base/api/math/matrices/Matrix;", + "td", jdom, igroups, contrasts + ) data <- .jd2r_matrix(jm) data <- .group_names(data, contrasts = contrasts) return(ts(data, start = start, frequency = frequency)) @@ -377,29 +393,30 @@ td<-function(frequency, start, length, s, groups=c(1,2,3,4,5,6,0), contrasts=TRU #' \url{https://jdemetra-new-documentation.netlify.app/a-calendar-correction} #' @examples #' BE <- national_calendar(list( -#' fixed_day(7,21), -#' special_day("NEWYEAR"), -#' special_day("CHRISTMAS"), -#' special_day("MAYDAY"), -#' special_day("EASTERMONDAY"), -#' special_day("ASCENSION"), -#' special_day("WHITMONDAY"), -#' special_day("ASSUMPTION"), -#' special_day("ALLSAINTSDAY"), -#' special_day("ARMISTICE"))) -#' q<-holidays(BE, "2021-01-01", 366*10, type="All") -#' plot(apply(q,1, max)) +#' fixed_day(7, 21), +#' special_day("NEWYEAR"), +#' special_day("CHRISTMAS"), +#' special_day("MAYDAY"), +#' special_day("EASTERMONDAY"), +#' special_day("ASCENSION"), +#' special_day("WHITMONDAY"), +#' special_day("ASSUMPTION"), +#' special_day("ALLSAINTSDAY"), +#' special_day("ARMISTICE") +#' )) +#' q <- holidays(BE, "2021-01-01", 366 * 10, type = "All") +#' plot(apply(q, 1, max)) #' @export holidays <- function(calendar, start, length, - nonworking=c(6,7), - type=c("Skip", "All", "NextWorkingDay", "PreviousWorkingDay"), - single=FALSE) { - type<-match.arg(type) - pcal<-.r2p_calendar(calendar) - jcal<-.p2jd_calendar(pcal) - jm<-.jcall( + nonworking = c(6, 7), + type = c("Skip", "All", "NextWorkingDay", "PreviousWorkingDay"), + single = FALSE) { + type <- match.arg(type) + pcal <- .r2p_calendar(calendar) + jcal <- .p2jd_calendar(pcal) + jm <- .jcall( obj = "jdplus/toolkit/base/r/calendar/Calendars", returnSig = "Ljdplus/toolkit/base/api/math/matrices/Matrix;", method = "holidays", @@ -432,24 +449,28 @@ holidays <- function(calendar, #' @export #' @examples #' BE <- national_calendar(list( -#' fixed_day(7,21), -#' special_day("NEWYEAR"), -#' special_day("CHRISTMAS"), -#' special_day("MAYDAY"), -#' special_day("EASTERMONDAY"), -#' special_day("ASCENSION"), -#' special_day("WHITMONDAY"), -#' special_day("ASSUMPTION"), -#' special_day("ALLSAINTSDAY"), -#' special_day("ARMISTICE"))) -#' lt<-long_term_mean(BE,12, -#' groups = c(1,1,1,1,1,0,0), -#' holiday = 7) -long_term_mean <-function(calendar,frequency,groups=c(1,2,3,4,5,6,0), holiday=7){ - pcal<-.r2p_calendar(calendar) - jcal<-.p2jd_calendar(pcal) - jm<-.jcall("jdplus/toolkit/base/r/calendar/Calendars", "Ljdplus/toolkit/base/api/math/matrices/Matrix;", - "longTermMean", jcal, as.integer(frequency), as.integer(groups), as.integer(holiday)) +#' fixed_day(7, 21), +#' special_day("NEWYEAR"), +#' special_day("CHRISTMAS"), +#' special_day("MAYDAY"), +#' special_day("EASTERMONDAY"), +#' special_day("ASCENSION"), +#' special_day("WHITMONDAY"), +#' special_day("ASSUMPTION"), +#' special_day("ALLSAINTSDAY"), +#' special_day("ARMISTICE") +#' )) +#' lt <- long_term_mean(BE, 12, +#' groups = c(1, 1, 1, 1, 1, 0, 0), +#' holiday = 7 +#' ) +long_term_mean <- function(calendar, frequency, groups = c(1, 2, 3, 4, 5, 6, 0), holiday = 7) { + pcal <- .r2p_calendar(calendar) + jcal <- .p2jd_calendar(pcal) + jm <- .jcall( + "jdplus/toolkit/base/r/calendar/Calendars", "Ljdplus/toolkit/base/api/math/matrices/Matrix;", + "longTermMean", jcal, as.integer(frequency), as.integer(groups), as.integer(holiday) + ) res <- .jd2r_matrix(jm) return(.group_names(res, contrasts = FALSE)) } @@ -470,10 +491,10 @@ long_term_mean <-function(calendar,frequency,groups=c(1,2,3,4,5,6,0), holiday=7) #' \url{https://jdemetra-new-documentation.netlify.app/a-calendar-correction} # #' @examples -#' #Dates from 2018(included) to 2023 (included) +#' # Dates from 2018(included) to 2023 (included) #' easter_dates(2018, 2023) -easter_dates<-function(year0, year1, julian = FALSE){ - dates<-.jcall("jdplus/toolkit/base/r/calendar/Calendars", "[S", "easter", as.integer(year0), as.integer(year1), as.logical(julian)) +easter_dates <- function(year0, year1, julian = FALSE) { + dates <- .jcall("jdplus/toolkit/base/r/calendar/Calendars", "[S", "easter", as.integer(year0), as.integer(year1), as.logical(julian)) return(sapply(dates, as.Date)) } @@ -492,71 +513,82 @@ easter_dates<-function(year0, year1, julian = FALSE){ #' More information on calendar correction in JDemetra+ online documentation: #' \url{https://jdemetra-new-documentation.netlify.app/a-calendar-correction} #' @export -stock_td<-function(frequency, start, length, s, w = 31){ +stock_td <- function(frequency, start, length, s, w = 31) { if (!missing(s) && is.ts(s)) { frequency <- stats::frequency(s) start <- stats::start(s) length <- .length_ts(s) } jdom <- .r2jd_tsdomain(frequency, start[1], start[2], length) - jm<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "Ljdplus/toolkit/base/api/math/matrices/Matrix;", "stockTradingDays", jdom, as.integer(w)) + jm <- .jcall("jdplus/toolkit/base/r/modelling/Variables", "Ljdplus/toolkit/base/api/math/matrices/Matrix;", "stockTradingDays", jdom, as.integer(w)) data <- .jd2r_matrix(jm) colnames(data) <- c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday") - return(ts(data, frequency = frequency, start= start)) + return(ts(data, frequency = frequency, start = start)) } -.r2p_holiday<-function(r){ - if (is(r, SPECIALDAY)){return(.r2p_specialday(r))} - if (is(r, FIXEDDAY)){return(.r2p_fixedday(r))} - if (is(r, EASTERDAY)){return(.r2p_easterday(r))} - if (is(r, FIXEDWEEKDAY)){return(.r2p_fixedweekday(r))} - if (is(r, SINGLEDAY)){return(.r2p_singleday(r))} +.r2p_holiday <- function(r) { + if (is(r, SPECIALDAY)) { + return(.r2p_specialday(r)) + } + if (is(r, FIXEDDAY)) { + return(.r2p_fixedday(r)) + } + if (is(r, EASTERDAY)) { + return(.r2p_easterday(r)) + } + if (is(r, FIXEDWEEKDAY)) { + return(.r2p_fixedweekday(r)) + } + if (is(r, SINGLEDAY)) { + return(.r2p_singleday(r)) + } return(NULL) } -.p2r_calendar<-function(p){ +.p2r_calendar <- function(p) { return(structure( - list(days=c(lapply(p$fixed_days, function(z) .p2r_fixedday(z)), - lapply(p$fixed_week_days, function(z) .p2r_fixedweekday(z)), - lapply(p$easter_related_days, function(z) .p2r_easterday(z)), - lapply(p$prespecified_holidays, function(z) .p2r_specialday(z)), - lapply(p$single_dates, function(z) .p2r_singleday(z)), - mean_correction=p$mean_correction)), - class=c('JD3_CALENDAR', 'JD3_CALENDARDEFINITION') + list(days = c(lapply(p$fixed_days, function(z) .p2r_fixedday(z)), + lapply(p$fixed_week_days, function(z) .p2r_fixedweekday(z)), + lapply(p$easter_related_days, function(z) .p2r_easterday(z)), + lapply(p$prespecified_holidays, function(z) .p2r_specialday(z)), + lapply(p$single_dates, function(z) .p2r_singleday(z)), + mean_correction = p$mean_correction + )), + class = c("JD3_CALENDAR", "JD3_CALENDARDEFINITION") )) } #' @export #' @rdname jd3_utilities -.r2p_calendar<-function(r){ - p<-jd3.Calendar$new() - if (length(r$days)>0){ - #select fixed days - sel<-which(sapply(r$days,function(z) is(z, FIXEDDAY))) - p$fixed_days<-lapply(r$days[sel], function(z) .r2p_fixedday(z)) - #select fixed week days - sel<-which(sapply(r$days,function(z) is(z, FIXEDWEEKDAY))) - p$fixed_week_days<-lapply(r$days[sel], function(z) .r2p_fixedweekday(z)) +.r2p_calendar <- function(r) { + p <- jd3.Calendar$new() + if (length(r$days) > 0) { + # select fixed days + sel <- which(sapply(r$days, function(z) is(z, FIXEDDAY))) + p$fixed_days <- lapply(r$days[sel], function(z) .r2p_fixedday(z)) + # select fixed week days + sel <- which(sapply(r$days, function(z) is(z, FIXEDWEEKDAY))) + p$fixed_week_days <- lapply(r$days[sel], function(z) .r2p_fixedweekday(z)) # select easter days - sel<-which(sapply(r$days,function(z) is(z, EASTERDAY))) - p$easter_related_days<-lapply(r$days[sel], function(z) .r2p_easterday(z)) + sel <- which(sapply(r$days, function(z) is(z, EASTERDAY))) + p$easter_related_days <- lapply(r$days[sel], function(z) .r2p_easterday(z)) # select special days - sel<-which(sapply(r$days,function(z) is(z, SPECIALDAY))) - p$prespecified_holidays<-lapply(r$days[sel], function(z) .r2p_specialday(z)) + sel <- which(sapply(r$days, function(z) is(z, SPECIALDAY))) + p$prespecified_holidays <- lapply(r$days[sel], function(z) .r2p_specialday(z)) # select single days - sel<-which(sapply(r$days,function(z) is(z, SINGLEDAY))) - p$single_dates<-lapply(r$days[sel], function(z) .r2p_singleday(z)) + sel <- which(sapply(r$days, function(z) is(z, SINGLEDAY))) + p$single_dates <- lapply(r$days[sel], function(z) .r2p_singleday(z)) } - p$mean_correction<-r$mean_correction + p$mean_correction <- r$mean_correction return(p) } #' Create a Chained Calendar #' -#'@description -#'Allows to combine two calendars, one before and one after a given date. +#' @description +#' Allows to combine two calendars, one before and one after a given date. #' -#'@details +#' @details #' A chained calendar is an useful option when major changes in the composition of the holidays take place. #' In such a case two calendars describing the situation before and after the change of regime can be defined #' and bound together, one before the break and one after the break. @@ -569,28 +601,28 @@ stock_td<-function(frequency, start, length, s, w = 31){ #' More information on calendar correction in JDemetra+ online documentation: #' \url{https://jdemetra-new-documentation.netlify.app/a-calendar-correction} #' @examples -#' Belgium <- national_calendar(list(special_day("NEWYEAR"),fixed_day(7,21))) -#' France <- national_calendar(list(special_day("NEWYEAR"),fixed_day(7,14))) -#' chained_cal<-chained_calendar(France, Belgium, "2000-01-01") +#' Belgium <- national_calendar(list(special_day("NEWYEAR"), fixed_day(7, 21))) +#' France <- national_calendar(list(special_day("NEWYEAR"), fixed_day(7, 14))) +#' chained_cal <- chained_calendar(France, Belgium, "2000-01-01") #' #' @export -chained_calendar<-function(calendar1, calendar2, break_date){ +chained_calendar <- function(calendar1, calendar2, break_date) { return(structure(list( - calendar1=calendar1, - calendar2=calendar2, - break_date=break_date - ), class=c('JD3_CHAINEDCALENDAR', 'JD3_CALENDARDEFINITION'))) + calendar1 = calendar1, + calendar2 = calendar2, + break_date = break_date + ), class = c("JD3_CHAINEDCALENDAR", "JD3_CALENDARDEFINITION"))) } -.p2r_chainedcalendar<-function(p){ +.p2r_chainedcalendar <- function(p) { return(chained_calendar(p$calendar1, p$calendar2, .p2r_date(p$break_date))) } -.r2p_chainedcalendar<-function(r){ - pc<-jd3.ChainedCalendar$new() - pc$calendar1<-.r2p_calendardef(r$calendar1) - pc$calendar2<-.r2p_calendardef(r$calendar2) - pc$break_date<-parseDate(r$break_date) +.r2p_chainedcalendar <- function(r) { + pc <- jd3.ChainedCalendar$new() + pc$calendar1 <- .r2p_calendardef(r$calendar1) + pc$calendar2 <- .r2p_calendardef(r$calendar2) + pc$break_date <- parseDate(r$break_date) return(pc) } @@ -614,44 +646,59 @@ chained_calendar<-function(calendar1, calendar2, break_date){ #' \url{https://jdemetra-new-documentation.netlify.app/a-calendar-correction} #' @export #' @examples -#' Belgium <- national_calendar(list(special_day("NEWYEAR"),fixed_day(7,21))) -#' France <- national_calendar(list(special_day("NEWYEAR"),fixed_day(7,14))) -#' composite_calendar<- weighted_calendar(list(France,Belgium), weights = c(1,2)) -weighted_calendar<-function(calendars, weights){ +#' Belgium <- national_calendar(list(special_day("NEWYEAR"), fixed_day(7, 21))) +#' France <- national_calendar(list(special_day("NEWYEAR"), fixed_day(7, 14))) +#' composite_calendar <- weighted_calendar(list(France, Belgium), weights = c(1, 2)) +weighted_calendar <- function(calendars, weights) { # checkmate::assertNames(calendars) checkmate::assertNumeric(weights) if (length(calendars) != length(weights)) stop("Calendars and weights should have the same length") - return(structure(list(calendars=calendars, weights=weights), class=c('JD3_WEIGHTEDCALENDAR', 'JD3_CALENDARDEFINITION'))) + return(structure(list(calendars = calendars, weights = weights), class = c("JD3_WEIGHTEDCALENDAR", "JD3_CALENDARDEFINITION"))) } -.p2r_wcalendar<-function(p){ - calendars<-sapply(p, function(item){return(item$calendar)}) - weights<-sapply(p, function(item){return(item$weights)}) +.p2r_wcalendar <- function(p) { + calendars <- sapply(p, function(item) { + return(item$calendar) + }) + weights <- sapply(p, function(item) { + return(item$weights) + }) return(weighted_calendar(calendars, weights)) - } -.r2p_wcalendar<-function(r){ - pwc<-jd3.WeightedCalendar$new() - n<-length(r$calendars) - pwc$items<-lapply(1:n, function(i){return(list(calendar=r$calendars[[i]], weight=r$weights[i]))}) +.r2p_wcalendar <- function(r) { + pwc <- jd3.WeightedCalendar$new() + n <- length(r$calendars) + pwc$items <- lapply(1:n, function(i) { + return(list(calendar = r$calendars[[i]], weight = r$weights[i])) + }) pwc } -.p2r_calendardef<-function(p){ - if (p$has('calendar')) return(.p2r_calendar(p$calendar)) - if (p$has('chained_calendar')) return(.p2r_chainedcalendar(p$chained_calendar)) - if (p$has('weighted_calendar')) return(.p2r_wcalendar(p$weighted_calendar)) +.p2r_calendardef <- function(p) { + if (p$has("calendar")) { + return(.p2r_calendar(p$calendar)) + } + if (p$has("chained_calendar")) { + return(.p2r_chainedcalendar(p$chained_calendar)) + } + if (p$has("weighted_calendar")) { + return(.p2r_wcalendar(p$weighted_calendar)) + } return(NULL) } -.r2p_calendardef<-function(r){ - p<-jd3.CalendarDefinition$new() - if (is(r, 'JD3_CALENDAR')){p$calendar<-.r2p_calendar(r)} - else if (is(r, 'JD3_CHAINEDCALENDAR')){p$chained_calendar<-.r2p_chainedcalendar(r)} - else if (is(r, 'JD3_WEIGHTEDCALENDAR')){p$weighted_calendar<-.r2p_wcalendar(r)} +.r2p_calendardef <- function(r) { + p <- jd3.CalendarDefinition$new() + if (is(r, "JD3_CALENDAR")) { + p$calendar <- .r2p_calendar(r) + } else if (is(r, "JD3_CHAINEDCALENDAR")) { + p$chained_calendar <- .r2p_chainedcalendar(r) + } else if (is(r, "JD3_WEIGHTEDCALENDAR")) { + p$weighted_calendar <- .r2p_wcalendar(r) + } return(p) } @@ -659,9 +706,9 @@ weighted_calendar<-function(calendars, weights){ #' Create a National Calendar #' #' @description -#'Will create a calendar as a list of days corresponding to the required holidays. -#'The holidays have to be generated by one of these functions: `fixed_day()`, -#'`fixed_week_day()`, `easter_day()`, `special_day()` or `single_day()`. +#' Will create a calendar as a list of days corresponding to the required holidays. +#' The holidays have to be generated by one of these functions: `fixed_day()`, +#' `fixed_week_day()`, `easter_day()`, `special_day()` or `single_day()`. #' #' #' @param days list of holidays to be taken into account in the calendar @@ -669,32 +716,35 @@ weighted_calendar<-function(calendars, weights){ #' contain long term mean corrections (default). FALSE otherwise. #' #' @examples -#' #Fictional calendar using all possibilities to set the required holidays +#' # Fictional calendar using all possibilities to set the required holidays #' MyCalendar <- national_calendar(list( -#' fixed_day(7,21), -#' special_day("NEWYEAR"), -#' special_day("CHRISTMAS"), -#' fixed_week_day(7, 2, 3), # second Wednesday of July -#' special_day("MAYDAY"), -#' easter_day(1), # Easter Monday -#' easter_day(-2), # Good Friday -#' single_day("2001-09-11"), # appearing once -#' special_day("ASCENSION"), -#' easter_day(offset=60, julian=FALSE, weight=0.5, -#' validity = list(start="2000-01-01", end = "2020-12-01")), # Corpus Christi -#' special_day("WHITMONDAY"), -#' special_day("ASSUMPTION"), -#' special_day("ALLSAINTSDAY"), -#' special_day("ARMISTICE"))) +#' fixed_day(7, 21), +#' special_day("NEWYEAR"), +#' special_day("CHRISTMAS"), +#' fixed_week_day(7, 2, 3), # second Wednesday of July +#' special_day("MAYDAY"), +#' easter_day(1), # Easter Monday +#' easter_day(-2), # Good Friday +#' single_day("2001-09-11"), # appearing once +#' special_day("ASCENSION"), +#' easter_day( +#' offset = 60, julian = FALSE, weight = 0.5, +#' validity = list(start = "2000-01-01", end = "2020-12-01") +#' ), # Corpus Christi +#' special_day("WHITMONDAY"), +#' special_day("ASSUMPTION"), +#' special_day("ALLSAINTSDAY"), +#' special_day("ARMISTICE") +#' )) #' @return returns an object of class \code{c("JD3_CALENDAR","JD3_CALENDARDEFINITION")} #' @seealso \code{\link{chained_calendar}}, \code{\link{weighted_calendar}} #' @references #' More information on calendar correction in JDemetra+ online documentation: #' \url{https://jdemetra-new-documentation.netlify.app/} #' @export -national_calendar <- function(days, mean_correction=TRUE){ - if (! is.list(days)) stop('Days should be a list of holidays') - return(structure(list(days=days, mean_correction=mean_correction), class=c('JD3_CALENDAR', 'JD3_CALENDARDEFINITION'))) +national_calendar <- function(days, mean_correction = TRUE) { + if (!is.list(days)) stop("Days should be a list of holidays") + return(structure(list(days = days, mean_correction = mean_correction), class = c("JD3_CALENDAR", "JD3_CALENDARDEFINITION"))) } #' @title Trading day regressors with pre-defined holidays @@ -719,7 +769,7 @@ national_calendar <- function(days, mean_correction=TRUE){ #' @export #' @examples #' BE <- national_calendar(list( -#' fixed_day(7,21), +#' fixed_day(7, 21), #' special_day("NEWYEAR"), #' special_day("CHRISTMAS"), #' special_day("MAYDAY"), @@ -728,25 +778,30 @@ national_calendar <- function(days, mean_correction=TRUE){ #' special_day("WHITMONDAY"), #' special_day("ASSUMPTION"), #' special_day("ALLSAINTSDAY"), -#' special_day("ARMISTICE"))) -#' calendar_td(BE, 12, c(1980,1), 240, holiday=7, groups=c(1,1,1,2,2,3,0), -#' contrasts = FALSE) +#' special_day("ARMISTICE") +#' )) +#' calendar_td(BE, 12, c(1980, 1), 240, +#' holiday = 7, groups = c(1, 1, 1, 2, 2, 3, 0), +#' contrasts = FALSE +#' ) #' @seealso \code{\link{national_calendar}}, \code{\link{td}} #' @references #' More information on calendar correction in JDemetra+ online documentation: #' \url{https://jdemetra-new-documentation.netlify.app/} -calendar_td<-function(calendar,frequency, start, length, s, groups=c(1,2,3,4,5,6,0), holiday=7, contrasts=TRUE){ - if (! is(calendar, 'JD3_CALENDAR')) stop('Invalid calendar') +calendar_td <- function(calendar, frequency, start, length, s, groups = c(1, 2, 3, 4, 5, 6, 0), holiday = 7, contrasts = TRUE) { + if (!is(calendar, "JD3_CALENDAR")) stop("Invalid calendar") if (!missing(s) && is.ts(s)) { frequency <- stats::frequency(s) start <- stats::start(s) length <- .length_ts(s) } - jdom<-.r2jd_tsdomain(frequency, start[1], start[2], length) - pcal<-.r2p_calendar(calendar) - jcal<-.p2jd_calendar(pcal) - jm<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "Ljdplus/toolkit/base/api/math/matrices/Matrix;", - "htd", jcal, jdom, as.integer(groups), as.integer(holiday), contrasts) + jdom <- .r2jd_tsdomain(frequency, start[1], start[2], length) + pcal <- .r2p_calendar(calendar) + jcal <- .p2jd_calendar(pcal) + jm <- .jcall( + "jdplus/toolkit/base/r/modelling/Variables", "Ljdplus/toolkit/base/api/math/matrices/Matrix;", + "htd", jcal, jdom, as.integer(groups), as.integer(holiday), contrasts + ) output <- .jd2r_matrix(jm) output <- .group_names(output, contrasts = contrasts) return(ts(output, start = start, frequency = frequency)) @@ -763,52 +818,55 @@ NULL #' @export #' @rdname print.calendars -print.JD3_FIXEDDAY<-function(x, ...){ - cat('Fixed day: month=', x$month, ', day=', x$day, sep='') +print.JD3_FIXEDDAY <- function(x, ...) { + cat("Fixed day: month=", x$month, ", day=", x$day, sep = "") .print_weight(x) .print_validityperiod(x) } .print_weight <- function(x, ...) { - if (x$weight != 1) - cat(' , weight=', x$weight, sep='') + if (x$weight != 1) { + cat(" , weight=", x$weight, sep = "") + } } .print_validityperiod <- function(x, ...) { - if (!is.null(x$validity$start)) - cat(sprintf(' , from=%s', x$validity$start)) - if (!is.null(x$validity$end)) - cat(sprintf(' , to=%s', x$validity$end)) + if (!is.null(x$validity$start)) { + cat(sprintf(" , from=%s", x$validity$start)) + } + if (!is.null(x$validity$end)) { + cat(sprintf(" , to=%s", x$validity$end)) + } } -DAYS<-c('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday') +DAYS <- c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday") #' @export #' @rdname print.calendars -print.JD3_FIXEDWEEKDAY<-function(x, ...){ - cat('Fixed week day: month=', x$month, ', day of the week=', DAYS[x$dayofweek], ', week=', x$week, sep='') +print.JD3_FIXEDWEEKDAY <- function(x, ...) { + cat("Fixed week day: month=", x$month, ", day of the week=", DAYS[x$dayofweek], ", week=", x$week, sep = "") .print_weight(x) .print_validityperiod(x) } #' @export #' @rdname print.calendars -print.JD3_EASTERDAY<-function(x, ...){ - cat('Easter related day: offset=', x$offset, sep='') +print.JD3_EASTERDAY <- function(x, ...) { + cat("Easter related day: offset=", x$offset, sep = "") .print_weight(x) .print_validityperiod(x) } #' @export #' @rdname print.calendars -print.JD3_SPECIALDAY<-function(x, ...){ - cat('Prespecified holiday: event=', x$event, sep='') - if (x$offset != 0)cat(' , offset=', x$offset, sep='') +print.JD3_SPECIALDAY <- function(x, ...) { + cat("Prespecified holiday: event=", x$event, sep = "") + if (x$offset != 0) cat(" , offset=", x$offset, sep = "") .print_weight(x) .print_validityperiod(x) } #' @export #' @rdname print.calendars -print.JD3_SINGLEDAY<-function(x, ...){ - cat('Single date: ', x$date, sep='') +print.JD3_SINGLEDAY <- function(x, ...) { + cat("Single date: ", x$date, sep = "") .print_weight(x) } @@ -819,7 +877,7 @@ print.JD3_CALENDAR <- function(x, ...) { for (day in x$day) { cat("\t- ") print(day) - cat('\n') + cat("\n") } cat("\nMean correction: ", ifelse(x$mean_correction, "Yes", "No"), "\n", sep = "") @@ -827,8 +885,7 @@ print.JD3_CALENDAR <- function(x, ...) { } #' @export -print.JD3_CHAINEDCALENDAR <- function(x, ...) -{ +print.JD3_CHAINEDCALENDAR <- function(x, ...) { cat("First calendar before ", x$break_date, "\n", sep = "") print(x$calendar1) @@ -841,8 +898,7 @@ print.JD3_CHAINEDCALENDAR <- function(x, ...) } #' @export -print.JD3_WEIGHTEDCALENDAR <- function(x, ...) -{ +print.JD3_WEIGHTEDCALENDAR <- function(x, ...) { for (index_cal in seq_along(x$weights)) { cat("Calendar n", index_cal, "\n", sep = "") cat("weight: ", x$weight[index_cal], "\n", sep = "") diff --git a/R/calendarts.R b/R/calendarts.R index 03a8448..6c972d6 100644 --- a/R/calendarts.R +++ b/R/calendarts.R @@ -5,19 +5,27 @@ #' @export #' #' @examples -#' obs<-list( -#' list(start=as.Date("1980-01-01"), end=as.Date("1999-12-31"), value=2000), -#' list(start=as.Date("2000-01-01"), end=as.Date("2010-01-01"), value=1000) +#' obs <- list( +#' list(start = as.Date("1980-01-01"), end = as.Date("1999-12-31"), value = 2000), +#' list(start = as.Date("2000-01-01"), end = as.Date("2010-01-01"), value = 1000) #' ) -#' jobj<-r2jd_calendarts(obs) -r2jd_calendarts<-function(calendarobs){ - if (is.null(calendarobs) || !is.list(calendarobs)){ +#' jobj <- r2jd_calendarts(obs) +r2jd_calendarts <- function(calendarobs) { + if (is.null(calendarobs) || !is.list(calendarobs)) { return(NULL) } - starts<-sapply(calendarobs, function(z){as.character(z$start)}) - ends<-sapply(calendarobs, function(z){as.character(z$end)}) - values<-sapply(calendarobs, function(z){as.numeric(z$value)}) - jts<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/CalendarTimeSeries;", "of", - .jarray(starts, "Ljava/lang/String;"), .jarray(ends, "Ljava/lang/String;"), .jarray(values)) + starts <- sapply(calendarobs, function(z) { + as.character(z$start) + }) + ends <- sapply(calendarobs, function(z) { + as.character(z$end) + }) + values <- sapply(calendarobs, function(z) { + as.numeric(z$value) + }) + jts <- .jcall( + "jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/CalendarTimeSeries;", "of", + .jarray(starts, "Ljava/lang/String;"), .jarray(ends, "Ljava/lang/String;"), .jarray(values) + ) return(jts) } diff --git a/R/decomposition.R b/R/decomposition.R index 261002d..28fe028 100644 --- a/R/decomposition.R +++ b/R/decomposition.R @@ -6,56 +6,58 @@ NULL #' @rdname sa_decomposition #' @export -sadecomposition<-function(y, sa, t, s, i, mul){ - if (! is.logical(mul))stop("Invalid SA decomposition") - if (is.null(y))stop("Invalid SA decomposition") - if (! is.ts(y))stop("Invalid SA decomposition") - n<-length(y) - if (is.null(s)){ - if (mul){ - s<-ts(rep(1,1,n), start = start(y), frequency = frequency(y)) +sadecomposition <- function(y, sa, t, s, i, mul) { + if (!is.logical(mul)) stop("Invalid SA decomposition") + if (is.null(y)) stop("Invalid SA decomposition") + if (!is.ts(y)) stop("Invalid SA decomposition") + n <- length(y) + if (is.null(s)) { + if (mul) { + s <- ts(rep(1, 1, n), start = start(y), frequency = frequency(y)) } else { - s <- ts(rep(0,1,n), start = start(y), frequency = frequency(y)) + s <- ts(rep(0, 1, n), start = start(y), frequency = frequency(y)) } - } else if (! is.ts(s))stop("Invalid SA decomposition") - if (is.null(i)){ - if (mul){ - i<-ts(rep(1,1,n), start = start(y), frequency = frequency(y)) + } else if (!is.ts(s)) stop("Invalid SA decomposition") + if (is.null(i)) { + if (mul) { + i <- ts(rep(1, 1, n), start = start(y), frequency = frequency(y)) } else { - i<-ts(rep(0,1,n), start = start(y), frequency = frequency(y)) + i <- ts(rep(0, 1, n), start = start(y), frequency = frequency(y)) } - } else if (! is.ts(i))stop("Invalid SA decomposition") + } else if (!is.ts(i)) stop("Invalid SA decomposition") - if (! is.ts(sa))stop("Invalid SA decomposition") - if (! is.ts(t))stop("Invalid SA decomposition") + if (!is.ts(sa)) stop("Invalid SA decomposition") + if (!is.ts(t)) stop("Invalid SA decomposition") - return(structure(list(series=y, sa=sa, trend=t, seas=s, irr=i, multiplicative=mul), class=c("JD3_SADECOMPOSITION", "JD3"))) + return(structure(list(series = y, sa = sa, trend = t, seas = s, irr = i, multiplicative = mul), class = c("JD3_SADECOMPOSITION", "JD3"))) } #' @rdname sa_decomposition #' @export -print.JD3_SADECOMPOSITION<-function(x, n_last_obs = frequency(x$series), ...){ +print.JD3_SADECOMPOSITION <- function(x, n_last_obs = frequency(x$series), ...) { cat("Last values\n") print(tail( - .preformat.ts(ts.union(series=x$series,sa=x$sa,trend=x$trend,seas=x$seas,irr=x$irr),...), + .preformat.ts(ts.union(series = x$series, sa = x$sa, trend = x$trend, seas = x$seas, irr = x$irr), ...), n_last_obs - ) - ) + )) } #' @rdname sa_decomposition #' @export plot.JD3_SADECOMPOSITION <- function(x, first_date = NULL, last_date = NULL, type_chart = c("sa-trend", "seas-irr"), - caption = c("sa-trend" = "Y, Sa, trend", - "seas-irr" = "Sea., irr.")[type_chart], - colors = c(y = "#F0B400", t = "#1E6C0B", sa = "#155692", - s = "#1E6C0B", i = "#155692"), - ...){ - + caption = c( + "sa-trend" = "Y, Sa, trend", + "seas-irr" = "Sea., irr." + )[type_chart], + colors = c( + y = "#F0B400", t = "#1E6C0B", sa = "#155692", + s = "#1E6C0B", i = "#155692" + ), + ...) { type_chart <- match.arg(type_chart) - data_plot <- ts.union(y=x$series,sa=x$sa,t=x$trend,s=x$seas,i=x$irr) + data_plot <- ts.union(y = x$series, sa = x$sa, t = x$trend, s = x$seas, i = x$irr) if (!missing(first_date)) { data_plot <- window(data_plot, start = first_date) } @@ -73,13 +75,16 @@ plot.JD3_SADECOMPOSITION <- function(x, first_date = NULL, last_date = NULL, # col <- colors[gsub("_.*$", "", series_graph)] # par(mar = c(5, 4, 4, 2) + 0.1) ts.plot(data_plot[, series_graph], - col = colors[series_graph], - main = caption[1], lty = lty, - ...) - legend("bottomleft", legend = c("Series", "Trend","Seasonally adjusted"), - col = colors[series_graph], lty = 1, - pch = NA_integer_, - inset = c(0,1), xpd = TRUE, bty = "n") + col = colors[series_graph], + main = caption[1], lty = lty, + ... + ) + legend("bottomleft", + legend = c("Series", "Trend", "Seasonally adjusted"), + col = colors[series_graph], lty = 1, + pch = NA_integer_, + inset = c(0, 1), xpd = TRUE, bty = "n" + ) } if ("seas-irr" %in% type_chart) { @@ -89,14 +94,19 @@ plot.JD3_SADECOMPOSITION <- function(x, first_date = NULL, last_date = NULL, # lty[grep("_f$", series_graph, invert = TRUE)] <- 1 # col <- colors[gsub("_.*$", "", series_graph)] ts.plot(data_plot[, series_graph], - col = colors[series_graph], - main = caption[1], lty = lty, - ...) - legend("bottomleft", legend = c("Seas (component)", - "Irregular"), - col= colors[series_graph], lty = 1, - pch = NA_integer_, - inset=c(0,1), xpd=TRUE, bty="n") + col = colors[series_graph], + main = caption[1], lty = lty, + ... + ) + legend("bottomleft", + legend = c( + "Seas (component)", + "Irregular" + ), + col = colors[series_graph], lty = 1, + pch = NA_integer_, + inset = c(0, 1), xpd = TRUE, bty = "n" + ) } invisible() diff --git a/R/differencing.R b/R/differencing.R index 3d4a281..e592a25 100644 --- a/R/differencing.R +++ b/R/differencing.R @@ -1,15 +1,19 @@ #' @include protobuf.R jd2r.R NULL -.p2r_differencing<-function(p){ - if (is.null(p)){ +.p2r_differencing <- function(p) { + if (is.null(p)) { return(NULL) } else { - del<-sapply(p$differences, function(z){(return(c(z$lag,z$order)))}) - del<-`rownames<-`(del, c("lag", "order")) - return(list(ddata=p$stationary_series, - mean=p$mean_correction, - differences=del)) + del <- sapply(p$differences, function(z) { + (return(c(z$lag, z$order))) + }) + del <- `rownames<-`(del, c("lag", "order")) + return(list( + ddata = p$stationary_series, + mean = p$mean_correction, + differences = del + )) } } @@ -33,17 +37,21 @@ NULL #' @export #' #' @examples -#' do_stationary(log(ABS$X0.2.09.10.M),12) -do_stationary<-function(data, period){ - if (is.ts(data) && missing(period)) +#' do_stationary(log(ABS$X0.2.09.10.M), 12) +do_stationary <- function(data, period) { + if (is.ts(data) && missing(period)) { period <- frequency(data) - jst<-.jcall("jdplus/toolkit/base/r/modelling/Differencing", "Ljdplus/toolkit/base/core/modelling/StationaryTransformation;", "doStationary", - as.numeric(data), as.integer(period)) - q<-.jcall("jdplus/toolkit/base/r/modelling/Differencing", "[B", "toBuffer", jst) - p<-RProtoBuf::read(modelling.StationaryTransformation, q) + } + jst <- .jcall( + "jdplus/toolkit/base/r/modelling/Differencing", "Ljdplus/toolkit/base/core/modelling/StationaryTransformation;", "doStationary", + as.numeric(data), as.integer(period) + ) + q <- .jcall("jdplus/toolkit/base/r/modelling/Differencing", "[B", "toBuffer", jst) + p <- RProtoBuf::read(modelling.StationaryTransformation, q) res <- .p2r_differencing(p) - if (is.ts(data)) + if (is.ts(data)) { res$ddata <- ts(res$ddata, end = end(data), frequency = frequency(data)) + } return(res) } @@ -67,18 +75,22 @@ do_stationary<-function(data, period){ #' @export #' #' @examples -#' differencing_fast(log(ABS$X0.2.09.10.M),12) +#' differencing_fast(log(ABS$X0.2.09.10.M), 12) #' -differencing_fast<-function(data, period, mad=TRUE, centile=90, k=1.2){ - if (is.ts(data) && missing(period)) +differencing_fast <- function(data, period, mad = TRUE, centile = 90, k = 1.2) { + if (is.ts(data) && missing(period)) { period <- frequency(data) - jst<-.jcall("jdplus/toolkit/base/r/modelling/Differencing", "Ljdplus/toolkit/base/core/modelling/StationaryTransformation;", "fastDifferencing", - as.numeric(data), as.integer(period), as.logical(mad), centile, k) - q<-.jcall("jdplus/toolkit/base/r/modelling/Differencing", "[B", "toBuffer", jst) - p<-RProtoBuf::read(modelling.StationaryTransformation, q) + } + jst <- .jcall( + "jdplus/toolkit/base/r/modelling/Differencing", "Ljdplus/toolkit/base/core/modelling/StationaryTransformation;", "fastDifferencing", + as.numeric(data), as.integer(period), as.logical(mad), centile, k + ) + q <- .jcall("jdplus/toolkit/base/r/modelling/Differencing", "[B", "toBuffer", jst) + p <- RProtoBuf::read(modelling.StationaryTransformation, q) res <- .p2r_differencing(p) - if (is.ts(data)) + if (is.ts(data)) { res$ddata <- ts(res$ddata, end = end(data), frequency = frequency(data)) + } return(res) } @@ -92,32 +104,35 @@ differencing_fast<-function(data, period, mad=TRUE, centile=90, k=1.2){ #' @export #' #' @examples -#' differences(retail$BookStores, c(1,1,12), FALSE) +#' differences(retail$BookStores, c(1, 1, 12), FALSE) #' -differences<-function(data, lags=1, mean=TRUE){ +differences <- function(data, lags = 1, mean = TRUE) { UseMethod("differences", data) } #' @export -differences.default<-function(data, lags=1, mean=TRUE){ - res <- .jcall("jdplus/toolkit/base/r/modelling/Differencing", "[D", "differences", - as.numeric(data), .jarray(as.integer(lags)), mean) - if (is.ts(data)) +differences.default <- function(data, lags = 1, mean = TRUE) { + res <- .jcall( + "jdplus/toolkit/base/r/modelling/Differencing", "[D", "differences", + as.numeric(data), .jarray(as.integer(lags)), mean + ) + if (is.ts(data)) { res <- ts(res, end = end(data), frequency = frequency(data)) + } return(res) } #' @export -differences.matrix<-function(data, lags=1, mean=TRUE){ - result <- data[-(1:sum(lags)),] - for (i in seq_len(ncol(data))){ - result[, i] <- differences(data[,i], lags = lags, mean = mean) +differences.matrix <- function(data, lags = 1, mean = TRUE) { + result <- data[-(1:sum(lags)), ] + for (i in seq_len(ncol(data))) { + result[, i] <- differences(data[, i], lags = lags, mean = mean) } result } #' @export -differences.data.frame<-function(data, lags=1, mean=TRUE){ - result <- data[-(1:sum(lags)),] - for (i in seq_len(ncol(data))){ - result[, i] <- differences(data[,i], lags = lags, mean = mean) +differences.data.frame <- function(data, lags = 1, mean = TRUE) { + result <- data[-(1:sum(lags)), ] + for (i in seq_len(ncol(data))) { + result[, i] <- differences(data[, i], lags = lags, mean = mean) } result } @@ -159,26 +174,28 @@ differences.data.frame<-function(data, lags=1, mean=TRUE){ #' @return T-Stat of the slope of the range-mean regression. #' #' @examples -#' y = ABS$X0.2.09.10.M +#' y <- ABS$X0.2.09.10.M #' # Multiplicative pattern #' plot(y) -#' period = 12 -#' rm_t = rangemean_tstat(y, period = period, groupsize = period) +#' period <- 12 +#' rm_t <- rangemean_tstat(y, period = period, groupsize = period) #' rm_t # higher than 0 #' # Can be tested: #' pt(rm_t, period - 2, lower.tail = FALSE) #' # Or : -#' 1-cdf_t(period-2, rm_t) +#' 1 - cdf_t(period - 2, rm_t) #' #' # Close to 0 -#' rm_t_log = rangemean_tstat(log(y), period = period, groupsize = period) +#' rm_t_log <- rangemean_tstat(log(y), period = period, groupsize = period) #' rm_t_log #' pt(rm_t_log, period - 2, lower.tail = FALSE) #' @export -rangemean_tstat<-function(data, period=0, groupsize = 0, trim = 0){ - if (is.ts(data) && missing(period)) +rangemean_tstat <- function(data, period = 0, groupsize = 0, trim = 0) { + if (is.ts(data) && missing(period)) { period <- frequency(data) - return(.jcall("jdplus/toolkit/base/r/modelling/AutoModelling", "D", "rangeMean", - as.numeric(data), as.integer(period), as.integer(groupsize), as.integer(trim))) - + } + return(.jcall( + "jdplus/toolkit/base/r/modelling/AutoModelling", "D", "rangeMean", + as.numeric(data), as.integer(period), as.integer(groupsize), as.integer(trim) + )) } diff --git a/R/display.R b/R/display.R index 9113282..15518e5 100644 --- a/R/display.R +++ b/R/display.R @@ -14,13 +14,13 @@ NULL #' @name jd3_print #' @rdname jd3_print #' @export -print.JD3_ARIMA<-function(x, ...){ +print.JD3_ARIMA <- function(x, ...) { m <- x - if (m$var > 0 || length(m$delta)>1){ + if (m$var > 0 || length(m$delta) > 1) { cat(m$name, "\n\n") - if (length(m$ar)>1) cat("AR:", m$ar, "\n") - if (length(m$delta)>1)cat("DIF:", m$delta, "\n") - if (length(m$ma)>1)cat("MA:", m$ma, "\n") + if (length(m$ar) > 1) cat("AR:", m$ar, "\n") + if (length(m$delta) > 1) cat("DIF:", m$delta, "\n") + if (length(m$ma) > 1) cat("MA:", m$ma, "\n") cat("var: ", m$var, "\n\n") } invisible(x) @@ -29,44 +29,49 @@ print.JD3_ARIMA<-function(x, ...){ #' @rdname jd3_print #' @export -print.JD3_UCARIMA<-function(x,...){ +print.JD3_UCARIMA <- function(x, ...) { ucm <- x print(ucm$model) - lapply(ucm$components, function(z){print(z)}) + lapply(ucm$components, function(z) { + print(z) + }) invisible(x) } -.arima_node<-function(p,d,q){ - s<-paste(p,d,q,sep=',') - return(paste0('(', s, ')')) +.arima_node <- function(p, d, q) { + s <- paste(p, d, q, sep = ",") + return(paste0("(", s, ")")) } #' @rdname jd3_print #' @export -print.JD3_SARIMA<-function(x, ...){ +print.JD3_SARIMA <- function(x, ...) { m <- x cat("SARIMA model: ", .arima_node(length(m$phi), m$d, length(m$theta)), .arima_node(length(m$bphi), m$bd, length(m$btheta)), m$period, "\n") - if (length(m$phi)>0) cat("phi:", m$phi, "\n") - if (length(m$theta)>0)cat("theta:", m$theta, "\n") - if (length(m$bphi)>0) cat("bphi:", m$bphi, "\n") - if (length(m$btheta)>0)cat("btheta:", m$btheta, "\n") + if (length(m$phi) > 0) cat("phi:", m$phi, "\n") + if (length(m$theta) > 0) cat("theta:", m$theta, "\n") + if (length(m$bphi) > 0) cat("bphi:", m$bphi, "\n") + if (length(m$btheta) > 0) cat("btheta:", m$btheta, "\n") } #' @rdname jd3_print #' @export -print.JD3_SARIMA_ESTIMATION<-function(x, digits = max(3L, getOption("digits") - 3L), ...){ +print.JD3_SARIMA_ESTIMATION <- function(x, digits = max(3L, getOption("digits") - 3L), ...) { tables <- .sarima_coef_table(x, ...) orders <- tables$sarima_orders - cat("SARIMA model:", + cat( + "SARIMA model:", .arima_node(orders$p, orders$d, orders$q), - .arima_node(orders$bp, orders$bd, orders$bq)) - if (!is.null(orders$period)) # when sarima_estimate() is used + .arima_node(orders$bp, orders$bd, orders$bq) + ) + if (!is.null(orders$period)) { # when sarima_estimate() is used cat(sprintf(" [%i]", orders$period)) + } cat("\n") cat("\nSARIMA coefficients:\n") - if (is.null(tables$coef_table)){ + if (is.null(tables$coef_table)) { cat("No SARIMA variables\n") } else { coef <- tables$coef_table[, 1] @@ -77,7 +82,7 @@ print.JD3_SARIMA_ESTIMATION<-function(x, digits = max(3L, getOption("digits") - } #' @export -summary.JD3_SARIMA_ESTIMATION<-function(object, ...){ +summary.JD3_SARIMA_ESTIMATION <- function(object, ...) { tables <- .sarima_coef_table(object, ...) class(tables) <- "summary.JD3_SARIMA_ESTIMATION" tables @@ -86,100 +91,123 @@ summary.JD3_SARIMA_ESTIMATION<-function(object, ...){ #' @importFrom stats printCoefmat #' @export -print.summary.JD3_SARIMA_ESTIMATION<-function(x, digits = max(3L, getOption("digits") - 3L), signif.stars = getOption("show.signif.stars"), ...){ +print.summary.JD3_SARIMA_ESTIMATION <- function(x, digits = max(3L, getOption("digits") - 3L), signif.stars = getOption("show.signif.stars"), ...) { orders <- x$sarima_orders - cat("SARIMA model:", + cat( + "SARIMA model:", .arima_node(orders$p, orders$d, orders$q), - .arima_node(orders$bp, orders$bd, orders$bq)) - if (!is.null(orders$period)) # when sarima_estimate() is used + .arima_node(orders$bp, orders$bd, orders$bq) + ) + if (!is.null(orders$period)) { # when sarima_estimate() is used cat(sprintf(" [%i]", orders$period)) + } cat("\n") cat("\nCoefficients\n") - if (is.null(x$coef_table)){ + if (is.null(x$coef_table)) { cat("No SARIMA variables\n") - } else if (ncol(x$coef_table) == 2){ + } else if (ncol(x$coef_table) == 2) { print(x$coef_table, ...) } else { - printCoefmat(x$coef_table[-2], digits = digits, signif.stars = signif.stars, - na.print = "NA", ...) + printCoefmat(x$coef_table[-2], + digits = digits, signif.stars = signif.stars, + na.print = "NA", ... + ) } invisible(x) } -.sarima_coef_table <- function(x, ...){ +.sarima_coef_table <- function(x, ...) { UseMethod(".sarima_coef_table", x) } -.sarima_coef_table.default <- function(x, cov = NULL, ndf = NULL,...){ +.sarima_coef_table.default <- function(x, cov = NULL, ndf = NULL, ...) { m <- x - if (! is.null(m$phi)) p<-dim(m$phi)[2]else p<-0 - if (! is.null(m$theta)) q<-dim(m$theta)[2]else q<-0 - if (! is.null(m$bphi)) bp<-dim(m$bphi)[2]else bp<-0 - if (! is.null(m$btheta)) bq<-dim(m$btheta)[2]else bq<-0 + if (!is.null(m$phi)) p <- dim(m$phi)[2] else p <- 0 + if (!is.null(m$theta)) q <- dim(m$theta)[2] else q <- 0 + if (!is.null(m$bphi)) bp <- dim(m$bphi)[2] else bp <- 0 + if (!is.null(m$btheta)) bq <- dim(m$btheta)[2] else bq <- 0 sarima_orders <- list(p = p, d = m$d, q = q, bp = bp, bd = m$bd, bq = bq) - names<-NULL - if (p > 0){names<-c(names,paste0("phi(", 1:p, ')')) } - if (q > 0){names<-c(names,paste0("theta(", 1:q, ')')) } - if (bp > 0){names<-c(names,paste0("bphi(", 1:bp, ')')) } - if (bq > 0){names<-c(names,paste0("btheta(", 1:bq,')')) } - if (! is.null(names)){ - all<-t(cbind(m$phi, m$theta, m$bphi, m$btheta)) - fr<-as.data.frame(all, row.names = names) - for(i in colnames(fr)){ - fr[,i] <- unlist(fr[,i]) + names <- NULL + if (p > 0) { + names <- c(names, paste0("phi(", 1:p, ")")) + } + if (q > 0) { + names <- c(names, paste0("theta(", 1:q, ")")) + } + if (bp > 0) { + names <- c(names, paste0("bphi(", 1:bp, ")")) + } + if (bq > 0) { + names <- c(names, paste0("btheta(", 1:bq, ")")) + } + if (!is.null(names)) { + all <- t(cbind(m$phi, m$theta, m$bphi, m$btheta)) + fr <- as.data.frame(all, row.names = names) + for (i in colnames(fr)) { + fr[, i] <- unlist(fr[, i]) } - if (!is.null(cov) && !is.null(ndf)){ + if (!is.null(cov) && !is.null(ndf)) { fr$pvalue <- fr$t <- fr$stde <- NA - stde<-sqrt(diag(cov)) - sel<-fr$type=='ESTIMATED' - t<-fr$value[sel]/stde - pval<-2*pt(abs(t), ndf, lower.tail = FALSE) - fr$stde[sel]<-stde - fr$t[sel]<-t - fr$pvalue[sel]<-pval - colnames(fr) <- c("Estimate", "Type", "Std. Error", - "T-stat", "Pr(>|t|)") + stde <- sqrt(diag(cov)) + sel <- fr$type == "ESTIMATED" + t <- fr$value[sel] / stde + pval <- 2 * pt(abs(t), ndf, lower.tail = FALSE) + fr$stde[sel] <- stde + fr$t[sel] <- t + fr$pvalue[sel] <- pval + colnames(fr) <- c( + "Estimate", "Type", "Std. Error", + "T-stat", "Pr(>|t|)" + ) } else { colnames(fr) <- c("Estimate", "Type") } } else { fr <- NULL } - list(sarima_orders = sarima_orders, - coef_table = fr) + list( + sarima_orders = sarima_orders, + coef_table = fr + ) } -.sarima_coef_table.JD3_REGARIMA_RSLTS <- function(x, cov = NULL, ndf = NULL,...) { +.sarima_coef_table.JD3_REGARIMA_RSLTS <- function(x, cov = NULL, ndf = NULL, ...) { .sarima_coef_table(x$description$arima, cov = cov, ndf = ndf, ...) } -.sarima_coef_table.JD3_SARIMA_ESTIMATE <- function(x,...){ - ndf<-x$likelihood$neffectiveobs-x$likelihood$nparams - sarima_orders <- list(p = x$orders$order[1], - d = x$orders$order[2], - q = x$orders$order[3], - bp = x$orders$seasonal$order[1], - bd = x$orders$seasonal$order[2], - bq = x$orders$seasonal$order[3], - period = x$orders$seasonal$period) +.sarima_coef_table.JD3_SARIMA_ESTIMATE <- function(x, ...) { + ndf <- x$likelihood$neffectiveobs - x$likelihood$nparams + sarima_orders <- list( + p = x$orders$order[1], + d = x$orders$order[2], + q = x$orders$order[3], + bp = x$orders$seasonal$order[1], + bd = x$orders$seasonal$order[2], + bq = x$orders$seasonal$order[3], + period = x$orders$seasonal$period + ) estimate <- x$parameters$val - if (length(estimate) > 0){ + if (length(estimate) > 0) { stde <- sqrt(diag(x$parameters$cov)) - t<-estimate/stde - pval<-2*pt(abs(t), ndf, lower.tail = FALSE) + t <- estimate / stde + pval <- 2 * pt(abs(t), ndf, lower.tail = FALSE) table <- data.frame(estimate, "ESTIMATED", stde, t, pval) - colnames(table) <- c("Estimate", "Type", "Std. Error", - "T-stat", "Pr(>|t|)") + colnames(table) <- c( + "Estimate", "Type", "Std. Error", + "T-stat", "Pr(>|t|)" + ) } else { table <- NULL } - list(sarima_orders = sarima_orders, - coef_table = table) + list( + sarima_orders = sarima_orders, + coef_table = table + ) } #' @rdname jd3_print #' @export -print.JD3_SPAN <- function(x, ...){ +print.JD3_SPAN <- function(x, ...) { span <- x type <- span$type d0 <- span$d0 @@ -187,14 +215,23 @@ print.JD3_SPAN <- function(x, ...){ n0 <- span$n0 n1 <- span$n1 - if (type == "ALL") { x <- "All"} - else if (type == "FROM") { x <- paste("From", d0, sep = " ")} - else if (type == "TO") { x <- paste("Until", d1, sep = " ")} - else if (type == "BETWEEN") { x <- paste(d0, d1, sep = " - ")} - else if (type == "FIRST") { x <- paste("First", n0, "periods", sep = " ")} - else if (type == "LAST") { x <- paste("Last", n1, "periods", sep = " ")} - else if (type == "EXCLUDING") { x <- paste("All but first", n0, "periods and last", n1, "periods", sep = " ")} - else { x <- "Undefined"} + if (type == "ALL") { + x <- "All" + } else if (type == "FROM") { + x <- paste("From", d0, sep = " ") + } else if (type == "TO") { + x <- paste("Until", d1, sep = " ") + } else if (type == "BETWEEN") { + x <- paste(d0, d1, sep = " - ") + } else if (type == "FIRST") { + x <- paste("First", n0, "periods", sep = " ") + } else if (type == "LAST") { + x <- paste("Last", n1, "periods", sep = " ") + } else if (type == "EXCLUDING") { + x <- paste("All but first", n0, "periods and last", n1, "periods", sep = " ") + } else { + x <- "Undefined" + } cat(x, "\n") @@ -204,28 +241,28 @@ print.JD3_SPAN <- function(x, ...){ #' @rdname jd3_print #' @export -print.JD3_LIKELIHOOD<-function(x, ...){ +print.JD3_LIKELIHOOD <- function(x, ...) { ll <- x cat("Number of observations:", ll$nobs, "\n") cat("Number of effective observations:", ll$neffectiveobs, "\n") cat("Number of parameters:", ll$nparams, "\n\n") cat("Loglikelihood:", ll$ll, "\n") - if (ll$ll != ll$adjustedll)cat("Adjusted loglikelihood:", ll$adjustedll, "\n\n") - cat("Standard error of the regression (ML estimate):", sqrt(ll$ssq/ll$neffectiveobs), "\n") + if (ll$ll != ll$adjustedll) cat("Adjusted loglikelihood:", ll$adjustedll, "\n\n") + cat("Standard error of the regression (ML estimate):", sqrt(ll$ssq / ll$neffectiveobs), "\n") cat("AIC:", ll$aic, "\n") cat("AICC:", ll$aicc, "\n") cat("BIC:", ll$bic, "\n\n") invisible(x) } #' @export -summary.JD3_LIKELIHOOD<-function(object, ...){ +summary.JD3_LIKELIHOOD <- function(object, ...) { res <- list( nobs = object$nobs, neffectiveobs = object$neffectiveobs, nparams = object$nparams, ll = object$ll, adjustedll = object$adjustedll, - se = sqrt(object$ssq/object$neffectiveobs), + se = sqrt(object$ssq / object$neffectiveobs), aic = object$aic, aicc = object$aicc, bic = object$bic @@ -234,62 +271,77 @@ summary.JD3_LIKELIHOOD<-function(object, ...){ res } #' @export -print.summary.JD3_LIKELIHOOD<-function(x, ...){ +print.summary.JD3_LIKELIHOOD <- function(x, ...) { cat("Number of observations: ", x$nobs, ", Number of effective observations: ", x$neffectiveobs, - ", Number of parameters: ", x$nparams, "\n", sep = "") + ", Number of parameters: ", x$nparams, "\n", + sep = "" + ) cat("Loglikelihood:", x$ll) - if (x$ll != x$adjustedll)cat(", Adjusted loglikelihood:", x$adjustedll) + if (x$ll != x$adjustedll) cat(", Adjusted loglikelihood:", x$adjustedll) cat("\nStandard error of the regression (ML estimate):", x$se, "\n") cat("AIC: ", x$aic, ", ", "AICc: ", x$aicc, ", ", - "BIC: ", x$bic, "\n", sep = "") + "BIC: ", x$bic, "\n", + sep = "" + ) invisible(x) } #' @rdname jd3_print #' @export -print.JD3_REGARIMA_RSLTS<-function(x, digits = max(3L, getOption("digits") - 3L), summary_info = getOption("summary_info"), ...){ - cat("Log-transformation:",if (x$description$log) {"yes"} else {"no"}, - "\n", sep=" ") - - ndf<-x$estimation$likelihood$neffectiveobs-x$estimation$likelihood$nparams - print(x$description$arima, cov = x$estimation$parameters$cov, - ndf = ndf, - digits = digits, - ...) +print.JD3_REGARIMA_RSLTS <- function(x, digits = max(3L, getOption("digits") - 3L), summary_info = getOption("summary_info"), ...) { + cat("Log-transformation:", if (x$description$log) { + "yes" + } else { + "no" + }, + "\n", + sep = " " + ) + + ndf <- x$estimation$likelihood$neffectiveobs - x$estimation$likelihood$nparams + print(x$description$arima, + cov = x$estimation$parameters$cov, + ndf = ndf, + digits = digits, + ... + ) xregs <- .regarima_coef_table(x, ...) cat("\n") - if (!is.null(xregs)){ + if (!is.null(xregs)) { cat("Regression model:\n") - xregs_coef <- xregs[,1] + xregs_coef <- xregs[, 1] names(xregs_coef) <- rownames(xregs) print(xregs_coef, digits = digits, na.print = "NA", ...) } else { cat("No regression variables\n") } - if (summary_info) + if (summary_info) { cat("\nFor a more detailed output, use the 'summary()' function.\n") + } invisible(x) } #' @export -print.JD3_SARIMA_ESTIMATE<-function(x, digits = max(3L, getOption("digits") - 3L), summary_info = getOption("summary_info"), ...){ - +print.JD3_SARIMA_ESTIMATE <- function(x, digits = max(3L, getOption("digits") - 3L), summary_info = getOption("summary_info"), ...) { tables <- .sarima_coef_table(x, ...) orders <- tables$sarima_orders - cat("SARIMA model:", + cat( + "SARIMA model:", .arima_node(orders$p, orders$d, orders$q), - .arima_node(orders$bp, orders$bd, orders$bq)) - if (!is.null(orders$period)) # when sarima_estimate() is used + .arima_node(orders$bp, orders$bd, orders$bq) + ) + if (!is.null(orders$period)) { # when sarima_estimate() is used cat(sprintf(" [%i]", orders$period)) + } cat("\n") cat("\nCoefficients\n") - if (is.null(tables$coef_table)){ + if (is.null(tables$coef_table)) { cat("No SARIMA variables\n") } else { coef <- tables$coef_table[, 1] @@ -298,98 +350,119 @@ print.JD3_SARIMA_ESTIMATE<-function(x, digits = max(3L, getOption("digits") - 3L } xregs <- .regarima_coef_table(x, ...) cat("\n") - if (!is.null(xregs)){ + if (!is.null(xregs)) { cat("Regression model:\n") - xregs_coef <- xregs[,1] + xregs_coef <- xregs[, 1] names(xregs_coef) <- rownames(xregs) print(xregs_coef, digits = digits, na.print = "NA", ...) } else { cat("No regression variables\n") } - if (summary_info) + if (summary_info) { cat("\nFor a more detailed output, use the 'summary()' function.\n") + } invisible(x) } -.regarima_coef_table <- function(x,...){ +.regarima_coef_table <- function(x, ...) { UseMethod(".regarima_coef_table", x) } -.regarima_coef_table.default <- function(x,...){ +.regarima_coef_table.default <- function(x, ...) { q <- x - if (length(q$description$variables)>0){ - regs<-do.call("rbind", lapply(q$description$variables, function(z){z$coef})) - xregs<-cbind(regs, stde=NA, t=NA, pvalue=NA) - stde<-sqrt(diag(q$estimation$bvar)) - sel<-xregs$type=='ESTIMATED' - t<-xregs$value[sel]/stde - ndf<-q$estimation$likelihood$neffectiveobs-q$estimation$likelihood$nparams - pval<-2*pt(abs(t), ndf, lower.tail = FALSE) - xregs$stde[sel]<-stde - xregs$t[sel]<-t - xregs$pvalue[sel]<-pval - colnames(xregs) <- c("Estimate", "Type", "Std. Error", - "T-stat", "Pr(>|t|)") + if (length(q$description$variables) > 0) { + regs <- do.call("rbind", lapply(q$description$variables, function(z) { + z$coef + })) + xregs <- cbind(regs, stde = NA, t = NA, pvalue = NA) + stde <- sqrt(diag(q$estimation$bvar)) + sel <- xregs$type == "ESTIMATED" + t <- xregs$value[sel] / stde + ndf <- q$estimation$likelihood$neffectiveobs - q$estimation$likelihood$nparams + pval <- 2 * pt(abs(t), ndf, lower.tail = FALSE) + xregs$stde[sel] <- stde + xregs$t[sel] <- t + xregs$pvalue[sel] <- pval + colnames(xregs) <- c( + "Estimate", "Type", "Std. Error", + "T-stat", "Pr(>|t|)" + ) xregs } else { NULL } } -.regarima_coef_table.JD3_SARIMA_ESTIMATE <- function(x,...){ - ndf<-x$likelihood$neffectiveobs-x$likelihood$nparams +.regarima_coef_table.JD3_SARIMA_ESTIMATE <- function(x, ...) { + ndf <- x$likelihood$neffectiveobs - x$likelihood$nparams estimate <- x$b - if (length(estimate) > 0){ + if (length(estimate) > 0) { stde <- sqrt(diag(x$bvar)) - t<-estimate/stde - pval<-2*pt(abs(t), ndf, lower.tail = FALSE) + t <- estimate / stde + pval <- 2 * pt(abs(t), ndf, lower.tail = FALSE) table <- data.frame(estimate, "ESTIMATED", stde, t, pval) - colnames(table) <- c("Estimate", "Type", "Std. Error", - "T-stat", "Pr(>|t|)") + colnames(table) <- c( + "Estimate", "Type", "Std. Error", + "T-stat", "Pr(>|t|)" + ) } else { table <- NULL } table } #' @export -summary.JD3_REGARIMA_RSLTS<-function(object, ...){ +summary.JD3_REGARIMA_RSLTS <- function(object, ...) { log <- object$description$log - ndf<-object$estimation$likelihood$neffectiveobs-object$estimation$likelihood$nparams+1 - sarima_sum <- summary(object$description$arima, cov = object$estimation$parameters$cov, - ndf = ndf, ...) + ndf <- object$estimation$likelihood$neffectiveobs - object$estimation$likelihood$nparams + 1 + sarima_sum <- summary(object$description$arima, + cov = object$estimation$parameters$cov, + ndf = ndf, ... + ) xregs <- .regarima_coef_table(object, ...) likelihood <- summary(object$estimation$likelihood) - res <- list(log = log, - sarima = sarima_sum, - xregs = xregs, - likelihood = likelihood) + res <- list( + log = log, + sarima = sarima_sum, + xregs = xregs, + likelihood = likelihood + ) class(res) <- "summary.JD3_REGARIMA_RSLTS" res } #' @export -summary.JD3_SARIMA_ESTIMATE <-function(object, ...){ +summary.JD3_SARIMA_ESTIMATE <- function(object, ...) { sarima_sum <- .sarima_coef_table(object, ...) class(sarima_sum) <- "summary.JD3_SARIMA_ESTIMATION" likelihood <- summary(object$likelihood) - res <- list(log = NULL, - sarima = sarima_sum, - xregs = .regarima_coef_table(object, ...), - likelihood = likelihood) + res <- list( + log = NULL, + sarima = sarima_sum, + xregs = .regarima_coef_table(object, ...), + likelihood = likelihood + ) class(res) <- "summary.JD3_REGARIMA_RSLTS" return(res) } #' @export -print.summary.JD3_REGARIMA_RSLTS <- function(x, digits = max(3L, getOption("digits") - 3L), signif.stars = getOption("show.signif.stars"), ...){ - if (!is.null(x$method)) # Used to add the method when regarima/tramo function is used +print.summary.JD3_REGARIMA_RSLTS <- function(x, digits = max(3L, getOption("digits") - 3L), signif.stars = getOption("show.signif.stars"), ...) { + if (!is.null(x$method)) { # Used to add the method when regarima/tramo function is used cat("Method:", x$method, "\n") + } - if (!is.null(x$log)) - cat("Log-transformation:",if (x$log) {"yes"} else {"no"},"\n",sep=" ") + if (!is.null(x$log)) { + cat("Log-transformation:", if (x$log) { + "yes" + } else { + "no" + }, "\n", sep = " ") + } print(x$sarima, digits = digits, signif.stars = signif.stars, ...) cat("\n") - if (!is.null(x$xregs)){ + if (!is.null(x$xregs)) { cat("Regression model:\n") - printCoefmat(x$xregs[-2], digits = digits, signif.stars = signif.stars, - na.print = "NA", ...) + printCoefmat(x$xregs[-2], + digits = digits, signif.stars = signif.stars, + na.print = "NA", ... + ) } else { cat("No regression variables\n") } @@ -398,11 +471,15 @@ print.summary.JD3_REGARIMA_RSLTS <- function(x, digits = max(3L, getOption("dig } #' @export -diagnostics.JD3_REGARIMA_RSLTS<-function(x, ...){ - if (is.null(x)) return(NULL) +diagnostics.JD3_REGARIMA_RSLTS <- function(x, ...) { + if (is.null(x)) { + return(NULL) + } residuals_test <- x$diagnostics - residuals_test <- data.frame(Statistic = sapply(residuals_test, function(test) test[["value"]]), - P.value = sapply(residuals_test, function(test) test[["pvalue"]]), - Description = sapply(residuals_test, function(test) attr(test, "distribution"))) + residuals_test <- data.frame( + Statistic = sapply(residuals_test, function(test) test[["value"]]), + P.value = sapply(residuals_test, function(test) test[["pvalue"]]), + Description = sapply(residuals_test, function(test) attr(test, "distribution")) + ) residuals_test } diff --git a/R/distributions.R b/R/distributions.R index b9f7303..567eb0e 100644 --- a/R/distributions.R +++ b/R/distributions.R @@ -16,21 +16,21 @@ #' @rdname studentdistribution #' @order 3 #' @export -random_t<-function(df, n){ +random_t <- function(df, n) { .jcall("jdplus/toolkit/base/r/stats/Distributions", "[D", "randomsT", df, as.integer(n)) } #' @rdname studentdistribution #' @order 1 #' @export -density_t<-function(df, x){ +density_t <- function(df, x) { .jcall("jdplus/toolkit/base/r/stats/Distributions", "[D", "densityT", df, .jarray(as.numeric(x))) } #' @rdname studentdistribution #' @order 2 #' @export -cdf_t<-function(df, x){ +cdf_t <- function(df, x) { .jcall("jdplus/toolkit/base/r/stats/Distributions", "[D", "cdfT", df, .jarray(as.numeric(x))) } @@ -44,21 +44,21 @@ cdf_t<-function(df, x){ #' @rdname chi2distribution #' @order 3 #' @export -random_chi2<-function(df, n){ +random_chi2 <- function(df, n) { .jcall("jdplus/toolkit/base/r/stats/Distributions", "[D", "randomsChi2", df, as.integer(n)) } #' @rdname chi2distribution #' @order 1 #' @export -density_chi2<-function(df, x){ +density_chi2 <- function(df, x) { .jcall("jdplus/toolkit/base/r/stats/Distributions", "[D", "densityChi2", df, .jarray(as.numeric(x))) } #' @rdname chi2distribution #' @order 2 #' @export -cdf_chi2<-function(df, x){ +cdf_chi2 <- function(df, x) { .jcall("jdplus/toolkit/base/r/stats/Distributions", "[D", "cdfChi2", df, .jarray(as.numeric(x))) } @@ -73,21 +73,21 @@ cdf_chi2<-function(df, x){ #' @rdname gammadistribution #' @order 3 #' @export -random_gamma<-function(shape, scale, n){ +random_gamma <- function(shape, scale, n) { .jcall("jdplus/toolkit/base/r/stats/Distributions", "[D", "randomsGamma", shape, scale, as.integer(n)) } #' @rdname gammadistribution #' @order 1 #' @export -density_gamma<-function(shape, scale, x){ +density_gamma <- function(shape, scale, x) { .jcall("jdplus/toolkit/base/r/stats/Distributions", "[D", "densityGamma", shape, scale, .jarray(as.numeric(x))) } #' @rdname gammadistribution #' @order 2 #' @export -cdf_gamma<-function(shape, scale, x){ +cdf_gamma <- function(shape, scale, x) { .jcall("jdplus/toolkit/base/r/stats/Distributions", "[D", "cdfGamma", shape, scale, .jarray(as.numeric(x))) } @@ -101,21 +101,21 @@ cdf_gamma<-function(shape, scale, x){ #' @rdname invgammadistribution #' @order 3 #' @export -random_inverse_gamma<-function(shape, scale, n){ +random_inverse_gamma <- function(shape, scale, n) { .jcall("jdplus/toolkit/base/r/stats/Distributions", "[D", "randomsInverseGamma", shape, scale, as.integer(n)) } #' @rdname invgammadistribution #' @order 1 #' @export -density_inverse_gamma<-function(shape, scale, x){ +density_inverse_gamma <- function(shape, scale, x) { .jcall("jdplus/toolkit/base/r/stats/Distributions", "[D", "densityInverseGamma", shape, scale, .jarray(as.numeric(x))) } #' @rdname invgammadistribution #' @order 2 #' @export -cdf_inverse_gamma<-function(shape, scale, x){ +cdf_inverse_gamma <- function(shape, scale, x) { .jcall("jdplus/toolkit/base/r/stats/Distributions", "[D", "cdfInverseGamma", shape, scale, .jarray(as.numeric(x))) } @@ -129,20 +129,20 @@ cdf_inverse_gamma<-function(shape, scale, x){ #' @rdname invgaussiandistribution #' @order 3 #' @export -random_inverse_gaussian<-function(shape, scale, n){ +random_inverse_gaussian <- function(shape, scale, n) { .jcall("jdplus/toolkit/base/r/stats/Distributions", "[D", "randomsInverseGaussian", shape, scale, as.integer(n)) } #' @rdname invgaussiandistribution #' @order 1 #' @export -density_inverse_gaussian<-function(shape, scale, x){ +density_inverse_gaussian <- function(shape, scale, x) { .jcall("jdplus/toolkit/base/r/stats/Distributions", "[D", "densityInverseGaussian", shape, scale, .jarray(as.numeric(x))) } #' @rdname invgaussiandistribution #' @order 2 #' @export -cdf_inverse_gaussian<-function(shape, scale, x){ +cdf_inverse_gaussian <- function(shape, scale, x) { .jcall("jdplus/toolkit/base/r/stats/Distributions", "[D", "cdfInverseGaussian", shape, scale, .jarray(as.numeric(x))) } diff --git a/R/generics.R b/R/generics.R index adcddd1..f4755de 100644 --- a/R/generics.R +++ b/R/generics.R @@ -1,18 +1,17 @@ - #' Generic Diagnostics Function #' #' @param x the object to extract diagnostics. #' @param ... further arguments. #' #' @export -diagnostics<-function(x, ...){ +diagnostics <- function(x, ...) { UseMethod("diagnostics", x) } #' @rdname diagnostics #' @export -diagnostics.JD3<-function(x, ...){ +diagnostics.JD3 <- function(x, ...) { cat("No diagnostic\n") } @@ -24,7 +23,7 @@ diagnostics.JD3<-function(x, ...){ #' @param x,... parameters. #' #' @export -sa_preprocessing<-function(x, ...){ +sa_preprocessing <- function(x, ...) { UseMethod("sa_preprocessing", x) } @@ -50,7 +49,7 @@ NULL #' @export #' @rdname sa_decomposition -sa_decomposition<-function(x, ...){ +sa_decomposition <- function(x, ...) { UseMethod("sa_decomposition", x) } @@ -63,7 +62,7 @@ sa_decomposition<-function(x, ...){ #' @name deprecated-rjd3toolkit #' @export #' @export -sa.decomposition<-function(x, ...){ +sa.decomposition <- function(x, ...) { .Deprecated("sa_decomposition") UseMethod("sa_decomposition", x) } diff --git a/R/jd2r.R b/R/jd2r.R index 801f164..2d7e1d5 100644 --- a/R/jd2r.R +++ b/R/jd2r.R @@ -3,13 +3,13 @@ NULL #> NULL -.jd2r_test<-function(jtest){ - if (is.jnull(jtest)) +.jd2r_test <- function(jtest) { + if (is.jnull(jtest)) { return(NULL) - else { - desc<-.jcall(jtest, "S", "getDescription") - val<-.jcall(jtest, "D", "getValue") - pval<-.jcall(jtest, "D", "getPvalue") + } else { + desc <- .jcall(jtest, "S", "getDescription") + val <- .jcall(jtest, "D", "getValue") + pval <- .jcall(jtest, "D", "getPvalue") return(statisticaltest(val, pval, desc)) } } @@ -20,74 +20,85 @@ NULL val <- .jcall(s, "D", "getCoefficient") stderr <- .jcall(s, "D", "getStdError") pval <- .jcall(s, "D", "getPvalue") - res <- matrix(c(val, stderr, val/stderr, pval), nrow = 1) + res <- matrix(c(val, stderr, val / stderr, pval), nrow = 1) colnames(res) <- c("Estimate", "Std. Error", "T-stat", "Pr(>|t|)") rownames(res) <- desc res } #' @export #' @rdname jd3_utilities -.r2jd_tsdata<-function(s){ - if (is.null(s)){ +.r2jd_tsdata <- function(s) { + if (is.null(s)) { return(NULL) } - freq<-frequency(s) - start<-start(s) - .jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/TsData;", "of", - as.integer(freq), as.integer(start[1]), as.integer(start[2]), as.double(s)) + freq <- frequency(s) + start <- start(s) + .jcall( + "jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/TsData;", "of", + as.integer(freq), as.integer(start[1]), as.integer(start[2]), as.double(s) + ) } #' @export #' @rdname jd3_utilities -.r2jd_tsdomain<-function(period, startYear, startPeriod, length){ - .jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/TsDomain;", "of", - as.integer(period), as.integer(startYear), as.integer(startPeriod), as.integer(length)) +.r2jd_tsdomain <- function(period, startYear, startPeriod, length) { + .jcall( + "jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/TsDomain;", "of", + as.integer(period), as.integer(startYear), as.integer(startPeriod), as.integer(length) + ) } #' @export #' @rdname jd3_utilities -.jd2r_tsdata<-function(s){ - if (is.jnull(s)){ +.jd2r_tsdata <- function(s) { + if (is.jnull(s)) { + return(NULL) + } + jx <- .jcall(s, "Ljdplus/toolkit/base/api/data/DoubleSeq;", "getValues") + x <- .jcall(jx, "[D", "toArray") + if (is.null(x)) { + return(NULL) + } + if (length(x) == 0) { return(NULL) } - jx<-.jcall(s, "Ljdplus/toolkit/base/api/data/DoubleSeq;", "getValues") - x<-.jcall(jx, "[D", "toArray") - if (is.null(x)) return(NULL) - if (length(x) == 0) return(NULL) - pstart<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "[I", "startPeriod", s) - ts(x,start=pstart[2:3], frequency=pstart[1]) + pstart <- .jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "[I", "startPeriod", s) + ts(x, start = pstart[2:3], frequency = pstart[1]) } #' @export #' @rdname jd3_utilities -.jd2r_mts<-function(s){ - if (is.jnull(s)){ +.jd2r_mts <- function(s) { + if (is.jnull(s)) { + return(NULL) + } + jx <- .jcall(s, "Ljdplus/toolkit/base/api/math/matrices/Matrix;", "toMatrix") + x <- .jd2r_matrix(jx) + if (is.jnull(x)) { return(NULL) } - jx<-.jcall(s, "Ljdplus/toolkit/base/api/math/matrices/Matrix;", "toMatrix") - x<-.jd2r_matrix(jx) - if (is.jnull(x)) return(NULL) - pstart<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "[I", "startPeriod", s) - ts(x,start=pstart[2:3], frequency=pstart[1]) + pstart <- .jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "[I", "startPeriod", s) + ts(x, start = pstart[2:3], frequency = pstart[1]) } -.extract_jts<-function(collection, index){ - js<- .jcall(collection, "Ljdplus/toolkit/base/api/timeseries/Ts;", "get", as.integer(index-1)) +.extract_jts <- function(collection, index) { + js <- .jcall(collection, "Ljdplus/toolkit/base/api/timeseries/Ts;", "get", as.integer(index - 1)) return(js) } #' @export #' @rdname jd3_utilities -.jd2r_lts<-function(s){ - if (is.jnull(s)){ +.jd2r_lts <- function(s) { + if (is.jnull(s)) { return(NULL) } - size<-.jcall(s, "I", "length") - if (size == 0) + size <- .jcall(s, "I", "length") + if (size == 0) { return(NULL) + } all <- lapply( X = 1:size, - FUN = function(idx){ + FUN = function(idx) { return(.jd2r_ts(.extract_jts(s, idx))) } ) @@ -96,78 +107,91 @@ NULL #' @export #' @rdname jd3_utilities -.jd2r_matrix<-function(s){ - if (is.jnull(s)){ +.jd2r_matrix <- function(s) { + if (is.jnull(s)) { return(NULL) } - nr<-.jcall(s, "I", "getRowsCount") - nc<-.jcall(s, "I", "getColumnsCount") - d<-.jcall(s, "[D", "toArray") - return(array(d, dim=c(nr, nc))) + nr <- .jcall(s, "I", "getRowsCount") + nc <- .jcall(s, "I", "getColumnsCount") + d <- .jcall(s, "[D", "toArray") + return(array(d, dim = c(nr, nc))) } #' @export #' @rdname jd3_utilities -.r2jd_matrix<-function(s){ - if (is.null(s)) +.r2jd_matrix <- function(s) { + if (is.null(s)) { return(.jnull("jdplus/toolkit/base/api/math/matrices/Matrix")) - if (!is.matrix(s)){ - s<-matrix(s, nrow=length(s), ncol=1) } - sdim<-dim(s) - return(.jcall("jdplus/toolkit/base/api/math/matrices/Matrix","Ljdplus/toolkit/base/api/math/matrices/Matrix;", "of", .jarray(as.double(s)), as.integer(sdim[1]), as.integer(sdim[2]))) + if (!is.matrix(s)) { + s <- matrix(s, nrow = length(s), ncol = 1) + } + sdim <- dim(s) + return(.jcall("jdplus/toolkit/base/api/math/matrices/Matrix", "Ljdplus/toolkit/base/api/math/matrices/Matrix;", "of", .jarray(as.double(s)), as.integer(sdim[1]), as.integer(sdim[2]))) } -.j2r_ldt<-function(ldt){ - if (is.jnull(ldt)) +.j2r_ldt <- function(ldt) { + if (is.jnull(ldt)) { return(NULL) - dt<-.jcall(ldt, "Ljava/time/LocalDate;", "toLocalDate") + } + dt <- .jcall(ldt, "Ljava/time/LocalDate;", "toLocalDate") return(as.Date(.jcall(dt, "S", "toString"))) } -.j2r_dt<-function(dt){ - if (is.jnull(dt)) +.j2r_dt <- function(dt) { + if (is.jnull(dt)) { return(NULL) + } return(as.Date(.jcall(dt, "S", "toString"))) } -.r2j_dt<-function(dt){ - jdt<-.jnew("java/lang/String", as.character(dt)) +.r2j_dt <- function(dt) { + jdt <- .jnew("java/lang/String", as.character(dt)) return(.jcall("java/time/LocalDate", "Ljava/time/LocalDate;", "parse", .jcast(jdt, "java/lang/CharSequence"))) } -.r2j_ldt<-function(dt){ - jdt<-.r2j_dt(dt) +.r2j_ldt <- function(dt) { + jdt <- .r2j_dt(dt) return(.jcall(jdt, "Ljava/time/LocalDateTime;", "atStartOfDay")) } -.jd2r_parameters <- function(jparams){ - if (is.jnull(jparams)) +.jd2r_parameters <- function(jparams) { + if (is.jnull(jparams)) { return(NULL) - param<-.jcastToArray(jparams) + } + param <- .jcastToArray(jparams) len <- length(param) - if (len==0) + if (len == 0) { return(NULL) + } param_name <- deparse(substitute(jparams)) Type <- sapply(param, function(x) .jcall(.jcall(x, "Ljdplus/toolkit/base/api/data/ParameterType;", "getType"), "S", "name")) Value <- sapply(param, function(x) .jcall(x, "D", "getValue")) data_param <- data.frame(Type = Type, Value = Value) - rownames(data_param) <- sprintf("%s(%i)", - param_name, - 1:len) + rownames(data_param) <- sprintf( + "%s(%i)", + param_name, + 1:len + ) data_param } #' @export #' @rdname jd3_utilities -.jdomain<-function(period, start, end){ - if (period == 0)return(.jnull("jdplus/toolkit/base/api/timeseries/TsDomain")) - if (is.null(start)) - start<-c(1900,1) - if (is.null(end)) - end<-c(2100, 1) - n<-period*(end[1]-start[1])+end[2]-start[2] - jdom<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/TsDomain;", "of" - , as.integer(period), as.integer(start[1]), as.integer(start[2]), as.integer(n)) +.jdomain <- function(period, start, end) { + if (period == 0) { + return(.jnull("jdplus/toolkit/base/api/timeseries/TsDomain")) + } + if (is.null(start)) { + start <- c(1900, 1) + } + if (is.null(end)) { + end <- c(2100, 1) + } + n <- period * (end[1] - start[1]) + end[2] - start[2] + jdom <- .jcall( + "jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/TsDomain;", "of", + as.integer(period), as.integer(start[1]), as.integer(start[2]), as.integer(n) + ) return(jdom) } diff --git a/R/jd3rslts.R b/R/jd3rslts.R index 0409c59..603dd5d 100644 --- a/R/jd3rslts.R +++ b/R/jd3rslts.R @@ -2,134 +2,146 @@ #' @export #' @rdname jd3_utilities -.proc_numeric<-function(rslt, name){ - s<-.jcall(rslt, "Ljava/lang/Object;", "getData", name) - if (!is.jnull(s)) +.proc_numeric <- function(rslt, name) { + s <- .jcall(rslt, "Ljava/lang/Object;", "getData", name) + if (!is.jnull(s)) { .jcall(s, "D", "doubleValue") - else + } else { return(NaN) + } } #' @export #' @rdname jd3_utilities -.proc_vector<-function(rslt, name){ - s<-.jcall(rslt, "Ljava/lang/Object;", "getData", name) - if (is.jnull(s)) +.proc_vector <- function(rslt, name) { + s <- .jcall(rslt, "Ljava/lang/Object;", "getData", name) + if (is.jnull(s)) { return(NULL) + } .jevalArray(s) } #' @export #' @rdname jd3_utilities -.proc_int<-function(rslt, name){ - s<-.jcall(rslt, "Ljava/lang/Object;", "getData", name) - if (is.jnull(s)) +.proc_int <- function(rslt, name) { + s <- .jcall(rslt, "Ljava/lang/Object;", "getData", name) + if (is.jnull(s)) { return(-1) + } .jcall(s, "I", "intValue") } #' @export #' @rdname jd3_utilities -.proc_bool<-function(rslt, name){ - s<-.jcall(rslt, "Ljava/lang/Object;", "getData", name) - if (is.jnull(s)) +.proc_bool <- function(rslt, name) { + s <- .jcall(rslt, "Ljava/lang/Object;", "getData", name) + if (is.jnull(s)) { return(FALSE) + } .jcall(s, "Z", "booleanValue") } #' @export #' @rdname jd3_utilities -.proc_ts<-function(rslt, name){ - s<-.jcall(rslt, "Ljava/lang/Object;", "getData", name) - if (is.jnull(s)) +.proc_ts <- function(rslt, name) { + s <- .jcall(rslt, "Ljava/lang/Object;", "getData", name) + if (is.jnull(s)) { return(NULL) - if (.jinstanceof(s, "jdplus/toolkit/base/api/timeseries/TsData")) - return(.jd2r_tsdata(.jcast(s,"jdplus/toolkit/base/api/timeseries/TsData"))) - else + } + if (.jinstanceof(s, "jdplus/toolkit/base/api/timeseries/TsData")) { + return(.jd2r_tsdata(.jcast(s, "jdplus/toolkit/base/api/timeseries/TsData"))) + } else { return(NULL) + } } #' @export #' @rdname jd3_utilities -.proc_str<-function(rslt, name){ - s<-.jcall(rslt, "Ljava/lang/Object;", "getData", name) - if (is.jnull(s)) +.proc_str <- function(rslt, name) { + s <- .jcall(rslt, "Ljava/lang/Object;", "getData", name) + if (is.jnull(s)) { return(NULL) + } .jcall(s, "S", "toString") } #' @export #' @rdname jd3_utilities -.proc_desc<-function(rslt, name){ - s<-.jcall(rslt, "Ljava/lang/Object;", "getData", name) - if (is.jnull(s)) +.proc_desc <- function(rslt, name) { + s <- .jcall(rslt, "Ljava/lang/Object;", "getData", name) + if (is.jnull(s)) { return(NULL) + } .jevalArray(s) } #' @export #' @rdname jd3_utilities -.proc_test<-function(rslt, name){ - s<-.jcall(rslt, "Ljava/lang/Object;", "getData", name) - if (is.jnull(s)) +.proc_test <- function(rslt, name) { + s <- .jcall(rslt, "Ljava/lang/Object;", "getData", name) + if (is.jnull(s)) { return(NULL) - desc<-.jcall(s, "S", "getDescription") - val<-.jcall(s, "D", "getValue") - pval<-.jcall(s, "D", "getPvalue") - all<-c(val, pval) - attr(all, "description")<-desc + } + desc <- .jcall(s, "S", "getDescription") + val <- .jcall(s, "D", "getValue") + pval <- .jcall(s, "D", "getPvalue") + all <- c(val, pval) + attr(all, "description") <- desc all } #' @export #' @rdname jd3_utilities -.proc_parameter<-function(rslt, name){ - s<-.jcall(rslt, "Ljava/lang/Object;", "getData", name) - if (is.jnull(s)) +.proc_parameter <- function(rslt, name) { + s <- .jcall(rslt, "Ljava/lang/Object;", "getData", name) + if (is.jnull(s)) { return(NULL) - val<-.jcall(s, "D", "getValue") + } + val <- .jcall(s, "D", "getValue") return(val) } #' @export #' @rdname jd3_utilities -.proc_parameters<-function(rslt, name){ - jd_p<-.jcall(rslt, "Ljava/lang/Object;", "getData", name) - if (is.jnull(jd_p)) +.proc_parameters <- function(rslt, name) { + jd_p <- .jcall(rslt, "Ljava/lang/Object;", "getData", name) + if (is.jnull(jd_p)) { return(NULL) - p<-.jcastToArray(jd_p) - len<-length(p) - all<-array(0, dim=c(len)) - for (i in 1:len){ - all[i]<-.jcall(p[[i]], "D", "getValue") + } + p <- .jcastToArray(jd_p) + len <- length(p) + all <- array(0, dim = c(len)) + for (i in 1:len) { + all[i] <- .jcall(p[[i]], "D", "getValue") } all } #' @export #' @rdname jd3_utilities -.proc_matrix<-function(rslt, name){ - s<-.jcall(rslt, "Ljava/lang/Object;", "getData", name) - if (is.jnull(s)) +.proc_matrix <- function(rslt, name) { + s <- .jcall(rslt, "Ljava/lang/Object;", "getData", name) + if (is.jnull(s)) { return(NULL) + } return(.jd2r_matrix(s)) } #' @export #' @rdname jd3_utilities -.proc_data<-function(rslt, name){ - s<-.jcall(rslt, "Ljava/lang/Object;", "getData", name) +.proc_data <- function(rslt, name) { + s <- .jcall(rslt, "Ljava/lang/Object;", "getData", name) if (is.jnull(s)) { return(NULL) } if (.jinstanceof(s, "jdplus/toolkit/base/api/timeseries/TsData")) { - return(.jd2r_tsdata(.jcast(s,"jdplus/toolkit/base/api/timeseries/TsData"))) + return(.jd2r_tsdata(.jcast(s, "jdplus/toolkit/base/api/timeseries/TsData"))) } else if (.jinstanceof(s, "java/lang/Number")) { return(.jcall(s, "D", "doubleValue")) } else if (.jinstanceof(s, "jdplus/toolkit/base/api/math/matrices/Matrix")) { - return(.jd2r_matrix(.jcast(s,"jdplus/toolkit/base/api/math/matrices/Matrix"))) - } else if (.jinstanceof(s, "jdplus/toolkit/base/api/data/Parameter")){ - val<-.jcall(s, "D", "getValue") + return(.jd2r_matrix(.jcast(s, "jdplus/toolkit/base/api/math/matrices/Matrix"))) + } else if (.jinstanceof(s, "jdplus/toolkit/base/api/data/Parameter")) { + val <- .jcall(s, "D", "getValue") return(c(val)) - } else if (.jinstanceof(s, "[Ljdplus/toolkit/base/api/data/Parameter;")){ - p<-.jcastToArray(s) - len<-length(p) - all<-array(0, dim=c(len)) - for (i in 1:len){ - all[i]<-.jcall(p[[i]], "D", "getValue") + } else if (.jinstanceof(s, "[Ljdplus/toolkit/base/api/data/Parameter;")) { + p <- .jcastToArray(s) + len <- length(p) + all <- array(0, dim = c(len)) + for (i in 1:len) { + all[i] <- .jcall(p[[i]], "D", "getValue") } return(all) } else if (.jcall(.jcall(s, "Ljava/lang/Class;", "getClass"), "Z", "isArray")) { - return(.jevalArray(s, silent=TRUE)) + return(.jevalArray(s, silent = TRUE)) } else if (.jinstanceof(s, "jdplus/toolkit/base/api/stats/StatisticalTest")) { return(.jd2r_test(s)) } else if (.jinstanceof(s, "jdplus/toolkit/base/api/timeseries/regression/RegressionItem")) { @@ -141,16 +153,16 @@ #' @export #' @rdname jd3_utilities -.proc_dictionary<-function(name){ - jmapping<-.jcall(name, "Ljdplus/toolkit/base/api/information/InformationMapping;", "getMapping") - jmap<-.jnew("java/util/LinkedHashMap") +.proc_dictionary <- function(name) { + jmapping <- .jcall(name, "Ljdplus/toolkit/base/api/information/InformationMapping;", "getMapping") + jmap <- .jnew("java/util/LinkedHashMap") .jcall(jmapping, "V", "fillDictionary", .jnull("java/lang/String"), .jcast(jmap, "java/util/Map"), TRUE) - jkeys<-.jcall(jmap, "Ljava/util/Set;", "keySet") - size<-.jcall(jkeys, "I", "size") - keys<-array(dim=size) - if (size >0){ - jiter<-.jcall(jkeys, "Ljava/util/Iterator;", "iterator") - for (i in 1:size){ + jkeys <- .jcall(jmap, "Ljava/util/Set;", "keySet") + size <- .jcall(jkeys, "I", "size") + keys <- array(dim = size) + if (size > 0) { + jiter <- .jcall(jkeys, "Ljava/util/Iterator;", "iterator") + for (i in 1:size) { keys[i] <- .jcall(.jcall(jiter, "Ljava/lang/Object;", "next"), "Ljava/lang/String;", "toString") } } @@ -159,14 +171,14 @@ #' @export #' @rdname jd3_utilities -.proc_dictionary2<-function(jobj){ - jmap<-.jcall(jobj, "Ljava/util/Map;", "getDictionary") - jkeys<-.jcall(jmap, "Ljava/util/Set;", "keySet") - size<-.jcall(jkeys, "I", "size") - keys<-array(dim=size) - if (size > 0){ - jiter<-.jcall(jkeys, "Ljava/util/Iterator;", "iterator") - for (i in 1:size){ +.proc_dictionary2 <- function(jobj) { + jmap <- .jcall(jobj, "Ljava/util/Map;", "getDictionary") + jkeys <- .jcall(jmap, "Ljava/util/Set;", "keySet") + size <- .jcall(jkeys, "I", "size") + keys <- array(dim = size) + if (size > 0) { + jiter <- .jcall(jkeys, "Ljava/util/Iterator;", "iterator") + for (i in 1:size) { keys[i] <- .jcall(.jcall(jiter, "Ljava/lang/Object;", "next"), "Ljava/lang/String;", "toString") } } @@ -175,19 +187,19 @@ #' @export #' @rdname jd3_utilities -.proc_likelihood<-function(jrslt, prefix){ +.proc_likelihood <- function(jrslt, prefix) { return(list( - ll=.proc_numeric(jrslt, paste(prefix,"ll", sep="")), - ssq=.proc_numeric(jrslt, paste(prefix,"ssqerr", sep="")), - nobs=.proc_int(jrslt, paste(prefix,"nobs", sep="")), - neffective=.proc_int(jrslt, paste(prefix,"neffective", sep="")), - nparams=.proc_int(jrslt, paste(prefix,"nparams", sep="")), - df=.proc_int(jrslt, paste(prefix,"df", sep="")), - aic=.proc_numeric(jrslt, paste(prefix,"aic", sep="")), - aicc=.proc_numeric(jrslt, paste(prefix,"aicc", sep="")), - bic=.proc_numeric(jrslt, paste(prefix,"bic", sep="")), - bic2=.proc_numeric(jrslt, paste(prefix,"bic2", sep="")), - bicc=.proc_numeric(jrslt, paste(prefix,"bicc", sep="")), - hannanquinn=.proc_numeric(jrslt, paste(prefix,"hannanquinn", sep="")) + ll = .proc_numeric(jrslt, paste(prefix, "ll", sep = "")), + ssq = .proc_numeric(jrslt, paste(prefix, "ssqerr", sep = "")), + nobs = .proc_int(jrslt, paste(prefix, "nobs", sep = "")), + neffective = .proc_int(jrslt, paste(prefix, "neffective", sep = "")), + nparams = .proc_int(jrslt, paste(prefix, "nparams", sep = "")), + df = .proc_int(jrslt, paste(prefix, "df", sep = "")), + aic = .proc_numeric(jrslt, paste(prefix, "aic", sep = "")), + aicc = .proc_numeric(jrslt, paste(prefix, "aicc", sep = "")), + bic = .proc_numeric(jrslt, paste(prefix, "bic", sep = "")), + bic2 = .proc_numeric(jrslt, paste(prefix, "bic2", sep = "")), + bicc = .proc_numeric(jrslt, paste(prefix, "bicc", sep = "")), + hannanquinn = .proc_numeric(jrslt, paste(prefix, "hannanquinn", sep = "")) )) } diff --git a/R/modellingcontext.R b/R/modellingcontext.R index 846b4c2..17cacf6 100644 --- a/R/modellingcontext.R +++ b/R/modellingcontext.R @@ -1,10 +1,10 @@ #' @include calendars.R NULL -JD3_DYNAMICTS<-'JD3_DYNAMICTS' -JD3_TSMONIKER<-'JD3_TSMONIKER' -JD3_TS<-'JD3_TS' -JD3_TSCOLLECTION<-'JD3_TSCOLLECTION' +JD3_DYNAMICTS <- "JD3_DYNAMICTS" +JD3_TSMONIKER <- "JD3_TSMONIKER" +JD3_TS <- "JD3_TS" +JD3_TSCOLLECTION <- "JD3_TSCOLLECTION" #' Title #' @@ -15,232 +15,273 @@ JD3_TSCOLLECTION<-'JD3_TSCOLLECTION' #' @export #' #' @examples -.tsmoniker<-function(source, id){ - return(structure(list(source=source, id=id), class=c(JD3_TSMONIKER))) +.tsmoniker <- function(source, id) { + return(structure(list(source = source, id = id), class = c(JD3_TSMONIKER))) } #' @export #' @rdname jd3_utilities -.r2p_moniker<-function(r){ - p<-jd3.TsMoniker$new() - p$source<-r$source - p$id<-r$id +.r2p_moniker <- function(r) { + p <- jd3.TsMoniker$new() + p$source <- r$source + p$id <- r$id return(p) } #' @export #' @rdname jd3_utilities -.p2r_moniker<-function(p){ - if (is.null(p)) return(NULL) +.p2r_moniker <- function(p) { + if (is.null(p)) { + return(NULL) + } return(.tsmoniker(p$source, p$id)) } #' @export #' @rdname jd3_utilities -.r2p_datasupplier<-function(name, r){ - p<-jd3.TsDataSuppliers$Item$new() - p$name<-name - if (is.ts(r)) p$data<-.r2p_tsdata(r) - else if (is(r, JD3_DYNAMICTS)) p$dynamic_data<-.r2p_dynamic_ts(r) - else return(NULL) +.r2p_datasupplier <- function(name, r) { + p <- jd3.TsDataSuppliers$Item$new() + p$name <- name + if (is.ts(r)) { + p$data <- .r2p_tsdata(r) + } else if (is(r, JD3_DYNAMICTS)) { + p$dynamic_data <- .r2p_dynamic_ts(r) + } else { + return(NULL) + } return(p) } -dynamic_ts<-function(moniker, data){ - return(structure(list(moniker=moniker, data=data), class=c(JD3_DYNAMICTS))) +dynamic_ts <- function(moniker, data) { + return(structure(list(moniker = moniker, data = data), class = c(JD3_DYNAMICTS))) } -.ts<-function(name, moniker, metadata, data){ - return(structure(list(name=name, moniker=moniker, metadata=metadata, data=data), class=c(JD3_TS))) +.ts <- function(name, moniker, metadata, data) { + return(structure(list(name = name, moniker = moniker, metadata = metadata, data = data), class = c(JD3_TS))) } -.tscollection<-function(name, moniker, metadata, series){ - return(structure(list(name=name, moniker=moniker, metadata=metadata, series=series), class=c(JD3_TSCOLLECTION))) +.tscollection <- function(name, moniker, metadata, series) { + return(structure(list(name = name, moniker = moniker, metadata = metadata, series = series), class = c(JD3_TSCOLLECTION))) } #' @export #' @rdname jd3_utilities -.p2r_metadata<-function(p){ - n<-length(p) - if (n > 0){ - lv<-lapply(p, function(v){return(v$value)}) - ns<-sapply(p, function(v){return(v$key)}) - names(lv)<-ns +.p2r_metadata <- function(p) { + n <- length(p) + if (n > 0) { + lv <- lapply(p, function(v) { + return(v$value) + }) + ns <- sapply(p, function(v) { + return(v$key) + }) + names(lv) <- ns return(lv) } return(NULL) } -.entry<-function(key, value, type){ - p<-type$new() - p$key<-key - p$value<-value +.entry <- function(key, value, type) { + p <- type$new() + p$key <- key + p$value <- value return(p) } #' @export #' @rdname jd3_utilities -.r2p_metadata<-function(r, type){ - n<-names(r) - pm<-lapply(n, function(item){ return(.entry(item, r[[item]], type)) }) +.r2p_metadata <- function(r, type) { + n <- names(r) + pm <- lapply(n, function(item) { + return(.entry(item, r[[item]], type)) + }) return(pm) } #' @export #' @rdname jd3_utilities -.p2r_ts<-function(p){ - if (is.null(p)) return(NULL) - s<-.p2r_tsdata(p$data) - m<-.p2r_moniker(p$moniker) - md<-.p2r_metadata(p$metadata) +.p2r_ts <- function(p) { + if (is.null(p)) { + return(NULL) + } + s <- .p2r_tsdata(p$data) + m <- .p2r_moniker(p$moniker) + md <- .p2r_metadata(p$metadata) return(.ts(p$name, m, md, s)) } #' @export #' @rdname jd3_utilities -.r2p_ts<-function(r){ - p<-jd3.Ts$new() - p$name<-r$name - p$moniker<-.r2p_moniker(r$moniker) - p$metadata<-.r2p_metadata(r$metadata,jd3.Ts$MetadataEntry) - p$data<- .r2p_tsdata(r$data) +.r2p_ts <- function(r) { + p <- jd3.Ts$new() + p$name <- r$name + p$moniker <- .r2p_moniker(r$moniker) + p$metadata <- .r2p_metadata(r$metadata, jd3.Ts$MetadataEntry) + p$data <- .r2p_tsdata(r$data) return(p) } #' @export #' @rdname jd3_utilities -.p2r_tscollection<-function(p){ - if (is.null(p)) +.p2r_tscollection <- function(p) { + if (is.null(p)) { return(NULL) - else { - rs<-lapply(p$series, function(s){return(.p2r_ts(s))}) - names<-lapply(rs, function(s){return(s$name)}) - rs<-`names<-`(rs, names) + } else { + rs <- lapply(p$series, function(s) { + return(.p2r_ts(s)) + }) + names <- lapply(rs, function(s) { + return(s$name) + }) + rs <- `names<-`(rs, names) return(.tscollection(p$name, .p2r_moniker(p$moniker), .p2r_metadata(p$metadata), rs)) } } #' @export #' @rdname jd3_utilities -.r2p_tscollection<-function(r){ - p<-jd3.TsCollection$new() - p$name<-r$name - p$moniker<-.r2p_moniker(r$moniker) - p$metadata<-.r2p_metadata(r$metadata,jd3.TsCollection$MetadataEntry) - p$series<- lapply(r$series, function(s){return(.r2p_ts(s))}) +.r2p_tscollection <- function(r) { + p <- jd3.TsCollection$new() + p$name <- r$name + p$moniker <- .r2p_moniker(r$moniker) + p$metadata <- .r2p_metadata(r$metadata, jd3.TsCollection$MetadataEntry) + p$series <- lapply(r$series, function(s) { + return(.r2p_ts(s)) + }) return(p) } #' @export #' @rdname jd3_utilities -.r2jd_ts<-function(s){ - if (is.null(s)) +.r2jd_ts <- function(s) { + if (is.null(s)) { return(.jnull("jdplus/toolkit/base/api/timeseries/Ts")) - ps<-.r2p_ts(s) - bytes<-RProtoBuf::serialize(ps, NULL) + } + ps <- .r2p_ts(s) + bytes <- RProtoBuf::serialize(ps, NULL) return(.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/Ts;", "tsOfBytes", bytes)) } #' @export #' @rdname jd3_utilities -.jd2r_ts<-function(js){ - if (is.jnull(js)) +.jd2r_ts <- function(js) { + if (is.jnull(js)) { return(NULL) - q<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "[B", "toBuffer", js) - p<-RProtoBuf::read(jd3.Ts, q) + } + q <- .jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "[B", "toBuffer", js) + p <- RProtoBuf::read(jd3.Ts, q) return(.p2r_ts(p)) } #' @export #' @rdname jd3_utilities -.r2jd_tscollection<-function(s){ - if (is.null(s)) +.r2jd_tscollection <- function(s) { + if (is.null(s)) { return(.jnull("jdplus/toolkit/base/api/timeseries/TsCollection")) - ps<-.r2p_tscollection(s) - bytes<-RProtoBuf::serialize(ps, NULL) + } + ps <- .r2p_tscollection(s) + bytes <- RProtoBuf::serialize(ps, NULL) return(.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/Ts;", "tsCollectionOfBytes", bytes)) } #' @export #' @rdname jd3_utilities -.jd2r_tscollection<-function(js){ - if (is.jnull(js)) +.jd2r_tscollection <- function(js) { + if (is.jnull(js)) { return(NULL) - q<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "[B", "toBuffer", js) - p<-RProtoBuf::read(jd3.TsCollection, q) + } + q <- .jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "[B", "toBuffer", js) + p <- RProtoBuf::read(jd3.TsCollection, q) return(.p2r_tscollection(p)) } -.r2p_dynamic_ts<-function(r){ - p<-jd3.DynamicTsData$new() - p$current<- .r2p_tsdata(r$data) - p$moniker<-.r2p_moniker(r$moniker) +.r2p_dynamic_ts <- function(r) { + p <- jd3.DynamicTsData$new() + p$current <- .r2p_tsdata(r$data) + p$moniker <- .r2p_moniker(r$moniker) return(p) } -.p2r_dynamic_ts<-function(p){ - if (is.null(p)) return(NULL) - s<-.p2r_tsdata(p$current) - m<-.p2r_moniker(p$moniker) +.p2r_dynamic_ts <- function(p) { + if (is.null(p)) { + return(NULL) + } + s <- .p2r_tsdata(p$current) + m <- .p2r_moniker(p$moniker) return(dynamic_ts(m, s)) } -.r2p_dynamic_ts<-function(r){ - p<-jd3.DynamicTsData$new() - p$current<- .r2p_tsdata(r$data) - p$moniker<-.r2p_moniker(r$moniker) +.r2p_dynamic_ts <- function(r) { + p <- jd3.DynamicTsData$new() + p$current <- .r2p_tsdata(r$data) + p$moniker <- .r2p_moniker(r$moniker) return(p) } #' @export #' @rdname jd3_utilities -.p2r_datasupplier<-function(p){ - if (p$has('dynamic_data')) return(.p2r_dynamic_ts(p$dynamic_data)) - if (p$has('data')) return(.p2r_tsdata(p$data)) +.p2r_datasupplier <- function(p) { + if (p$has("dynamic_data")) { + return(.p2r_dynamic_ts(p$dynamic_data)) + } + if (p$has("data")) { + return(.p2r_tsdata(p$data)) + } return(NULL) } #' @export #' @rdname jd3_utilities -.r2p_datasuppliers<-function(r){ - if (! is.list(r)) stop("Suppliers should be a list") - ns<-names(r) - if (is.null(ns)) +.r2p_datasuppliers <- function(r) { + if (!is.list(r)) stop("Suppliers should be a list") + ns <- names(r) + if (is.null(ns)) { stop("All the variables of the list should be named") - n<-length(ns) - all<-lapply(1:n, function(z){.r2p_datasupplier(ns[z], r[[z]])}) - p<-jd3.TsDataSuppliers$new() - p$items<-all + } + n <- length(ns) + all <- lapply(1:n, function(z) { + .r2p_datasupplier(ns[z], r[[z]]) + }) + p <- jd3.TsDataSuppliers$new() + p$items <- all return(p) } #' @export #' @rdname jd3_utilities -.p2r_datasuppliers<-function(p){ - n<-length(p$items) - if (n == 0){return(list())} - l<-lapply(1:n, function(i){return(.p2r_datasupplier(p$items[[i]]))}) - ns<-sapply(1:n, function(i){return(p$items[[i]]$name)}) - names(l)<-ns +.p2r_datasuppliers <- function(p) { + n <- length(p$items) + if (n == 0) { + return(list()) + } + l <- lapply(1:n, function(i) { + return(.p2r_datasupplier(p$items[[i]])) + }) + ns <- sapply(1:n, function(i) { + return(p$items[[i]]$name) + }) + names(l) <- ns return(l) } #' @export #' @rdname jd3_utilities -.p2jd_variables<-function(p){ - bytes<-p$serialize(NULL) - jcal <- .jcall("jdplus/toolkit/base/r/util/Modelling", "Ljdplus/toolkit/base/api/timeseries/regression/TsDataSuppliers;", - "variablesOf", - bytes) +.p2jd_variables <- function(p) { + bytes <- p$serialize(NULL) + jcal <- .jcall( + "jdplus/toolkit/base/r/util/Modelling", "Ljdplus/toolkit/base/api/timeseries/regression/TsDataSuppliers;", + "variablesOf", + bytes + ) return(jcal) } #' @export #' @rdname jd3_utilities -.jd2p_variables<-function(jd){ - bytes<-.jcall("jdplus/toolkit/base/r/util/Modelling", "[B", "toBuffer", jd) - p<-RProtoBuf::read(jd3.TsDataSuppliers, bytes) +.jd2p_variables <- function(jd) { + bytes <- .jcall("jdplus/toolkit/base/r/util/Modelling", "[B", "toBuffer", jd) + p <- RProtoBuf::read(jd3.TsDataSuppliers, bytes) return(p) } @@ -248,15 +289,15 @@ dynamic_ts<-function(moniker, data){ #' @export #' @rdname jd3_utilities -.jd2r_variables<-function(jcals){ - p<-.jd2p_variables(jcals) +.jd2r_variables <- function(jcals) { + p <- .jd2p_variables(jcals) return(.p2r_datasuppliers(p)) } #' @export #' @rdname jd3_utilities -.r2jd_variables<-function(r){ - p<-.r2p_datasuppliers(r) +.r2jd_variables <- function(r) { + p <- .r2p_datasuppliers(r) return(.p2jd_variables(p)) } @@ -275,14 +316,16 @@ dynamic_ts<-function(moniker, data){ #' @examples #' # creating one or several external regressors (TS objects), which will #' # be gathered in one or several groups -#' iv1<-intervention_variable(12, c(2000, 1), 60, -#' starts = "2001-01-01", ends = "2001-12-01") -#' iv2<- intervention_variable(12, c(2000, 1), 60, -#' starts = "2001-01-01", ends = "2001-12-01", delta = 1) +#' iv1 <- intervention_variable(12, c(2000, 1), 60, +#' starts = "2001-01-01", ends = "2001-12-01" +#' ) +#' iv2 <- intervention_variable(12, c(2000, 1), 60, +#' starts = "2001-01-01", ends = "2001-12-01", delta = 1 +#' ) #' # regressors as a list of two groups reg1 and reg2 -#' vars<-list(reg1=list(x = iv1),reg2=list(x = iv2) ) +#' vars <- list(reg1 = list(x = iv1), reg2 = list(x = iv2)) #' # creating the modelling context -#' my_context<-modelling_context(variables=vars) +#' my_context <- modelling_context(variables = vars) #' # customize a default specification #' # init_spec <- rjd3x13::x13_spec("RSA5c") #' # new_spec<- add_usrdefvar(init_spec,name = "reg1.iv1", regeffect="Trend") @@ -292,13 +335,13 @@ dynamic_ts<-function(moniker, data){ #' @references #' More information on auxiliary variables in JDemetra+ online documentation: #' \url{https://jdemetra-new-documentation.netlify.app/} -modelling_context<-function(calendars=NULL, variables=NULL){ - if (is.null(calendars))calendars<-list() - if (is.null(variables))variables<-list() - if (! is.list(calendars)) stop("calendars should be a list of calendars") - if (length(calendars)>0) if (length(calendars) != length(which(sapply(calendars,function(z) is(z, 'JD3_CALENDARDEFINITION'))))) stop("calendars should be a list of calendars") - if (! is.list(variables)) stop("variables should be a list of vars") - if (length(variables) != 0){ +modelling_context <- function(calendars = NULL, variables = NULL) { + if (is.null(calendars)) calendars <- list() + if (is.null(variables)) variables <- list() + if (!is.list(calendars)) stop("calendars should be a list of calendars") + if (length(calendars) > 0) if (length(calendars) != length(which(sapply(calendars, function(z) is(z, "JD3_CALENDARDEFINITION"))))) stop("calendars should be a list of calendars") + if (!is.list(variables)) stop("variables should be a list of vars") + if (length(variables) != 0) { list_var <- sapply(variables, is.list) mts_var <- sapply(variables, is.mts) ts_var <- (!list_var) & (!mts_var) @@ -317,7 +360,7 @@ modelling_context<-function(calendars=NULL, variables=NULL){ # Use 'r' as the name of the dictionary variables <- c(variables[!ts_var], list(r = variables[ts_var])) } - if (sum(names(variables) == "r") >= 2){ + if (sum(names(variables) == "r") >= 2) { # handle case with multiple r groups defined combined_var <- do.call(c, variables[names(variables) == "r"]) names(combined_var) <- unlist(lapply(variables[names(variables) == "r"], names)) @@ -326,57 +369,65 @@ modelling_context<-function(calendars=NULL, variables=NULL){ } } - return(list(calendars=calendars, variables=variables)) + return(list(calendars = calendars, variables = variables)) } #' @export #' @rdname jd3_utilities -.p2r_context<-function(p){ - n<-length(p$calendars) +.p2r_context <- function(p) { + n <- length(p$calendars) lcal <- lvar <- NULL - if (n > 0){ - lcal<-lapply(1:n, function(i){return(.p2r_calendardef(p$calendars[[i]]$value))}) - ns<-sapply(1:n, function(i){return(p$calendars[[i]]$key)}) - names(lcal)<-ns + if (n > 0) { + lcal <- lapply(1:n, function(i) { + return(.p2r_calendardef(p$calendars[[i]]$value)) + }) + ns <- sapply(1:n, function(i) { + return(p$calendars[[i]]$key) + }) + names(lcal) <- ns } - n<-length(p$variables) - if (n > 0){ - lvar<-lapply(1:n, function(i){return(.p2r_datasuppliers(p$variables[[i]]$value))}) - ns<-sapply(1:n, function(i){return(p$variables[[i]]$key)}) - names(lvar)<-ns + n <- length(p$variables) + if (n > 0) { + lvar <- lapply(1:n, function(i) { + return(.p2r_datasuppliers(p$variables[[i]]$value)) + }) + ns <- sapply(1:n, function(i) { + return(p$variables[[i]]$key) + }) + names(lvar) <- ns } - return(list(calendars=lcal, variables=lvar)) + return(list(calendars = lcal, variables = lvar)) } #' @export #' @rdname jd3_utilities -.r2p_context<-function(r){ - p<-jd3.ModellingContext$new() - n<-length(r$calendars) - if (n > 0){ - ns<-names(r$calendars) +.r2p_context <- function(r) { + p <- jd3.ModellingContext$new() + n <- length(r$calendars) + if (n > 0) { + ns <- names(r$calendars) # To take into account empty calendars length_cal <- lengths(r$calendars) - lcal<-lapply((1:n)[length_cal!=0], function(i){ - entry<-jd3.ModellingContext$CalendarsEntry$new() - entry$key<-ns[i] - entry$value<-.r2p_calendardef(r$calendars[[i]]) + lcal <- lapply((1:n)[length_cal != 0], function(i) { + entry <- jd3.ModellingContext$CalendarsEntry$new() + entry$key <- ns[i] + entry$value <- .r2p_calendardef(r$calendars[[i]]) return(entry) }) if (length(lcal) > 0) { - p$calendars<-lcal + p$calendars <- lcal } } - n<-length(r$variables) - if (n > 0){ - ns<-names(r$variables) + n <- length(r$variables) + if (n > 0) { + ns <- names(r$variables) length_var <- lengths(r$variables) - lvar<-lapply((1:n)[length_var!=0], function(i){ - entry<-jd3.ModellingContext$VariablesEntry$new() - entry$key<-ns[i] - entry$value<-.r2p_datasuppliers(r$variables[[i]]) + lvar <- lapply((1:n)[length_var != 0], function(i) { + entry <- jd3.ModellingContext$VariablesEntry$new() + entry$key <- ns[i] + entry$value <- .r2p_datasuppliers(r$variables[[i]]) return(entry) }) if (length(lvar) > 0) { @@ -388,63 +439,69 @@ modelling_context<-function(calendars=NULL, variables=NULL){ #' @export #' @rdname jd3_utilities -.p2jd_context<-function(p){ - bytes<-p$serialize(NULL) - jcal <- .jcall("jdplus/toolkit/base/r/util/Modelling", "Ljdplus/toolkit/base/api/timeseries/regression/ModellingContext;", - "of", - bytes) +.p2jd_context <- function(p) { + bytes <- p$serialize(NULL) + jcal <- .jcall( + "jdplus/toolkit/base/r/util/Modelling", "Ljdplus/toolkit/base/api/timeseries/regression/ModellingContext;", + "of", + bytes + ) return(jcal) } #' @export #' @rdname jd3_utilities -.jd2p_context<-function(jd){ - bytes<-.jcall("jdplus/toolkit/base/r/util/Modelling", "[B", "toBuffer", jd) - p<-RProtoBuf::read(jd3.ModellingContext, bytes) +.jd2p_context <- function(jd) { + bytes <- .jcall("jdplus/toolkit/base/r/util/Modelling", "[B", "toBuffer", jd) + p <- RProtoBuf::read(jd3.ModellingContext, bytes) return(p) } #' @export #' @rdname jd3_utilities -.jd2r_modellingcontext<-function(jcontext){ - p<-.jd2p_context(jcontext) +.jd2r_modellingcontext <- function(jcontext) { + p <- .jd2p_context(jcontext) return(.p2r_context(p)) } #' @export #' @rdname jd3_utilities -.r2jd_modellingcontext<-function(r){ - p<-.r2p_context(r) +.r2jd_modellingcontext <- function(r) { + p <- .r2p_context(r) return(.p2jd_context(p)) } #' @export #' @rdname jd3_utilities -.p2r_calendars<-function(p){ - n<-length(p$calendars) +.p2r_calendars <- function(p) { + n <- length(p$calendars) lcal <- NULL - if (n > 0){ - lcal<-lapply(1:n, function(i){return(.p2r_calendardef(p$calendars[[i]]$value))}) - ns<-sapply(1:n, function(i){return(p$calendars[[i]]$key)}) - names(lcal)<-ns + if (n > 0) { + lcal <- lapply(1:n, function(i) { + return(.p2r_calendardef(p$calendars[[i]]$value)) + }) + ns <- sapply(1:n, function(i) { + return(p$calendars[[i]]$key) + }) + names(lcal) <- ns } return(lcal) } #' @export #' @rdname jd3_utilities -.r2p_calendars<-function(r){ - p<-jd3.Calendars$new() - ns<-names(r) - n<-length(ns) +.r2p_calendars <- function(r) { + p <- jd3.Calendars$new() + ns <- names(r) + n <- length(ns) # To take into account empty calendars length_cal <- lengths(r) - p$calendars<-lapply((1:n)[length_cal!=0], function(i){ - entry<-jd3.Calendars$CalendarsEntry$new() - entry$key<-ns[i] - entry$value<-.r2p_calendardef(r[[i]]) + p$calendars <- lapply((1:n)[length_cal != 0], function(i) { + entry <- jd3.Calendars$CalendarsEntry$new() + entry$key <- ns[i] + entry$value <- .r2p_calendardef(r[[i]]) return(entry) }) return(p) @@ -452,33 +509,35 @@ modelling_context<-function(calendars=NULL, variables=NULL){ #' @export #' @rdname jd3_utilities -.p2jd_calendars<-function(p){ - bytes<-p$serialize(NULL) - jcal <- .jcall("jdplus/toolkit/base/r/util/Modelling", "Ljdplus/toolkit/base/api/timeseries/calendars/CalendarManager;", - "calendarsOf", - bytes) +.p2jd_calendars <- function(p) { + bytes <- p$serialize(NULL) + jcal <- .jcall( + "jdplus/toolkit/base/r/util/Modelling", "Ljdplus/toolkit/base/api/timeseries/calendars/CalendarManager;", + "calendarsOf", + bytes + ) return(jcal) } #' @export #' @rdname jd3_utilities -.jd2p_calendars<-function(jd){ - bytes<-.jcall("jdplus/toolkit/base/r/util/Modelling", "[B", "toBuffer", jd) - p<-RProtoBuf::read(jd3.Calendars, bytes) +.jd2p_calendars <- function(jd) { + bytes <- .jcall("jdplus/toolkit/base/r/util/Modelling", "[B", "toBuffer", jd) + p <- RProtoBuf::read(jd3.Calendars, bytes) return(p) } #' @export #' @rdname jd3_utilities -.jd2r_calendars<-function(jcals){ - p<-.jd2p_calendars(jcals) +.jd2r_calendars <- function(jcals) { + p <- .jd2p_calendars(jcals) return(.p2r_calendars(p)) } #' @export #' @rdname jd3_utilities -.r2jd_calendars<-function(r){ - p<-.r2p_calendars(r) +.r2jd_calendars <- function(r) { + p <- .r2p_calendars(r) return(.p2jd_calendars(p)) } diff --git a/R/procresults.R b/R/procresults.R index 8cce272..3ed74cd 100644 --- a/R/procresults.R +++ b/R/procresults.R @@ -1,17 +1,18 @@ #' @include jd3rslts.R NULL -OBJ<-'JD3_Object' -RSLT<-'JD3_ProcResults' +OBJ <- "JD3_Object" +RSLT <- "JD3_ProcResults" #' @export #' @rdname jd3_utilities -.jd3_object<-function(jobjRef, subclasses=NULL, result=FALSE){ - if (result) - classes<-c(OBJ, RSLT, subclasses) - else - classes<-c(OBJ, subclasses) - return(structure(list(internal=jobjRef), class=classes)) +.jd3_object <- function(jobjRef, subclasses = NULL, result = FALSE) { + if (result) { + classes <- c(OBJ, RSLT, subclasses) + } else { + classes <- c(OBJ, subclasses) + } + return(structure(list(internal = jobjRef), class = classes)) } @@ -24,13 +25,14 @@ RSLT<-'JD3_ProcResults' #' @param userdefined vector containing the names of the object to extract. #' #' @export -dictionary<-function(object){ - if (! is(object, RSLT)) +dictionary <- function(object) { + if (!is(object, RSLT)) { stop("No dictionary for this type of object") - if (is.jnull(object$internal)){ + } + if (is.jnull(object$internal)) { stop("No java object") } else { - if (.jinstanceof(object$internal, "jdplus/toolkit/base/api/information/Explorable")){ + if (.jinstanceof(object$internal, "jdplus/toolkit/base/api/information/Explorable")) { .proc_dictionary2(object$internal) } else { .proc_dictionary(.jclass(object$internal)) @@ -40,10 +42,11 @@ dictionary<-function(object){ #' @rdname dictionary #' @export -result<-function(object, id){ - if (! is(object, RSLT)) +result <- function(object, id) { + if (!is(object, RSLT)) { stop("No result for this type of object") - if (is.jnull(object$internal)){ + } + if (is.jnull(object$internal)) { stop("No java object") } else { .proc_data(object$internal, id) @@ -52,14 +55,17 @@ result<-function(object, id){ #' @rdname dictionary #' @export -user_defined <- function(object, userdefined = NULL){ - if (is.null(userdefined)){ +user_defined <- function(object, userdefined = NULL) { + if (is.null(userdefined)) { result <- list() } else { - result <- lapply(userdefined, - function(var) result(object, var)) - if (is.null(names(userdefined))) + result <- lapply( + userdefined, + function(var) result(object, var) + ) + if (is.null(names(userdefined))) { names(result) <- userdefined + } } class(result) <- c("user_defined") result diff --git a/R/protobuf.R b/R/protobuf.R index e0cfe0b..82c12fa 100644 --- a/R/protobuf.R +++ b/R/protobuf.R @@ -25,39 +25,39 @@ NULL #' @export #' @rdname jd3_utilities -.enum_sextract<-function(type, p){ - return(type$value(number=p)$name()) +.enum_sextract <- function(type, p) { + return(type$value(number = p)$name()) } #' @export #' @rdname jd3_utilities -.enum_sof<-function(type, code){ - return(type$value(name=code)$number()) +.enum_sof <- function(type, code) { + return(type$value(name = code)$number()) } #' @export #' @rdname jd3_utilities -.enum_extract<-function(type, p){ - name<-type$value(number=p)$name() - return(substring(name, regexpr("_", name)+1)) +.enum_extract <- function(type, p) { + name <- type$value(number = p)$name() + return(substring(name, regexpr("_", name) + 1)) } #' @export #' @rdname jd3_utilities -.enum_of<-function(type, code, prefix){ - i<-type$value(name=paste(prefix, code, sep='_'))$number() +.enum_of <- function(type, code, prefix) { + i <- type$value(name = paste(prefix, code, sep = "_"))$number() return(i) } #' @export #' @rdname jd3_utilities -.r2p_parameter<-function(r){ - p<-jd3.Parameter$new() +.r2p_parameter <- function(r) { + p <- jd3.Parameter$new() if (is.null(r)) { - p$value<-0 - p$type<-.enum_of(jd3.ParameterType, "UNUSED", "PARAMETER") + p$value <- 0 + p$type <- .enum_of(jd3.ParameterType, "UNUSED", "PARAMETER") } else { - p$value<-r$value - p$type<-.enum_of(jd3.ParameterType, r$type, "PARAMETER") + p$value <- r$value + p$type <- .enum_of(jd3.ParameterType, r$type, "PARAMETER") } return(p) } @@ -65,17 +65,23 @@ NULL #' @export #' @rdname jd3_utilities -.p2r_parameter<-function(p){ - if (! p$has("type")) return(NULL) - return(list(value = p$value, type=.enum_extract(jd3.ParameterType, p$type))) +.p2r_parameter <- function(p) { + if (!p$has("type")) { + return(NULL) + } + return(list(value = p$value, type = .enum_extract(jd3.ParameterType, p$type))) } #' @export #' @rdname jd3_utilities -.r2p_parameters<-function(r){ - n<-length(r) - if (n == 0) return(NULL) - p<-apply(r, 2, function(z){.r2p_parameter(z)}) +.r2p_parameters <- function(r) { + n <- length(r) + if (n == 0) { + return(NULL) + } + p <- apply(r, 2, function(z) { + .r2p_parameter(z) + }) return(p) } @@ -91,11 +97,15 @@ NULL #' @export #' @rdname jd3_utilities -.r2p_lparameters<-function(r){ +.r2p_lparameters <- function(r) { # r is a list of lists with value/type entries - n<-length(r) - if (n == 0) return(NULL) - p<-lapply(r, function(z){.r2p_parameter(z)}) + n <- length(r) + if (n == 0) { + return(NULL) + } + p <- lapply(r, function(z) { + .r2p_parameter(z) + }) return(p) } @@ -103,109 +113,132 @@ NULL #' @export #' @rdname jd3_utilities -.p2r_parameters<-function(p){ - n<-length(p) - if (n == 0) return(NULL) - r<-sapply(p, function(z){list(value=z$value, type=.enum_extract(jd3.ParameterType, z$type))}) +.p2r_parameters <- function(p) { + n <- length(p) + if (n == 0) { + return(NULL) + } + r <- sapply(p, function(z) { + list(value = z$value, type = .enum_extract(jd3.ParameterType, z$type)) + }) return(r) } #' @export #' @rdname jd3_utilities -.p2r_parameters_rslt<-function(p){ - if (is.null(p)) +.p2r_parameters_rslt <- function(p) { + if (is.null(p)) { return(NULL) - if (length(p) == 0) + } + if (length(p) == 0) { return(NULL) - value<-sapply(p, function(z){z$value}) - type<-sapply(p, function(z){.enum_extract(jd3.ParameterType, z$type)}) - return(data.frame(value=value, type=type)) + } + value <- sapply(p, function(z) { + z$value + }) + type <- sapply(p, function(z) { + .enum_extract(jd3.ParameterType, z$type) + }) + return(data.frame(value = value, type = type)) } #' @export #' @rdname jd3_utilities -.p2r_parameters_rsltx<-function(p){ - if (is.null(p)) +.p2r_parameters_rsltx <- function(p) { + if (is.null(p)) { return(NULL) - if (length(p) == 0) + } + if (length(p) == 0) { return(NULL) - value<-sapply(p, function(z){z$value}) - type<-sapply(p, function(z){.enum_extract(jd3.ParameterType, z$type)}) - description<-sapply(p, function(z){z$description}) - - rslt<-data.frame(value=value, type=type) - row.names(rslt)<-description + } + value <- sapply(p, function(z) { + z$value + }) + type <- sapply(p, function(z) { + .enum_extract(jd3.ParameterType, z$type) + }) + description <- sapply(p, function(z) { + z$description + }) + + rslt <- data.frame(value = value, type = type) + row.names(rslt) <- description return(rslt) } #' @export #' @rdname jd3_utilities -.p2r_test<-function(p){ - if (is.null(p)) +.p2r_test <- function(p) { + if (is.null(p)) { return(NULL) + } p <- p$as.list() return(statisticaltest(p$value, p$pvalue, p$description)) } #' @export #' @rdname jd3_utilities -.p2r_matrix<-function(p){ - m<-matrix(data=p$values, nrow = p$nrows, ncol = p$ncols) +.p2r_matrix <- function(p) { + m <- matrix(data = p$values, nrow = p$nrows, ncol = p$ncols) `attr<-`(m, "name", p$name) return(m) } -.r2p_matrix<-function(r){ - p<-jd3.Matrix$new() - p$name<-attr(r, "name") - p$nrows<-nrow(r) - p$ncols<-ncol(r) - p$values<-as.numeric(r) +.r2p_matrix <- function(r) { + p <- jd3.Matrix$new() + p$name <- attr(r, "name") + p$nrows <- nrow(r) + p$ncols <- ncol(r) + p$values <- as.numeric(r) return(p) } #' @export #' @rdname jd3_utilities -.p2r_tsdata<-function(p){ - if (length(p$values) == 0) +.p2r_tsdata <- function(p) { + if (length(p$values) == 0) { return(NULL) - s<-ts(data=p$values, frequency = p$annual_frequency, start = c(p$start_year, p$start_period)) - s<-`attr<-`(s, "name", p$name) + } + s <- ts(data = p$values, frequency = p$annual_frequency, start = c(p$start_year, p$start_period)) + s <- `attr<-`(s, "name", p$name) return(s) } #' @export #' @rdname jd3_utilities -.r2p_tsdata<-function(r){ - p<-jd3.TsData$new() - p$name<-attr(r, "name") - p$annual_frequency<-frequency(r) - s<-start(r) - p$start_year<-s[1] - p$start_period<-s[2] - p$values<-as.numeric(r) +.r2p_tsdata <- function(r) { + p <- jd3.TsData$new() + p$name <- attr(r, "name") + p$annual_frequency <- frequency(r) + s <- start(r) + p$start_year <- s[1] + p$start_period <- s[2] + p$values <- as.numeric(r) return(p) } #' @export #' @rdname jd3_utilities -.p2r_parameters_estimation<-function(p){ - if (is.null(p)) +.p2r_parameters_estimation <- function(p) { + if (is.null(p)) { return(NULL) - return(list(val=p$value, score=p$score, cov=.p2r_matrix(p$covariance), description=p$description)) + } + return(list(val = p$value, score = p$score, cov = .p2r_matrix(p$covariance), description = p$description)) } #' @export #' @rdname jd3_utilities -.p2r_likelihood<-function(p){ - return(.likelihood(p$nobs, p$neffectiveobs, p$nparams, - p$log_likelihood, p$adjusted_log_likelihood, - p$aic, p$aicc, p$bic, p$bicc, p$ssq)) +.p2r_likelihood <- function(p) { + return(.likelihood( + p$nobs, p$neffectiveobs, p$nparams, + p$log_likelihood, p$adjusted_log_likelihood, + p$aic, p$aicc, p$bic, p$bicc, p$ssq + )) } #' @export #' @rdname jd3_utilities -.p2r_date<-function(p){ - if (p$has('year')){ +.p2r_date <- function(p) { + if (p$has("year")) { return(ymd(p$year, p$month, p$day)) } else { return(NULL) @@ -214,50 +247,59 @@ NULL #' @export #' @rdname jd3_utilities -.r2p_date<-function(s){ - if (is.null(s)) return(jd3.Date$new()) - else return(parseDate(s)) +.r2p_date <- function(s) { + if (is.null(s)) { + return(jd3.Date$new()) + } else { + return(parseDate(s)) + } } # Span #' @export #' @rdname jd3_utilities -.p2r_span<-function(span){ - type<-.enum_extract(jd3.SelectionType, span$type) - dt0<-.p2r_date(span$d0) - dt1<-.p2r_date(span$d1) +.p2r_span <- function(span) { + type <- .enum_extract(jd3.SelectionType, span$type) + dt0 <- .p2r_date(span$d0) + dt1 <- .p2r_date(span$d1) - return(structure(list(type=type, d0=dt0, d1=dt1, n0=span$n0, n1=span$n1), class= "JD3_SPAN")) + return(structure(list(type = type, d0 = dt0, d1 = dt1, n0 = span$n0, n1 = span$n1), class = "JD3_SPAN")) } #' @export #' @rdname jd3_utilities -.r2p_span<-function(rspan){ - pspan<-jd3.TimeSelector$new() - pspan$type<-.enum_of(jd3.SelectionType, rspan$type, "SPAN") - pspan$n0<-rspan$n0 - pspan$n1<-rspan$n1 - pspan$d0<-.r2p_date(rspan$d0) - pspan$d1<-.r2p_date(rspan$d1) +.r2p_span <- function(rspan) { + pspan <- jd3.TimeSelector$new() + pspan$type <- .enum_of(jd3.SelectionType, rspan$type, "SPAN") + pspan$n0 <- rspan$n0 + pspan$n1 <- rspan$n1 + pspan$d0 <- .r2p_date(rspan$d0) + pspan$d1 <- .r2p_date(rspan$d1) return(pspan) } -.p2r_sarima<-function(p){ - return(sarima_model(p$name, p$period, p$phi, p$d, p$theta, - p$bphi, p$bd, p$btheta)) +.p2r_sarima <- function(p) { + return(sarima_model( + p$name, p$period, p$phi, p$d, p$theta, + p$bphi, p$bd, p$btheta + )) } #' @export #' @rdname jd3_utilities -.p2r_arima<-function(p){ +.p2r_arima <- function(p) { return(arima_model(p$name, p$ar, p$delta, p$ma, p$innovation_variance)) } #' @export #' @rdname jd3_utilities -.p2r_ucarima<-function(p){ - model<-.p2r_arima(p$model) - return(ucarima_model(model,lapply(p$components, function(z){.p2r_arima(z)}), lapply(p$complements, function(z){.p2r_arima(z)}), FALSE)) +.p2r_ucarima <- function(p) { + model <- .p2r_arima(p$model) + return(ucarima_model(model, lapply(p$components, function(z) { + .p2r_arima(z) + }), lapply(p$complements, function(z) { + .p2r_arima(z) + }), FALSE)) } @@ -265,278 +307,331 @@ NULL # Sarima #' @export #' @rdname jd3_utilities -.p2r_spec_sarima<-function(spec){ +.p2r_spec_sarima <- function(spec) { return(structure( list( - period=spec$period, - d=spec$d, - bd=spec$bd, - phi=.p2r_parameters(spec$phi), - theta=.p2r_parameters(spec$theta), - bphi=.p2r_parameters(spec$bphi), - btheta=.p2r_parameters(spec$btheta) + period = spec$period, + d = spec$d, + bd = spec$bd, + phi = .p2r_parameters(spec$phi), + theta = .p2r_parameters(spec$theta), + bphi = .p2r_parameters(spec$bphi), + btheta = .p2r_parameters(spec$btheta) ), - class="JD3_SARIMA_ESTIMATION" + class = "JD3_SARIMA_ESTIMATION" )) } #' @export #' @rdname jd3_utilities -.r2p_spec_sarima<-function(r){ - p<-regarima.SarimaSpec$new() - p$period<-r$period - p$d<-r$d - p$bd<-r$bd - p$phi<-.r2p_parameters(r$phi) - p$theta<-.r2p_parameters(r$theta) - p$bphi<-.r2p_parameters(r$bphi) - p$btheta<-.r2p_parameters(r$btheta) +.r2p_spec_sarima <- function(r) { + p <- regarima.SarimaSpec$new() + p$period <- r$period + p$d <- r$d + p$bd <- r$bd + p$phi <- .r2p_parameters(r$phi) + p$theta <- .r2p_parameters(r$theta) + p$bphi <- .r2p_parameters(r$bphi) + p$btheta <- .r2p_parameters(r$btheta) return(p) } -.p2r_outlier<-function(p){ +.p2r_outlier <- function(p) { return(list( - name=p$name, - pos=.p2r_date(p$position), - code=p$code, - coef=.p2r_parameter(p$coefficient) + name = p$name, + pos = .p2r_date(p$position), + code = p$code, + coef = .p2r_parameter(p$coefficient) )) } -.r2p_outlier<-function(r){ - p<-modelling.Outlier$new() - p$name<-r$name - p$code<-r$code - p$position<-.r2p_date(r$pos) - p$coefficient<-.r2p_parameter(r$coef) +.r2p_outlier <- function(r) { + p <- modelling.Outlier$new() + p$name <- r$name + p$code <- r$code + p$position <- .r2p_date(r$pos) + p$coefficient <- .r2p_parameter(r$coef) return(p) } #' @export #' @rdname jd3_utilities -.p2r_outliers<-function(p){ - if (length(p) == 0){return(NULL)} - return(lapply(p, function(z){.p2r_outlier(z)})) +.p2r_outliers <- function(p) { + if (length(p) == 0) { + return(NULL) + } + return(lapply(p, function(z) { + .p2r_outlier(z) + })) } #' @export #' @rdname jd3_utilities -.r2p_outliers<-function(r){ - if (length(r) == 0){return(list())} - return(lapply(r, function(z){.r2p_outlier(z)})) +.r2p_outliers <- function(r) { + if (length(r) == 0) { + return(list()) + } + return(lapply(r, function(z) { + .r2p_outlier(z) + })) } -.p2r_sequence<-function(p){ +.p2r_sequence <- function(p) { return(list( - start=.p2r_date(p$start), - end=.p2r_date(p$end) + start = .p2r_date(p$start), + end = .p2r_date(p$end) )) } -.r2p_sequence<-function(r){ - p<-modelling.InterventionVariable$Sequence$new() - p$start<-.r2p_date(r$start) - p$end<-.r2p_date(r$end) +.r2p_sequence <- function(r) { + p <- modelling.InterventionVariable$Sequence$new() + p$start <- .r2p_date(r$start) + p$end <- .r2p_date(r$end) return(p) } #' @export #' @rdname jd3_utilities -.p2r_sequences<-function(p){ - if (length(p) == 0){return(NULL)} - return(lapply(p, function(z){.p2r_sequence(z)})) +.p2r_sequences <- function(p) { + if (length(p) == 0) { + return(NULL) + } + return(lapply(p, function(z) { + .p2r_sequence(z) + })) } #' @export #' @rdname jd3_utilities -.r2p_sequences<-function(r){ - if (length(r) == 0){return(list())} - return(lapply(r, function(z){.r2p_sequence(z)})) +.r2p_sequences <- function(r) { + if (length(r) == 0) { + return(list()) + } + return(lapply(r, function(z) { + .r2p_sequence(z) + })) } #' @export #' @rdname jd3_utilities -.p2r_iv<-function(p){ +.p2r_iv <- function(p) { return(list( - name=p$name, - sequences=.p2r_sequences(p$sequences), - delta=p$delta, - seasonaldelta=p$seasonal_delta, - coef=.p2r_parameter(p$coefficient), - regeffect=.regeffect(p$metadata) + name = p$name, + sequences = .p2r_sequences(p$sequences), + delta = p$delta, + seasonaldelta = p$seasonal_delta, + coef = .p2r_parameter(p$coefficient), + regeffect = .regeffect(p$metadata) )) } #' @export #' @rdname jd3_utilities -.r2p_iv<-function(r){ - p<-modelling.InterventionVariable$new() - p$name<-r$name - p$sequences<-.r2p_sequences(r$sequences) - p$coefficient<-.r2p_parameter(r$coef) - p$metadata<-modelling.InterventionVariable.MetadataEntry$new(key = "regeffect", value=r$regeffect) +.r2p_iv <- function(r) { + p <- modelling.InterventionVariable$new() + p$name <- r$name + p$sequences <- .r2p_sequences(r$sequences) + p$coefficient <- .r2p_parameter(r$coef) + p$metadata <- modelling.InterventionVariable.MetadataEntry$new(key = "regeffect", value = r$regeffect) return(p) } #' @export #' @rdname jd3_utilities -.p2r_ivs<-function(p){ - if (length(p) == 0){return(NULL)} - return(lapply(p, function(z){.p2r_iv(z)})) +.p2r_ivs <- function(p) { + if (length(p) == 0) { + return(NULL) + } + return(lapply(p, function(z) { + .p2r_iv(z) + })) } #' @export #' @rdname jd3_utilities -.r2p_ivs<-function(r){ - if (length(r) == 0){return(list())} - return(lapply(r, function(z){.r2p_iv(z)})) +.r2p_ivs <- function(r) { + if (length(r) == 0) { + return(list()) + } + return(lapply(r, function(z) { + .r2p_iv(z) + })) } -.p2r_ramp<-function(p){ +.p2r_ramp <- function(p) { return(list( - name=p$name, - start=.p2r_date(p$start), - end=.p2r_date(p$end), - coef=.p2r_parameter(p$coefficient) + name = p$name, + start = .p2r_date(p$start), + end = .p2r_date(p$end), + coef = .p2r_parameter(p$coefficient) )) } -.r2p_ramp<-function(r){ - p<-modelling.Ramp$new() - p$name<-r$name - p$start<-.r2p_date(r$start) - p$end<-.r2p_date(r$end) - p$coefficient<-.r2p_parameter(r$coef) +.r2p_ramp <- function(r) { + p <- modelling.Ramp$new() + p$name <- r$name + p$start <- .r2p_date(r$start) + p$end <- .r2p_date(r$end) + p$coefficient <- .r2p_parameter(r$coef) return(p) } #' @export #' @rdname jd3_utilities -.p2r_ramps<-function(p){ - if (length(p) == 0){return(NULL)} - return(lapply(p, function(z){.p2r_ramp(z)})) +.p2r_ramps <- function(p) { + if (length(p) == 0) { + return(NULL) + } + return(lapply(p, function(z) { + .p2r_ramp(z) + })) } #' @export #' @rdname jd3_utilities -.r2p_ramps<-function(r){ - if (length(r) == 0){return(list())} - return(lapply(r, function(z){.r2p_ramp(z)})) +.r2p_ramps <- function(r) { + if (length(r) == 0) { + return(list()) + } + return(lapply(r, function(z) { + .r2p_ramp(z) + })) } -.regeffect<-function(map){ - if (length(map) == 0) +.regeffect <- function(map) { + if (length(map) == 0) { + return("Undefined") + } + r <- which(sapply(map, function(z) { + z$key == "regeffect" + })) + if (length(r) == 0) { return("Undefined") - r<-which(sapply(map, function(z){z$key == "regeffect"})) - if (length(r) == 0) return("Undefined") + } return(map[[min(r)]]$value) } -.p2r_uservar<-function(p){ - l<-p$lag +.p2r_uservar <- function(p) { + l <- p$lag return(list( - id=p$id, - name=p$name, - lag=l, - coef=.p2r_parameter(p$coefficient), - regeffect=.regeffect(p$metadata) + id = p$id, + name = p$name, + lag = l, + coef = .p2r_parameter(p$coefficient), + regeffect = .regeffect(p$metadata) )) } -.r2p_uservar<-function(r){ - p<-modelling.TsVariable$new() - p$name<-r$name - p$id<-r$id - p$lag<-r$lag - p$coefficient<-.r2p_parameter(r$coef) - p$metadata<-modelling.TsVariable.MetadataEntry$new(key = "regeffect", value=r$regeffect) +.r2p_uservar <- function(r) { + p <- modelling.TsVariable$new() + p$name <- r$name + p$id <- r$id + p$lag <- r$lag + p$coefficient <- .r2p_parameter(r$coef) + p$metadata <- modelling.TsVariable.MetadataEntry$new(key = "regeffect", value = r$regeffect) return(p) } #' @export #' @rdname jd3_utilities -.p2r_uservars<-function(p){ - if (length(p) == 0){return(NULL)} - return(lapply(p, function(z){.p2r_uservar(z)})) +.p2r_uservars <- function(p) { + if (length(p) == 0) { + return(NULL) + } + return(lapply(p, function(z) { + .p2r_uservar(z) + })) } #' @export #' @rdname jd3_utilities -.r2p_uservars<-function(r){ - if (length(r) == 0){return(list())} - return(lapply(r, function(z){.r2p_uservar(z)})) +.r2p_uservars <- function(r) { + if (length(r) == 0) { + return(list()) + } + return(lapply(r, function(z) { + .r2p_uservar(z) + })) } #' @export #' @rdname jd3_utilities -.p2r_variables<-function(p){ - return(lapply(p, function(v){.p2r_variable(v)})) +.p2r_variables <- function(p) { + return(lapply(p, function(v) { + .p2r_variable(v) + })) } -.p2r_variable<-function(p){ - name<-p$name - type<-.enum_extract(modelling.VariableType, p$var_type) - coef<-.p2r_parameters_rsltx(p$coefficients) - return(list(name=name, type=type, coef=coef)) +.p2r_variable <- function(p) { + name <- p$name + type <- .enum_extract(modelling.VariableType, p$var_type) + coef <- .p2r_parameters_rsltx(p$coefficients) + return(list(name = name, type = type, coef = coef)) } -.p2r_component<-function(p){ - s<-p$data$values - n<-length(s) - if (n == 0) return(NULL) - freq<-p$data$annual_frequency - start<-c(p$data$start_year, p$data$start_period) - nb<-p$nbcasts - nf<-p$nfcasts - - val<-ts(s[(nb+1):(n-nf)], frequency = freq, start=.ts_move(start, freq, nb)) - rslt<-list(data=val) - if (nb > 0){ - bcasts<-ts(s[1:nb], frequency = freq, start=start) - rslt[['bcasts']]<-bcasts +.p2r_component <- function(p) { + s <- p$data$values + n <- length(s) + if (n == 0) { + return(NULL) + } + freq <- p$data$annual_frequency + start <- c(p$data$start_year, p$data$start_period) + nb <- p$nbcasts + nf <- p$nfcasts + + val <- ts(s[(nb + 1):(n - nf)], frequency = freq, start = .ts_move(start, freq, nb)) + rslt <- list(data = val) + if (nb > 0) { + bcasts <- ts(s[1:nb], frequency = freq, start = start) + rslt[["bcasts"]] <- bcasts } - if (nf > 0){ - fcasts<-ts(s[(n-nf+1):n], frequency = freq, start=.ts_move(start, freq, n-nf)) - rslt[['fcasts']]<-fcasts + if (nf > 0) { + fcasts <- ts(s[(n - nf + 1):n], frequency = freq, start = .ts_move(start, freq, n - nf)) + rslt[["fcasts"]] <- fcasts } return(rslt) } -.p2r_sa_component<-function(p){ - e<-p$stde - if (length(e) == 0) return(.p2r_component(p)) - - s<-p$data$values - n<-length(s) - if (n == 0) return(NULL) - freq<-p$data$annual_frequency - start<-c(p$data$start_year, p$data$start_period) - nb<-p$nbcasts - nf<-p$nfcasts - dstart<-.ts_move(start, freq, nb) - fstart<-.ts_move(start, freq, n-nf) - - idx<-(nb+1):(n-nf) - data<-ts(s[idx], frequency = freq, dstart) - edata<-ts(e[idx], frequency = freq, dstart) - - rslt<-list(data=data, data.stde=edata) - if (nb > 0){ - idx<-1:nb - bcasts<-ts(s[idx], frequency = freq, start=start) - ebcasts<-ts(e[idx], frequency = freq, start=start) - rslt[['bcasts']]<-bcasts - rslt[['bcasts.stde']]<-ebcasts - } - if (nf > 0){ - idx<-(n-nf+1):n - fcasts<-ts(s[idx], frequency = freq, start=fstart) - efcasts<-ts(e[idx], frequency = freq, start=fstart) - rslt[['fcasts']]<-fcasts - rslt[['fcasts.stde']]<-efcasts +.p2r_sa_component <- function(p) { + e <- p$stde + if (length(e) == 0) { + return(.p2r_component(p)) + } + + s <- p$data$values + n <- length(s) + if (n == 0) { + return(NULL) + } + freq <- p$data$annual_frequency + start <- c(p$data$start_year, p$data$start_period) + nb <- p$nbcasts + nf <- p$nfcasts + dstart <- .ts_move(start, freq, nb) + fstart <- .ts_move(start, freq, n - nf) + + idx <- (nb + 1):(n - nf) + data <- ts(s[idx], frequency = freq, dstart) + edata <- ts(e[idx], frequency = freq, dstart) + + rslt <- list(data = data, data.stde = edata) + if (nb > 0) { + idx <- 1:nb + bcasts <- ts(s[idx], frequency = freq, start = start) + ebcasts <- ts(e[idx], frequency = freq, start = start) + rslt[["bcasts"]] <- bcasts + rslt[["bcasts.stde"]] <- ebcasts + } + if (nf > 0) { + idx <- (n - nf + 1):n + fcasts <- ts(s[idx], frequency = freq, start = fstart) + efcasts <- ts(e[idx], frequency = freq, start = fstart) + rslt[["fcasts"]] <- fcasts + rslt[["fcasts.stde"]] <- efcasts } return(rslt) @@ -544,24 +639,24 @@ NULL #' @export #' @rdname jd3_utilities -.p2r_sa_decomposition<-function(p, full=FALSE){ +.p2r_sa_decomposition <- function(p, full = FALSE) { if (full) { output <- list( mode = .enum_extract(sa.DecompositionMode, p$mode), - series=.p2r_sa_component(p$series), - sa=.p2r_sa_component(p$seasonally_adjusted), - t=.p2r_sa_component(p$trend), - s=.p2r_sa_component(p$seasonal), - i=.p2r_sa_component(p$irregular) + series = .p2r_sa_component(p$series), + sa = .p2r_sa_component(p$seasonally_adjusted), + t = .p2r_sa_component(p$trend), + s = .p2r_sa_component(p$seasonal), + i = .p2r_sa_component(p$irregular) ) } else { output <- list( mode = .enum_extract(sa.DecompositionMode, p$mode), - series=.p2r_component(p$series), - sa=.p2r_component(p$seasonally_adjusted), - t=.p2r_component(p$trend), - s=.p2r_component(p$seasonal), - i=.p2r_component(p$irregular) + series = .p2r_component(p$series), + sa = .p2r_component(p$seasonally_adjusted), + t = .p2r_component(p$trend), + s = .p2r_component(p$seasonal), + i = .p2r_component(p$irregular) ) } return(output) @@ -569,48 +664,52 @@ NULL #' @export #' @rdname jd3_utilities -.p2r_sa_diagnostics<-function(p){ +.p2r_sa_diagnostics <- function(p) { output <- list( - vardecomposition =p$variance_decomposition$as.list(), - seas.ftest.i=.p2r_test(p$seasonal_ftest_on_irregular), - seas.ftest.sa=.p2r_test(p$seasonal_ftest_on_sa), - seas.qstest.i=.p2r_test(p$seasonal_qtest_on_irregular), - seas.qstest.sa=.p2r_test(p$seasonal_qtest_on_sa), - td.ftest.i=.p2r_test(p$td_ftest_on_irregular), - td.ftest.sa=.p2r_test(p$td_ftest_on_sa) + vardecomposition = p$variance_decomposition$as.list(), + seas.ftest.i = .p2r_test(p$seasonal_ftest_on_irregular), + seas.ftest.sa = .p2r_test(p$seasonal_ftest_on_sa), + seas.qstest.i = .p2r_test(p$seasonal_qtest_on_irregular), + seas.qstest.sa = .p2r_test(p$seasonal_qtest_on_sa), + td.ftest.i = .p2r_test(p$td_ftest_on_irregular), + td.ftest.sa = .p2r_test(p$td_ftest_on_sa) ) return(output) } -.ts_move<-function(period, freq, delta){ - if (delta == 0)return(period) - if (freq == 1)return(c(period[1]+delta, 1)) - x<-period[1]*freq+(period[2]+delta-1) - return(c(x %/% freq, (x %% freq)+1)) +.ts_move <- function(period, freq, delta) { + if (delta == 0) { + return(period) + } + if (freq == 1) { + return(c(period[1] + delta, 1)) + } + x <- period[1] * freq + (period[2] + delta - 1) + return(c(x %/% freq, (x %% freq) + 1)) } # Benchmarking #' @export #' @rdname jd3_utilities -.p2r_spec_benchmarking<-function(p){ +.p2r_spec_benchmarking <- function(p) { return(list( - enabled=p$enabled, - target=.enum_extract(sa.BenchmarkingTarget, p$target), - lambda=p$lambda, - rho=p$rho, - bias=.enum_extract(sa.BenchmarkingBias, p$bias), - forecast=p$forecast + enabled = p$enabled, + target = .enum_extract(sa.BenchmarkingTarget, p$target), + lambda = p$lambda, + rho = p$rho, + bias = .enum_extract(sa.BenchmarkingBias, p$bias), + forecast = p$forecast )) } #' @export #' @rdname jd3_utilities -.r2p_spec_benchmarking<-function(r){ - p<-sa.BenchmarkingSpec$new() - p$enabled<-r$enabled - p$target<-.enum_of(sa.BenchmarkingTarget, r$target, "BENCH") - p$lambda<-r$lambda - p$rho<-r$rho - p$bias<-.enum_of(sa.BenchmarkingBias, r$bias, "BENCH") - p$forecast<-r$forecast +.r2p_spec_benchmarking <- function(r) { + p <- sa.BenchmarkingSpec$new() + p$enabled <- r$enabled + p$target <- .enum_of(sa.BenchmarkingTarget, r$target, "BENCH") + p$lambda <- r$lambda + p$rho <- r$rho + p$bias <- .enum_of(sa.BenchmarkingBias, r$bias, "BENCH") + p$forecast <- r$forecast return(p) } diff --git a/R/regarima_generic.R b/R/regarima_generic.R index d5c6f80..418f7ed 100644 --- a/R/regarima_generic.R +++ b/R/regarima_generic.R @@ -1,9 +1,10 @@ # Method "JD3_REGARIMA_RSLTS" for the function coef #' @importFrom stats coef df.residual logLik residuals vcov nobs #' @export -coef.JD3_REGARIMA_RSLTS <- function(object, component = c("regression", "arima", "both"), ...){ - if (is.null(object)) +coef.JD3_REGARIMA_RSLTS <- function(object, component = c("regression", "arima", "both"), ...) { + if (is.null(object)) { return(NULL) + } component <- match.arg(component) if (component == "regression") { @@ -11,10 +12,12 @@ coef.JD3_REGARIMA_RSLTS <- function(object, component = c("regression", "arima", } else if (component == "arima") { coefs <- .sarima_coef_table(object)$coef_table } else { - coefs <- rbind(.sarima_coef_table(object)$coef_table[,1:2], - .regarima_coef_table(object)[,1:2]) + coefs <- rbind( + .sarima_coef_table(object)$coef_table[, 1:2], + .regarima_coef_table(object)[, 1:2] + ) } - res <- coefs[,1] + res <- coefs[, 1] names(res) <- rownames(coefs) res } @@ -22,27 +25,31 @@ coef.JD3_REGARIMA_RSLTS <- function(object, component = c("regression", "arima", # Method "JD3_REGARIMA_RSLTS" for the function logLik #' @export logLik.JD3_REGARIMA_RSLTS <- function(object, ...) { - if (!is.null(object$estimation)) # for sarima_estimate outputs + if (!is.null(object$estimation)) { # for sarima_estimate outputs object <- object$estimation - if (is.null(object) - || is.null(object$likelihood$ll)) { + } + if (is.null(object) || + is.null(object$likelihood$ll)) { res <- NA } else { res <- structure(object$likelihood$ll, - df = object$likelihood$nparams, - nall = object$likelihood$nobs, - nobs = object$likelihood$neffectiveobs) + df = object$likelihood$nparams, + nall = object$likelihood$nobs, + nobs = object$likelihood$neffectiveobs + ) } class(res) <- "logLik" res } #' @export -vcov.JD3_REGARIMA_RSLTS <- function(object, component = c("regression", "arima"), ...){ - if (!is.null(object$estimation)) # for sarima_estimate outputs +vcov.JD3_REGARIMA_RSLTS <- function(object, component = c("regression", "arima"), ...) { + if (!is.null(object$estimation)) { # for sarima_estimate outputs object <- object$estimation + } - if (is.null(object)) + if (is.null(object)) { return(NULL) + } component <- match.arg(component) if (component == "regression") { object$bvar @@ -51,27 +58,33 @@ vcov.JD3_REGARIMA_RSLTS <- function(object, component = c("regression", "arima") } } #' @export -df.residual.JD3_REGARIMA_RSLTS <- function(object, ...){ - if (is.null(object)) +df.residual.JD3_REGARIMA_RSLTS <- function(object, ...) { + if (is.null(object)) { return(NULL) - if (!is.null(object$estimation)) # for sarima_estimate outputs + } + if (!is.null(object$estimation)) { # for sarima_estimate outputs object <- object$estimation + } object$likelihood$neffectiveobs - object$likelihood$nparams } #' @export -nobs.JD3_REGARIMA_RSLTS <- function(object, ...){ - if (is.null(object)) +nobs.JD3_REGARIMA_RSLTS <- function(object, ...) { + if (is.null(object)) { return(NULL) - if (!is.null(object$estimation)) # for sarima_estimate outputs + } + if (!is.null(object$estimation)) { # for sarima_estimate outputs object <- object$estimation + } object$likelihood$neffectiveobs } #' @export -residuals.JD3_REGARIMA_RSLTS <- function(object, ...){ - if (is.null(object)) +residuals.JD3_REGARIMA_RSLTS <- function(object, ...) { + if (is.null(object)) { return(NULL) - if (!is.null(object$estimation)) # for sarima_estimate outputs + } + if (!is.null(object$estimation)) { # for sarima_estimate outputs object <- object$estimation + } object$res } diff --git a/R/regarima_rslts.R b/R/regarima_rslts.R index cd5d225..a4e96c1 100644 --- a/R/regarima_rslts.R +++ b/R/regarima_rslts.R @@ -3,40 +3,44 @@ NULL #' @export #' @rdname jd3_utilities -.p2r_regarima_rslts<-function(p){ +.p2r_regarima_rslts <- function(p) { output <- list( - description=.p2r_regarima_description(p$description), - estimation=.p2r_regarima_estimation(p$estimation), - diagnostics=.p2r_regarima_diagnostics(p$diagnostics) + description = .p2r_regarima_description(p$description), + estimation = .p2r_regarima_estimation(p$estimation), + diagnostics = .p2r_regarima_diagnostics(p$diagnostics) ) class(output) <- "JD3_REGARIMA_RSLTS" return(output) } -.p2r_regarima_description<-function(p){ +.p2r_regarima_description <- function(p) { return(list( - log=p$log, + log = p$log, preadjustment = .enum_extract(modelling.LengthOfPeriod, p$preadjustment), - arima=.p2r_spec_sarima(p$arima), - variables=.p2r_variables(p$variables) + arima = .p2r_spec_sarima(p$arima), + variables = .p2r_variables(p$variables) )) } -.p2r_regarima_estimation<-function(p){ +.p2r_regarima_estimation <- function(p) { return(list( - y=p$y, - X=.p2r_matrix(p$x), - parameters=.p2r_parameters_estimation(p$parameters), - b=p$b, - bvar=.p2r_matrix(p$bcovariance), - likelihood=.p2r_likelihood(p$likelihood), - res=p$residuals + y = p$y, + X = .p2r_matrix(p$x), + parameters = .p2r_parameters_estimation(p$parameters), + b = p$b, + bvar = .p2r_matrix(p$bcovariance), + likelihood = .p2r_likelihood(p$likelihood), + res = p$residuals )) } -.p2r_regarima_diagnostics<-function(p){ - tlist<-lapply(p$residuals_tests, function(z){.p2r_test(z$value)}) - tnames<-lapply(p$residuals_tests, function(z){z$key}) - testonresiduals<-`names<-`(tlist, tnames) +.p2r_regarima_diagnostics <- function(p) { + tlist <- lapply(p$residuals_tests, function(z) { + .p2r_test(z$value) + }) + tnames <- lapply(p$residuals_tests, function(z) { + z$key + }) + testonresiduals <- `names<-`(tlist, tnames) return(testonresiduals) } diff --git a/R/spec_benchmarking.R b/R/spec_benchmarking.R index 777d536..bd4792a 100644 --- a/R/spec_benchmarking.R +++ b/R/spec_benchmarking.R @@ -58,10 +58,14 @@ set_benchmarking.default <- function(x, enabled = NA, lambda = NA, forecast = NA, bias = c(NA, "None")) { - target <- match.arg(toupper(target[1]), - c(NA, "CALENDARADJUSTED", "ORIGINAL")) - bias <- match.arg(toupper(bias)[1], - c(NA, "NONE")) + target <- match.arg( + toupper(target[1]), + c(NA, "CALENDARADJUSTED", "ORIGINAL") + ) + bias <- match.arg( + toupper(bias)[1], + c(NA, "NONE") + ) if (!is.na(enabled) && is.logical(enabled)) { x$enabled <- enabled } diff --git a/R/spec_regarima.R b/R/spec_regarima.R index b4a5574..80f56de 100644 --- a/R/spec_regarima.R +++ b/R/spec_regarima.R @@ -36,7 +36,7 @@ add_outlier <- function(x, type, date, name = sprintf("%s (%s)", type, date), - coef = 0){ + coef = 0) { UseMethod("add_outlier", x) } #' @export @@ -44,45 +44,57 @@ add_outlier.default <- function(x, type, date, name = sprintf("%s (%s)", type, date), - coef = 0){ + coef = 0) { type <- match.arg(toupper(type), - choices = c("AO", "TC", "LS", "SO"), - several.ok = TRUE) + choices = c("AO", "TC", "LS", "SO"), + several.ok = TRUE + ) # data.frame to recycle arguments new_out <- data.frame(type, date, name, coef) new_out <- as.list(new_out) new_out <- mapply(.create_outlier, - as.list(new_out)[[1]], - as.list(new_out)[[2]], - as.list(new_out)[[3]], - as.list(new_out)[[4]], - SIMPLIFY = FALSE) + as.list(new_out)[[1]], + as.list(new_out)[[2]], + as.list(new_out)[[3]], + as.list(new_out)[[4]], + SIMPLIFY = FALSE + ) names(new_out) <- NULL - x$regression$outliers <- c(x$regression$outliers, - new_out) - all_out <- t(simplify2array(x$regression$outliers)[c("pos","code"),]) - dupl_out <- duplicated(all_out,fromLast = TRUE) - if (any(dupl_out)){ + x$regression$outliers <- c( + x$regression$outliers, + new_out + ) + all_out <- t(simplify2array(x$regression$outliers)[c("pos", "code"), ]) + dupl_out <- duplicated(all_out, fromLast = TRUE) + if (any(dupl_out)) { warning("Duplicated outliers removed: last outliers kept") x$regression$outliers <- x$regression$outliers[!dupl_out] } x } -.create_outlier<-function(code, pos, name = NULL, coef=NULL){ - res <- list(name=name, pos=pos, code=code, coef = .fixed_parameter(coef)) +.create_outlier <- function(code, pos, name = NULL, coef = NULL) { + res <- list(name = name, pos = pos, code = code, coef = .fixed_parameter(coef)) return(res) } -.fixed_parameters<-function(coef){ - ncoef<-length(coef) - if (ncoef == 0) return(NULL) - l<-lapply(coef, function(v){list(value=v, type='FIXED')}) +.fixed_parameters <- function(coef) { + ncoef <- length(coef) + if (ncoef == 0) { + return(NULL) + } + l <- lapply(coef, function(v) { + list(value = v, type = "FIXED") + }) return(l) } -.fixed_parameter<-function(coef){ - if (is.null(coef)) return(NULL) - if (coef == 0) return(NULL) - return(list(value=coef, type='FIXED')) +.fixed_parameter <- function(coef) { + if (is.null(coef)) { + return(NULL) + } + if (coef == 0) { + return(NULL) + } + return(list(value = coef, type = "FIXED")) } @@ -92,35 +104,38 @@ add_outlier.default <- function(x, remove_outlier <- function(x, type = NULL, date = NULL, - name = NULL){ + name = NULL) { UseMethod("remove_outlier", x) } #' @export remove_outlier.default <- function(x, type = NULL, date = NULL, - name = NULL){ - if (is.null(x$regression$outliers)) + name = NULL) { + if (is.null(x$regression$outliers)) { return(x) - out_mat <- simplify2array(x$regression$outliers)[c("code", "pos", "name"),, drop = FALSE] + } + out_mat <- simplify2array(x$regression$outliers)[c("code", "pos", "name"), , drop = FALSE] if (is.null(type)) { - out_mat["code",] <- "" + out_mat["code", ] <- "" } else { type <- match.arg(toupper(type), - choices = c("AO", "TC", "LS", "SO"), - several.ok = TRUE) + choices = c("AO", "TC", "LS", "SO"), + several.ok = TRUE + ) } if (is.null(date)) { - out_mat["pos",] <- "" + out_mat["pos", ] <- "" } if (is.null(name)) { - out_mat["name",] <- "" + out_mat["name", ] <- "" } - out_id <- apply(out_mat,2, paste0, collapse = "") + out_id <- apply(out_mat, 2, paste0, collapse = "") rm_out_id <- rbind(type = type, date = date, name = name) - if (is.null(rm_out_id)) + if (is.null(rm_out_id)) { return(x) - rm_out_id <- apply(rm_out_id,2, paste0, collapse = "") + } + rm_out_id <- apply(rm_out_id, 2, paste0, collapse = "") remove_out <- out_id %in% rm_out_id x$regression$outliers <- x$regression$outliers[!remove_out] @@ -135,7 +150,7 @@ add_ramp <- function(x, start, end, name = sprintf("rp.%s - %s", start, end), - coef = 0){ + coef = 0) { UseMethod("add_ramp", x) } #' @export @@ -143,30 +158,33 @@ add_ramp.default <- function(x, start, end, name = sprintf("rp.%s - %s", start, end), - coef = 0){ + coef = 0) { # data.frame to recycle arguments new_ramp <- data.frame(start, end, name, coef) new_ramp <- as.list(new_ramp) new_ramp <- mapply(.create_ramp, - as.list(new_ramp)[[1]], - as.list(new_ramp)[[2]], - as.list(new_ramp)[[3]], - as.list(new_ramp)[[4]], - SIMPLIFY = FALSE) + as.list(new_ramp)[[1]], + as.list(new_ramp)[[2]], + as.list(new_ramp)[[3]], + as.list(new_ramp)[[4]], + SIMPLIFY = FALSE + ) names(new_ramp) <- NULL - x$regression$ramps <- c(x$regression$ramps, - new_ramp) - all_out <- t(simplify2array(x$regression$ramps)[c("start", "end"),]) - dupl_out <- duplicated(all_out,fromLast = TRUE) - if (any(dupl_out)){ + x$regression$ramps <- c( + x$regression$ramps, + new_ramp + ) + all_out <- t(simplify2array(x$regression$ramps)[c("start", "end"), ]) + dupl_out <- duplicated(all_out, fromLast = TRUE) + if (any(dupl_out)) { warning("Duplicated ramps removed") x$regression$ramps <- x$regression$ramps[!dupl_out] } x } -.create_ramp<-function(start, end, name = NULL, coef=NULL){ - res <- list(name=name, start=start, end=end, coef = .fixed_parameter(coef)) +.create_ramp <- function(start, end, name = NULL, coef = NULL) { + res <- list(name = name, start = start, end = end, coef = .fixed_parameter(coef)) return(res) } #' @rdname add_outlier @@ -174,31 +192,33 @@ add_ramp.default <- function(x, remove_ramp <- function(x, start = NULL, end = NULL, - name = NULL){ + name = NULL) { UseMethod("remove_ramp", x) } #' @export remove_ramp.default <- function(x, start = NULL, end = NULL, - name = NULL){ - if (is.null(x$regression$ramps)) + name = NULL) { + if (is.null(x$regression$ramps)) { return(x) - rp_mat <- simplify2array(x$regression$ramps)[c("start", "end", "name"),, drop = FALSE] + } + rp_mat <- simplify2array(x$regression$ramps)[c("start", "end", "name"), , drop = FALSE] if (is.null(start)) { - rp_mat["start",] <- "" + rp_mat["start", ] <- "" } if (is.null(end)) { - rp_mat["end",] <- "" + rp_mat["end", ] <- "" } if (is.null(name)) { - rp_mat["name",] <- "" + rp_mat["name", ] <- "" } - rp_id <- apply(rp_mat,2, paste0, collapse = "") + rp_id <- apply(rp_mat, 2, paste0, collapse = "") rm_rp_id <- rbind(start = start, end = end, name = name) - if (is.null(rm_rp_id)) + if (is.null(rm_rp_id)) { return(x) - rm_rp_id <- apply(rm_rp_id,2, paste0, collapse = "") + } + rm_rp_id <- apply(rm_rp_id, 2, paste0, collapse = "") remove_rp <- rp_id %in% rm_rp_id x$regression$ramps <- x$regression$ramps[!remove_rp] @@ -273,7 +293,7 @@ set_basic <- function(x, n0 = 0, n1 = 0, preliminary.check = NA, - preprocessing = NA){ + preprocessing = NA) { UseMethod("set_basic", x) } #' @export @@ -284,18 +304,19 @@ set_basic.default <- function(x, n0 = 0, n1 = 0, preliminary.check = NA, - preprocessing = NA){ + preprocessing = NA) { basic <- x$basic is_tramo <- inherits(x, "JD3_TRAMO_SPEC") basic$span <- set_span(basic$span, - type = type, - d0 = d0, d1 = d1, - n0 = n0, n1 = n1) - if (!missing(preprocessing) && !is.na(preprocessing) && !is_tramo){ + type = type, + d0 = d0, d1 = d1, + n0 = n0, n1 = n1 + ) + if (!missing(preprocessing) && !is.na(preprocessing) && !is_tramo) { basic$preprocessing <- preprocessing } - if (!missing(preliminary.check) && !is.na(preliminary.check)){ + if (!missing(preliminary.check) && !is.na(preliminary.check)) { # basic$preliminaryCheck <- preliminary.check } x$basic <- basic @@ -352,7 +373,7 @@ set_estimate <- function(x, tol = NA, # TRAMO SPECIFIC exact.ml = NA, - unit.root.limit = NA){ + unit.root.limit = NA) { UseMethod("set_estimate", x) } #' @export @@ -365,13 +386,14 @@ set_estimate.default <- function(x, tol = NA, # TRAMO SPECIFIC exact.ml = NA, - unit.root.limit = NA){ + unit.root.limit = NA) { estimate <- x$estimate is_tramo <- inherits(x, "JD3_TRAMO_SPEC") estimate$span <- set_span(estimate$span, - type = type, - d0 = d0, d1 = d1, - n0 = n0, n1 = n1) + type = type, + d0 = d0, d1 = d1, + n0 = n0, n1 = n1 + ) if (!missing(tol) && !is.na(tol)) { estimate$tol <- tol } @@ -450,7 +472,7 @@ set_outlier <- function(x, maxiter = NA, lsrun = NA, # TRAMO SPECIFIC - eml.est = NA){ + eml.est = NA) { UseMethod("set_outlier", x) } #' @export @@ -468,33 +490,35 @@ set_outlier.default <- function(x, maxiter = NA, lsrun = NA, # TRAMO SPECIFIC - eml.est = NA){ + eml.est = NA) { outlier <- x$outlier outlier$span <- set_span(outlier$span, - type = span.type, - d0 = d0, d1 = d1, - n0 = n0, n1 = n1) + type = span.type, + d0 = d0, d1 = d1, + n0 = n0, n1 = n1 + ) # to set specific TRAMO/REGARIMA values is_tramo <- inherits(x, "JD3_TRAMO_SPEC") va_name <- ifelse(is_tramo, "va", "defva") tcr_name <- ifelse(is_tramo, "tcrate", "monthlytcrate") - if (missing(critical.value) || anyNA(critical.value)){ + if (missing(critical.value) || anyNA(critical.value)) { critical.value <- outlier[[va_name]] } else { outlier[[va_name]] <- critical.value[1] } - if (is.null(outliers.type) || length(outliers.type) == 0){ + if (is.null(outliers.type) || length(outliers.type) == 0) { if (is_tramo) { outlier$enabled <- FALSE } else { outlier$outliers <- list() } - } else if (!missing(outliers.type) && !all(is.na(outliers.type))){ + } else if (!missing(outliers.type) && !all(is.na(outliers.type))) { outliers.type <- match.arg(toupper(outliers.type), - choices = c("AO", "LS", "TC", "SO"), - several.ok = TRUE) + choices = c("AO", "LS", "TC", "SO"), + several.ok = TRUE + ) outliers.type <- unique(outliers.type) if (is_tramo) { outlier$enabled <- TRUE @@ -503,7 +527,7 @@ set_outlier.default <- function(x, } } else { critical.value <- rep(critical.value, length(outliers.type)) - outlier$outliers <- lapply(seq_along(outliers.type), function(i){ + outlier$outliers <- lapply(seq_along(outliers.type), function(i) { list(type = outliers.type[i], va = critical.value[i]) }) } @@ -521,7 +545,8 @@ set_outlier.default <- function(x, # REGARIMA SPECIFIC PARAMETERS if (!missing(method) && !is.null(method) && !all(is.na(method))) { method <- match.arg(toupper(method)[1], - choices = c("ADDONE", "ADDALL")) + choices = c("ADDONE", "ADDALL") + ) outlier$method <- method } if (!is.na(maxiter)) { @@ -625,7 +650,7 @@ set_automodel <- function(x, fct = NA, balanced = NA, # TRAMO SPECIFIC - amicompare=NA){ + amicompare = NA) { UseMethod("set_automodel", x) } #' @export @@ -645,58 +670,58 @@ set_automodel.default <- function(x, fct = NA, balanced = NA, # TRAMO SPECIFIC - amicompare = NA){ + amicompare = NA) { automodel <- x$automodel is_tramo <- inherits(x, "JD3_TRAMO_SPEC") reducecv_col <- ifelse(is_tramo, "pc", "predcv") lblim_col <- ifelse(is_tramo, "pcr", "ljungbox") - if (!is.na(enabled) && is.logical(enabled)){ + if (!is.na(enabled) && is.logical(enabled)) { automodel$enabled <- enabled } - if (!is.na(ub1)){ + if (!is.na(ub1)) { automodel$ub1 <- ub1 } - if (!is.na(ub2)){ + if (!is.na(ub2)) { automodel$ub2 <- ub2 } - if (!is.na(cancel)){ + if (!is.na(cancel)) { automodel$cancel <- cancel } - if (!is.na(fct)){ + if (!is.na(fct)) { automodel$fct <- fct } - if (!is.na(ljungboxlimit)){ + if (!is.na(ljungboxlimit)) { automodel[[lblim_col]] <- ljungboxlimit } - if (!is.na(reducecv)){ + if (!is.na(reducecv)) { automodel[[reducecv_col]] <- reducecv } - if (!is.na(acceptdefault) && is.logical(acceptdefault)){ + if (!is.na(acceptdefault) && is.logical(acceptdefault)) { automodel$acceptdef <- acceptdefault } - if (!is.na(tsig)){ + if (!is.na(tsig)) { automodel$tsig <- tsig } if (is_tramo) { # TRAMO SPECIFIC - if (!is.na(amicompare) && is.logical(amicompare)){ + if (!is.na(amicompare) && is.logical(amicompare)) { automodel$amicompare <- amicompare } } else { # REGARIMA SPECIFIC - if (!is.na(ubfinal)){ + if (!is.na(ubfinal)) { automodel$ubfinal <- ubfinal } - if (!is.na(checkmu) && is.logical(checkmu)){ + if (!is.na(checkmu) && is.logical(checkmu)) { automodel$checkmu <- checkmu } - if (!is.na(mixed) && is.logical(mixed)){ + if (!is.na(mixed) && is.logical(mixed)) { automodel$mixed <- mixed } - if (!is.na(balanced) && is.logical(balanced)){ + if (!is.na(balanced) && is.logical(balanced)) { automodel$balanced <- balanced } } @@ -759,7 +784,7 @@ set_arima <- function(x, bd = NA, bq = NA, coef = NA, - coef.type = c(NA, "Undefined", "Fixed", "Initial")){ + coef.type = c(NA, "Undefined", "Fixed", "Initial")) { UseMethod("set_arima", x) } #' @export @@ -773,26 +798,27 @@ set_arima.default <- function(x, bd = NA, bq = NA, coef = NA, - coef.type = c(NA, "Undefined", "Fixed", "Initial")){ + coef.type = c(NA, "Undefined", "Fixed", "Initial")) { arima <- x$arima - if (x$automodel$enabled){ + if (x$automodel$enabled) { warning("autmodel enabled: the parameters will not impact the final parameters") } - if (!is.na(d)){ + if (!is.na(d)) { arima$d <- d } - if (!is.na(bd)){ + if (!is.na(bd)) { arima$bd <- bd } - if (missing(coef.type) || is.null(coef.type)){ + if (missing(coef.type) || is.null(coef.type)) { coef.type <- "UNDEFINED" } else { coef.type <- match.arg(toupper(coef.type), - choices = c(NA, "UNDEFINED", "FIXED", "INITIAL"), - several.ok = TRUE) + choices = c(NA, "UNDEFINED", "FIXED", "INITIAL"), + several.ok = TRUE + ) coef.type[is.na(coef.type)] <- "UNDEFINED" } - if (missing(coef) || is.null(coef)){ + if (missing(coef) || is.null(coef)) { coef <- 0 } else { coef[is.na(coef)] <- 0 @@ -806,12 +832,16 @@ set_arima.default <- function(x, if (np + nq + nbp + nbq == 0) { arima_params <- NULL } else { - arima_params <- data.frame(arima_order = c(rep("p", np), - rep("phi", nq), - rep("bp", nbp), - rep("bphi", nbq)), - value = coef, - type = coef.type) + arima_params <- data.frame( + arima_order = c( + rep("p", np), + rep("phi", nq), + rep("bp", nbp), + rep("bphi", nbq) + ), + value = coef, + type = coef.type + ) arima_params$value <- as.list(arima_params$value) arima_params$type <- as.list(arima_params$type) } @@ -823,7 +853,7 @@ set_arima.default <- function(x, } else { arima$phi <- t(arima_params[1:p, c("value", "type")]) colnames(arima$phi) <- NULL - arima_params <- arima_params[-c(1:p),] + arima_params <- arima_params[-c(1:p), ] } } if (!is.na(q)) { @@ -832,7 +862,7 @@ set_arima.default <- function(x, } else { arima$theta <- t(arima_params[1:q, c("value", "type")]) colnames(arima$theta) <- NULL - arima_params <- arima_params[-c(1:q),] + arima_params <- arima_params[-c(1:q), ] } } if (!is.na(bp)) { @@ -841,7 +871,7 @@ set_arima.default <- function(x, } else { arima$bphi <- t(arima_params[1:bp, c("value", "type")]) colnames(arima$bphi) <- NULL - arima_params <- arima_params[-c(1:bp),] + arima_params <- arima_params[-c(1:bp), ] } } if (!is.na(bq)) { @@ -860,7 +890,8 @@ set_arima.default <- function(x, mean.type <- "UNDEFINED" } else { mean.type <- match.arg(toupper(mean.type)[1], - choices = c("UNDEFINED", "FIXED", "INITIAL")) + choices = c("UNDEFINED", "FIXED", "INITIAL") + ) } if (is.null(mean) || is.na(mean)) { regression["mean"] <- list(NULL) @@ -969,21 +1000,22 @@ set_arima.default <- function(x, #' # Pre-defined regressors based on user-defined calendar #' ### create a calendar #' BE <- national_calendar(list( -#' fixed_day(7,21), -#' special_day("NEWYEAR"), -#' special_day("CHRISTMAS"), -#' special_day("MAYDAY"), -#' special_day("EASTERMONDAY"), -#' special_day("ASCENSION"), -#' special_day("WHITMONDAY"), -#' special_day("ASSUMPTION"), -#' special_day("ALLSAINTSDAY"), -#' special_day("ARMISTICE"))) +#' fixed_day(7, 21), +#' special_day("NEWYEAR"), +#' special_day("CHRISTMAS"), +#' special_day("MAYDAY"), +#' special_day("EASTERMONDAY"), +#' special_day("ASCENSION"), +#' special_day("WHITMONDAY"), +#' special_day("ASSUMPTION"), +#' special_day("ALLSAINTSDAY"), +#' special_day("ARMISTICE") +#' )) #' ## put into a context -#' my_context<-modelling_context(calendars = list(cal=BE)) +#' my_context <- modelling_context(calendars = list(cal = BE)) #' ## create a specification -#' #init_spec <- rjd3x13::x13_spec("RSA5c") -#'## modify the specification +#' # init_spec <- rjd3x13::x13_spec("RSA5c") +#' ## modify the specification #' # new_spec<-set_tradingdays(init_spec, #' # option = "TradingDays", calendar.name="cal") #' ## estimate with context @@ -1003,22 +1035,22 @@ set_arima.default <- function(x, #' # estimate with context #' # sa<-rjd3x13::x13(y_raw,new_spec, context=my_context) #' @export -set_tradingdays<- function(x, - option = c(NA, "TradingDays", "WorkingDays", "TD3", "TD3c", "TD4", "None", "UserDefined"), - calendar.name = NA, - uservariable = NA, - stocktd = NA, - test = c(NA, "None", "Remove", "Add", "Separate_T", "Joint_F"), - coef = NA, - coef.type = c(NA, "Fixed", "Estimated"), - automatic = c(NA, "Unused", "FTest", "WaldTest", "Aic", "Bic"), - # TRAMO SPECIFIC - pftd = NA, - # LEAP YEAR - autoadjust = NA, - leapyear = c(NA, "LeapYear", "LengthOfPeriod", "None"), - leapyear.coef = NA, - leapyear.coef.type = c(NA, "Fixed", "Estimated")){ +set_tradingdays <- function(x, + option = c(NA, "TradingDays", "WorkingDays", "TD3", "TD3c", "TD4", "None", "UserDefined"), + calendar.name = NA, + uservariable = NA, + stocktd = NA, + test = c(NA, "None", "Remove", "Add", "Separate_T", "Joint_F"), + coef = NA, + coef.type = c(NA, "Fixed", "Estimated"), + automatic = c(NA, "Unused", "FTest", "WaldTest", "Aic", "Bic"), + # TRAMO SPECIFIC + pftd = NA, + # LEAP YEAR + autoadjust = NA, + leapyear = c(NA, "LeapYear", "LengthOfPeriod", "None"), + leapyear.coef = NA, + leapyear.coef.type = c(NA, "Fixed", "Estimated")) { UseMethod("set_tradingdays", x) } @@ -1038,125 +1070,143 @@ set_tradingdays.default <- function(x, autoadjust = NA, leapyear = c(NA, "LeapYear", "LengthOfPeriod", "None"), leapyear.coef = NA, - leapyear.coef.type = c(NA, "Estimated", "Fixed")){ + leapyear.coef.type = c(NA, "Estimated", "Fixed")) { td <- x$regression$td is_tramo <- inherits(x, "JD3_TRAMO_SPEC") - if (!missing(option) && !anyNA(option)){ + if (!missing(option) && !anyNA(option)) { option <- match.arg(toupper(option)[1], - choices = c("TRADINGDAYS", "WORKINGDAYS", "NONE","USERDEFINED", - "TD3", "TD3C", "TD4", "HOLIDAYS")) + choices = c( + "TRADINGDAYS", "WORKINGDAYS", "NONE", "USERDEFINED", + "TD3", "TD3C", "TD4", "HOLIDAYS" + ) + ) td$td <- switch(option, - WORKINGDAYS = "TD2", - TRADINGDAYS = "TD7", - USERDEFINED = "TD_NONE", - NONE = "TD_NONE", - option) + WORKINGDAYS = "TD2", + TRADINGDAYS = "TD7", + USERDEFINED = "TD_NONE", + NONE = "TD_NONE", + option + ) td$users <- character() } - if (!missing(calendar.name) && !anyNA(calendar.name)){ + if (!missing(calendar.name) && !anyNA(calendar.name)) { td$holidays <- calendar.name } if (!is.null(uservariable) && !anyNA(uservariable) && - length(uservariable) > 0){ + length(uservariable) > 0) { td$td <- "TD_NONE" td$holidays <- "" td$users <- uservariable - if (missing(coef) || is.null(coef)){ + if (missing(coef) || is.null(coef)) { coef <- 0 coef.type <- "ESTIMATED" } } - if (!missing(stocktd) && !is.na(stocktd)){ + if (!missing(stocktd) && !is.na(stocktd)) { td$users <- character() td$td <- "TD_NONE" td$holidays <- "" td$w <- stocktd } - if (!missing(autoadjust) && !is.na(autoadjust)){ + if (!missing(autoadjust) && !is.na(autoadjust)) { td$autoadjust <- autoadjust } - if (!is.null(test) && !anyNA(test)){ + if (!is.null(test) && !anyNA(test)) { if (is_tramo) { test <- match.arg(toupper(test)[1], - choices = c("SEPARATE_T", "JOINT_F", "NONE")) - td$test <- sprintf("TEST_%s", - switch(test, - NONE = "NO", - test)) + choices = c("SEPARATE_T", "JOINT_F", "NONE") + ) + td$test <- sprintf( + "TEST_%s", + switch(test, + NONE = "NO", + test + ) + ) } else { test <- match.arg(toupper(test)[1], - choices = c("REMOVE", "ADD", "NONE")) + choices = c("REMOVE", "ADD", "NONE") + ) td$test <- switch(test, - NONE = "NO", - test) + NONE = "NO", + test + ) } } - if (!missing(automatic) && !anyNA(automatic)){ + if (!missing(automatic) && !anyNA(automatic)) { if (is_tramo) { automatic <- match.arg(toupper(automatic)[1], - choices = c("UNUSED", "FTEST", "WALDTEST", "AIC", "BIC")) + choices = c("UNUSED", "FTEST", "WALDTEST", "AIC", "BIC") + ) td$auto <- switch(automatic, - UNUSED = "AUTO_NO", - FTEST = "AUTO_FTEST", - AIC = "AUTO_AIC", - BIC = "AUTO_BIC", - WALDTEST = "AUTO_WALDTEST") + UNUSED = "AUTO_NO", + FTEST = "AUTO_FTEST", + AIC = "AUTO_AIC", + BIC = "AUTO_BIC", + WALDTEST = "AUTO_WALDTEST" + ) } else { automatic <- match.arg(toupper(automatic)[1], - choices = c("UNUSED", "WALDTEST", "AIC", "BIC")) + choices = c("UNUSED", "WALDTEST", "AIC", "BIC") + ) td$auto <- switch(automatic, - UNUSED = "AUTO_NO", - AIC = "AUTO_AIC", - BIC = "AUTO_BIC", - WALDTEST = "AUTO_WALD") + UNUSED = "AUTO_NO", + AIC = "AUTO_AIC", + BIC = "AUTO_BIC", + WALDTEST = "AUTO_WALD" + ) } - } if (is_tramo) { - if (!missing(pftd) && !anyNA(pftd)){ + if (!missing(pftd) && !anyNA(pftd)) { td$ptest <- pftd } } if (!is.null(leapyear) && !anyNA(leapyear)) { leapyear <- match.arg(toupper(leapyear), - choices = c("LEAPYEAR", "LENGTHOFPERIOD", "NONE")) + choices = c("LEAPYEAR", "LENGTHOFPERIOD", "NONE") + ) if (leapyear != "LENGTHOFPERIOD" || (leapyear == "LENGTHOFPERIOD" && !is_tramo)) { # LENGTHOFPERIOD not available on TRAMO td$lp <- leapyear } } - if (missing(coef) || is.null(coef)){ + if (missing(coef) || is.null(coef)) { # coef <- 0 } else { - if (missing(coef.type) || is.null(coef.type)){ + if (missing(coef.type) || is.null(coef.type)) { coef.type <- "FIXED" } else { coef.type <- match.arg(toupper(coef.type), - choices = c(NA, "ESTIMATED", "FIXED"), - several.ok = TRUE) + choices = c(NA, "ESTIMATED", "FIXED"), + several.ok = TRUE + ) coef.type[is.na(coef.type)] <- "FIXED" } ntd <- switch(td$td, - TD2 = 1, - TD3 = 2, - TD3C = 3, - TD4 = 3, - TD7 = 6, - length(td$users)) - if (length(coef) == 1){ + TD2 = 1, + TD3 = 2, + TD3C = 3, + TD4 = 3, + TD7 = 6, + length(td$users) + ) + if (length(coef) == 1) { coef <- rep(coef, ntd) } - tdcoefficients <- data.frame(value = coef, - type = coef.type) + tdcoefficients <- data.frame( + value = coef, + type = coef.type + ) tdcoefficients$value <- as.list(tdcoefficients$value) tdcoefficients$type <- as.list(tdcoefficients$type) @@ -1164,16 +1214,16 @@ set_tradingdays.default <- function(x, if (td$test != "NO" && any(coef.type == "FIXED")) { warning("You must set the test parameter to NONE to specify coef") } - } - if (missing(leapyear.coef) || is.null(leapyear.coef)){ + if (missing(leapyear.coef) || is.null(leapyear.coef)) { # coef <- 0 } else { - if (missing(leapyear.coef.type) || is.null(leapyear.coef.type)){ + if (missing(leapyear.coef.type) || is.null(leapyear.coef.type)) { leapyear.coef.type <- "FIXED" } else { leapyear.coef.type <- match.arg(toupper(leapyear.coef.type), - choices = c(NA, "ESTIMATED", "FIXED")) + choices = c(NA, "ESTIMATED", "FIXED") + ) leapyear.coef.type[is.na(leapyear.coef.type)] <- "FIXED" } td$lpcoefficient$value <- leapyear.coef @@ -1232,14 +1282,14 @@ set_tradingdays.default <- function(x, #' # type = "IncludeEasterMonday") #' # sa<-rjd3x13::x13(ABS$X0.2.09.10.M,new_spec) #' @export -set_easter<- function(x, enabled = NA, - julian = NA, - duration = NA, - test = c(NA, "Add", "Remove", "None"), - coef = NA, - coef.type = c(NA, "Estimated", "Fixed"), - # TRAMO SPECIFIC - type = c(NA, "Unused", "Standard", "IncludeEaster", "IncludeEasterMonday")){ +set_easter <- function(x, enabled = NA, + julian = NA, + duration = NA, + test = c(NA, "Add", "Remove", "None"), + coef = NA, + coef.type = c(NA, "Estimated", "Fixed"), + # TRAMO SPECIFIC + type = c(NA, "Unused", "Standard", "IncludeEaster", "IncludeEasterMonday")) { UseMethod("set_easter", x) } #' @export @@ -1250,61 +1300,66 @@ set_easter.default <- function(x, enabled = NA, coef = NA, coef.type = c(NA, "Estimated", "Fixed"), # TRAMO SPECIFIC - type = c(NA, "Unused", "Standard", "IncludeEaster", "IncludeEasterMonday")){ + type = c(NA, "Unused", "Standard", "IncludeEaster", "IncludeEasterMonday")) { easter <- x$regression$easter # to set specific TRAMO/REGARIMA values is_tramo <- inherits(x, "JD3_TRAMO_SPEC") - if (!is.null(test) && !anyNA(test)){ + if (!is.null(test) && !anyNA(test)) { if (is_tramo) { if (!is.logical(test)) { test <- match.arg(toupper(test)[1], - choices = c("REMOVE", "ADD", "NONE")) != "NONE" + choices = c("REMOVE", "ADD", "NONE") + ) != "NONE" } easter$test <- test } else { test <- match.arg(toupper(test)[1], - choices = c("REMOVE", "ADD", "NONE")) + choices = c("REMOVE", "ADD", "NONE") + ) easter$test <- switch(test, - NONE = "NO", - test) + NONE = "NO", + test + ) } } - if (!missing(enabled) && !is.na(enabled)){ + if (!missing(enabled) && !is.na(enabled)) { easter$type <- ifelse(enabled, "STANDARD", "UNUSED") } if (is_tramo && !is.null(type) && !anyNA(type)) { # TRAMO SPECIFIC type <- match.arg(toupper(type)[1], - choices = c("UNUSED", "STANDARD", "INCLUDEEASTER", "INCLUDEEASTERMONDAY")) + choices = c("UNUSED", "STANDARD", "INCLUDEEASTER", "INCLUDEEASTERMONDAY") + ) easter$type <- type } - if (!missing(julian) && !is.na(julian)){ + if (!missing(julian) && !is.na(julian)) { if (is_tramo) { easter$julian <- julian } else { easter$type <- ifelse(julian, "JULIAN", easter$type) } } - if (easter$type == "UNUSED"){ + if (easter$type == "UNUSED") { if (is_tramo) { easter$test <- FALSE } else { easter$test <- "NO" } } - if (!missing(duration) && !is.na(duration)){ + if (!missing(duration) && !is.na(duration)) { easter$duration <- duration } - if (missing(coef) ||is.null(coef) || is.na(coef)) { + if (missing(coef) || is.null(coef) || is.na(coef)) { } else { if (missing(coef.type) || anyNA(coef.type)) { coef.type <- "FIXED" } else { coef.type <- match.arg(toupper(coef.type)[1], - choices = c("ESTIMATED", "FIXED")) + choices = c("ESTIMATED", "FIXED") + ) } if (coef.type == "ESTIMATED") { @@ -1313,7 +1368,6 @@ set_easter.default <- function(x, enabled = NA, easter$coefficient$value <- coef easter$coefficient$type <- coef.type } - } x$regression$easter <- easter x @@ -1352,14 +1406,14 @@ set_easter.default <- function(x, enabled = NA, #' # sa<-rjd3x13::x13(ABS$X0.2.09.10.M,new_spec) #' #' @export -set_transform<- function(x, - fun = c(NA, "Auto", "Log", "None"), - adjust = c(NA, "None", "LeapYear", "LengthOfPeriod"), - outliers = NA, - # REGARIMA SPECIFIC - aicdiff = NA, - # TRAMO SPECIFIC - fct = NA){ +set_transform <- function(x, + fun = c(NA, "Auto", "Log", "None"), + adjust = c(NA, "None", "LeapYear", "LengthOfPeriod"), + outliers = NA, + # REGARIMA SPECIFIC + aicdiff = NA, + # TRAMO SPECIFIC + fct = NA) { UseMethod("set_transform", x) } #' @export @@ -1370,22 +1424,27 @@ set_transform.default <- function(x, # REGARIMA SPECIFIC aicdiff = NA, # TRAMO SPECIFIC - fct = NA){ + fct = NA) { transform <- x$transform - fun <- match.arg(toupper(fun[1]), - c(NA, "AUTO", "LOG", "NONE")) + fun <- match.arg( + toupper(fun[1]), + c(NA, "AUTO", "LOG", "NONE") + ) # to set specific TRAMO/REGARIMA values is_tramo <- inherits(x, "JD3_TRAMO_SPEC") - if (!is.na(fun)){ + if (!is.na(fun)) { transform$fn <- switch(fun, - NONE = "LEVEL", - fun) + NONE = "LEVEL", + fun + ) } - adjust <- match.arg(toupper(adjust[1]), - c(NA, "NONE", "LEAPYEAR", "LENGTHOFPERIOD")) - if (!is.na(adjust)){ + adjust <- match.arg( + toupper(adjust[1]), + c(NA, "NONE", "LEAPYEAR", "LENGTHOFPERIOD") + ) + if (!is.na(adjust)) { transform$adjust <- adjust } @@ -1394,11 +1453,11 @@ set_transform.default <- function(x, } if (is_tramo) { # TRAMO SPECIFIC PARAMETER - if (!is.na(fct)){ + if (!is.na(fct)) { transform$fct <- fct } } else { - if (!is.na(aicdiff)){ + if (!is.na(aicdiff)) { transform$aicdiff <- aicdiff } } @@ -1443,19 +1502,21 @@ set_transform.default <- function(x, #' @examples #' # creating one or several external regressors (TS objects), #' # which will be gathered in one or several groups -#' iv1<-intervention_variable(12, c(2000, 1), 60, -#' starts = "2001-01-01", ends = "2001-12-01") -#' iv2<- intervention_variable(12, c(2000, 1), 60, -#' starts = "2001-01-01", ends = "2001-12-01", delta = 1) +#' iv1 <- intervention_variable(12, c(2000, 1), 60, +#' starts = "2001-01-01", ends = "2001-12-01" +#' ) +#' iv2 <- intervention_variable(12, c(2000, 1), 60, +#' starts = "2001-01-01", ends = "2001-12-01", delta = 1 +#' ) #' # configuration 1: regressors in the same default group (named "r") -#' variables<-list("iv1"=iv1, "iv2"=iv2) +#' variables <- list("iv1" = iv1, "iv2" = iv2) #' # to use those regressors, input : name=r.iv1 and r.iv2 in add_usrdefvar function #' # configuration 2: group names are user-defined #' # here: regressors as a list of two groups (lists) reg1 and reg2 -#' vars<-list(reg1=list(iv1 = iv1),reg2=list(iv2 = iv2) ) +#' vars <- list(reg1 = list(iv1 = iv1), reg2 = list(iv2 = iv2)) #' # to use those regressors, input : name=reg1.iv1 and name=reg2.iv2 in add_usrdefvar function #' # creating the modelling context -#' my_context<-modelling_context(variables=vars) +#' my_context <- modelling_context(variables = vars) #' # customize a default specification #' # init_spec <- rjd3x13::x13_spec("RSA5c") #' # regressors have to be added one by one @@ -1470,34 +1531,34 @@ set_transform.default <- function(x, #' \url{https://jdemetra-new-documentation.netlify.app/} #' @export add_usrdefvar <- function(x, - group="r", + group = "r", name, - label = paste0(group,".",name), + label = paste0(group, ".", name), lag = 0, coef = NULL, - regeffect=c("Undefined", "Trend", "Seasonal", "Irregular", "Series", "SeasonallyAdjusted")) { + regeffect = c("Undefined", "Trend", "Seasonal", "Irregular", "Series", "SeasonallyAdjusted")) { UseMethod("add_usrdefvar", x) } #' @export add_usrdefvar.default <- function(x, - group="r", + group = "r", name, - label=paste0(group,".",name), + label = paste0(group, ".", name), lag = 0, coef = NULL, - regeffect=c("Undefined", "Trend", "Seasonal", "Irregular", "Series", "SeasonallyAdjusted")) { + regeffect = c("Undefined", "Trend", "Seasonal", "Irregular", "Series", "SeasonallyAdjusted")) { x$regression$users[[length(x$regression$users) + 1]] <- - .create_variable(id =paste0(group,".",name), label = label, lag = lag, coef = coef, regeffect = regeffect) + .create_variable(id = paste0(group, ".", name), label = label, lag = lag, coef = coef, regeffect = regeffect) x } # read in protofile -.create_variable<-function(id, label=NULL, lag = 0, coef = NULL, regeffect=c("Undefined", "Trend", "Seasonal", "Irregular", "Series", "SeasonallyAdjusted")){ +.create_variable <- function(id, label = NULL, lag = 0, coef = NULL, regeffect = c("Undefined", "Trend", "Seasonal", "Irregular", "Series", "SeasonallyAdjusted")) { regeffect <- match.arg(regeffect) if (is.null(label)) { - label<-id + label <- id } - res <- list(id = id, name=label, lag=lag, coef = .fixed_parameter(coef), regeffect=regeffect) + res <- list(id = id, name = label, lag = lag, coef = .fixed_parameter(coef), regeffect = regeffect) return(res) } @@ -1507,16 +1568,17 @@ set_span <- function(x, d0 = NULL, d1 = NULL, n0 = 0, - n1 = 0){ - if (!missing(type) && !is.null(type) && !is.na(type[1])){ + n1 = 0) { + if (!missing(type) && !is.null(type) && !is.na(type[1])) { type <- match.arg(toupper(type), - choices = c("ALL", "FROM", "TO", "BETWEEN", "LAST", "FIRST", "EXCLUDING")) + choices = c("ALL", "FROM", "TO", "BETWEEN", "LAST", "FIRST", "EXCLUDING") + ) if (type == "ALL") { x$type <- type x$d1 <- x$d1 <- NULL x$n0 <- x$n1 <- 0 - } else if (type == "FROM"){ - if (is.null(d0)){ + } else if (type == "FROM") { + if (is.null(d0)) { warning("d0 parameter must be defined") } else { x$type <- type @@ -1524,8 +1586,8 @@ set_span <- function(x, x$d1 <- NULL x$n0 <- x$n1 <- 0 } - } else if (type == "TO"){ - if (is.na(d1)){ + } else if (type == "TO") { + if (is.na(d1)) { warning("d1 parameter must be defined") } else { x$type <- type @@ -1533,8 +1595,8 @@ set_span <- function(x, x$d0 <- NULL x$n0 <- x$n1 <- 0 } - } else if (type=="BETWEEN"){ - if (is.na(d0) || is.na(d1)){ + } else if (type == "BETWEEN") { + if (is.na(d0) || is.na(d1)) { warning("d0 and d1 parameters must be defined") } else { x$type <- type @@ -1542,8 +1604,8 @@ set_span <- function(x, x$d1 <- d1 x$n0 <- x$n1 <- 0 } - } else if (type=="FIRST"){ - if (is.na(n0)){ + } else if (type == "FIRST") { + if (is.na(n0)) { warning("n0 parameter must be defined") } else { x$type <- type @@ -1551,8 +1613,8 @@ set_span <- function(x, x$n0 <- n0 x$n1 <- 0 } - } else if (type=="LAST"){ - if (is.na(n1)){ + } else if (type == "LAST") { + if (is.na(n1)) { warning("n1 parameter must be defined") } else { x$type <- type @@ -1560,8 +1622,8 @@ set_span <- function(x, x$n0 <- 0 x$n1 <- n1 } - } else if (type=="EXCLUDING"){ - if (is.na(n0) || is.na(n1)){ + } else if (type == "EXCLUDING") { + if (is.na(n0) || is.na(n1)) { warning("n0 and n1 parameters must be defined") } else { x$type <- type diff --git a/R/splines.R b/R/splines.R index 533941c..b4ebe60 100644 --- a/R/splines.R +++ b/R/splines.R @@ -9,11 +9,11 @@ #' @export #' #' @examples -periodic_splines<-function(order=4, period=1, knots, pos){ - - jm<-.jcall("jdplus/toolkit/base/r/math/BSplines", "Ljdplus/toolkit/base/core//math/matrices/Matrix;", - "periodic", as.integer(order), as.numeric(period), .jarray(as.numeric(knots)), .jarray(as.numeric(pos))) +periodic_splines <- function(order = 4, period = 1, knots, pos) { + jm <- .jcall( + "jdplus/toolkit/base/r/math/BSplines", "Ljdplus/toolkit/base/core//math/matrices/Matrix;", + "periodic", as.integer(order), as.numeric(period), .jarray(as.numeric(knots)), .jarray(as.numeric(pos)) + ) res <- .jd2r_matrix(jm) return(res) - } diff --git a/R/tests_regular.R b/R/tests_regular.R index eb195f7..9909745 100644 --- a/R/tests_regular.R +++ b/R/tests_regular.R @@ -18,29 +18,29 @@ NULL #' \item{\code{distribution}} the statistical distribution used. #' } #' @examples -#' udr_test = testofupdownruns(random_t(5, 1000)) +#' udr_test <- testofupdownruns(random_t(5, 1000)) #' udr_test # default print #' print(udr_test, details = TRUE) # with the distribution #' #' @export -statisticaltest<-function(val, pval, dist=NULL){ - if (pval<0){ +statisticaltest <- function(val, pval, dist = NULL) { + if (pval < 0) { pval <- 0 - } else if (pval>1){ + } else if (pval > 1) { pval <- 1 } - return(structure(list(value=val, pvalue=pval), distribution=dist, class=c("JD3_TEST", "JD3"))) + return(structure(list(value = val, pvalue = pval), distribution = dist, class = c("JD3_TEST", "JD3"))) } #' @rdname statisticaltest #' @export -print.JD3_TEST<-function(x, details=FALSE, ...){ - cat('Value:', x$value, '\n') - cat('P-Value:', sprintf('%.4f', x$pvalue), '\n') - if (details){ - dist<-attr(x, "distribution") - if (! is.null(dist)){ - cat('[', dist, ']\n') +print.JD3_TEST <- function(x, details = FALSE, ...) { + cat("Value:", x$value, "\n") + cat("P-Value:", sprintf("%.4f", x$pvalue), "\n") + if (details) { + dist <- attr(x, "distribution") + if (!is.null(dist)) { + cat("[", dist, "]\n") } } } @@ -64,12 +64,14 @@ print.JD3_TEST<-function(x, details=FALSE, ...){ #' @return A \code{c("JD3_TEST", "JD3")} object (see [statisticaltest()] for details). #' #' @examples -#' ljungbox(random_t(2, 100), lag = 24, k =1) -#' ljungbox(ABS$X0.2.09.10.M, lag = 24, k =1) +#' ljungbox(random_t(2, 100), lag = 24, k = 1) +#' ljungbox(ABS$X0.2.09.10.M, lag = 24, k = 1) #' @export -ljungbox<-function(data, k=1, lag=1, nhp=0, sign=0, mean=TRUE){ - jtest<-.jcall("jdplus/toolkit/base/r/stats/Tests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "ljungBox", - as.numeric(data), as.integer(k), as.integer(lag), as.integer(nhp), as.integer(sign), as.logical(mean)) +ljungbox <- function(data, k = 1, lag = 1, nhp = 0, sign = 0, mean = TRUE) { + jtest <- .jcall( + "jdplus/toolkit/base/r/stats/Tests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "ljungBox", + as.numeric(data), as.integer(k), as.integer(lag), as.integer(nhp), as.integer(sign), as.logical(mean) + ) return(.jd2r_test(jtest)) } @@ -84,7 +86,7 @@ ljungbox<-function(data, k=1, lag=1, nhp=0, sign=0, mean=TRUE){ #' @return A \code{c("JD3_TEST", "JD3")} object (see \code{\link{statisticaltest}} for details). #' #' @examples -#' x <- rnorm(100) # null +#' x <- rnorm(100) # null #' bowmanshenton(x) #' doornikhansen(x) #' jarquebera(x) @@ -98,23 +100,25 @@ NULL #' @export #' @describeIn normality_tests Bowman-Shenton test -bowmanshenton<-function(data){ - jtest<-.jcall("jdplus/toolkit/base/r/stats/Tests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "bowmanShenton",as.numeric(data)) +bowmanshenton <- function(data) { + jtest <- .jcall("jdplus/toolkit/base/r/stats/Tests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "bowmanShenton", as.numeric(data)) return(.jd2r_test(jtest)) } #' @export #' @describeIn normality_tests Doornik-Hansen test -doornikhansen<-function(data){ - jtest<-.jcall("jdplus/toolkit/base/r/stats/Tests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "doornikHansen",as.numeric(data)) +doornikhansen <- function(data) { + jtest <- .jcall("jdplus/toolkit/base/r/stats/Tests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "doornikHansen", as.numeric(data)) return(.jd2r_test(jtest)) } #' @export #' @describeIn normality_tests Jarque-Bera test -jarquebera<-function(data, k=0, sample=TRUE){ - jtest<-.jcall("jdplus/toolkit/base/r/stats/Tests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "jarqueBera", - as.numeric(data), as.integer(k), as.logical(sample)) +jarquebera <- function(data, k = 0, sample = TRUE) { + jtest <- .jcall( + "jdplus/toolkit/base/r/stats/Tests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "jarqueBera", + as.numeric(data), as.integer(k), as.logical(sample) + ) return(.jd2r_test(jtest)) } @@ -131,7 +135,7 @@ jarquebera<-function(data, k=0, sample=TRUE){ #' #' @examples #' x <- random_t(5, 1000) -#'# random values +#' # random values #' testofruns(x) #' testofupdownruns(x) #' # non-random values @@ -141,17 +145,21 @@ NULL #' @describeIn runstests Runs test around mean or median #' @export -testofruns<-function(data, mean=TRUE, number=TRUE){ - jtest<-.jcall("jdplus/toolkit/base/r/stats/Tests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "testOfRuns", - as.numeric(data), as.logical(mean), as.logical(number)) +testofruns <- function(data, mean = TRUE, number = TRUE) { + jtest <- .jcall( + "jdplus/toolkit/base/r/stats/Tests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "testOfRuns", + as.numeric(data), as.logical(mean), as.logical(number) + ) return(.jd2r_test(jtest)) } #' @describeIn runstests up and down runs test #' @export -testofupdownruns<-function(data, number=TRUE){ - jtest<-.jcall("jdplus/toolkit/base/r/stats/Tests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "testOfUpDownRuns", - as.numeric(data), as.logical(number)) +testofupdownruns <- function(data, number = TRUE) { + jtest <- .jcall( + "jdplus/toolkit/base/r/stats/Tests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "testOfUpDownRuns", + as.numeric(data), as.logical(number) + ) return(.jd2r_test(jtest)) } @@ -162,45 +170,51 @@ testofupdownruns<-function(data, number=TRUE){ #' @param nar number of AR lags used to compute inverse autocorrelations. #' #' @examples -#' x = ABS$X0.2.09.10.M +#' x <- ABS$X0.2.09.10.M #' autocorrelations(x) #' autocorrelations_partial(x) #' autocorrelations_inverse(x) #' @export -autocorrelations<-function(data, mean=TRUE, n=15){ - res <- .jcall("jdplus/toolkit/base/r/stats/Tests", "[D", "autocorrelations", - as.numeric(data), as.logical(mean), as.integer(n)) +autocorrelations <- function(data, mean = TRUE, n = 15) { + res <- .jcall( + "jdplus/toolkit/base/r/stats/Tests", "[D", "autocorrelations", + as.numeric(data), as.logical(mean), as.integer(n) + ) names(res) <- seq_len(n) return(res) } #' @export #' @rdname autocorrelations -autocorrelations_partial<-function(data, mean=TRUE, n=15){ - res <- .jcall("jdplus/toolkit/base/r/stats/Tests", "[D", "partialAutocorrelations", - as.numeric(data), as.logical(mean), as.integer(n)) +autocorrelations_partial <- function(data, mean = TRUE, n = 15) { + res <- .jcall( + "jdplus/toolkit/base/r/stats/Tests", "[D", "partialAutocorrelations", + as.numeric(data), as.logical(mean), as.integer(n) + ) names(res) <- seq_len(n) return(res) } #' @export #' @rdname autocorrelations -autocorrelations_inverse<-function(data, nar=30, n=15){ - res <- .jcall("jdplus/toolkit/base/r/stats/Tests", "[D", "inverseAutocorrelations", - as.numeric(data), as.integer(nar), as.integer(n)) +autocorrelations_inverse <- function(data, nar = 30, n = 15) { + res <- .jcall( + "jdplus/toolkit/base/r/stats/Tests", "[D", "inverseAutocorrelations", + as.numeric(data), as.integer(nar), as.integer(n) + ) names(res) <- seq_len(n) return(res) } #' @export #' @describeIn normality_tests Skewness test -skewness<-function(data){ - jtest<-.jcall("jdplus/toolkit/base/r/stats/Tests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "skewness",as.numeric(data)) +skewness <- function(data) { + jtest <- .jcall("jdplus/toolkit/base/r/stats/Tests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "skewness", as.numeric(data)) return(.jd2r_test(jtest)) } #' @export #' @describeIn normality_tests Kurtosis test -kurtosis<-function(data){ - jtest<-.jcall("jdplus/toolkit/base/r/stats/Tests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "kurtosis",as.numeric(data)) +kurtosis <- function(data) { + jtest <- .jcall("jdplus/toolkit/base/r/stats/Tests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "kurtosis", as.numeric(data)) return(.jd2r_test(jtest)) } @@ -214,8 +228,8 @@ kurtosis<-function(data){ #' @export #' #' @examples -#' y<-rnorm(1000) -#' m<-rjd3toolkit::mad(y, centile=70) -mad<-function(data, centile=50, medianCorrected=TRUE){ - return(.jcall("jdplus/toolkit/base/r/stats/Tests", "D", "mad",as.numeric(data), as.numeric(centile), as.logical(medianCorrected))) +#' y <- rnorm(1000) +#' m <- rjd3toolkit::mad(y, centile = 70) +mad <- function(data, centile = 50, medianCorrected = TRUE) { + return(.jcall("jdplus/toolkit/base/r/stats/Tests", "D", "mad", as.numeric(data), as.numeric(centile), as.logical(medianCorrected))) } diff --git a/R/tests_seasonality.R b/R/tests_seasonality.R index d202393..166e4b7 100644 --- a/R/tests_seasonality.R +++ b/R/tests_seasonality.R @@ -16,14 +16,17 @@ NULL #' @export #' #' @examples -#' s<-do_stationary(log(ABS$X0.2.09.10.M))$ddata +#' s <- do_stationary(log(ABS$X0.2.09.10.M))$ddata #' seasonality_qs(s) #' seasonality_qs(random_t(2, 1000), 7) -seasonality_qs<-function(data, period=NA, nyears=0, type=1){ - if (is.ts(data) && missing(period)) +seasonality_qs <- function(data, period = NA, nyears = 0, type = 1) { + if (is.ts(data) && missing(period)) { period <- frequency(data) - jtest<-.jcall("jdplus/sa/base/r/SeasonalityTests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "qsTest", - as.numeric(data), as.integer(period), as.integer(nyears), as.integer((type))) + } + jtest <- .jcall( + "jdplus/sa/base/r/SeasonalityTests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "qsTest", + as.numeric(data), as.integer(period), as.integer(nyears), as.integer((type)) + ) return(.jd2r_test(jtest)) } @@ -40,7 +43,7 @@ seasonality_qs<-function(data, period=NA, nyears=0, type=1){ #' @export #' #' @examples -#' s<-do_stationary(log(ABS$X0.2.09.10.M))$ddata +#' s <- do_stationary(log(ABS$X0.2.09.10.M))$ddata #' seasonality_modified_qs(s) #' @details #' Thresholds for p-values: p.9=2.49, p.95=3.83, p.99=7.06, p.999=11.88. @@ -48,11 +51,14 @@ seasonality_qs<-function(data, period=NA, nyears=0, type=1){ #' Remark: the length of the series has some impact on the p-values, mainly on #' short series. Not critical. -seasonality_modified_qs<-function(data, period=NA, nyears=0){ - if (is.ts(data) && missing(period)) +seasonality_modified_qs <- function(data, period = NA, nyears = 0) { + if (is.ts(data) && missing(period)) { period <- frequency(data) - test<-.jcall("jdplus/sa/base/r/SeasonalityTests", "D", "modifiedQsTest", - as.numeric(data), as.integer(period), as.integer(nyears)) + } + test <- .jcall( + "jdplus/sa/base/r/SeasonalityTests", "D", "modifiedQsTest", + as.numeric(data), as.integer(period), as.integer(nyears) + ) return(test) } @@ -72,14 +78,17 @@ seasonality_modified_qs<-function(data, period=NA, nyears=0){ #' @export #' #' @examples -#' s<-do_stationary(log(ABS$X0.2.09.10.M))$ddata +#' s <- do_stationary(log(ABS$X0.2.09.10.M))$ddata #' seasonality_kruskalwallis(s) #' seasonality_kruskalwallis(random_t(2, 1000), 7) -seasonality_kruskalwallis<-function(data, period, nyears=0){ - if (is.ts(data) && missing(period)) +seasonality_kruskalwallis <- function(data, period, nyears = 0) { + if (is.ts(data) && missing(period)) { period <- frequency(data) - jtest<-.jcall("jdplus/sa/base/r/SeasonalityTests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "kruskalWallisTest", - as.numeric(data), as.integer(period), as.integer(nyears)) + } + jtest <- .jcall( + "jdplus/sa/base/r/SeasonalityTests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "kruskalWallisTest", + as.numeric(data), as.integer(period), as.integer(nyears) + ) return(.jd2r_test(jtest)) } @@ -92,14 +101,17 @@ seasonality_kruskalwallis<-function(data, period, nyears=0){ #' @export #' #' @examples -#' s<-do_stationary(log(ABS$X0.2.09.10.M))$ddata +#' s <- do_stationary(log(ABS$X0.2.09.10.M))$ddata #' seasonality_periodogram(s) #' seasonality_periodogram(random_t(2, 1000), 7) -seasonality_periodogram<-function(data, period=NA, nyears=0){ - if (is.ts(data) && missing(period)) +seasonality_periodogram <- function(data, period = NA, nyears = 0) { + if (is.ts(data) && missing(period)) { period <- frequency(data) - jtest<-.jcall("jdplus/sa/base/r/SeasonalityTests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "periodogramTest", - as.numeric(data), as.integer(period), as.integer(nyears)) + } + jtest <- .jcall( + "jdplus/sa/base/r/SeasonalityTests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "periodogramTest", + as.numeric(data), as.integer(period), as.integer(nyears) + ) return(.jd2r_test(jtest)) } @@ -112,14 +124,17 @@ seasonality_periodogram<-function(data, period=NA, nyears=0){ #' @export #' #' @examples -#' s<-do_stationary(log(ABS$X0.2.09.10.M))$ddata +#' s <- do_stationary(log(ABS$X0.2.09.10.M))$ddata #' seasonality_friedman(s) #' seasonality_friedman(random_t(2, 1000), 12) -seasonality_friedman<-function(data, period=NA, nyears=0){ - if (is.ts(data) && missing(period)) +seasonality_friedman <- function(data, period = NA, nyears = 0) { + if (is.ts(data) && missing(period)) { period <- frequency(data) - jtest<-.jcall("jdplus/sa/base/r/SeasonalityTests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "friedmanTest", - as.numeric(data), as.integer(period), as.integer(nyears)) + } + jtest <- .jcall( + "jdplus/sa/base/r/SeasonalityTests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "friedmanTest", + as.numeric(data), as.integer(period), as.integer(nyears) + ) return(.jd2r_test(jtest)) } @@ -132,17 +147,20 @@ seasonality_friedman<-function(data, period=NA, nyears=0){ #' @export #' #' @examples -#' seasonality_f(ABS$X0.2.09.10.M, model="D1") +#' seasonality_f(ABS$X0.2.09.10.M, model = "D1") #' seasonality_f(random_t(2, 1000), 7) -seasonality_f<-function(data, - period=NA, - model=c("AR", "D1", "WN"), - nyears=0){ - if (is.ts(data) && missing(period)) +seasonality_f <- function(data, + period = NA, + model = c("AR", "D1", "WN"), + nyears = 0) { + if (is.ts(data) && missing(period)) { period <- frequency(data) - model<-match.arg(model) - jtest<-.jcall("jdplus/sa/base/r/SeasonalityTests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "fTest", - as.numeric(data), as.integer(period), model, as.integer(nyears)) + } + model <- match.arg(model) + jtest <- .jcall( + "jdplus/sa/base/r/SeasonalityTests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "fTest", + as.numeric(data), as.integer(period), model, as.integer(nyears) + ) return(.jd2r_test(jtest)) } @@ -158,22 +176,25 @@ seasonality_f<-function(data, #' @export #' #' @examples -#' s<-do_stationary(log(ABS$X0.2.09.10.M))$ddata +#' s <- do_stationary(log(ABS$X0.2.09.10.M))$ddata #' seasonality_combined(s) #' seasonality_combined(random_t(2, 1000), 7) -seasonality_combined<-function(data, period=NA, firstperiod=cycle(data)[1], mul=TRUE){ - if (is.ts(data) && missing(period)) +seasonality_combined <- function(data, period = NA, firstperiod = cycle(data)[1], mul = TRUE) { + if (is.ts(data) && missing(period)) { period <- frequency(data) - jctest<-.jcall("jdplus/sa/base/r/SeasonalityTests", "Ljdplus/sa/base/core/tests/CombinedSeasonality;", "combinedTest", - as.numeric(data), as.integer(period), as.integer(firstperiod-1), as.logical(mul)) - q<-.jcall("jdplus/sa/base/r/SeasonalityTests", "[B", "toBuffer", jctest) - p<-RProtoBuf::read(sa.CombinedSeasonalityTest, q) + } + jctest <- .jcall( + "jdplus/sa/base/r/SeasonalityTests", "Ljdplus/sa/base/core/tests/CombinedSeasonality;", "combinedTest", + as.numeric(data), as.integer(period), as.integer(firstperiod - 1), as.logical(mul) + ) + q <- .jcall("jdplus/sa/base/r/SeasonalityTests", "[B", "toBuffer", jctest) + p <- RProtoBuf::read(sa.CombinedSeasonalityTest, q) output <- list( - seasonality=.enum_extract(sa.IdentifiableSeasonality, p$seasonality), - kruskalwallis=.p2r_test(p$kruskal_wallis), - stable=.p2r_anova(p$stable_seasonality), - evolutive=.p2r_anova(p$evolutive_seasonality) + seasonality = .enum_extract(sa.IdentifiableSeasonality, p$seasonality), + kruskalwallis = .p2r_test(p$kruskal_wallis), + stable = .p2r_anova(p$stable_seasonality), + evolutive = .p2r_anova(p$evolutive_seasonality) ) return(output) } @@ -190,19 +211,20 @@ seasonality_combined<-function(data, period=NA, firstperiod=cycle(data)[1], mul= #' @export #' #' @examples -#' s<-log(ABS$X0.2.20.10.M) -#' freqs<-seq(0.01, 0.5, 0.001) -#' plot(seasonality_canovahansen_trigs(s, 1/freqs, original = FALSE), type='l') -seasonality_canovahansen_trigs<-function(data, periods, lag1=TRUE, - kernel=c("Bartlett", "Square", "Welch", "Tukey", "Hamming", "Parzen"), - order=NA, original=FALSE){ - - kernel<-match.arg(kernel) - if (is.na(order)) order<--1 - - jtest<-.jcall("jdplus/sa/base/r/SeasonalityTests", "[D", "canovaHansenTrigs", - as.numeric(data), .jarray(periods), - as.logical(lag1), kernel, as.integer(order), as.logical(original)) +#' s <- log(ABS$X0.2.20.10.M) +#' freqs <- seq(0.01, 0.5, 0.001) +#' plot(seasonality_canovahansen_trigs(s, 1 / freqs, original = FALSE), type = "l") +seasonality_canovahansen_trigs <- function(data, periods, lag1 = TRUE, + kernel = c("Bartlett", "Square", "Welch", "Tukey", "Hamming", "Parzen"), + order = NA, original = FALSE) { + kernel <- match.arg(kernel) + if (is.na(order)) order <- -1 + + jtest <- .jcall( + "jdplus/sa/base/r/SeasonalityTests", "[D", "canovaHansenTrigs", + as.numeric(data), .jarray(periods), + as.logical(lag1), kernel, as.integer(order), as.logical(original) + ) return(jtest) } @@ -219,20 +241,22 @@ seasonality_canovahansen_trigs<-function(data, periods, lag1=TRUE, #' #' #' @examples -#' s<-log(ABS$X0.2.20.10.M) -#' seasonality_canovahansen(s, 12, type="Contrast") -#' seasonality_canovahansen(s, 12, type="Trigonometric") -seasonality_canovahansen<-function(data, period, type=c("Contrast", "Dummy", "Trigonometric"), lag1=TRUE, - kernel=c("Bartlett", "Square", "Welch", "Tukey", "Hamming", "Parzen"), - order=NA, start=1){ - type<-match.arg(type) - kernel<-match.arg(kernel) - if (is.na(order)) order<--1 - - q<-.jcall("jdplus/sa/base/r/SeasonalityTests", "[D", "canovaHansen", - as.numeric(data), as.integer(period), - type, as.logical(lag1), - kernel, as.integer(order), as.integer(start-1)) - last<-length(q) - return(list(seasonality=list(value=q[last-1], pvalue=q[last]), joint=q[last-2], details=q[-c(last-2, last-1, last)])) +#' s <- log(ABS$X0.2.20.10.M) +#' seasonality_canovahansen(s, 12, type = "Contrast") +#' seasonality_canovahansen(s, 12, type = "Trigonometric") +seasonality_canovahansen <- function(data, period, type = c("Contrast", "Dummy", "Trigonometric"), lag1 = TRUE, + kernel = c("Bartlett", "Square", "Welch", "Tukey", "Hamming", "Parzen"), + order = NA, start = 1) { + type <- match.arg(type) + kernel <- match.arg(kernel) + if (is.na(order)) order <- -1 + + q <- .jcall( + "jdplus/sa/base/r/SeasonalityTests", "[D", "canovaHansen", + as.numeric(data), as.integer(period), + type, as.logical(lag1), + kernel, as.integer(order), as.integer(start - 1) + ) + last <- length(q) + return(list(seasonality = list(value = q[last - 1], pvalue = q[last]), joint = q[last - 2], details = q[-c(last - 2, last - 1, last)])) } diff --git a/R/tests_td.R b/R/tests_td.R index 37b1fae..8dc009b 100644 --- a/R/tests_td.R +++ b/R/tests_td.R @@ -46,11 +46,13 @@ NULL #' @examples #' td_f(ABS$X0.2.09.10.M) #' @export -td_f<-function(s, model=c("D1", "DY", "DYD1", "WN", "AIRLINE", "R011", "R100"), nyears=0){ - model<-match.arg(model) - jts<-.r2jd_tsdata(s) - jtest<-.jcall("jdplus/toolkit/base/r/modelling/TradingDaysTests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "fTest", - jts, model, as.integer(nyears)) +td_f <- function(s, model = c("D1", "DY", "DYD1", "WN", "AIRLINE", "R011", "R100"), nyears = 0) { + model <- match.arg(model) + jts <- .r2jd_tsdata(s) + jtest <- .jcall( + "jdplus/toolkit/base/r/modelling/TradingDaysTests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "fTest", + jts, model, as.integer(nyears) + ) return(.jd2r_test(jtest)) } @@ -65,18 +67,20 @@ td_f<-function(s, model=c("D1", "DY", "DYD1", "WN", "AIRLINE", "R011", "R100"), #' @export #' #' @examples -#' s<-log(ABS$X0.2.20.10.M) -#' td_canovahansen(s, c(1,12)) -td_canovahansen<-function(s, differencing, kernel=c("Bartlett", "Square", "Welch", "Tukey", "Hamming", "Parzen"), - order=NA){ - kernel<-match.arg(kernel) - if (is.na(order)) order<--1 - jts<-.r2jd_tsdata(s) - q<-.jcall("jdplus/toolkit/base/r/modelling/TradingDaysTests", "[D", "canovaHansen", - jts, .jarray(as.integer(differencing)), kernel, as.integer(order)) +#' s <- log(ABS$X0.2.20.10.M) +#' td_canovahansen(s, c(1, 12)) +td_canovahansen <- function(s, differencing, kernel = c("Bartlett", "Square", "Welch", "Tukey", "Hamming", "Parzen"), + order = NA) { + kernel <- match.arg(kernel) + if (is.na(order)) order <- -1 + jts <- .r2jd_tsdata(s) + q <- .jcall( + "jdplus/toolkit/base/r/modelling/TradingDaysTests", "[D", "canovaHansen", + jts, .jarray(as.integer(differencing)), kernel, as.integer(order) + ) - last<-length(q) - return(list(td=list(value=q[last-1], pvalue=q[last]), joint=q[last-2], details=q[-c(last-2, last-1, last)])) + last <- length(q) + return(list(td = list(value = q[last - 1], pvalue = q[last]), joint = q[last - 2], details = q[-c(last - 2, last - 1, last)])) } #' Likelihood ratio test on time varying trading days @@ -91,13 +95,14 @@ td_canovahansen<-function(s, differencing, kernel=c("Bartlett", "Square", "Welch #' @export #' #' @examples -#' s<-log(ABS$X0.2.20.10.M) +#' s <- log(ABS$X0.2.20.10.M) #' td_timevarying(s) -td_timevarying<-function(s, groups=c(1,2,3,4,5,6,0), contrasts=FALSE){ - jts<-.r2jd_tsdata(s) - igroups<-as.integer(groups) - jtest<-.jcall("jdplus/toolkit/base/r/modelling/TradingDaysTests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "timeVaryingTradingDaysTest", - jts, igroups, as.logical(contrasts)) +td_timevarying <- function(s, groups = c(1, 2, 3, 4, 5, 6, 0), contrasts = FALSE) { + jts <- .r2jd_tsdata(s) + igroups <- as.integer(groups) + jtest <- .jcall( + "jdplus/toolkit/base/r/modelling/TradingDaysTests", "Ljdplus/toolkit/base/api/stats/StatisticalTest;", "timeVaryingTradingDaysTest", + jts, igroups, as.logical(contrasts) + ) return(.jd2r_test(jtest)) - } diff --git a/R/timeseries.R b/R/timeseries.R index 9ca6926..4633292 100644 --- a/R/timeseries.R +++ b/R/timeseries.R @@ -17,50 +17,49 @@ NULL #' @export #' #' @examples -#' s = ABS$X0.2.09.10.M +#' s <- ABS$X0.2.09.10.M #' # Annual sum #' aggregate(s, nfreq = 1, conversion = "Sum") # first and last years removed #' aggregate(s, nfreq = 1, conversion = "Sum", complete = FALSE) #' # Quarterly mean #' aggregate(s, nfreq = 4, conversion = "Average") -aggregate<-function(s, nfreq=1, - conversion=c("Sum", "Average", "First", "Last", "Min", "Max"), - complete=TRUE) { +aggregate <- function(s, nfreq = 1, + conversion = c("Sum", "Average", "First", "Last", "Min", "Max"), + complete = TRUE) { UseMethod("aggregate", s) } #' @export -aggregate.default<-function(s, nfreq=1, - conversion=c("Sum", "Average", "First", "Last", "Min", "Max"), - complete=TRUE){ +aggregate.default <- function(s, nfreq = 1, + conversion = c("Sum", "Average", "First", "Last", "Min", "Max"), + complete = TRUE) { conversion <- match.arg(conversion) - if (is.null(s)){ + if (is.null(s)) { return(NULL) } - jd_s<-.r2jd_tsdata(s) - jd_agg<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/TsData;", "aggregate", jd_s, as.integer(nfreq), conversion, complete) - if (is.jnull(jd_agg)){ + jd_s <- .r2jd_tsdata(s) + jd_agg <- .jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/TsData;", "aggregate", jd_s, as.integer(nfreq), conversion, complete) + if (is.jnull(jd_agg)) { return(NULL) - } - else { + } else { return(.jd2r_tsdata(jd_agg)) } } #' @export -aggregate.matrix <- function(s, nfreq=1, - conversion=c("Sum", "Average", "First", "Last", "Min", "Max"), - complete=TRUE) { - res <- do.call(cbind, lapply(seq_len(ncol(s)), function(i){ - aggregate(s[,i], nfreq = nfreq, conversion = conversion, complete = complete) +aggregate.matrix <- function(s, nfreq = 1, + conversion = c("Sum", "Average", "First", "Last", "Min", "Max"), + complete = TRUE) { + res <- do.call(cbind, lapply(seq_len(ncol(s)), function(i) { + aggregate(s[, i], nfreq = nfreq, conversion = conversion, complete = complete) })) colnames(res) <- colnames(s) res } #' @export -aggregate.data.frame <- function(s, nfreq=1, - conversion=c("Sum", "Average", "First", "Last", "Min", "Max"), - complete=TRUE) { - res <- base::list2DF(lapply(seq_len(ncol(s)), function(i){ - aggregate(s[,i], nfreq = nfreq, conversion = conversion, complete = complete) +aggregate.data.frame <- function(s, nfreq = 1, + conversion = c("Sum", "Average", "First", "Last", "Min", "Max"), + complete = TRUE) { + res <- base::list2DF(lapply(seq_len(ncol(s)), function(i) { + aggregate(s[, i], nfreq = nfreq, conversion = conversion, complete = complete) })) colnames(res) <- colnames(s) res @@ -77,20 +76,18 @@ aggregate.data.frame <- function(s, nfreq=1, #' y <- window(ABS$X0.2.09.10.M, start = 1982, end = 2018, extend = TRUE) #' y #' clean_extremities(y) -clean_extremities<-function(s){ - if (is.null(s)){ +clean_extremities <- function(s) { + if (is.null(s)) { return(NULL) } - jd_s<-.r2jd_tsdata(s) - jd_scleaned<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/TsData;", "cleanExtremities", jd_s) + jd_s <- .r2jd_tsdata(s) + jd_scleaned <- .jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/TsData;", "cleanExtremities", jd_s) - if (is.jnull(jd_scleaned)){ + if (is.jnull(jd_scleaned)) { return(NULL) - } - else { + } else { return(.jd2r_tsdata(jd_scleaned)) } - } @@ -103,38 +100,39 @@ clean_extremities<-function(s){ #' @return The interpolated series #' @export #' -ts_interpolate<-function(s, method=c("airline", "average")){ +ts_interpolate <- function(s, method = c("airline", "average")) { UseMethod("ts_interpolate", s) } #' @export -ts_interpolate.default<-function(s, method=c("airline", "average")){ - method<-match.arg(method) - if (is.null(s)){ +ts_interpolate.default <- function(s, method = c("airline", "average")) { + method <- match.arg(method) + if (is.null(s)) { return(NULL) } - jd_s<-.r2jd_tsdata(s) - if (method == "airline"){ - jd_si<-.jcall("jdplus/toolkit/base/r/modelling/Interpolation", "Ljdplus/toolkit/base/api/timeseries/TsData;", "airlineInterpolation", jd_s) + jd_s <- .r2jd_tsdata(s) + if (method == "airline") { + jd_si <- .jcall("jdplus/toolkit/base/r/modelling/Interpolation", "Ljdplus/toolkit/base/api/timeseries/TsData;", "airlineInterpolation", jd_s) return(.jd2r_tsdata(jd_si)) - } else if (method == "average"){ - jd_si<-.jcall("jdplus/toolkit/base/r/modelling/Interpolation", "Ljdplus/toolkit/base/api/timeseries/TsData;", "averageInterpolation", jd_s) + } else if (method == "average") { + jd_si <- .jcall("jdplus/toolkit/base/r/modelling/Interpolation", "Ljdplus/toolkit/base/api/timeseries/TsData;", "averageInterpolation", jd_s) return(.jd2r_tsdata(jd_si)) - } else + } else { return(NULL) + } } #' @export -ts_interpolate.matrix <- function(s, method=c("airline", "average")){ +ts_interpolate.matrix <- function(s, method = c("airline", "average")) { result <- s - for (i in seq_len(ncol(s))){ - result[, i] <- ts_interpolate(s[,i], method = method) + for (i in seq_len(ncol(s))) { + result[, i] <- ts_interpolate(s[, i], method = method) } result } #' @export -ts_interpolate.data.frame <- function(s, method=c("airline", "average")){ +ts_interpolate.data.frame <- function(s, method = c("airline", "average")) { result <- s - for (i in seq_len(ncol(s))){ - result[, i] <- ts_interpolate(s[,i], method = method) + for (i in seq_len(ncol(s))) { + result[, i] <- ts_interpolate(s[, i], method = method) } result } @@ -155,37 +153,36 @@ ts_interpolate.data.frame <- function(s, method=c("airline", "average")){ #' ts_adjust(y) #' # with reverse we can find the #' all.equal(ts_adjust(ts_adjust(y), reverse = TRUE), y) -ts_adjust<-function(s, method=c("LeapYear", "LengthOfPeriod"), reverse = FALSE){ +ts_adjust <- function(s, method = c("LeapYear", "LengthOfPeriod"), reverse = FALSE) { UseMethod("ts_adjust", s) } #' @export -ts_adjust.default<-function(s, method=c("LeapYear", "LengthOfPeriod"), reverse = FALSE){ - method<-match.arg(method) - if (is.null(s)){ +ts_adjust.default <- function(s, method = c("LeapYear", "LengthOfPeriod"), reverse = FALSE) { + method <- match.arg(method) + if (is.null(s)) { return(NULL) } - jd_s<-.r2jd_tsdata(s) - jd_st<-.jcall("jdplus/toolkit/base/r/modelling/Transformation", "Ljdplus/toolkit/base/api/timeseries/TsData;", "adjust", jd_s, method, as.logical(reverse)) - if (is.jnull(jd_st)){ + jd_s <- .r2jd_tsdata(s) + jd_st <- .jcall("jdplus/toolkit/base/r/modelling/Transformation", "Ljdplus/toolkit/base/api/timeseries/TsData;", "adjust", jd_s, method, as.logical(reverse)) + if (is.jnull(jd_st)) { return(NULL) - } - else { + } else { return(.jd2r_tsdata(jd_st)) } } #' @export -ts_adjust.matrix <- function(s, method=c("LeapYear", "LengthOfPeriod"), reverse = FALSE){ +ts_adjust.matrix <- function(s, method = c("LeapYear", "LengthOfPeriod"), reverse = FALSE) { result <- s - for (i in seq_len(ncol(s))){ - result[, i] <- ts_adjust(s[,i], method = method, reverse = reverse) + for (i in seq_len(ncol(s))) { + result[, i] <- ts_adjust(s[, i], method = method, reverse = reverse) } result } #' @export -ts_adjust.data.frame <- function(s, method=c("LeapYear", "LengthOfPeriod"), reverse = FALSE){ +ts_adjust.data.frame <- function(s, method = c("LeapYear", "LengthOfPeriod"), reverse = FALSE) { result <- s - for (i in seq_len(ncol(s))){ - result[, i] <- ts_adjust(s[,i], method = method, reverse = reverse) + for (i in seq_len(ncol(s))) { + result[, i] <- ts_adjust(s[, i], method = method, reverse = reverse) } result } @@ -199,10 +196,10 @@ ts_adjust.data.frame <- function(s, method=c("LeapYear", "LengthOfPeriod"), reve #' @export #' #' @examples daysOf(retail$BookStores) -daysOf<-function(ts, pos=1){ - start<-start(ts) - jdom<-.r2jd_tsdomain(frequency(ts), start[1], start[2], length(ts)) - days<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "[S", "daysOf",jdom, as.integer(pos-1)) +daysOf <- function(ts, pos = 1) { + start <- start(ts) + jdom <- .r2jd_tsdomain(frequency(ts), start[1], start[2], length(ts)) + days <- .jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "[S", "daysOf", jdom, as.integer(pos - 1)) return(as.Date(days)) } @@ -216,11 +213,11 @@ daysOf<-function(ts, pos=1){ #' @return An object of type "JD3_TS". List containing the identifiers, #' the data and the metadata #' @export -to_ts<-function(source, id, type="All"){ - jmoniker<-.jcall("jdplus/toolkit/base/api/timeseries/TsMoniker", "Ljdplus/toolkit/base/api/timeseries/TsMoniker;", "of", source, id) - jts<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/Ts;", "makeTs", jmoniker, type) - bytes<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "[B", "toBuffer", jts) - p<-RProtoBuf::read(jd3.Ts, bytes) +to_ts <- function(source, id, type = "All") { + jmoniker <- .jcall("jdplus/toolkit/base/api/timeseries/TsMoniker", "Ljdplus/toolkit/base/api/timeseries/TsMoniker;", "of", source, id) + jts <- .jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/Ts;", "makeTs", jmoniker, type) + bytes <- .jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "[B", "toBuffer", jts) + p <- RProtoBuf::read(jd3.Ts, bytes) return(.p2r_ts(p)) } @@ -236,11 +233,11 @@ to_ts<-function(source, id, type="All"){ #' @export #' #' @examples -to_tscollection<-function(source, id, type="All"){ - jmoniker<-.jcall("jdplus/toolkit/base/api/timeseries/TsMoniker", "Ljdplus/toolkit/base/api/timeseries/TsMoniker;", "of", source, id) - jtscoll<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/Ts;", "makeTsCollection", jmoniker, type) - bytes<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "[B", "toBuffer", jtscoll) - p<-RProtoBuf::read(jd3.TsCollection, bytes) +to_tscollection <- function(source, id, type = "All") { + jmoniker <- .jcall("jdplus/toolkit/base/api/timeseries/TsMoniker", "Ljdplus/toolkit/base/api/timeseries/TsMoniker;", "of", source, id) + jtscoll <- .jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/Ts;", "makeTsCollection", jmoniker, type) + bytes <- .jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "[B", "toBuffer", jtscoll) + p <- RProtoBuf::read(jd3.TsCollection, bytes) return(.p2r_tscollection(p)) } @@ -253,35 +250,35 @@ to_tscollection<-function(source, id, type="All"){ #' @export #' #' @examples -#' s<-ABS$X0.2.09.10.M -#' t<-data_to_ts(s,"test") -data_to_ts<-function(s, name){ - jts<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/Ts;", "makeTs", .r2jd_tsdata(s), name) - bytes<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "[B", "toBuffer", jts) - p<-RProtoBuf::read(jd3.Ts, bytes) +#' s <- ABS$X0.2.09.10.M +#' t <- data_to_ts(s, "test") +data_to_ts <- function(s, name) { + jts <- .jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/Ts;", "makeTs", .r2jd_tsdata(s), name) + bytes <- .jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "[B", "toBuffer", jts) + p <- RProtoBuf::read(jd3.Ts, bytes) return(.p2r_ts(p)) } #' @export #' @rdname jd3_utilities -.r2jd_tmp_ts<-function(s, name){ - jts<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/Ts;", "makeTs", .r2jd_tsdata(s), name) +.r2jd_tmp_ts <- function(s, name) { + jts <- .jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/Ts;", "makeTs", .r2jd_tsdata(s), name) return(jts) } #' @export #' @rdname jd3_utilities -.r2jd_make_ts<-function(source, id, type="All"){ - jmoniker<-.jcall("jdplus/toolkit/base/api/timeseries/TsMoniker", "Ljdplus/toolkit/base/api/timeseries/TsMoniker;", "of", source, id) - jts<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/Ts;", "makeTs", jmoniker, type) +.r2jd_make_ts <- function(source, id, type = "All") { + jmoniker <- .jcall("jdplus/toolkit/base/api/timeseries/TsMoniker", "Ljdplus/toolkit/base/api/timeseries/TsMoniker;", "of", source, id) + jts <- .jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/Ts;", "makeTs", jmoniker, type) return(jts) } #' @export #' @rdname jd3_utilities -.r2jd_make_tscollection<-function(source, id, type="All"){ - jmoniker<-.jcall("jdplus/toolkit/base/api/timeseries/TsMoniker", "Ljdplus/toolkit/base/api/timeseries/TsMoniker;", "of", source, id) - jtscoll<-.jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/Ts;", "makeTsCollection", jmoniker, type) +.r2jd_make_tscollection <- function(source, id, type = "All") { + jmoniker <- .jcall("jdplus/toolkit/base/api/timeseries/TsMoniker", "Ljdplus/toolkit/base/api/timeseries/TsMoniker;", "of", source, id) + jtscoll <- .jcall("jdplus/toolkit/base/r/timeseries/TsUtility", "Ljdplus/toolkit/base/api/timeseries/Ts;", "makeTsCollection", jmoniker, type) return(jtscoll) } @@ -297,12 +294,14 @@ data_to_ts<-function(s, name){ #' #' @examples #' # Annual series -#' s<-tsdata_of(c(1,2,3,4), c("1990-01-01", "1995-01-01", "1996-01-01", "2000-11-01")) +#' s <- tsdata_of(c(1, 2, 3, 4), c("1990-01-01", "1995-01-01", "1996-01-01", "2000-11-01")) #' # Quarterly series -#' t<-tsdata_of(c(1,2,3,NA,4), c("1990-01-01", "1995-01-01", "1996-01-01", "2000-08-01", "2000-11-01")) -tsdata_of<-function(values, dates){ - jtsdata<-.jcall("jdplus/toolkit/base/r/timeseries/TsDataCollector", "Ljdplus/toolkit/base/api/timeseries/TsData;", - "of", as.numeric(values), as.character(dates)) +#' t <- tsdata_of(c(1, 2, 3, NA, 4), c("1990-01-01", "1995-01-01", "1996-01-01", "2000-08-01", "2000-11-01")) +tsdata_of <- function(values, dates) { + jtsdata <- .jcall( + "jdplus/toolkit/base/r/timeseries/TsDataCollector", "Ljdplus/toolkit/base/api/timeseries/TsData;", + "of", as.numeric(values), as.character(dates) + ) return(.jd2r_tsdata(jtsdata)) } @@ -316,8 +315,8 @@ tsdata_of<-function(values, dates){ #' @export #' #' @examples -compare_annual_totals<-function(raw, sa){ - jsa<-.r2jd_tsdata(sa) - jraw<-.r2jd_tsdata(raw) +compare_annual_totals <- function(raw, sa) { + jsa <- .r2jd_tsdata(sa) + jraw <- .r2jd_tsdata(raw) return(.jcall("jdplus/sa/base/r/SaUtility", "D", "compareAnnualTotals", jraw, jsa)) } diff --git a/R/utils.R b/R/utils.R index 813f6e7..b68020e 100644 --- a/R/utils.R +++ b/R/utils.R @@ -23,38 +23,38 @@ NULL "Imports" -ymd<-function(y, m, d=1){ +ymd <- function(y, m, d = 1) { return(as.Date(sprintf("%04i-%02i-%02i", y, m, d))) } -yearOf<-function(s){ +yearOf <- function(s) { return(as.integer(substr(s, 1, 4))) } -monthOf<-function(s){ +monthOf <- function(s) { return(as.integer(substr(s, 6, 7))) } -dayOf<-function(s){ +dayOf <- function(s) { return(as.integer(substr(s, 9, 10))) } -dateOf<-function(year, month, day){ - d<-jd3.Date$new() - d$year<-year - d$month<-month - d$day<-day +dateOf <- function(year, month, day) { + d <- jd3.Date$new() + d$year <- year + d$month <- month + d$day <- day return(d) } -parseDate<-function(s){ - d<-jd3.Date$new() - d$year<-yearOf(s) - d$month<-monthOf(s) - d$day<-dayOf(s) +parseDate <- function(s) { + d <- jd3.Date$new() + d$year <- yearOf(s) + d$month <- monthOf(s) + d$day <- dayOf(s) return(d) } #' Title #' #' @export -reload_dictionaries<-function(){ +reload_dictionaries <- function() { .jcall("jdplus/toolkit/base/api/information/InformationExtractors", "V", "reloadExtractors") } @@ -63,14 +63,14 @@ reload_dictionaries<-function(){ NULL -.p2r_anova<-function(p){ - return(list(SSM=p$SSM, dfM=p$dfm, SSR=p$SSR, dfR=p$dfr, test=test_anova(p$SSM, p$dfm, p$SSR, p$dfr))) +.p2r_anova <- function(p) { + return(list(SSM = p$SSM, dfM = p$dfm, SSR = p$SSR, dfR = p$dfr, test = test_anova(p$SSM, p$dfm, p$SSR, p$dfr))) } -test_anova<-function(ssm, dfm, ssr, dfr){ - val<-(ssm/dfm)*(dfr/ssr) - desc<-paste0("F(",dfm,",",dfr,")") - pval<-1-pf(val, dfm, dfr) +test_anova <- function(ssm, dfm, ssr, dfr) { + val <- (ssm / dfm) * (dfr / ssr) + desc <- paste0("F(", dfm, ",", dfr, ")") + pval <- 1 - pf(val, dfm, dfr) return(statisticaltest(val, pval, desc)) } @@ -90,13 +90,16 @@ test_anova<-function(ssm, dfm, ssr, dfr){ #' @export #' #' @examples -.likelihood<-function(nobs, neffectiveobs=NA, nparams=0, ll, adjustedll=NA, aic, aicc, bic, bicc, ssq){ - - if (is.na(neffectiveobs)) neffectiveobs<-nobs - if (is.na(adjustedll)) adjustedll<-ll - - return(structure(list(nobs=nobs, neffectiveobs=neffectiveobs, nparams=nparams, - ll=ll, adjustedll=adjustedll, - aic=aic, aicc=aicc, bic=bic, bicc=bicc, ssq=ssq), - class = "JD3_LIKELIHOOD")) +.likelihood <- function(nobs, neffectiveobs = NA, nparams = 0, ll, adjustedll = NA, aic, aicc, bic, bicc, ssq) { + if (is.na(neffectiveobs)) neffectiveobs <- nobs + if (is.na(adjustedll)) adjustedll <- ll + + return(structure( + list( + nobs = nobs, neffectiveobs = neffectiveobs, nparams = nparams, + ll = ll, adjustedll = adjustedll, + aic = aic, aicc = aicc, bic = bic, bicc = bicc, ssq = ssq + ), + class = "JD3_LIKELIHOOD" + )) } diff --git a/R/variables.R b/R/variables.R index 0b68a45..daaa5c8 100644 --- a/R/variables.R +++ b/R/variables.R @@ -16,33 +16,33 @@ NULL #' More information on calendar correction in JDemetra+ online documentation: #' \url{https://jdemetra-new-documentation.netlify.app/a-calendar-correction} #' @examples -#' #Monthly regressor, five-year long, duration 8 days, effect finishing on Easter Monday -#' ee<-easter_variable(12, c(2020,1),length=5*12,duration=8, endpos=1) +#' # Monthly regressor, five-year long, duration 8 days, effect finishing on Easter Monday +#' ee <- easter_variable(12, c(2020, 1), length = 5 * 12, duration = 8, endpos = 1) #' @export -easter_variable<-function(frequency, start, length, s, duration=6, endpos=-1, - correction=c("Simple", "PreComputed", "Theoretical", "None")){ - correction<-match.arg(correction) +easter_variable <- function(frequency, start, length, s, duration = 6, endpos = -1, + correction = c("Simple", "PreComputed", "Theoretical", "None")) { + correction <- match.arg(correction) if (!missing(s) && is.ts(s)) { - frequency<-stats::frequency(s) - start<-stats::start(s) - length<-.length_ts(s) + frequency <- stats::frequency(s) + start <- stats::start(s) + length <- .length_ts(s) } - jdom<-.r2jd_tsdomain(frequency, start[1], start[2], length) - data<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "easter", jdom, as.integer(duration), as.integer(endpos), correction) - return(ts(data, frequency = frequency, start= start)) + jdom <- .r2jd_tsdomain(frequency, start[1], start[2], length) + data <- .jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "easter", jdom, as.integer(duration), as.integer(endpos), correction) + return(ts(data, frequency = frequency, start = start)) } #' @rdname easter_variable #' @export -julianeaster_variable<-function(frequency, start, length, s, duration=6){ +julianeaster_variable <- function(frequency, start, length, s, duration = 6) { if (!missing(s) && is.ts(s)) { - frequency<-stats::frequency(s) - start<-stats::start(s) - length<-.length_ts(s) + frequency <- stats::frequency(s) + start <- stats::start(s) + length <- .length_ts(s) } - jdom<-.r2jd_tsdomain(frequency, start[1], start[2], length) - data<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "julianEaster", jdom, as.integer(duration)) - return(ts(data, frequency = frequency, start= start)) + jdom <- .r2jd_tsdomain(frequency, start[1], start[2], length) + data <- .jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "julianEaster", jdom, as.integer(duration)) + return(ts(data, frequency = frequency, start = start)) } #' Leap Year regressor @@ -61,19 +61,19 @@ julianeaster_variable<-function(frequency, start, length, s, duration=6){ #' #' @examples #' # Leap years occur in year 2000, 2004, 2008 and 2012 -#' lp_variable(4, start = c(2000, 1), length = 4*13) -#' lper<-lp_variable(12,c(2000,1),length=10*12,type ="LengthOfPeriod") -lp_variable<-function(frequency, start, length, s, type=c("LeapYear", "LengthOfPeriod")){ - type<-match.arg(type) - lp<-type == "LeapYear" +#' lp_variable(4, start = c(2000, 1), length = 4 * 13) +#' lper <- lp_variable(12, c(2000, 1), length = 10 * 12, type = "LengthOfPeriod") +lp_variable <- function(frequency, start, length, s, type = c("LeapYear", "LengthOfPeriod")) { + type <- match.arg(type) + lp <- type == "LeapYear" if (!missing(s) && is.ts(s)) { - frequency<-stats::frequency(s) - start<-stats::start(s) - length<-.length_ts(s) + frequency <- stats::frequency(s) + start <- stats::start(s) + length <- .length_ts(s) } - jdom<-.r2jd_tsdomain(frequency, start[1], start[2], length) - data<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "leapYear", jdom, as.logical(lp)) - return(ts(data, frequency = frequency, start= start)) + jdom <- .r2jd_tsdomain(frequency, start[1], start[2], length) + data <- .jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "leapYear", jdom, as.logical(lp)) + return(ts(data, frequency = frequency, start = start)) } #' Generating Outlier regressors @@ -103,79 +103,83 @@ lp_variable<-function(frequency, start, length, s, type=c("LeapYear", "LengthOfP #' @export #' #' @examples -#' #Outliers in February 2002 -#' ao <- ao_variable(12, c(2000,1), length = 12*4, date = "2002-02-01") -#' ls <- ls_variable(12, c(2000,1), length = 12*4, date = "2002-02-01") -#' tc <- tc_variable(12, c(2000,1), length = 12*4, date = "2002-02-01") -#' so <- so_variable(12, c(2000,1), length = 12*4, date = "2002-02-01") -#' plot.ts(ts.union(ao, ls, tc, so), plot.type = "single", -#' col = c("black", "orange", "green", "gray")) +#' # Outliers in February 2002 +#' ao <- ao_variable(12, c(2000, 1), length = 12 * 4, date = "2002-02-01") +#' ls <- ls_variable(12, c(2000, 1), length = 12 * 4, date = "2002-02-01") +#' tc <- tc_variable(12, c(2000, 1), length = 12 * 4, date = "2002-02-01") +#' so <- so_variable(12, c(2000, 1), length = 12 * 4, date = "2002-02-01") +#' plot.ts(ts.union(ao, ls, tc, so), +#' plot.type = "single", +#' col = c("black", "orange", "green", "gray") +#' ) #' @name outliers_variables #' @rdname outliers_variables -ao_variable<-function(frequency, start, length, s, pos, date=NULL){ +ao_variable <- function(frequency, start, length, s, pos, date = NULL) { if (!missing(s) && is.ts(s)) { - frequency<-stats::frequency(s) - start<-stats::start(s) - length<-.length_ts(s) + frequency <- stats::frequency(s) + start <- stats::start(s) + length <- .length_ts(s) } - jdom<-.r2jd_tsdomain(frequency, start[1], start[2], length) - if (is.null(date)){ - data<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "ao", jdom, as.integer(pos-1)) + jdom <- .r2jd_tsdomain(frequency, start[1], start[2], length) + if (is.null(date)) { + data <- .jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "ao", jdom, as.integer(pos - 1)) } else { - data<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "ao", jdom, as.character(date)) + data <- .jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "ao", jdom, as.character(date)) } - return(ts(data, frequency = frequency, start= start)) + return(ts(data, frequency = frequency, start = start)) } #' @export #' @rdname outliers_variables -tc_variable<-function(frequency, start, length, s, pos, date=NULL, rate=0.7){ +tc_variable <- function(frequency, start, length, s, pos, date = NULL, rate = 0.7) { if (!missing(s) && is.ts(s)) { - frequency<-stats::frequency(s) - start<-stats::start(s) - length<-.length_ts(s) + frequency <- stats::frequency(s) + start <- stats::start(s) + length <- .length_ts(s) } - jdom<-.r2jd_tsdomain(frequency, start[1], start[2], length) - if (is.null(date)){ - data<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "tc", jdom, as.integer(pos-1), rate) + jdom <- .r2jd_tsdomain(frequency, start[1], start[2], length) + if (is.null(date)) { + data <- .jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "tc", jdom, as.integer(pos - 1), rate) } else { - data<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "tc", jdom, as.character(date), rate) + data <- .jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "tc", jdom, as.character(date), rate) } - return(ts(data, frequency = frequency, start= start)) + return(ts(data, frequency = frequency, start = start)) } #' @export #' @rdname outliers_variables -ls_variable<-function(frequency, start, length, s, pos, date=NULL, zeroended=TRUE){ +ls_variable <- function(frequency, start, length, s, pos, date = NULL, zeroended = TRUE) { if (!missing(s) && is.ts(s)) { - frequency<-stats::frequency(s) - start<-stats::start(s) - length<-.length_ts(s) + frequency <- stats::frequency(s) + start <- stats::start(s) + length <- .length_ts(s) } - jdom<-.r2jd_tsdomain(frequency, start[1], start[2], length) - if (is.null(date)){ - data<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "ls", jdom, as.integer(pos-1), as.logical(zeroended)) + jdom <- .r2jd_tsdomain(frequency, start[1], start[2], length) + if (is.null(date)) { + data <- .jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "ls", jdom, as.integer(pos - 1), as.logical(zeroended)) } else { - data<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "ls", jdom, as.character(date), as.logical(zeroended)) + data <- .jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "ls", jdom, as.character(date), as.logical(zeroended)) } - return(ts(data, frequency = frequency, start= start)) + return(ts(data, frequency = frequency, start = start)) } #' @export #' @rdname outliers_variables -so_variable<-function(frequency, start, length, s, pos, date=NULL, zeroended=TRUE){ +so_variable <- function(frequency, start, length, s, pos, date = NULL, zeroended = TRUE) { if (!missing(s) && is.ts(s)) { - frequency<-stats::frequency(s) - start<-stats::start(s) - length<-.length_ts(s) + frequency <- stats::frequency(s) + start <- stats::start(s) + length <- .length_ts(s) } - jdom<-.r2jd_tsdomain(frequency, start[1], start[2], length) - if (is.null(date)){ - data<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "so", jdom, as.integer(pos-1), as.logical(zeroended)) + jdom <- .r2jd_tsdomain(frequency, start[1], start[2], length) + if (is.null(date)) { + data <- .jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "so", jdom, as.integer(pos - 1), as.logical(zeroended)) } else { - data<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "so", jdom, as.character(date), - as.logical(zeroended)) + data <- .jcall( + "jdplus/toolkit/base/r/modelling/Variables", "[D", "so", jdom, as.character(date), + as.logical(zeroended) + ) } - return(ts(data, frequency = frequency, start= start)) + return(ts(data, frequency = frequency, start = start)) } #' Ramp regressor @@ -198,28 +202,32 @@ so_variable<-function(frequency, start, length, s, pos, date=NULL, zeroended=TRU #' #' @examples #' # Ramp variable from January 2001 to September 2001 -#' rp <- ramp_variable(12, c(2000,1), length = 12*4, range = c(13, 21)) +#' rp <- ramp_variable(12, c(2000, 1), length = 12 * 4, range = c(13, 21)) #' # Or equivalently -#' rp<-ramp_variable(12, c(2000,1), length = 12*4, range = c("2001-01-01", "2001-09-02")) +#' rp <- ramp_variable(12, c(2000, 1), length = 12 * 4, range = c("2001-01-01", "2001-09-02")) #' plot.ts(rp) -ramp_variable<-function(frequency, start, length, s, range){ +ramp_variable <- function(frequency, start, length, s, range) { if (!missing(s) && is.ts(s)) { - frequency<-stats::frequency(s) - start<-stats::start(s) - length<-.length_ts(s) + frequency <- stats::frequency(s) + start <- stats::start(s) + length <- .length_ts(s) } - jdom<-.r2jd_tsdomain(frequency, start[1], start[2], length) + jdom <- .r2jd_tsdomain(frequency, start[1], start[2], length) if (length(range) != 2) stop("Invalid range") - if (is.character(range)){ - data<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "ramp", jdom, - as.character(range[1]), - as.character(range[2])) + if (is.character(range)) { + data <- .jcall( + "jdplus/toolkit/base/r/modelling/Variables", "[D", "ramp", jdom, + as.character(range[1]), + as.character(range[2]) + ) } else { - data<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "ramp", jdom, - as.integer(range[1]-1), - as.integer(range[2]-1)) + data <- .jcall( + "jdplus/toolkit/base/r/modelling/Variables", "[D", "ramp", jdom, + as.integer(range[1] - 1), + as.integer(range[2] - 1) + ) } - return(ts(data, frequency = frequency, start= start)) + return(ts(data, frequency = frequency, start = start)) } #' Intervention variable @@ -244,17 +252,19 @@ ramp_variable<-function(frequency, start, length, s, range){ #' the cumulative sum of temporary level shifts, once differenced the regressor will become a classical level shift. #' #' @examples -#' iv1<-intervention_variable(12, c(2000, 1), 60, -#' starts = "2001-01-01", ends = "2001-12-01") +#' iv1 <- intervention_variable(12, c(2000, 1), 60, +#' starts = "2001-01-01", ends = "2001-12-01" +#' ) #' plot(iv1) -#' iv2<- intervention_variable(12, c(2000, 1), 60, -#' starts = "2001-01-01", ends = "2001-12-01", delta = 1) -#' plot (iv2) +#' iv2 <- intervention_variable(12, c(2000, 1), 60, +#' starts = "2001-01-01", ends = "2001-12-01", delta = 1 +#' ) +#' plot(iv2) #' # using one variable in a a seasonal adjustment process #' # regressors as a list of two groups reg1 and reg2 -#' vars<-list(reg1=list(x = iv1),reg2=list(x = iv2) ) +#' vars <- list(reg1 = list(x = iv1), reg2 = list(x = iv2)) #' # creating the modelling context -#' my_context<-modelling_context(variables=vars) +#' my_context <- modelling_context(variables = vars) #' # customize a default specification #' # init_spec <- rjd3x13::x13_spec("RSA5c") #' # new_spec<- add_usrdefvar(init_spec,id = "reg1.iv1", regeffect="Trend") @@ -266,68 +276,72 @@ ramp_variable<-function(frequency, start, length, s, range){ #' \url{https://jdemetra-new-documentation.netlify.app/} #' @export -intervention_variable<-function(frequency, start, length, s, starts, ends, delta=0, seasonaldelta=0){ +intervention_variable <- function(frequency, start, length, s, starts, ends, delta = 0, seasonaldelta = 0) { if (!missing(s) && is.ts(s)) { - frequency<-stats::frequency(s) - start<-stats::start(s) - length<-.length_ts(s) + frequency <- stats::frequency(s) + start <- stats::start(s) + length <- .length_ts(s) } if (length(starts) != length(ends)) stop("Invalid spans in intervention variable") - jdom<-.r2jd_tsdomain(frequency, start[1], start[2], length) - if (is.character(starts) && is.character(ends)){ - data<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "interventionVariable", jdom, - delta, - seasonaldelta, - .jarray(as.character(starts)), - .jarray(as.character(ends))) + jdom <- .r2jd_tsdomain(frequency, start[1], start[2], length) + if (is.character(starts) && is.character(ends)) { + data <- .jcall( + "jdplus/toolkit/base/r/modelling/Variables", "[D", "interventionVariable", jdom, + delta, + seasonaldelta, + .jarray(as.character(starts)), + .jarray(as.character(ends)) + ) } else { - data<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "[D", "interventionVariable", jdom, - delta, - seasonaldelta, - .jarray(as.integer(starts-1)), - .jarray(as.integer(ends-1))) + data <- .jcall( + "jdplus/toolkit/base/r/modelling/Variables", "[D", "interventionVariable", jdom, + delta, + seasonaldelta, + .jarray(as.integer(starts - 1)), + .jarray(as.integer(ends - 1)) + ) } - return(ts(data, frequency = frequency, start= start)) + return(ts(data, frequency = frequency, start = start)) } #' Periodic dummies and contrasts #' -#'@inheritParams outliers_variables -#'@details +#' @inheritParams outliers_variables +#' @details #' The function periodic.dummies creates as many time series as types of periods in a year (4 or 12) #' with the value one only for one given type of period (ex Q1) #' The periodic.contrasts function is based on periodic.dummies but adds -1 to the period preceding a 1. -#'@examples +#' @examples #' # periodic dummies for a quarterly series -#' p<-periodic.dummies(4, c(2000,1), 60) -#' #periodic contrasts for a quarterly series -#'q<-periodic.contrasts(4, c(2000,1), 60) -#'q[1:9,] -#'@export -periodic.dummies <-function(frequency, start, length, s){ +#' p <- periodic.dummies(4, c(2000, 1), 60) +#' # periodic contrasts for a quarterly series +#' q <- periodic.contrasts(4, c(2000, 1), 60) +#' q[1:9, ] +#' @export +periodic.dummies <- function(frequency, start, length, s) { if (!missing(s) && is.ts(s)) { - frequency<-stats::frequency(s) - start<-stats::start(s) - length<-.length_ts(s) + frequency <- stats::frequency(s) + start <- stats::start(s) + length <- .length_ts(s) } jdom <- .r2jd_tsdomain(frequency, start[1], start[2], length) - jm<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "Ljdplus/toolkit/base/api/math/matrices/Matrix;", "periodicDummies", jdom) + jm <- .jcall("jdplus/toolkit/base/r/modelling/Variables", "Ljdplus/toolkit/base/api/math/matrices/Matrix;", "periodicDummies", jdom) data <- .jd2r_matrix(jm) - return(ts(data, frequency = frequency, start= start)) + return(ts(data, frequency = frequency, start = start)) } -#'@export -#'@rdname periodic.dummies -periodic.contrasts <-function(frequency, start, length, s){ +#' @export +#' @rdname periodic.dummies +periodic.contrasts <- function(frequency, start, length, s) { if (!missing(s) && is.ts(s)) { - frequency<-stats::frequency(s) - start<-stats::start(s) - length<-.length_ts(s) + frequency <- stats::frequency(s) + start <- stats::start(s) + length <- .length_ts(s) } jdom <- .r2jd_tsdomain(frequency, start[1], start[2], length) - jm<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "Ljdplus/toolkit/base/api/math/matrices/Matrix;", "periodicContrasts", jdom) + jm <- .jcall("jdplus/toolkit/base/r/modelling/Variables", "Ljdplus/toolkit/base/api/math/matrices/Matrix;", "periodicContrasts", jdom) data <- .jd2r_matrix(jm) - return(ts(data, frequency = frequency, start= start)) + return(ts(data, frequency = frequency, start = start)) } #' Trigonometric variables #' @@ -375,22 +389,26 @@ periodic.contrasts <-function(frequency, start, length, s){ #' #' @export trigonometric_variables <- function(frequency, start, length, s, - seasonal_frequency = NULL){ + seasonal_frequency = NULL) { if (!missing(s) && is.ts(s)) { - frequency<-stats::frequency(s) - start<-stats::start(s) - length<-.length_ts(s) + frequency <- stats::frequency(s) + start <- stats::start(s) + length <- .length_ts(s) } jdom <- .r2jd_tsdomain(frequency, start[1], start[2], length) - if (!is.null(seasonal_frequency)) + if (!is.null(seasonal_frequency)) { seasonal_frequency <- as.integer(seasonal_frequency) - jm<-.jcall("jdplus/toolkit/base/r/modelling/Variables", "Ljdplus/toolkit/base/api/math/matrices/Matrix;", "trigonometricVariables", - jdom, .jarray(seasonal_frequency)) + } + jm <- .jcall( + "jdplus/toolkit/base/r/modelling/Variables", "Ljdplus/toolkit/base/api/math/matrices/Matrix;", "trigonometricVariables", + jdom, .jarray(seasonal_frequency) + ) data <- .jd2r_matrix(jm) - if (ncol(data) %% 2 == 1) + if (ncol(data) %% 2 == 1) { data <- cbind(data, 0) + } return(ts(data, frequency = frequency, start = start)) } diff --git a/R/zzz.R b/R/zzz.R index baf6ca8..86a6e43 100644 --- a/R/zzz.R +++ b/R/zzz.R @@ -3,11 +3,11 @@ NULL #' @rdname jd3_utilities #' @export -DATE_MIN<-NULL +DATE_MIN <- NULL #' @export #' @rdname jd3_utilities -DATE_MAX<-NULL +DATE_MAX <- NULL #' @importFrom RProtoBuf read readProtoFiles2 #' @importFrom rJava .jpackage .jcall .jnull .jarray .jevalArray .jcast .jcastToArray .jinstanceof is.jnull .jnew .jclass @@ -16,11 +16,11 @@ NULL .onLoad <- function(libname, pkgname) { - result <- .jpackage(pkgname, lib.loc=libname) + result <- .jpackage(pkgname, lib.loc = libname) if (!result) stop("Loading java packages failed") # what's your java version? Need >= 17 - jversion <- .jcall('java.lang.System','S','getProperty','java.version') + jversion <- .jcall("java.lang.System", "S", "getProperty", "java.version") if (jversion < "17") { stop(sprintf("Your java version is %s. 17 or higher is needed.", jversion)) } @@ -28,10 +28,10 @@ NULL proto.dir <- system.file("proto", package = pkgname) readProtoFiles2(protoPath = proto.dir) - DATE_MIN<<-dateOf(1,1,1) - DATE_MAX<<-dateOf(9999, 12, 31) + DATE_MIN <<- dateOf(1, 1, 1) + DATE_MAX <<- dateOf(9999, 12, 31) - if(is.null(getOption("summary_info"))) + if (is.null(getOption("summary_info"))) { options(summary_info = TRUE) - + } } diff --git a/README.Rmd b/README.Rmd index b0b7cd9..a674701 100644 --- a/README.Rmd +++ b/README.Rmd @@ -6,10 +6,10 @@ output: github_document ```{r, include = FALSE} knitr::opts_chunk$set( - collapse = TRUE, - comment = "#>", - fig.path = "man/figures/README-", - out.width = "100%" + collapse = TRUE, + comment = "#>", + fig.path = "man/figures/README-", + out.width = "100%" ) ``` From f3ea143d31b6fda88242fbc67ad0bf644b8f6515 Mon Sep 17 00:00:00 2001 From: Tanguy BARTHELEMY Date: Mon, 14 Oct 2024 15:57:54 +0200 Subject: [PATCH 18/18] lint package --- .lintr | 3 ++- R/arima.R | 15 ++++++++++++--- R/regarima_generic.R | 4 ++-- R/spec_regarima.R | 6 +++--- 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/.lintr b/.lintr index 9135dcb..4f6b247 100644 --- a/.lintr +++ b/.lintr @@ -27,6 +27,7 @@ linters: lintr::all_linters( todo_comment_linter = NULL, if_not_else_linter = NULL, unnecessary_nested_if_linter = NULL, - undesirable_operator_linter = NULL + undesirable_operator_linter = NULL, + object_usage_linter = NULL ) encoding: "UTF-8" diff --git a/R/arima.R b/R/arima.R index 4d52386..f984a2a 100644 --- a/R/arima.R +++ b/R/arima.R @@ -478,7 +478,12 @@ sarima_estimate <- function(x, order = c(0, 0, 0), seasonal = list(order = c(0, #' @examples #' y <- ABS$X0.2.09.10.M #' sarima_hannan_rissanen(y, order = c(0, 1, 1), seasonal = c(0, 1, 1)) -sarima_hannan_rissanen <- function(x, order = c(0, 0, 0), seasonal = list(order = c(0, 0, 0), period = NA), initialization = c("Ols", "Levinson", "Burg"), biasCorrection = TRUE, finalCorrection = TRUE) { +sarima_hannan_rissanen <- function(x, + order = c(0, 0, 0), + seasonal = list(order = c(0, 0, 0), period = NA), + initialization = c("Ols", "Levinson", "Burg"), + biasCorrection = TRUE, + finalCorrection = TRUE) { if (!is.list(seasonal) && is.numeric(seasonal) && length(seasonal) == 3) { initialization <- match.arg(initialization) seasonal <- list( @@ -490,8 +495,12 @@ sarima_hannan_rissanen <- function(x, order = c(0, 0, 0), seasonal = list(order seasonal$period <- frequency(x) } jmodel <- .jcall( - "jdplus/toolkit/base/r/arima/SarimaModels", "Ljdplus/toolkit/base/core/sarima/SarimaModel;", "hannanRissanen", - as.numeric(x), as.integer(order), as.integer(seasonal$period), as.integer(seasonal$order), as.character(initialization), as.logical(biasCorrection), as.logical(finalCorrection) + "jdplus/toolkit/base/r/arima/SarimaModels", + "Ljdplus/toolkit/base/core/sarima/SarimaModel;", + "hannanRissanen", + as.numeric(x), as.integer(order), as.integer(seasonal$period), + as.integer(seasonal$order), as.character(initialization), + as.logical(biasCorrection), as.logical(finalCorrection) ) return(.jd2r_sarima(jmodel)) } diff --git a/R/regarima_generic.R b/R/regarima_generic.R index 418f7ed..72bb70a 100644 --- a/R/regarima_generic.R +++ b/R/regarima_generic.R @@ -28,8 +28,8 @@ logLik.JD3_REGARIMA_RSLTS <- function(object, ...) { if (!is.null(object$estimation)) { # for sarima_estimate outputs object <- object$estimation } - if (is.null(object) || - is.null(object$likelihood$ll)) { + if (is.null(object) + || is.null(object$likelihood$ll)) { res <- NA } else { res <- structure(object$likelihood$ll, diff --git a/R/spec_regarima.R b/R/spec_regarima.R index 80f56de..fbda555 100644 --- a/R/spec_regarima.R +++ b/R/spec_regarima.R @@ -1095,9 +1095,9 @@ set_tradingdays.default <- function(x, if (!missing(calendar.name) && !anyNA(calendar.name)) { td$holidays <- calendar.name } - if (!is.null(uservariable) && - !anyNA(uservariable) && - length(uservariable) > 0) { + if (!is.null(uservariable) + && !anyNA(uservariable) + && length(uservariable) > 0) { td$td <- "TD_NONE" td$holidays <- ""

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 z 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ϟ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�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 literal 235637 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 z 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