From b636824d2421e39c74f26a8f5058bb3d96973c48 Mon Sep 17 00:00:00 2001 From: palatej Date: Mon, 15 Apr 2024 16:47:01 +0200 Subject: [PATCH 1/2] Code cleanup --- R/arima.R | 6 +-- R/calendars.R | 34 ++++++++--------- R/decomposition.R | 10 ++--- R/differencing.R | 6 +-- R/display.R | 25 ++++++------ R/protobuf.R | 4 +- R/regarima_generic.R | 8 ++-- R/regarima_rslts.R | 1 + R/spec_regarima.R | 88 +++++++++++++++++++++---------------------- R/tests_seasonality.R | 12 +++--- R/timeseries.R | 6 +-- R/utils.R | 6 +-- R/variables.R | 72 +++++++++++++++++------------------ R/zzz.R | 1 - 14 files changed, 139 insertions(+), 140 deletions(-) diff --git a/R/arima.R b/R/arima.R index 46d113a..3ed07b4 100644 --- a/R/arima.R +++ b/R/arima.R @@ -17,7 +17,7 @@ NULL #' @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, + list(name = name, period = period, phi = phi, d = d, theta = theta, bphi = bphi, bd = bd, btheta = btheta), class="JD3_SARIMA")) } @@ -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))) @@ -394,7 +394,7 @@ sarima_estimate<-function(x, order=c(0,0,0), seasonal = list(order=c(0,0,0), per #' 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) + initialization<-match.arg(initialization) seasonal <- list(order = seasonal, period = NA) } diff --git a/R/calendars.R b/R/calendars.R index 50d0ff2..bb7f33e 100644 --- a/R/calendars.R +++ b/R/calendars.R @@ -4,24 +4,24 @@ #' @include protobuf.R jd2r.R NULL -HOLIDAY='JD3_HOLIDAY' -FIXEDDAY='JD3_FIXEDDAY' -FIXEDWEEKDAY='JD3_FIXEDWEEKDAY' -EASTERDAY='JD3_EASTERDAY' -SPECIALDAY='JD3_SPECIALDAY' -SINGLEDAY='JD3_SINGLEDAY' +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 + pend<-DATE_MAX }else{ - pend=parseDate(end) + pend<-parseDate(end) } vp$start<-pstart vp$end<-pend @@ -336,9 +336,9 @@ special_day<-function(event, offset=0, weight=1, validity=NULL){ #' 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) + 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) @@ -736,9 +736,9 @@ national_calendar <- function(days, mean_correction=TRUE){ 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) + 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) @@ -776,7 +776,7 @@ print.JD3_FIXEDDAY<-function(x, ...){ 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 diff --git a/R/decomposition.R b/R/decomposition.R index f605632..b29631e 100644 --- a/R/decomposition.R +++ b/R/decomposition.R @@ -10,19 +10,19 @@ 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) + n<-length(y) if (is.null(s)){ if (mul){ - s=ts(rep(1,1,n), start = start(y), frequency = frequency(y)) + 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)) + 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") @@ -70,7 +70,7 @@ plot.JD3_SADECOMPOSITION <- function(x, first_date = NULL, last_date = NULL, lty <- rep(1, length(series_graph)) # lty[grep("_f$", series_graph)] <- 1 - col <- colors[gsub("_.*$", "", series_graph)] + # col <- colors[gsub("_.*$", "", series_graph)] # par(mar = c(5, 4, 4, 2) + 0.1) ts.plot(data_plot[, series_graph], col = colors[series_graph], diff --git a/R/differencing.R b/R/differencing.R index 096781f..0c8bf14 100644 --- a/R/differencing.R +++ b/R/differencing.R @@ -36,7 +36,7 @@ NULL #' @examples #' do_stationary(log(ABS$X0.2.09.10.M),12) do_stationary<-function(data, period){ - if (is.ts(data) & missing(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)) @@ -71,7 +71,7 @@ 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)) + 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) @@ -177,7 +177,7 @@ 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)) + 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 ac71e04..15ddd7d 100644 --- a/R/display.R +++ b/R/display.R @@ -50,8 +50,8 @@ print.JD3_SARIMA<-function(x, ...){ #' @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 + tables <- .sarima_coef_table(x, ...) + orders <- tables$sarima_orders cat("SARIMA model: ", .arima_node(orders$p, orders$d, orders$q), @@ -116,17 +116,17 @@ print.summary.JD3_SARIMA_ESTIMATION<-function(x, digits = max(3L, getOption("dig 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 (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' @@ -151,7 +151,7 @@ print.summary.JD3_SARIMA_ESTIMATION<-function(x, digits = max(3L, getOption("dig } .sarima_coef_table.JD3_SARIMA_ESTIMATE <- function(x,...){ ndf<-x$likelihood$neffectiveobs-x$likelihood$nparams+1 - sarima_orders = list(p = x$orders$order[1], + sarima_orders <- list(p = x$orders$order[1], d = x$orders$order[2], q = x$orders$order[3], bp = x$orders$seasonal$order[1], @@ -255,7 +255,7 @@ print.JD3_REGARIMA_RSLTS<-function(x, digits = max(3L, getOption("digits") - 3L) ndf = ndf, digits = digits, ...) - xregs = .regarima_coef_table(x, ...) + xregs <- .regarima_coef_table(x, ...) cat("\n") if (!is.null(xregs)){ cat("Regression model:\n") @@ -359,14 +359,13 @@ summary.JD3_REGARIMA_RSLTS<-function(object, ...){ summary.JD3_SARIMA_ESTIMATE <-function(object, ...){ sarima_sum = .sarima_coef_table(object, ...) class(sarima_sum) <- "summary.JD3_SARIMA_ESTIMATION" - xregs = .regarima_coef_table(object, ...) - likelihood = summary(object$likelihood) - res = list(log = NULL, + likelihood <- summary(object$likelihood) + res <- list(log = NULL, sarima = sarima_sum, xregs = .regarima_coef_table(object, ...), likelihood = likelihood) class(res) <- "summary.JD3_REGARIMA_RSLTS" - res + return (res) } #' @export print.summary.JD3_REGARIMA_RSLTS <- function(x, digits = max(3L, getOption("digits") - 3L), signif.stars = getOption("show.signif.stars"), ...){ diff --git a/R/protobuf.R b/R/protobuf.R index bbae0c2..fb3bdbc 100644 --- a/R/protobuf.R +++ b/R/protobuf.R @@ -34,7 +34,8 @@ NULL #' @export #' @rdname jd3_utilities .enum_of<-function(type, code, prefix){ - i<-type$value(name=paste(prefix, code, sep='_'))$number() + i<-type$value(name=paste(prefix, code, sep='_'))$number() + return (i) } #' @export @@ -312,7 +313,6 @@ NULL #' @rdname jd3_utilities .r2p_outliers<-function(r){ if (length(r) == 0){return (list())} - l<-list() return (lapply(r, function(z){.r2p_outlier(z)})) } diff --git a/R/regarima_generic.R b/R/regarima_generic.R index 98b9270..4a01f93 100644 --- a/R/regarima_generic.R +++ b/R/regarima_generic.R @@ -7,14 +7,14 @@ coef.JD3_REGARIMA_RSLTS <- function(object, component = c("regression", "arima", component <- match.arg(component) if (component == "regression") { - coefs = .regarima_coef_table(object) + coefs <- .regarima_coef_table(object) } else if (component == "arima") { - coefs = .sarima_coef_table(object)$coef_table + coefs <- .sarima_coef_table(object)$coef_table } else{ - coefs = rbind(.sarima_coef_table(object)$coef_table[,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 } diff --git a/R/regarima_rslts.R b/R/regarima_rslts.R index 89e8e30..68954a7 100644 --- a/R/regarima_rslts.R +++ b/R/regarima_rslts.R @@ -38,4 +38,5 @@ NULL 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_regarima.R b/R/spec_regarima.R index f7b0aab..b56a989 100644 --- a/R/spec_regarima.R +++ b/R/spec_regarima.R @@ -41,7 +41,7 @@ add_outlier.default <- function(x, date, name = sprintf("%s (%s)", type, date), coef = 0){ - type = match.arg(toupper(type), + type <- match.arg(toupper(type), choices = c("AO", "TC", "LS", "SO"), several.ok = TRUE) # data.frame to recycle arguments @@ -56,7 +56,7 @@ add_outlier.default <- function(x, names(new_out) <- NULL x$regression$outliers <- c(x$regression$outliers, new_out) - all_out = t(simplify2array(x$regression$outliers)[c("pos","code"),]) + 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") @@ -98,30 +98,30 @@ remove_outlier.default <- function(x, 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), + type <- match.arg(toupper(type), 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 = "") - rm_out_id = rbind(type = type, date = date, name = 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 = "") + rm_out_id <- apply(rm_out_id,2, paste0, collapse = "") - remove_out = out_id %in% rm_out_id + 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$regression["outliers"] <- list(NULL) } x } @@ -152,7 +152,7 @@ add_ramp.default <- function(x, names(new_ramp) <- NULL x$regression$ramps <- c(x$regression$ramps, new_ramp) - all_out = t(simplify2array(x$regression$ramps)[c("start", "end"),]) + 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") @@ -162,7 +162,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)) + res <- list(name=name, start=start, end=end, coef = .fixed_parameter(coef)) return (res) } #' @rdname add_outlier @@ -180,26 +180,26 @@ remove_ramp.default <- function(x, 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 = "") - rm_rp_id = rbind(start = start, end = end, name = 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 = "") + rm_rp_id <- apply(rm_rp_id,2, paste0, collapse = "") - remove_rp = rp_id %in% rm_rp_id + 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$regression["ramps"] <- list(NULL) } x } @@ -282,10 +282,10 @@ set_basic.default <- function(x, type = type, d0 = d0, d1 = d1, n0 = n0, n1 = n1) - if(!missing(preprocessing) & !is.na(preprocessing) & !is_tramo){ + 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 @@ -356,14 +356,14 @@ set_estimate.default <- function(x, type = type, d0 = d0, d1 = d1, n0 = n0, n1 = n1) - if (!missing(tol) & !is.na(tol)) { + if (!missing(tol) && !is.na(tol)) { estimate$tol <- tol } # TRAMO-SEATS SPECIFIC - if (!missing(exact.ml) & !is.na(exact.ml) & is_tramo) { + 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) { + if (!missing(unit.root.limit) && !is.na(unit.root.limit) && is_tramo) { estimate$ubp <- unit.root.limit } # END TRAMO-SEATS SPECIFIC @@ -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) || any(is.na(critical.value))){ critical.value <- outlier[[va_name]] }else{ outlier[[va_name]] <- critical.value[1] @@ -498,7 +498,7 @@ set_outlier.default <- function(x, } if (is_tramo) { # TRAMO SPECIFIC PARAMETERS - if (!is.na(eml.est) & is_tramo) { + if (!is.na(eml.est) && is_tramo) { outlier$ml <- eml.est } } else { @@ -635,7 +635,7 @@ set_automodel.default <- function(x, 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 } @@ -657,7 +657,7 @@ set_automodel.default <- function(x, 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 } @@ -666,7 +666,7 @@ set_automodel.default <- function(x, } if (is_tramo) { # TRAMO SPECIFIC - if(!is.na(amicompare) & is.logical(amicompare)){ + if(!is.na(amicompare) && is.logical(amicompare)){ automodel$amicompare <- amicompare } } else { @@ -674,13 +674,13 @@ set_automodel.default <- function(x, 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 } } @@ -1074,7 +1074,7 @@ set_tradingdays.default <- function(x, test) } } - if(!missing(automatic) & !any(is.na(automatic))){ + if(!missing(automatic) && !any(is.na(automatic))){ if (is_tramo) { automatic <- match.arg(toupper(automatic)[1], choices = c("UNUSED", "FTEST", "WALDTEST", "AIC", "BIC")) @@ -1096,7 +1096,7 @@ set_tradingdays.default <- function(x, } if (is_tramo) { - if(!missing(pftd) & !any(is.na(pftd))){ + if(!missing(pftd) && !any(is.na(pftd))){ td$ptest <- pftd } } @@ -1104,7 +1104,7 @@ set_tradingdays.default <- function(x, if (!is.null(leapyear) && !any(is.na(leapyear))) { leapyear <- match.arg(toupper(leapyear), choices = c("LEAPYEAR", "LENGTHOFPERIOD", "NONE")) - if (leapyear != "LENGTHOFPERIOD" || (leapyear == "LENGTHOFPERIOD" & !is_tramo)) { + if (leapyear != "LENGTHOFPERIOD" || (leapyear == "LENGTHOFPERIOD" && !is_tramo)) { # LENGTHOFPERIOD not available on TRAMO td$lp <- leapyear } @@ -1131,13 +1131,13 @@ set_tradingdays.default <- function(x, if (length(coef) == 1){ coef <- rep(coef, ntd) } - tdcoefficients = data.frame(value = coef, + 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")) { + if (td$test != "NO" && any(coef.type == "FIXED")) { warning("You must set the test parameter to NONE to specify coef") } @@ -1154,7 +1154,7 @@ set_tradingdays.default <- function(x, } td$lpcoefficient$value <- leapyear.coef td$lpcoefficient$type <- leapyear.coef.type - if (td$test != "NO"& any(coef.type == "FIXED")) { + if (td$test != "NO" && any(coef.type == "FIXED")) { warning("You must set the test parameter to NONE to specify leapyear.coef") } } @@ -1510,7 +1510,7 @@ set_span <- function(x, x$n0 <- x$n1 <- 0 } } else if (type=="BETWEEN"){ - if(is.na(d0) | is.na(d1)){ + if(is.na(d0) || is.na(d1)){ warning("d0 and d1 parameters must be defined") }else{ x$type <- type @@ -1537,7 +1537,7 @@ set_span <- function(x, x$n1 <- n1 } } else if (type=="EXCLUDING"){ - if(is.na(n0) | is.na(n1)){ + if(is.na(n0) || is.na(n1)){ warning("n0 and n1 parameters must be defined") }else{ x$type <- type diff --git a/R/tests_seasonality.R b/R/tests_seasonality.R index 40bdbbc..dfa08b9 100644 --- a/R/tests_seasonality.R +++ b/R/tests_seasonality.R @@ -19,7 +19,7 @@ NULL #' seasonality_qs(ABS$X0.2.09.10.M, 12) #' seasonality_qs(random_t(2, 1000), 7) seasonality_qs<-function(data, period, nyears=0){ - if (is.ts(data) & missing(period)) + 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)) @@ -39,7 +39,7 @@ seasonality_qs<-function(data, period, nyears=0){ #' seasonality_kruskalwallis(ABS$X0.2.09.10.M, 12) #' seasonality_kruskalwallis(random_t(2, 1000), 7) seasonality_kruskalwallis<-function(data, period, nyears=0){ - if (is.ts(data) & missing(period)) + 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)) @@ -58,7 +58,7 @@ seasonality_kruskalwallis<-function(data, period, nyears=0){ #' seasonality_periodogram(ABS$X0.2.09.10.M, 12) #' seasonality_periodogram(random_t(2, 1000), 7) seasonality_periodogram<-function(data, period, nyears=0){ - if (is.ts(data) & missing(period)) + 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)) @@ -75,7 +75,7 @@ seasonality_periodogram<-function(data, period, nyears=0){ #' #' @examples seasonality_friedman<-function(data, period, nyears=0){ - if (is.ts(data) & missing(period)) + 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)) @@ -97,7 +97,7 @@ seasonality_f<-function(data, period, model=c("AR", "D1", "WN"), nyears=0){ - if (is.ts(data) & missing(period)) + 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", @@ -120,7 +120,7 @@ seasonality_f<-function(data, #' seasonality_combined(ABS$X0.2.09.10.M, 12) #' seasonality_combined(random_t(2, 1000), 7) seasonality_combined<-function(data, period, firstperiod=cycle(data)[1], mul=TRUE){ - if (is.ts(data) & missing(period)) + 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)) diff --git a/R/timeseries.R b/R/timeseries.R index b8ced89..26ff3bf 100644 --- a/R/timeseries.R +++ b/R/timeseries.R @@ -217,7 +217,7 @@ daysOf<-function(ts, pos=0){ #' #' @examples to_ts<-function(source, id, type="All"){ - jmoniker=.jcall("jdplus/toolkit/base/api/timeseries/TsMoniker", "Ljdplus/toolkit/base/api/timeseries/TsMoniker;", "of", source, id) + 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) @@ -235,7 +235,7 @@ 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) + 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) @@ -278,7 +278,7 @@ data_to_ts<-function(s, name){ #' @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) + 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) } diff --git a/R/utils.R b/R/utils.R index 2827cc9..d9ed8d9 100644 --- a/R/utils.R +++ b/R/utils.R @@ -48,7 +48,7 @@ NULL test_anova<-function(ssm, dfm, ssr, dfr){ val<-(ssm/dfm)*(dfr/ssr) - desc=paste0("F(",dfm,",",dfr,")") + desc<-paste0("F(",dfm,",",dfr,")") pval<-1-pf(val, dfm, dfr) return (statisticaltest(val, pval, desc)) } @@ -72,8 +72,8 @@ 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<-obs + if (is.na(adjustedll)) adjustedll<-ll return (structure(list(nobs=nobs, neffectiveobs=neffectiveobs, nparams=nparams, ll=ll, adjustedll=adjustedll, diff --git a/R/variables.R b/R/variables.R index 9ac8b98..6d99b8c 100644 --- a/R/variables.R +++ b/R/variables.R @@ -23,9 +23,9 @@ 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) @@ -36,9 +36,9 @@ easter_variable<-function(frequency, start, length, s, duration=6, endpos=-1, #' @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) + 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)) @@ -67,9 +67,9 @@ lp_variable<-function(frequency, start, length, s, type=c("LeapYear", "LengthOfP 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)) @@ -114,9 +114,9 @@ lp_variable<-function(frequency, start, length, s, type=c("LeapYear", "LengthOfP #' @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) + 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)){ @@ -130,9 +130,9 @@ ao_variable<-function(frequency, start, length, s, pos, date=NULL){ #' @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) + 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)){ @@ -147,9 +147,9 @@ tc_variable<-function(frequency, start, length, s, pos, date=NULL, rate=0.7){ #' @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) + 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)){ @@ -164,9 +164,9 @@ ls_variable<-function(frequency, start, length, s, pos, date=NULL, zeroended=TRU #' @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) + 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)){ @@ -204,9 +204,9 @@ so_variable<-function(frequency, start, length, s, pos, date=NULL, zeroended=TRU #' 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) + 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") @@ -268,9 +268,9 @@ 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) + frequency<-stats::frequency(s) + start<-stats::start(s) + length<-.length_ts(s) } if (length(starts) != length(ends)) stop("Invalid spans in intervention variable") @@ -307,9 +307,9 @@ intervention_variable<-function(frequency, start, length, s, starts, ends, delta #'@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) @@ -320,9 +320,9 @@ periodic.dummies <-function(frequency, start, length, s){ #'@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) @@ -377,9 +377,9 @@ periodic.contrasts <-function(frequency, start, length, s){ 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) + frequency<-stats::frequency(s) + start<-stats::start(s) + length<-.length_ts(s) } jdom <- .r2jd_tsdomain(frequency, start[1], start[2], length) diff --git a/R/zzz.R b/R/zzz.R index db01781..e98f9ff 100644 --- a/R/zzz.R +++ b/R/zzz.R @@ -16,7 +16,6 @@ NULL .onLoad <- function(libname, pkgname) { - result <- .jpackage(pkgname, lib.loc=libname) if (!result) stop("Loading java packages failed") From a9abe5fe3f5af8af31fa4ebadc76a34e87622a53 Mon Sep 17 00:00:00 2001 From: palatej Date: Fri, 19 Apr 2024 08:42:01 +0200 Subject: [PATCH 2/2] Bug in protobuf transfer of SA decomposition with backcasts --- ...dplus-sa-base-protobuf-3.2.3-SNAPSHOT.jar} | Bin 95416 -> 95813 bytes 1 file changed, 0 insertions(+), 0 deletions(-) rename inst/java/{jdplus-sa-base-protobuf-3.2.2.jar => jdplus-sa-base-protobuf-3.2.3-SNAPSHOT.jar} (84%) diff --git a/inst/java/jdplus-sa-base-protobuf-3.2.2.jar b/inst/java/jdplus-sa-base-protobuf-3.2.3-SNAPSHOT.jar similarity index 84% rename from inst/java/jdplus-sa-base-protobuf-3.2.2.jar rename to inst/java/jdplus-sa-base-protobuf-3.2.3-SNAPSHOT.jar index 4c799067ebbcb25a98fd9d030ea2b9461dcb7a44..7fedf2c5b904a79ad1aa07fb81f7528025d45749 100644 GIT binary patch delta 10030 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