From 742b4a08af5e8dabd95fa7de627a34eb66965666 Mon Sep 17 00:00:00 2001 From: yvesdeville Date: Tue, 28 Jan 2025 16:07:24 +0100 Subject: [PATCH 1/9] influence method --- NAMESPACE | 10 ++ R/TVGEV.R | 8 +- R/influenceTVGEV.R | 279 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 295 insertions(+), 2 deletions(-) create mode 100644 R/influenceTVGEV.R diff --git a/NAMESPACE b/NAMESPACE index fefb816..5ce6f5e 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -13,6 +13,7 @@ S3method(autolayer,quantMax.TVGEV) S3method(autoplot,TVGEV) S3method(autoplot,bfts) S3method(autoplot,bts) +S3method(autoplot,influence.TVGEV) S3method(autoplot,predict.TVGEV) S3method(autoplot,quantMax.TVGEV) S3method(autoplot,resid.TVGEV) @@ -24,6 +25,7 @@ S3method(coef,TVGEV) S3method(confint,TVGEV) S3method(density,NSGEV) S3method(density,TVGEV) +S3method(influence,TVGEV) S3method(lines,bts) S3method(logLik,TVGEV) S3method(mean,TVGEV) @@ -34,6 +36,7 @@ S3method(plot,NSGEV) S3method(plot,TVGEV) S3method(plot,bfts) S3method(plot,bts) +S3method(plot,influence.TVGEV) S3method(plot,predict.TVGEV) S3method(plot,resid.TVGEV) S3method(predict,NSGEV) @@ -41,6 +44,7 @@ S3method(predict,TVGEV) S3method(print,NSGEV) S3method(print,TVGEV) S3method(print,bts) +S3method(print,influence.TVGEV) S3method(print,profLik.TVGEV) S3method(print,summary.NSGEV) S3method(print,summary.TVGEV) @@ -106,13 +110,18 @@ import(numDeriv) import(splines) importFrom(forecast,autolayer) importFrom(forecast,autoplot) +importFrom(grDevices,adjustcolor) importFrom(grDevices,col2rgb) +importFrom(grDevices,palette) importFrom(graphics,abline) +importFrom(graphics,grid) +importFrom(graphics,legend) importFrom(graphics,lines) importFrom(graphics,matlines) importFrom(graphics,matplot) importFrom(graphics,mtext) importFrom(graphics,par) +importFrom(graphics,rug) importFrom(graphics,text) importFrom(methods,is) importFrom(nieve,dGEV) @@ -130,6 +139,7 @@ importFrom(stats,confint) importFrom(stats,density) importFrom(stats,deriv) importFrom(stats,df) +importFrom(stats,influence) importFrom(stats,lm) importFrom(stats,logLik) importFrom(stats,model.frame) diff --git a/R/TVGEV.R b/R/TVGEV.R index 5b509f1..eec64e3 100644 --- a/R/TVGEV.R +++ b/R/TVGEV.R @@ -988,11 +988,15 @@ TVGEV <- function(data, tv[["design"]] <- mc[["design"]] + allVars <- union(union(all.vars(loc), all.vars(scale)), + all.vars(shape)) + if (!is.null(tv$design)) { if (is.call(tv$design)) { dfAll <- as.data.frame(eval(tv$design, envir = data)) - dfAll <- data.frame(data[ , response], dfAll) - colnames(dfAll) <- c(response, colnames(dfAll)[-1]) + ## dfAll <- data.frame(data[ , response], dfAll) + dfAll <- data.frame(data, dfAll) + ## colnames(dfAll) <- c(response, colnames(dfAll)[-1]) } else { dfAll <- tv$design } diff --git a/R/influenceTVGEV.R b/R/influenceTVGEV.R new file mode 100644 index 0000000..77f6c1c --- /dev/null +++ b/R/influenceTVGEV.R @@ -0,0 +1,279 @@ +##' This function provides some indications on the influence of a +##' specific observation used in the fit of a \code{TVGEV} object. For +##' several candidate values of the chosen observation, a \code{TVGEV} +##' is re-fitted with the observed value replaced by the candidate +##' value, and the quantity of interest as defined by \code{what} is +##' computed. +##' +##' By suitably defining the function \code{what}, one can trace e.g., +##' the estimate of a quantile with given probability, the +##' corresponding upper confidence limit, the upper end-point of the +##' distribution, ... and more. +##' +##' @title Diagnostic of Influence for \code{TVGEV} Objects +##' +##' @param model A \code{TVGEV} object. +##' +##' @param what A function with one argument \code{object} defining or +##' extracting the (numeric) quantity for which the influence is +##' to be analysed. So, \code{object} must be a \code{TVGEV} +##' object. See \bold{Examples}. This function can return numeric +##' vector in which case several influence curves will be +##' computed. It is then wise to make the function return a vector +##' with named elements. +##' +##' @param which Identifies the observation which influence will be +##' analysed. Can be: an integer giving the observation, the +##' character \code{"min"}, the character{"max"}, a character that +##' can be coerced to a date, or an object with class +##' \code{"Date"} that identifies the observation. This argument +##' must define an observation existing in the data frame used to +##' create the object. So it can not be used e.g. to define a +##' future date. +##' +##' @param how Character specifying the type of (finite-sample) +##' influence curve to use. For now only the only possibility is +##' \code{"replace"}, see Section 2.1 of the book by Hampel et al +##' (1996). The chosen observation is replaced by a value \eqn{x} +##' and the quantity of interest is computed for each value of +##' \eqn{x}. +##' +##' @param ... Not used. +##' +##' @return A named list of vectors. The element \code{obsValue} +##' contains the candidate values for the chosen observation and +##' \code{statValue} contains the corresponding values of the +##' specific statistic defined with \code{what}. +##' +##' @note For \code{TVGEV} models with a positive GEV shape, the +##' smallest observation may have a strong influence on the +##' result, even if the model is stationary. +##' +##' @importFrom stats influence +##' @export +##' @method influence TVGEV +##' +##' @references +##' +##' Hampel, F.R., Ronchetti, E.M., Rousseeuw, P.J. and Stahel +##' W.A. (1996) \emph{Robust Statistics: The Approach Based on +##' Influence Functions}. Wiley. +##' +##' @examples +##' example(TVGEV) +##' influ <- influence(res2, which = "min") +##' autoplot(influ) +##' influ <- influence(res2, which = as.Date("2015-01-01")) +##' autoplot(influ) +##' RL_2050 <- function(model) { +##' c("RL_2050(100)" = quantile(model, prob = 0.99, date = "2050-01-01")[1]) +##' } +##' influence(res2, what = RL_2050) |> autoplot() +##' influence(res2, what = RL_2050, which = "2003-01-01") |> autoplot() +##' RLs_2050 <- function(model) { +##' res <- c(quantile(model, prob = 0.99, date = "2050-01-01")[1], +##' quantile(model, prob = 0.999, date = "2050-01-01")[1]) +##' names(res) <- paste0("RL", c(100, 1000)) +##' res +##' } +##' influ <- influence(res2, what = RLs_2050, which = "2003-01-01") +##' autoplot(influ) +influence.TVGEV <- function(model, + what = function(model) coef(model)["xi_0"], + which = "min", + how = "replace", + ...) { + + y <- model$data[ , model$response] + Date <- model$data[ , model$date] + n <- model$n + ind <- (1:n)[!is.na(y)] + if (is.numeric(which)) { + if (abs(which - round(which)) > 0.01 || which < 1 || which > n) { + stop("When 'which' is numeric, it must be an integer between ", + "1 and `nobs(model)`") + } + } else if (is.character(which)) { + if (which == "min") { + ii <- which.min(y[ind]) + which <- ind[ii] + } else if (which == "max") { + ii <- which.max(y[ind]) + which <- ind[ii] + } else { + which <- as.Date(which) + which <- (1:n)[Date == which] + } + } else if (inherits(which, "Date")) { + which <- (1:n)[Date == which] + } + + rr <- range(y, na.rm = TRUE) + rr <- rr + c(-0.1, 0.1) * diff(rr) + + yGrid <- seq(from = rr[1], to = rr[2], length = 30) + yGrid <- c(yGrid, y[which]) + res0 <- do.call(what, list(model = model)) + nres <- length(res0) + nms <- names(res0) + res <- matrix(NA_real_, nrow = length(yGrid), ncol = nres) + names(res) <- nms + + for (iy in seq_along(yGrid)) { + .df <- model$data + .df[which, model$response] <- yGrid[iy] + calli <- model$call + calli[["data"]] <- .df + tr <- try(fiti <- eval(calli)) + resi <- do.call(what, list(model = fiti)) + res[iy, ] <- resi + } + + if (nres == 1) res <- as.vector(res) + + res <- list(obsValue = yGrid, + statValue = res, + which = which, + what = what, + date = Date, + y = y, + names = nms) + + class(res) <- "influence.TVGEV" + res + +} + +##' @method print influence.TVGEV +##' @export +##' +print.influence.TVGEV <- function(x, ...) { + cat("Finite-sample influence function\n") + cat(sprintf("Observation number: %d (%s)\n", + x$which, x$date[x$which])) + cat(sprintf("what: %s\n", paste(x$names, collapse = ", "))) +} + +##' +##' @title Plot Method for \code{influence.TVGEV} Object +##' +##' @param x A \code{TVGEV} object. +##' +##' @param y Not used. +##' +##' @param ... Not used. +##' +##' @return Nothing. +##' +##' @note This method \code{autoplot} +##' +##' @seealso \code{\link{autoplot.TVGEV}}. +##' +##' @importFrom grDevices palette adjustcolor +##' @importFrom graphics matplot grid rug legend +##' @export +##' @method plot influence.TVGEV +##' +plot.influence.TVGEV <- function(x, y = NULL, ...) { + Pch <- c(16, 18, 21, 24, 22) + nc <- ifelse(is.matrix(sv <- x$statValue), ncol(sv), 1) + warning("Consider using the `autoplot` method instead") + grDevices::palette("Tableau") + matplot(x$obsValue, x$statValue, + pch = Pch[1:nc], + main = sprintf("Influence of obs. number %d, (%s)", + x$which, format(x$date[x$which])), + xlab = "obs. candidate value", ylab = "stat. value") + grid() + abline(v = x$y[x$which], + col = grDevices::adjustcolor( "gray", alpha.f = 0.7)) + rug(x$y) + legend("topleft", + pch = Pch[1:nc], + col = 1:nc, + legend = x$names) + grDevices::palette("default") +} + + +##' The influence curve is obtained by replacing the chosen +##' observation by a candidate value and then re-fitting the same +##' model and computing the statistic of interest: coefficient +##' estimate, quantile, ... The rug shows the \eqn{y_b} and the +##' vertical line shows the observation chosen for the analysis. +##' +##' @title Create a \code{ggplot} for a \code{influence.TVGEV} Object +##' +##' @param object An object with class \code{"influence.TVGEV"} as +##' created bye the \code{influnce} method for the \code{"TVGEV"} +##' class. +##' +##' @param ... Not used yet. +##' +##' @return An object inheriting grom \code{"ggplot"} showing the +##' (finite-sample) influence function for the observation and the +##' statistic that have been chosen. +##' +##' @export +##' @method autoplot influence.TVGEV +##' +##' @examples +##' library(ismev) +##' data(venice) +##' df <- data.frame(Date = as.Date(paste0(venice[ , "Year"], "-01-01")), +##' Sealevel = venice[ , "r1"] / 100) +##' fit0 <- TVGEV(data = df, date = "Date", response = "Sealevel") +##' autoplot(fit0) +##' RL_2050 <- function(model) { +##' c("RL_2050(100)" = quantile(model, prob = 0.99, date = "2050-01-01")[1]) +##' } +##' autoplot(fit0) +##' influence(fit0, what = RL_2050) |> autoplot() +##' ## fit with a linear time trend +##' fit1 <- TVGEV(data = df, date = "Date", response = "Sealevel", +##' design = polynomX(Date, degree = 1), loc = ~t1) +##' autoplot(fit1) +##' summary(fit1) +##' influence(fit1) |> autoplot() +##' influence(fit1, what = RL_2050) |> autoplot() +##' influence(fit1, which = "max", what = RL_2050) |> autoplot() +##' ## Influence curve for the estimated slope +##' slope <- function(model) { +##' c("slope\n(cm/100 yr)" = 100 * unname(coef(model)["mu_t1"])) +##' } +##' influence(fit1, which = "max", what = slope) |> autoplot() +##' influence(fit1, which = "min", what = slope) |> autoplot() +autoplot.influence.TVGEV <- function(object, ...) { + + obsValue <- statValue <- name <- y <- NULL + + if (is.matrix(m <- object$statValue) && ncol(m) > 1) { + df <- list() + for (j in 1:ncol(object$statValue)) { + df[[j]] <- data.frame(obsValue = object$obsValue, + statValue = object$statValue[ , j], + name = object$names[j]) + } + df <- data.table::rbindlist(df) + } else { + df <- data.frame(obsValue = object$obsValue, + statValue = object$statValue, + name = object$names) + } + g <- ggplot(data = df) + + geom_point(mapping = aes(x = obsValue, + y = statValue, + group = name, + colour = name, + shape = name), size = 1.5) + + xlab("obs. value") + ylab("stat. value") + + geom_vline(xintercept = object$y[object$which], + colour = adjustcolor( "gray", alpha.f = 0.9)) + + ggtitle(sprintf("Influence curve of obs. number %d, (%s)", + object$which, format(object$date[object$which]))) + + geom_rug(data = data.frame(y = object$y), mapping = aes(x = y)) + + labs(colour = "stat.", shape = "stat.") + + scale_colour_manual(values = c("orangered", "springgreen3", "steelblue3")) + g + +} From 0344a683c681492f72e4cc89435953103afafafa Mon Sep 17 00:00:00 2001 From: yvesdeville Date: Mon, 9 Jun 2025 15:20:40 +0200 Subject: [PATCH 2/9] TS covariables --- DESCRIPTION | 2 +- NAMESPACE | 1 + NEWS.md | 8 ++ R/TVGEV.R | 147 ++++++++++++++++++++------ R/influenceTVGEV.R | 12 +-- R/miscUtils.R | 83 +++++++++++++++ R/predictTVGEV.R | 181 +++++++++++++++++++++----------- R/predictUncond.R | 6 +- R/statsTVGEV.R | 102 +++++++++++------- TODO.md | 11 +- man/autoplot.influence.TVGEV.Rd | 54 ++++++++++ man/checkNewdata.TVGEV.Rd | 28 +++++ man/influence.TVGEV.Rd | 93 ++++++++++++++++ man/plot.influence.TVGEV.Rd | 27 +++++ man/predict.TVGEV.Rd | 2 +- man/psi2theta.TVGEV.Rd | 32 +++--- 16 files changed, 631 insertions(+), 158 deletions(-) create mode 100644 man/autoplot.influence.TVGEV.Rd create mode 100644 man/checkNewdata.TVGEV.Rd create mode 100644 man/influence.TVGEV.Rd create mode 100644 man/plot.influence.TVGEV.Rd diff --git a/DESCRIPTION b/DESCRIPTION index e7a19ec..9b2240a 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -2,7 +2,7 @@ Package: NSGEV Type: Package Title: Non-Stationary GEV Time Series Version: 0.2.0 -Date: 2024-12-02 +Date: 2025-06-09 Authors@R: c(person(given = "Yves", family = "Deville", diff --git a/NAMESPACE b/NAMESPACE index 5ce6f5e..abc4d7e 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -103,6 +103,7 @@ export(selectDate) export(testNumDeriv) export(transFormula) import("extRemes", except = c("qqplot", "qqnorm")) +import(data.table) import(ggplot2) import(ismev) import(nloptr) diff --git a/NEWS.md b/NEWS.md index 4875924..1e1d033 100644 --- a/NEWS.md +++ b/NEWS.md @@ -2,6 +2,14 @@ **NSGEV** Package News ====================== +# New in version 0.3.0 + +## Enhancements + +- Experimental changes on `TVGEV` to allow the use of Time Series + covariates along with functions of time. CAUTION This may have + created bugs!!! + # New in version 0.2.0 ## Enhancements diff --git a/R/TVGEV.R b/R/TVGEV.R index eec64e3..6adc6a7 100644 --- a/R/TVGEV.R +++ b/R/TVGEV.R @@ -1,41 +1,47 @@ ##***************************************************************************** -##' Compute the GEV parameters for the marginal distributions of a -##' \code{TVGEV} model. +##' @description Compute the GEV parameters for the marginal +##' distributions of a \code{TVGEV} model. ##' ##' @title Compute the Matrix of GEV Parameters from the Vector of -##' Model Parameters 'psi' and the Data +##' Model Parameters 'psi' and the Data ##' ##' @param model The \code{TVGEV} object. ##' ##' @param psi A vector of parameters for \code{model}. By default the -##' vector of estimates in \code{psi} will be used. +##' vector of estimates in \code{psi} will be used. ##' ##' @param date A vector that can be coerced to the \code{"Date"} -##' class. Each element will correspond to a row of the matrix of GEV -##' parameters. +##' class. Each element will correspond to a row of the matrix of +##' GEV parameters. If \code{model} contains TS covariables, this +##' must instead be a data frame containing the suitable +##' covariables, along with a column with name \code{model$name} +##' and class \code{Date}. Id \code{date} is \code{NULL}, the date +##' and possibly the TS covariables are extracted from +##' \code{model} and correspond to the information used in the +##' fit. ##' ##' @param deriv Logical. If \code{TRUE} the returned object has an -##' attribute names \code{"gradient"} which is the gradient -##' array. +##' attribute names \code{"gradient"} which is the gradient array. ##' ##' @param checkNames Logical. If \code{TRUE} it will be checked that -##' the names of \code{psi} match the \code{parNames} element of -##' \code{model}. +##' the names of \code{psi} match the \code{parNames} element of +##' \code{model}. ##' ##' @param \dots Not used yet. ##' -##' @return A matrix with \code{length(date)} rows and \code{3} colums. -##' The columns contain the location, the scale and the shape GEV parameters -##' in that order. +##' @return A matrix with \code{length(date)} rows and \code{3} +##' colums. The columns contain the location, the scale and the +##' shape GEV parameters in that order. ##' ##' @seealso The \code{\link{GEV}} for the GEV probability functions. ##' ##' @note The \code{deriv} formal argument is mainly here to maintain -##' a compatibility with the \code{NSGEV} method. However, the -##' derivatives w.r.t. the parameter vector \code{psi} are obtained -##' simply by using the \code{X} elements of the object \code{model}. +##' a compatibility with the \code{NSGEV} method. However, the +##' derivatives w.r.t. the parameter vector \code{psi} are +##' obtained simply by using the \code{X} elements of the object +##' \code{model}. ##' ##' @method psi2theta TVGEV ##' @@ -58,23 +64,33 @@ psi2theta.TVGEV <- function(model, psi = NULL, date = NULL, stop("'psi' must have named elements with ", "the names 'parNames(model)'") } - } else { - names(psi) <- model$parNames - } - - ## is date is NULL, we use the design matrices in the model + } else names(psi) <- model$parNames + + ## ======================================================================== + ## is 'date' is 'NULL', we use the design matrices in the model + ## ======================================================================== + if (is.null(date)) { X <- model$X n <- model$n ind <- model$ind fDate <- model$fDate } else { - n <- length(date) + date <- as.data.frame(date) + if (ncol(date) == 1) { + names(date) <- model$date + } else if (is.null(date[[model$date]])) { + stop("one must pass a data frame ", + "with a '", model$date, "'column to the 'modelMatrices'", + "function.") + } + n <- nrow(date) + fDate <- format(date[[model$date]]) + if (!all(model$isCst)) { L <- modelMatrices.TVGEV(model, date = date) X <- L$X } else X <- NULL - fDate <- format(date) } theta <- array(NA, dim = c(n, 3L), @@ -733,16 +749,27 @@ bs.TVGEV <- function(object, ##' modelMatrices.TVGEV <- function(object, date = NULL, ...) { - if (is.null(date)) { return(list(dfAll = object$dfAll, X = object$X)) } trm <- object$terms - date <- as.Date(date) - data <- data.frame(date) - colnames(data) <- object$date - parNames.GEV <- c("loc", "scale", "shape") + if (length(object$TSVars) == 0) { + ## One column data frame + data <- data.frame(date) + colnames(data) <- object$date + data[[object$date]] <- as.Date(data[[object$date]]) + } else { + data <- as.data.frame(date) + date <- data[[object$date]] + if (is.null(data[[object$date]])) { + stop("'model' uses TSVars hence one must pass a data frame ", + "with a '", object$date, "'column to the 'modelMatrices'", + "function.") + } + } + parNames.GEV <- c("loc", "scale", "shape") + ## Caution: here, 'dfAll' does not embed the response if (!is.null(object$design)) { if (is.call(object$design)) { @@ -750,10 +777,13 @@ modelMatrices.TVGEV <- function(object, date = NULL, ...) { } else { dfAll <- object$design } - } else dfAll <- object$data + dfAll[[object$date]] <- NULL + dfAll <- data.frame(data, dfAll) + } else dfAll <- data fDate <- format(date) - rownames(dfAll) <- fDate + ## XXX + ## rownames(dfAll) <- fDate X <- list() @@ -763,7 +793,10 @@ modelMatrices.TVGEV <- function(object, date = NULL, ...) { mf <- model.frame(trm[[nm]], dfAll, na.action = na.pass) X[[nm]] <- model.matrix(trm[[nm]], mf) ## X[[nm]] <- model.matrix(object$terms[[nm]], data = dfAll) - rownames(X[[nm]]) <- fDate + ## XXX + if (length(object$TSVars == 0)) { + rownames(X[[nm]]) <- fDate + } } list(dfAll = dfAll, X = X) @@ -984,24 +1017,68 @@ TVGEV <- function(data, ## ======================================================================= ## Build a data frame 'dfAll' containing ALL the required variables. + ## + ## - 'desVars' contains the "design variables" that are functions of the + ## date coming from the design e.g. 't1' + ## + ## - 'TSVars' constains the variables that are not design + ## variables, that are not the Date or the Response and appear + ## in `allVars`. + ## ## ======================================================================= tv[["design"]] <- mc[["design"]] - allVars <- union(union(all.vars(loc), all.vars(scale)), - all.vars(shape)) + allVars <- union(union(all.vars(loc), all.vars(scale)), all.vars(shape)) + desVars <- setdiff(allVars, names(data)) if (!is.null(tv$design)) { if (is.call(tv$design)) { dfAll <- as.data.frame(eval(tv$design, envir = data)) ## dfAll <- data.frame(data[ , response], dfAll) - dfAll <- data.frame(data, dfAll) ## colnames(dfAll) <- c(response, colnames(dfAll)[-1]) } else { dfAll <- tv$design } - } else dfAll <- tv$data + notFound <- setdiff(desVars, names(dfAll)) + if (length(notFound)) { + notFound <- paste(paste0("'", notFound, "'"), collapse = ", ") + stop("Required variables not in 'data' nor in the design: ", + notFound) + } + ## avoid the duplication of the date column. + dfAll[[date]] <- NULL + dup <- intersect(names(dfAll), names(data)) + if (any(dup)) { + dup <- paste(paste0("'", dup, "'"), collapse = ", ") + stop("Variable names both in design and data: ", + dup) + } + dfAll <- data.frame(data, dfAll) + } else { + dfAll <- tv$data + notFound <- setdiff(allVars, names(dfAll)) + if (length(notFound)) { + notFound <- paste(paste0("'", notFound, "'"), collapse = ", ") + stop("Required variables not in 'data' nor in the design: ", + notFound) + } + } + tv$TSVars <- setdiff(allVars, union(union(date, response), desVars)) + if (trace > 1) { + cat("o Analysis of formulas\n") + cat(" - All Variables: ", + paste(paste0("'", allVars, "'"), collapse = ", "), + "\n") + cat(" - Design Variables: ", + paste(paste0("'", desVars, "'"), collapse = ", "), + "\n") + cat(" - TS Covariates: ", + paste(paste0("'", tv$TSVars, "'"), collapse = ", "), + "\n") + } + tv$fDate <- format(data[ , date]) rownames(dfAll) <- tv$fDate diff --git a/R/influenceTVGEV.R b/R/influenceTVGEV.R index 77f6c1c..44e527d 100644 --- a/R/influenceTVGEV.R +++ b/R/influenceTVGEV.R @@ -24,12 +24,12 @@ ##' ##' @param which Identifies the observation which influence will be ##' analysed. Can be: an integer giving the observation, the -##' character \code{"min"}, the character{"max"}, a character that -##' can be coerced to a date, or an object with class -##' \code{"Date"} that identifies the observation. This argument -##' must define an observation existing in the data frame used to -##' create the object. So it can not be used e.g. to define a -##' future date. +##' character \code{"min"}, the character \code{"max"}, a +##' character that can be coerced to a date, or an object with +##' class \code{"Date"} that identifies the observation. This +##' argument must define an observation existing in the data frame +##' used to create the object. So it can not be used e.g. to +##' define a future date. ##' ##' @param how Character specifying the type of (finite-sample) ##' influence curve to use. For now only the only possibility is diff --git a/R/miscUtils.R b/R/miscUtils.R index 8c7ed3b..6e60426 100644 --- a/R/miscUtils.R +++ b/R/miscUtils.R @@ -308,3 +308,86 @@ testNumDeriv <- function(der, derNum, PREC = 0.05, (max(abs(der - derNum)) < small / PREC) || (max(abs(der - derNum) / (abs(der) + 1e-9)) < small / PREC) } + +##' +##' @title Check New Data for Prediction +##' +##' @param object A \code{TSGEV} object. +##' +##' @param newdata An atomic vector or a data frame providing the data +##' for a prediction. +##' +##' @param design Not used yet. +##' +##' @return A data frame with the variables required for prediction. +##' This must always contain a column with is name given by +##' \code{object$date} and with class \code{"Date"}. If +##' \code{object} contains \code{TSVars}, the corresponding +##' variables must be provided as well, but with no check on their +##' class. +##' +##' @keywords internal +##' +## @examples +## df <- within(TXMax_Dijon, Date <- as.Date(sprintf("%4d-01-01", Year))) +## fit <- TVGEV(data = df, response = "TXMax", date = "Date", +## design = breaksX(date = Date, breaks = "1970-01-01", degree = 1), +## loc = ~ t1 + t1_1970) +## try(checkNewdata.TVGEV(fit, data.frame(date = "2026-01-20"))) +## checkNewdata.TVGEV(fit, data.frame(Date = "2026-01-20")) +## +## \dontrun{ +## data(fremantle) +## df <- within(fremantle, Date <- as.Date(paste0(Year, "-01-01"))) +## fit <- TVGEV(data = df, response = "SeaLevel", date = "Date", +## design = polynomX(date = Date, degree = 1), +## loc = ~ t1 + SOI, trace = 2) +## try(checkNewdata.TVGEV(fit, data.frame(Date = "2026-01-20", x = 2))) +## checkNewdata.TVGEV(fit, data.frame(Date = "2026-01-20", SOI = 2.1)) +## } +## +checkNewdata.TVGEV <- function(object, newdata = NULL, design = FALSE) { + + + if (length(object$TSVars)) { + if (is.null(newdata)) { + newdata <- object$data + fDate <- object$fDate + } + newdata <- as.data.frame(newdata) + requiredVars <- c(object$date, object$TSVars) + notFound <- setdiff(requiredVars, names(newdata)) + if (length(notFound)) { + stop("Required variables not found: ", + paste(notFound, collapse = ", ")) + } + } else { + if (is.null(newdata)) { + newdata <- object$data[[object$date]] + fDate <- object$fDate + } + if (is.atomic(newdata)) { + newdata <- data.frame(as.Date(newdata)) + colnames(newdata) <- object$date + fDate <- format(newdata[[object$date]]) + } else { + newdata <- as.data.frame(newdata) + if (ncol(newdata) == 1) { + if (names(newdata) != object$date) + stop("Bad column name in 'newdata'.", + " Expecting '", object$date, "'.") + newdata[[object$date]] <- as.Date(newdata[[object$date]]) + } else { + if (is.na(m <- match(object$date, names(newdata)))) + stop("Bad column names in 'newdata'.", + " Expecting to find '", object$date, "'.") + newdata[[object$date]] <- as.Date(newdata[[object$date]]) + newdata <- newdata[, m, drop = FALSE] + } + fDate <- format(newdata[[object$date]]) + } + + } + + newdata +} diff --git a/R/predictTVGEV.R b/R/predictTVGEV.R index 96afd6c..4b0a680 100644 --- a/R/predictTVGEV.R +++ b/R/predictTVGEV.R @@ -47,7 +47,7 @@ ##' ##' @param trace Integer level of verbosity. ##' -##' @param ... Arguments to be passed to \code{bs}. +##' @param ... Arguments to be passed to the \code{bs} method. ##' ##' @return A data frame or an array with the RL and confidence limits ##' for each combination of \emph{date}, \emph{period} and @@ -78,6 +78,7 @@ ##' ##' @importFrom utils getS3method ##' @importFrom nieve qGEV +##' @import data.table ##' @importFrom reshape2 melt ##' @importFrom stats predict qnorm ##' @method predict TVGEV @@ -99,6 +100,8 @@ predict.TVGEV <- function(object, trace = 1L, ...) { + Date <- Period <- NULL ## Avoid 'NOTE' in `R CMD check` + dots <- match.call(expand.dots = FALSE)$... confintMethod <- match.arg(confintMethod) @@ -117,7 +120,6 @@ predict.TVGEV <- function(object, } } - if (!all(object$isCst)) { if (is.null(newdate)) { message("Since 'object' is really time-varying, the Return Levels\n", @@ -152,17 +154,19 @@ predict.TVGEV <- function(object, nLevel <- length(level) if (is.null(newdate)) { - newdate <- selectDate(object$data[ , object$date]) + if (length(object$TSVars) == 0) { + newdate <- selectDate(object$data[ , object$date]) + } else { + stop("Since `object` uses TSVars, a data frame must be given ", + "with the columns '", object$date, "' and ", + paste(paste0("'", object$TSVars, "'"), collapse = ", "), ".") + + } } - - ## OLD CODE working with else - ## X <- object$X - ## n <- object$n - ## ind <- object$ind - ## newdate <- object$data[ , object$date] - ## fDate <- object$fDate - - n <- length(newdate) + newdate <- as.data.frame(newdate) + names(newdate) <- object$date + ## newdate <- data.frame(Id = 1:nrow(newdate), newdate) + n <- nrow(newdate) ## special case for non TV model if (!all(object$isCst)) { @@ -170,7 +174,13 @@ predict.TVGEV <- function(object, X <- L$X } else X <- NULL - fDate <- format(newdate) + ## Attempt to make rownames. Not successful and maybe not useful... + fDate <- format(newdate[[object$date]]) + for (nm in object$TSVars) { + fDate <- paste0(fDate, ", nm = ", format(newdate[[nm]])) + } + ## ... so by-pass + fDate <- 1:n theta <- psi2theta(object, date = newdate, deriv = TRUE) @@ -186,7 +196,6 @@ predict.TVGEV <- function(object, scale = theta[ , 2], shape = theta[ , 3]) } - } else if (method == "delta") { @@ -398,7 +407,7 @@ predict.TVGEV <- function(object, theta <- psi2theta(model = object, psi = psi, - date = newdate[iDate], + date = newdate[iDate, ], deriv = TRUE, checkNames = FALSE) RL <- nieve::qGEV(prob, theta[ , 1], theta[ , 2], @@ -560,7 +569,8 @@ predict.TVGEV <- function(object, if (trace && (optNum > 1)) { cat(" \n") } - + + ## XXX remove 'try' resOpt <- try(nloptr::nloptr(x0 = psi0, eval_f = f, eval_g_ineq = g, @@ -655,48 +665,94 @@ predict.TVGEV <- function(object, if (out == "data.frame") { - if (requireNamespace("reshape2", quietly = TRUE)) { + if (method == "none") { + RLDT <- RL + newdate <- data.frame(Id = 1:nrow(newdate), newdate) + newdateDT <- as.data.table(newdate) + dim(RLDT) <- c(dim(RL), 1) + dimnames(RLDT) <- c(dimnames(RL), "Drop" = 1) + RLDT <- as.data.table(RLDT) + RLDT[["Drop"]] <- NULL + RLDT[ , Date := as.integer(Date)] + RLDT[ , Period := as.numeric(Period)] + setnames(RLDT, c("Date", "Period", "value"), c("Id", "Period", "Quant")) + RLDT <- RLDT[newdateDT, on = "Id"] + RLDT[["Id"]] <- NULL + RL <- as.data.frame(RLDT) + } else { + newdate <- data.frame(Id = 1:nrow(newdate), newdate) + RLDT <- as.data.table(RL) + newdateDT <- as.data.table(newdate) + RLDT[["Id"]] <- as.integer(RLDT[["Date"]]) + RLDT[["Date"]] <- NULL - if (method == "none") { - RL <- melt(RL, value.name = "Quant", varnames = c("Date", "Period")) - RL$Date <- as.Date(RL$Date) - } else { - ## ==================================================================== - ## UGGLY CODE: there must be a simpler and more - ## efficient way of doing that. The problem is that we - ## want to drop the " Type" dimension but not the - ## "Level" dimension even when it has no extension - ## ==================================================================== - - df <- list() - for (nm in c("Quant", "L", "U")) { - RL1 <- RL[ , , nm, , drop = FALSE] - df[[nm]] <- melt(RL1, - value.name = nm, - varnames = c("Date", "Period", "Type", "Level")) - } - RL <- data.frame(df[["Quant"]][, c("Date", "Period", "Level", "Quant")], - L = df[["L"]]$L, U = df[["U"]]$U) - - RL$Date <- as.Date(RL$Date) - ind <- with(RL, order(Date, Level, Period)) - RL <- RL[ind, , drop = FALSE] - } + ## RLDT[["Id"]] <- as.integer(RLDT[[object$date]]) + ## Merge + RLDT <- RLDT[newdateDT, on = "Id"] + RLDT <- dcast(RLDT, ... ~ Type) - } else { - stop("the package 'reshape2' could not be used") + RL <- as.data.frame(RLDT) + RL$Period <- as.numeric(RL$Period) + RLDT[["Id"]] <- NULL } class(RL) <- c("predict.TVGEV", "data.frame") + } ## use fDate to display information in title? attr(RL, "title") <- "Conditional Return Levels" attr(RL, "diagno") <- diagno attr(RL, "type") <- "conditional" + attr(RL, "TSVars") <- object$TSVars return(RL) - + + ## STEP TO GET RID of the 'reshape2' package + ## ##' @importFrom reshape2 melt + + ## if (requireNamespace("reshape2", quietly = TRUE)) { + + ## if (method == "none") { + ## RL <- melt(RL, value.name = "Quant", varnames = c("Date", "Period")) + ## RL$Date <- as.Date(RL$Date) + ## } else { + ## ## ==================================================================== + ## ## UGGLY CODE: there must be a simpler and more + ## ## efficient way of doing that. The problem is that we + ## ## want to drop the " Type" dimension but not the + ## ## "Level" dimension even when it has no extension + ## ## ==================================================================== + ## + ## df <- list() + ## for (nm in c("Quant", "L", "U")) { + ## RL1 <- RL[ , , nm, , drop = FALSE] + ## df[[nm]] <- melt(RL1, + ## value.name = nm, + ## varnames = c("Date", "Period", "Type", "Level")) + ## } + ## RL <- data.frame(df[["Quant"]][, c("Date", "Period", "Level", "Quant")], + ## L = df[["L"]]$L, U = df[["U"]]$U) + ## + ## RL$Date <- as.Date(RL$Date) + ## ind <- with(RL, order(Date, Level, Period)) + ## RL <- RL[ind, , drop = FALSE] + ## } + ## + ## } else { + ## stop("the package 'reshape2' could not be used") + ## } + ## + ## class(RL) <- c("predict.TVGEV", "data.frame") + ## } + + ## ## use fDate to display information in title? + ## attr(RL, "title") <- "Conditional Return Levels" + ## attr(RL, "diagno") <- diagno + ## attr(RL, "type") <- "conditional" + + ## return(RL) + } @@ -896,6 +952,7 @@ autoplot.predict.TVGEV <- function(object, bw = TRUE, ... ) { } confLev <- attr(object, "confLevel") + TSVars <- attr(object, "TSVars") if (nd <- length(unique(object$Date)) > 6L) { stop(nd, "dates found in 'object'. The maximum allowed is 6") @@ -908,27 +965,27 @@ autoplot.predict.TVGEV <- function(object, bw = TRUE, ... ) { if (!is.null(object$L) && !is.null(object$U)) { g1 <- g1 + geom_ribbon(mapping = aes(x = Period, ymin = L, ymax = U, group = Level, - ## colour = Level, - fill = Level), + ## colour = Level, + fill = Level), ## group = type, alpha = 0.2) - if (bw) { - g1 <- g1 + - geom_line(mapping = aes(x = Period, y = L, group = Level, - linetype = Level), - colour = "gray20", - alpha = 0.8) + if (bw) { + g1 <- g1 + + geom_line(mapping = aes(x = Period, y = L, group = Level, + linetype = Level), + colour = "gray20", + alpha = 0.8) g1 <- g1 + geom_line(mapping = aes(x = Period, y = U, group = Level, linetype = Level), colour = "gray20", alpha = 0.8) - } else { - g1 <- g1 + geom_line(mapping = aes(x = Period, y = L, group = Level), - alpha = 0.2) - g1 <- g1 + geom_line(mapping = aes(x = Period, y = U, group = Level), - alpha = 0.2) - } + } else { + g1 <- g1 + geom_line(mapping = aes(x = Period, y = L, group = Level), + alpha = 0.2) + g1 <- g1 + geom_line(mapping = aes(x = Period, y = U, group = Level), + alpha = 0.2) + } } @@ -958,8 +1015,10 @@ autoplot.predict.TVGEV <- function(object, bw = TRUE, ... ) { g1 <- g1 + xlab("Period") + ylab("Quantile") - if (attr(object, "type") == "conditional") { - g1 <- g1 + facet_wrap( ~ Date) + if (attr(object, "type") == "conditional") { + fm <- as.formula(paste("~", paste(c(" Date", TSVars), collapse = "+"))) + print(fm) + g1 <- g1 + facet_wrap(fm, labeller = label_both) } g1 <- g1 + ggtitle(attr(object, "title")) diff --git a/R/predictUncond.R b/R/predictUncond.R index 73d068c..8871ffd 100644 --- a/R/predictUncond.R +++ b/R/predictUncond.R @@ -136,6 +136,10 @@ predictUncond <- function(object, trace = 0, ...) { + if (length(object$TSVars)) { + stop("'object' includes TSVars. It can not be used for unconditional", + " prediction") + } probL <- (1 - level) / 2 probU <- 1 - probL @@ -210,7 +214,7 @@ predictUncond <- function(object, } if (confintMethod == "none") { - + RL <- array(NA, dim = c(np, 1), dimnames = list("period" = period, "Quant")) diff --git a/R/statsTVGEV.R b/R/statsTVGEV.R index 04c19e1..0c90fc9 100644 --- a/R/statsTVGEV.R +++ b/R/statsTVGEV.R @@ -35,6 +35,10 @@ quantile.TVGEV <- function(x, probs = c(0.90, 0.95, 0.99), date = NULL, psi = NULL, ...) { + + if (length(x$TSVars)) { + stop("'x' includes TSVars. It can not be used for now") + } ## control (from quantile.default) if (any(is.na(probs))) stop ("NA not allowed yet in 'probs'") @@ -42,17 +46,17 @@ quantile.TVGEV <- function(x, probs = c(0.90, 0.95, 0.99), eps <- 100 * .Machine$double.eps if (any(probs < -eps | probs > 1 + eps)) stop("'probs' outside [0,1]") - - if (is.null(date)) date <- x$fDate + if (is.null(psi)) psi <- x$estimate - - n <- length(date) - theta <- psi2theta(model = x, psi = psi, date = date) + newdate <- checkNewdata.TVGEV(object = x, newdata = date) + fDate <- format(newdate[[x$date]]) + theta <- psi2theta(model = x, psi = psi, date = newdate) + n <- nrow(theta) fProbs <- formatPerc(probs) quant <- array(NA, dim = c(n, length(probs)), - dimnames = list(date = format(date), + dimnames = list(date = fDate, paste("Q", fProbs, sep = ""))) for (i in seq_along(probs)) { @@ -61,7 +65,7 @@ quantile.TVGEV <- function(x, probs = c(0.90, 0.95, 0.99), shape = theta[ , 3L]) } - rownames(quant) <- attr(quant, "date") <- format(date) + attr(quant, "date") <- fDate attr(quant, "collabels") <- fProbs attr(quant, "label") <- "quantile" class(quant) <- c("bts", "matrix") @@ -125,33 +129,38 @@ density.TVGEV <- function(x, xValue = NULL, date = NULL, psi = NULL, log = FALSE, ...) { - - if (is.null(date)) { - date <- selectDate(x$fDate) + + if (length(x$TSVars)) { + stop("'x' includes TSVars. It can not be used for now") } - if (is.null(psi)) psi <- x$estimate + + ## avoid using two many dates + if (is.null(date)) date <- selectDate(x$fDate) + newdate <- checkNewdata.TVGEV(object = x, newdata = date) + fDate <- format(newdate[[x$date]]) + n <- nrow(newdate) - n <- length(date) - theta <- psi2theta(model = x, psi = psi, date = date) + if (is.null(psi)) psi <- x$estimate + theta <- psi2theta(model = x, psi = psi, date = newdate) if (is.null(xValue)) { - q <- quantile(x, probs = c(0.001, 0.999), date = date) + q <- quantile(x, probs = c(0.001, 0.999), date = newdate) rq <- range(q) xValue <- seq(from = rq[1L], to = rq[2L], length.out = 200) } fxValue <- format(xValue) dens <- array(NA, dim = c(n, length(xValue)), - dimnames = list(date = format(date), - paste("d", fxValue, sep = ""))) + dimnames = list(date = fDate, + paste("d", fxValue, sep = ""))) for (i in seq_along(xValue)) { dens[ , i] <- nieve::dGEV(xValue[i], loc = theta[ , 1L], scale = theta[, 2L], shape = theta[, 3L], ...) } - + attr(dens, "x") <- xValue - rownames(dens) <- attr(dens, "date") <- format(date) + rownames(dens) <- attr(dens, "date") <- fDate attr(dens, "collabels") <- fxValue attr(dens, "label") <- "density" class(dens) <- c("bfts", "bts", "matrix") @@ -175,17 +184,23 @@ cdf.TVGEV <- function(x, date = NULL, psi = NULL, log = FALSE, ...) { - - if (is.null(date)) { - date <- selectDate(x$fDate) + + if (length(x$TSVars)) { + stop("'object' includes TSVars. It can not be used for now") } - if (is.null(psi)) psi <- x$estimate + + ## avoid using two many dates + if (is.null(date)) date <- selectDate(x$fDate) + newdate <- checkNewdata.TVGEV(object = x, newdata = date) + fDate <- format(newdate[[x$date]]) + n <- nrow(newdate) - n <- length(date) - theta <- psi2theta(model = x, psi = psi, date = date) + if (is.null(psi)) psi <- x$estimate + + theta <- psi2theta(model = x, psi = psi, date = newdate) if (is.null(qValue)) { - q <- quantile(x, probs = c(0.005, 0.995), date = date) + q <- quantile(x, probs = c(0.005, 0.995), date = newdate) rq <- range(q) qValue <- seq(from = rq[1L], to = rq[2L], length.out = 200) } @@ -202,7 +217,7 @@ cdf.TVGEV <- function(x, } attr(cdf, "x") <- qValue - rownames(cdf) <- attr(cdf, "date") <- format(date) + rownames(cdf) <- attr(cdf, "date") <- fDate attr(cdf, "collabels") <- fqValue attr(cdf, "label") <- "cdf" class(cdf) <- c("bfts", "bts", "matrix") @@ -247,19 +262,26 @@ mean.TVGEV <- function(x, date = NULL, psi = NULL, ...) { + if (length(x$TSVars)) { + stop("'x' includes TSVars. It can not be used for now") + } + ## Euler-Mascheroni constant gam <- - digamma(1) - if (is.null(date)) date <- x$fDate if (is.null(psi)) psi <- x$estimate - - n <- length(date) - theta <- psi2theta(model = x, psi = psi, date = date) + + newdate <- checkNewdata.TVGEV(object = x, newdata = date) + fDate <- format(newdate[[x$date]]) + n <- nrow(newdate) + + theta <- psi2theta(model = x, psi = psi, date = newdate) E <- theta[ , 1, drop = FALSE] + gam * theta[ , 2, drop = FALSE] colnames(E) <- "expectation" ind <- theta[ , 3] != 0.0 E[ind, 1L] <- theta[ , 1] + theta[ind, 2] * (gamma(1 - theta[ind, 3]) - 1.0 ) / theta[ind, 3] - rownames(E) <- attr(E, "date") <- format(date) + + rownames(E) <- attr(E, "date") <- fDate attr(E, "collabels") <- "expectation" attr(E, "label") <- "expectation" class(E) <- c("bts", "matrix") @@ -281,8 +303,10 @@ moment.TVGEV <- function(x, which = "variance", date = NULL, psi = NULL, ...) { - - + if (length(x$TSVars)) { + stop("'x' includes TSVars. It can not be used for now") + } + if (which != "variance") { stop("'which' can only be \"variance\" for now.") } @@ -290,14 +314,16 @@ moment.TVGEV <- function(x, ## Euler-Mascheroni constant gam <- - digamma(1) - if (is.null(date)) date <- x$fDate if (is.null(psi)) psi <- x$estimate - n <- length(date) - theta <- psi2theta(model = x, psi = psi, date = date) + newdate <- checkNewdata.TVGEV(object = x, newdata = date) + fDate <- format(newdate[[x$date]]) + n <- nrow(newdate) + + theta <- psi2theta(model = x, psi = psi, date = newdate) M <- array(pi * pi / 6, dim = c(n, 1L), - dimnames = list(date = format(date), + dimnames = list(date = fDate, "moment" = "variance")) ## \xi >= 1/2 ind <- (theta[ , 3L] >= 0.5) @@ -309,7 +335,7 @@ moment.TVGEV <- function(x, (gamma(1 - 2 * theta[ind, 3L]) - gamma(1 - theta[ind, 3L])^2 ) / theta[ind, 3] / theta[ind, 3] - attr(M, "date") <- format(date) + attr(M, "date") <- fDate attr(M, "collabels") <- "variance" attr(M, "label") <- "variance" class(M) <- c("bts", "matrix") diff --git a/TODO.md b/TODO.md index adbf3d3..820968d 100644 --- a/TODO.md +++ b/TODO.md @@ -4,8 +4,9 @@ This is a temporary reminder list by YD. Not a planning for new development! -- [ ] Make an alias of the `anova` method under a better name making - clear that this is for a Likelihood Ratio test. +- [ ] **`anova` name** Make an alias of the `anova` method under a + better name making clear that this is for a Likelihood Ratio + test. May be `LR.test`. - [ ] **Profile Likelihood**. Speed up the computation of the profile likelihood intervals in `quantMax.TVGEV`. The initial values for @@ -44,3 +45,9 @@ development! Google Colab notebook. - [ ] **Hexagon sticker**? + +- [ ] Change the name of `bs` or replace this generic function by a + generic bootstapping function from another package. + +- [ ] Get rid of the dependence to the **reshape2** package by replacing + `reshape2::melt` by `data.table::melt`. diff --git a/man/autoplot.influence.TVGEV.Rd b/man/autoplot.influence.TVGEV.Rd new file mode 100644 index 0000000..a9b7d21 --- /dev/null +++ b/man/autoplot.influence.TVGEV.Rd @@ -0,0 +1,54 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/influenceTVGEV.R +\name{autoplot.influence.TVGEV} +\alias{autoplot.influence.TVGEV} +\title{Create a \code{ggplot} for a \code{influence.TVGEV} Object} +\usage{ +\method{autoplot}{influence.TVGEV}(object, ...) +} +\arguments{ +\item{object}{An object with class \code{"influence.TVGEV"} as +created bye the \code{influnce} method for the \code{"TVGEV"} +class.} + +\item{...}{Not used yet.} +} +\value{ +An object inheriting grom \code{"ggplot"} showing the + (finite-sample) influence function for the observation and the + statistic that have been chosen. +} +\description{ +The influence curve is obtained by replacing the chosen +observation by a candidate value and then re-fitting the same +model and computing the statistic of interest: coefficient +estimate, quantile, ... The rug shows the \eqn{y_b} and the +vertical line shows the observation chosen for the analysis. +} +\examples{ +library(ismev) +data(venice) +df <- data.frame(Date = as.Date(paste0(venice[ , "Year"], "-01-01")), + Sealevel = venice[ , "r1"] / 100) +fit0 <- TVGEV(data = df, date = "Date", response = "Sealevel") +autoplot(fit0) +RL_2050 <- function(model) { + c("RL_2050(100)" = quantile(model, prob = 0.99, date = "2050-01-01")[1]) +} +autoplot(fit0) +influence(fit0, what = RL_2050) |> autoplot() +## fit with a linear time trend +fit1 <- TVGEV(data = df, date = "Date", response = "Sealevel", + design = polynomX(Date, degree = 1), loc = ~t1) +autoplot(fit1) +summary(fit1) +influence(fit1) |> autoplot() +influence(fit1, what = RL_2050) |> autoplot() +influence(fit1, which = "max", what = RL_2050) |> autoplot() +## Influence curve for the estimated slope +slope <- function(model) { + c("slope\n(cm/100 yr)" = 100 * unname(coef(model)["mu_t1"])) +} +influence(fit1, which = "max", what = slope) |> autoplot() +influence(fit1, which = "min", what = slope) |> autoplot() +} diff --git a/man/checkNewdata.TVGEV.Rd b/man/checkNewdata.TVGEV.Rd new file mode 100644 index 0000000..cbb8ec0 --- /dev/null +++ b/man/checkNewdata.TVGEV.Rd @@ -0,0 +1,28 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/miscUtils.R +\name{checkNewdata.TVGEV} +\alias{checkNewdata.TVGEV} +\title{Check New Data for Prediction} +\usage{ +checkNewdata.TVGEV(object, newdata = NULL, design = FALSE) +} +\arguments{ +\item{object}{A \code{TSGEV} object.} + +\item{newdata}{An atomic vector or a data frame providing the data +for a prediction.} + +\item{design}{Not used yet.} +} +\value{ +A data frame with the variables required for prediction. + This must always contain a column with is name given by + \code{object$date} and with class \code{"Date"}. If + \code{object} contains \code{TSVars}, the corresponding + variables must be provided as well, but with no check on their + class. +} +\description{ +Check New Data for Prediction +} +\keyword{internal} diff --git a/man/influence.TVGEV.Rd b/man/influence.TVGEV.Rd new file mode 100644 index 0000000..c4404a2 --- /dev/null +++ b/man/influence.TVGEV.Rd @@ -0,0 +1,93 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/influenceTVGEV.R +\name{influence.TVGEV} +\alias{influence.TVGEV} +\title{Diagnostic of Influence for \code{TVGEV} Objects} +\usage{ +\method{influence}{TVGEV}( + model, + what = function(model) coef(model)["xi_0"], + which = "min", + how = "replace", + ... +) +} +\arguments{ +\item{model}{A \code{TVGEV} object.} + +\item{what}{A function with one argument \code{object} defining or +extracting the (numeric) quantity for which the influence is +to be analysed. So, \code{object} must be a \code{TVGEV} +object. See \bold{Examples}. This function can return numeric +vector in which case several influence curves will be +computed. It is then wise to make the function return a vector +with named elements.} + +\item{which}{Identifies the observation which influence will be +analysed. Can be: an integer giving the observation, the +character \code{"min"}, the character \code{"max"}, a +character that can be coerced to a date, or an object with +class \code{"Date"} that identifies the observation. This +argument must define an observation existing in the data frame +used to create the object. So it can not be used e.g. to +define a future date.} + +\item{how}{Character specifying the type of (finite-sample) +influence curve to use. For now only the only possibility is +\code{"replace"}, see Section 2.1 of the book by Hampel et al +(1996). The chosen observation is replaced by a value \eqn{x} +and the quantity of interest is computed for each value of +\eqn{x}.} + +\item{...}{Not used.} +} +\value{ +A named list of vectors. The element \code{obsValue} + contains the candidate values for the chosen observation and + \code{statValue} contains the corresponding values of the + specific statistic defined with \code{what}. +} +\description{ +This function provides some indications on the influence of a +specific observation used in the fit of a \code{TVGEV} object. For +several candidate values of the chosen observation, a \code{TVGEV} +is re-fitted with the observed value replaced by the candidate +value, and the quantity of interest as defined by \code{what} is +computed. +} +\details{ +By suitably defining the function \code{what}, one can trace e.g., +the estimate of a quantile with given probability, the +corresponding upper confidence limit, the upper end-point of the +distribution, ... and more. +} +\note{ +For \code{TVGEV} models with a positive GEV shape, the + smallest observation may have a strong influence on the + result, even if the model is stationary. +} +\examples{ +example(TVGEV) +influ <- influence(res2, which = "min") +autoplot(influ) +influ <- influence(res2, which = as.Date("2015-01-01")) +autoplot(influ) +RL_2050 <- function(model) { + c("RL_2050(100)" = quantile(model, prob = 0.99, date = "2050-01-01")[1]) +} +influence(res2, what = RL_2050) |> autoplot() +influence(res2, what = RL_2050, which = "2003-01-01") |> autoplot() +RLs_2050 <- function(model) { + res <- c(quantile(model, prob = 0.99, date = "2050-01-01")[1], + quantile(model, prob = 0.999, date = "2050-01-01")[1]) + names(res) <- paste0("RL", c(100, 1000)) + res +} +influ <- influence(res2, what = RLs_2050, which = "2003-01-01") +autoplot(influ) +} +\references{ +Hampel, F.R., Ronchetti, E.M., Rousseeuw, P.J. and Stahel + W.A. (1996) \emph{Robust Statistics: The Approach Based on + Influence Functions}. Wiley. +} diff --git a/man/plot.influence.TVGEV.Rd b/man/plot.influence.TVGEV.Rd new file mode 100644 index 0000000..9fa352b --- /dev/null +++ b/man/plot.influence.TVGEV.Rd @@ -0,0 +1,27 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/influenceTVGEV.R +\name{plot.influence.TVGEV} +\alias{plot.influence.TVGEV} +\title{Plot Method for \code{influence.TVGEV} Object} +\usage{ +\method{plot}{influence.TVGEV}(x, y = NULL, ...) +} +\arguments{ +\item{x}{A \code{TVGEV} object.} + +\item{y}{Not used.} + +\item{...}{Not used.} +} +\value{ +Nothing. +} +\description{ +Plot Method for \code{influence.TVGEV} Object +} +\note{ +This method \code{autoplot} +} +\seealso{ +\code{\link{autoplot.TVGEV}}. +} diff --git a/man/predict.TVGEV.Rd b/man/predict.TVGEV.Rd index 2d9f7d4..8542d40 100644 --- a/man/predict.TVGEV.Rd +++ b/man/predict.TVGEV.Rd @@ -45,7 +45,7 @@ the RL computed with the estimated parameters in \code{object}.} \item{trace}{Integer level of verbosity.} -\item{...}{Arguments to be passed to \code{bs}.} +\item{...}{Arguments to be passed to the \code{bs} method.} } \value{ A data frame or an array with the RL and confidence limits diff --git a/man/psi2theta.TVGEV.Rd b/man/psi2theta.TVGEV.Rd index 79e6db0..f645a75 100644 --- a/man/psi2theta.TVGEV.Rd +++ b/man/psi2theta.TVGEV.Rd @@ -3,7 +3,7 @@ \name{psi2theta.TVGEV} \alias{psi2theta.TVGEV} \title{Compute the Matrix of GEV Parameters from the Vector of -Model Parameters 'psi' and the Data} + Model Parameters 'psi' and the Data} \usage{ \method{psi2theta}{TVGEV}( model, @@ -21,12 +21,17 @@ Model Parameters 'psi' and the Data} vector of estimates in \code{psi} will be used.} \item{date}{A vector that can be coerced to the \code{"Date"} -class. Each element will correspond to a row of the matrix of GEV -parameters.} +class. Each element will correspond to a row of the matrix of +GEV parameters. If \code{model} contains TS covariables, this +must instead be a data frame containing the suitable +covariables, along with a column with name \code{model$name} +and class \code{Date}. Id \code{date} is \code{NULL}, the date +and possibly the TS covariables are extracted from +\code{model} and correspond to the information used in the +fit.} \item{deriv}{Logical. If \code{TRUE} the returned object has an -attribute names \code{"gradient"} which is the gradient -array.} +attribute names \code{"gradient"} which is the gradient array.} \item{checkNames}{Logical. If \code{TRUE} it will be checked that the names of \code{psi} match the \code{parNames} element of @@ -35,19 +40,20 @@ the names of \code{psi} match the \code{parNames} element of \item{\dots}{Not used yet.} } \value{ -A matrix with \code{length(date)} rows and \code{3} colums. -The columns contain the location, the scale and the shape GEV parameters -in that order. +A matrix with \code{length(date)} rows and \code{3} + colums. The columns contain the location, the scale and the + shape GEV parameters in that order. } \description{ -Compute the GEV parameters for the marginal distributions of a -\code{TVGEV} model. +Compute the GEV parameters for the marginal + distributions of a \code{TVGEV} model. } \note{ The \code{deriv} formal argument is mainly here to maintain -a compatibility with the \code{NSGEV} method. However, the -derivatives w.r.t. the parameter vector \code{psi} are obtained -simply by using the \code{X} elements of the object \code{model}. + a compatibility with the \code{NSGEV} method. However, the + derivatives w.r.t. the parameter vector \code{psi} are + obtained simply by using the \code{X} elements of the object + \code{model}. } \seealso{ The \code{\link{GEV}} for the GEV probability functions. From 6c09df719783a445ee742b393fe04177affa20cf Mon Sep 17 00:00:00 2001 From: yvesdeville Date: Mon, 9 Jun 2025 15:39:13 +0200 Subject: [PATCH 3/9] TS covariables --- R/predictTVGEV.R | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/R/predictTVGEV.R b/R/predictTVGEV.R index 4b0a680..6b7122d 100644 --- a/R/predictTVGEV.R +++ b/R/predictTVGEV.R @@ -163,9 +163,10 @@ predict.TVGEV <- function(object, } } - newdate <- as.data.frame(newdate) - names(newdate) <- object$date + ## newdate <- as.data.frame(newdate) + ## names(newdate) <- object$date ## newdate <- data.frame(Id = 1:nrow(newdate), newdate) + newdate <- checkNewdata.TVGEV(fit, newdata = newdate) n <- nrow(newdate) ## special case for non TV model From dbb8dec9984e8e11d58d9bb2bc665b052b10f9e2 Mon Sep 17 00:00:00 2001 From: yvesdeville Date: Mon, 9 Jun 2025 17:58:26 +0200 Subject: [PATCH 4/9] TS covariables --- R/predictTVGEV.R | 2 +- R/statsTVGEV.R | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/R/predictTVGEV.R b/R/predictTVGEV.R index 6b7122d..0f67405 100644 --- a/R/predictTVGEV.R +++ b/R/predictTVGEV.R @@ -166,7 +166,7 @@ predict.TVGEV <- function(object, ## newdate <- as.data.frame(newdate) ## names(newdate) <- object$date ## newdate <- data.frame(Id = 1:nrow(newdate), newdate) - newdate <- checkNewdata.TVGEV(fit, newdata = newdate) + newdate <- checkNewdata.TVGEV(object, newdata = newdate) n <- nrow(newdate) ## special case for non TV model diff --git a/R/statsTVGEV.R b/R/statsTVGEV.R index 0c90fc9..99d6dde 100644 --- a/R/statsTVGEV.R +++ b/R/statsTVGEV.R @@ -37,7 +37,7 @@ quantile.TVGEV <- function(x, probs = c(0.90, 0.95, 0.99), psi = NULL, ...) { if (length(x$TSVars)) { - stop("'x' includes TSVars. It can not be used for now") + warning("'x' includes TSVars") } ## control (from quantile.default) @@ -131,7 +131,7 @@ density.TVGEV <- function(x, xValue = NULL, log = FALSE, ...) { if (length(x$TSVars)) { - stop("'x' includes TSVars. It can not be used for now") + warning("'x' includes TSVars") } ## avoid using two many dates @@ -186,7 +186,7 @@ cdf.TVGEV <- function(x, log = FALSE, ...) { if (length(x$TSVars)) { - stop("'object' includes TSVars. It can not be used for now") + warning("'object' includes TSVars") } ## avoid using two many dates @@ -263,7 +263,7 @@ mean.TVGEV <- function(x, psi = NULL, ...) { if (length(x$TSVars)) { - stop("'x' includes TSVars. It can not be used for now") + warning("'x' includes TSVars") } ## Euler-Mascheroni constant @@ -304,7 +304,7 @@ moment.TVGEV <- function(x, date = NULL, psi = NULL, ...) { if (length(x$TSVars)) { - stop("'x' includes TSVars. It can not be used for now") + warning("'x' includes TSVars") } if (which != "variance") { From 9e1bcf9cdfe24a387ef5e3e62e5c59436af3e052 Mon Sep 17 00:00:00 2001 From: yvesdeville Date: Tue, 19 Aug 2025 16:03:29 +0200 Subject: [PATCH 5/9] NSGEVTS vignette --- DESCRIPTION | 4 +- NEWS.md | 5 +- R/TVGEV.R | 2 +- R/statsTVGEV.R | 2 +- TODO.md | 11 +- man/density.TVGEV.Rd | 2 +- man/psi2theta.TVGEV.Rd | 2 +- vignettes/NSGEV.bib | 6 +- vignettes/NSGEVTS.Rmd | 429 ++++++++++++++++++++++++++++++++++++++ vignettes/images/Fit.png | Bin 0 -> 79466 bytes vignettes/images/Pred.png | Bin 0 -> 68252 bytes 11 files changed, 451 insertions(+), 12 deletions(-) create mode 100644 vignettes/NSGEVTS.Rmd create mode 100644 vignettes/images/Fit.png create mode 100644 vignettes/images/Pred.png diff --git a/DESCRIPTION b/DESCRIPTION index 9b2240a..0b41153 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -2,7 +2,7 @@ Package: NSGEV Type: Package Title: Non-Stationary GEV Time Series Version: 0.2.0 -Date: 2025-06-09 +Date: 2025-08-20 Authors@R: c(person(given = "Yves", family = "Deville", @@ -15,7 +15,7 @@ License: GPL-3 LazyData: yes Imports: utils, methods, splines, numDeriv, nloptr, data.table, reshape2, tidyr, forecast, scales, grDevices Depends: ismev, extRemes, nieve, ggplot2 -Suggests: parallel, doParallel, foreach, testthat, rmarkdown, knitr, png, deSolve +Suggests: parallel, doParallel, foreach, testthat, rmarkdown, knitr, png, deSolve, htmltools, plotly Encoding: UTF-8 URL: https://github.com/IRSN/NSGEV/ BugReports: https://github.com/IRSN/NSGEV/issues/ diff --git a/NEWS.md b/NEWS.md index 1e1d033..1be030f 100644 --- a/NEWS.md +++ b/NEWS.md @@ -2,13 +2,16 @@ **NSGEV** Package News ====================== -# New in version 0.3.0 +# New in version 0.2.0 (branch `influence` ## Enhancements - Experimental changes on `TVGEV` to allow the use of Time Series covariates along with functions of time. CAUTION This may have created bugs!!! + +- New vignette *Timeseries Covariates with NSGEV*. DRAFT version. + # New in version 0.2.0 diff --git a/R/TVGEV.R b/R/TVGEV.R index 6adc6a7..2bdb996 100644 --- a/R/TVGEV.R +++ b/R/TVGEV.R @@ -35,7 +35,7 @@ ##' colums. The columns contain the location, the scale and the ##' shape GEV parameters in that order. ##' -##' @seealso The \code{\link{GEV}} for the GEV probability functions. +##' @seealso The \code{\link[nieve]{GEV}} for the GEV probability functions. ##' ##' @note The \code{deriv} formal argument is mainly here to maintain ##' a compatibility with the \code{NSGEV} method. However, the diff --git a/R/statsTVGEV.R b/R/statsTVGEV.R index 99d6dde..20757ac 100644 --- a/R/statsTVGEV.R +++ b/R/statsTVGEV.R @@ -110,7 +110,7 @@ quantile.TVGEV <- function(x, probs = c(0.90, 0.95, 0.99), ##' functions are plotted with the x-y axes flipped in order to enhance ##' the time-varying feature of the model. ##' -##' @seealso \code{\link{GEV}} for the density and cdf of the GEV +##' @seealso \code{\link[nieve]{GEV}} for the density and cdf of the GEV ##' distribution, \code{\link{plot.predict.TVGEV}} for the Return Level ##' plot. ##' diff --git a/TODO.md b/TODO.md index 820968d..a0b127e 100644 --- a/TODO.md +++ b/TODO.md @@ -19,6 +19,13 @@ development! *contours* for some or all of the couples of parameters in a fitted `TVGEV` model. +- [] **Return level plots** Allow the return level plot to use an + horizontal axis with a probability of exceedance (and a Gumbel + scale) rather than a return period as done for the quantile of + the maximum. So the plot for a conditional return level would be + nearly identical to that given for the quantile of the maximum + on a one-year period. + - [ ] **Improve Numerical Treatment**. Improve by using the QR method on the design matrices. So the vector of parameters will be internally $\mathbf{R}\boldsymbol{\psi}$ instead of @@ -32,12 +39,12 @@ development! check, and an action for the build to produce a release when a tag is used on for the commit. -- [x] **Vignettes**. In the Introduction vignette enhance the part on +- [x] **Vignettes**. In the *Introduction* vignette enhance the part on the quantile of the maximum by adding profile likelihood intervals. Complete the citations and introduce the expression *Design Life Level*. -- [x] **Vignettes**. In the Introduction vignette, include the fixes +- [x] **Vignettes**. In the *Introduction* vignette, include the fixes that were by Jesper Rydén (mail 2024-03-06). - [ ] **README** file. Make the installation part shortest, and include diff --git a/man/density.TVGEV.Rd b/man/density.TVGEV.Rd index 742f80d..b3ced79 100644 --- a/man/density.TVGEV.Rd +++ b/man/density.TVGEV.Rd @@ -55,7 +55,7 @@ plot(F) } \seealso{ -\code{\link{GEV}} for the density and cdf of the GEV +\code{\link[nieve]{GEV}} for the density and cdf of the GEV distribution, \code{\link{plot.predict.TVGEV}} for the Return Level plot. } diff --git a/man/psi2theta.TVGEV.Rd b/man/psi2theta.TVGEV.Rd index f645a75..ac0ae2b 100644 --- a/man/psi2theta.TVGEV.Rd +++ b/man/psi2theta.TVGEV.Rd @@ -56,5 +56,5 @@ The \code{deriv} formal argument is mainly here to maintain \code{model}. } \seealso{ -The \code{\link{GEV}} for the GEV probability functions. +The \code{\link[nieve]{GEV}} for the GEV probability functions. } diff --git a/vignettes/NSGEV.bib b/vignettes/NSGEV.bib index 97d3c16..bf423fb 100644 --- a/vignettes/NSGEV.bib +++ b/vignettes/NSGEV.bib @@ -39,13 +39,13 @@ @book{BeirlantEtAl_StatOfExtremes @Article{Rpack_evd, title = {{evd: Extreme Value Distributions}}, author = {Stephenson, Alec G.}, - journal = {{The R Journal}}, + journal = {{R News}}, year = {2002}, volume = {2}, number = {2}, - pages = {0}, + pages = {31-32}, month = {June}, - url = {http://CRAN.R-project.org/doc/Rnews/} + note = {https://journal.r-project.org/articles/RN-2002-015/} } %%============================================================================ @Manual{RPack_ismev, diff --git a/vignettes/NSGEVTS.Rmd b/vignettes/NSGEVTS.Rmd new file mode 100644 index 0000000..fe2ee6e --- /dev/null +++ b/vignettes/NSGEVTS.Rmd @@ -0,0 +1,429 @@ +--- + title: "Timeseries Covariables with **NSGEV**" + author: Yves Deville + date: "`r Sys.Date()`" + output: + rmarkdown::html_vignette: + toc: true + vignette: > + %\VignetteIndexEntry{Timeseries Covariates with NSGEV} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} + bibliography: NSGEV.bib + linkcolor: blue +--- + +\newcommand{\m}[1]{\mathbf{#1}} +\newcommand{\bs}[1]{\boldsymbol{#1}} + + + +```{r, echo=FALSE, eval=TRUE, message=FALSE, results="hide"} +## library(remotes) +## install_github("IRSN/NSGEV", ref = "influence") +library(knitr) +if (opts_knit$get("rmarkdown.pandoc.to") == "html") { + library(htmltools) +} +opts_knit$get("rmarkdown.pandoc.to") +``` + + + +# Using timeseries covariates in **TVGEV** models + +In Time-Varying GEV models, a series $y(t)$ of block maxima is +considered as formed by independent GEV observations with their +marginal distribution depending on the time $t$. In some cases one +may want to further use one or several *timeseries covariate* +$z(t)$. A typical example of such timeseries covariates is provided by +so-called *climate indices* such as the *Southern Oscillation Index* +(SOI) and the *North Atlantic Oscillation* (NAO) both available from +the USA [National Oceanic and Atmospheric +Administration](https://www.ncei.noaa.gov). The response $y(t)$ +usually being a timeseries of *annual* maxima, each covariate $z(t)$ +must also come with a yearly sampling, which may require some kind of +aggregation using the annual mean or maximum. Most often, timeseries +covariates should be used along with functions of time describing the +trend, in order to avoid spurious regression, see below. Note that a +covariate $z(t)$ does not need to have independent observations nor +even to be stationary. The crucial assumption in the model is that the +observations $y(t)$ are independent conditional on the series $z(t)$. + +# Example: Annual Sea Levels in Fremantle (AUS) + +The `fremantle` data of the **ismev** package contains the annual +maxima of the sea level in Fremantle, Australia, in meters. This +dataset is described in Chap. 1 of @Coles_ExtremeValues +and is used in Chap. 6 of the book to provide examples of models +for non-stationary extremes. + +```{r, label = "Fremantle", message=FALSE, warning=FALSE} +library(NSGEV); library(ismev) +data(fremantle) +head(fremantle, n = 7) +``` + +The `SOI` column contains the annual value of the Southern Oscillation +Index. In order to use the `TVGEV` function with this data it helps +to define a variable of class `"Date"` by using the +`Year` column. + +```{r, label="Fremantle2", message=FALSE, warning=FALSE} +df <- within(fremantle, Date <- as.Date(paste0(Year, "-01-01"))) +``` + +The variable `SeaLevel` contains the response timeseries $y(t)$ while +$\texttt{SOI}(t)$ will be used as covariate $z(t)$. The series are shown +below, along with a scatterplot with points $[z(t),\,y(t)]$. Note that +some years are missing such as 1902. This will not affect the use of +the `TVGEV` function. Moreover, the same results would be obtained if +the missing years were added to the table with `NA` values for the two +variables `SeaLevel` and `SOI`. This will be illustrated later + + +```{r, label="Fremantle2a", message=FALSE, warning=FALSE, echo=FALSE} +## opar <- par(mfrow = c(2, 2), cex = 0.5, mar = c(4, 4, 2, 2)) +## with(df, plot(x = Date, y = SeaLevel, type = "h", xlab = "", +## main = "Annual maxima of Sea levels in Fremantle (AUS)")) +## with(df, plot(x = Date, y = SOI, type = "h", xlab = "", +## main = "SOI", col = "seagreen")) +## with(df, plot(x = SOI, y = SeaLevel, type = "p", pch = 16, +## main = "Sea level against SOI index")) +## par(opar) +``` + +```{r, ggplotly, message=FALSE, warning=FALSE} +library(plotly); +g1 <- ggplot(data = df) + + geom_segment(aes(x = Date, xend = Date, y = min(SeaLevel) - 0.1, yend = SeaLevel), colour = "orangered") + + geom_point(aes(x = Date, y = SeaLevel), colour = "orangered") + xlab("") + ylab("SeaLevel (m)") +g2 <- ggplot(data = df) + + geom_segment(aes(x = Date, xend = Date, y = 0, yend = SOI), colour = "SeaGreen") + + geom_point(aes(x = Date, y = SOI), colour = "SeaGreen") + xlab("") + ylab("SOI") +g3 <- ggplot(data = df) + + geom_point(aes(x = SOI, y = SeaLevel, date = Date)) + xlab("SOI") + ylab("SeaLevel") +``` + +```{r, ggplotlyOut, message=FALSE, warning=FALSE, fig.show='hold', out.width="50%", echo=FALSE} +if (opts_knit$get("rmarkdown.pandoc.to") == "html") { + g <- list() + g[[1]] <- ggplotly(g1, width = 400, height = 340) + g[[2]] <- ggplotly(g2, width = 400, height = 340) + g[[3]] <- ggplotly(g3, width = 300, height = 340) + htmltools::tagList(g) +} else { + print(g1 + ggtitle("SeaLevel")) + print(g2 + ggtitle("SOI")) + print(g3 + ggtitle("SeaLevel against SOI")) +} +``` + +One may guess from the scatterplot that a larger level of the `SOI` +results on average in a (slightly) larger sea level. + + +# `TVGEV` models with timeseries covariates + +## Fitting the `TVGEV` models + +Using the `fremantle` data, we fit the following three GEV models +$y(t) \sim \texttt{GEV}\{\mu(t),\, \sigma(t),\,\xi(t)\}$ +involving a parameter vector $\bs{\psi}$ + +\begin{equation*} + (M_0) \quad + \left\{ + \begin{aligned} + \mu(t) + &= \psi^{\mu}_0 \\ + \sigma(t) + &= \psi^{\sigma}_0\\ + \xi(t)&= \psi^{\xi}_0, + \end{aligned} + \right. + \qquad + (M_1) \quad + \left\{ + \begin{aligned} + \mu(t) + &= \psi^{\mu}_0 + \psi^{\mu}_1 \, t \\ + \sigma(t) + &= \psi^{\sigma}_0\\ + \xi(t) &= \psi^{\xi}_0, + \end{aligned} + \right. + \qquad + (M_2) \quad + \left\{ + \begin{aligned} + \mu(t) + &= \psi^{\mu}_0 + \psi^{\mu}_1 \, t + \psi^\mu_2 \, \texttt{SOI}(t)\\ + \sigma(t) + &= \psi^{\sigma}_0\\ + \xi(t)&= \psi^{\xi}_0, + \end{aligned} + \right. +\end{equation*} + +So $M_0$ is a stationary model with i.i.d. GEV observations, $M_1$ +specifies a linear time trend for the location parameter $\mu$ and +$M_2$ uses both a linear time trend term and a linear effect of the +covariate $\texttt{SOI}(t)$. In all cases, the GEV scale $\sigma$ and +the shape $\xi$ are both kept constant. The three models are nested. + +The linear time trend will be built by using the `polynomX` design +function which returns a matrix of polynomials in $t$. The column `t1` +can be used to describe the trend. The (default) time origin is +located at `1970-01-01` and the time is expressed in years. + + +```{r, label="fits", results="hide",fig.width=5, fig.height=4} +fit0 <- TVGEV(data = df, response = "SeaLevel", date = "Date", + design = polynomX(date = Date, degree = 1), + loc = ~ 1) +fit1 <- TVGEV(data = df, response = "SeaLevel", date = "Date", + design = polynomX(date = Date, degree = 1), + loc = ~ t1) +fit2 <- TVGEV(data = df, response = "SeaLevel", date = "Date", + design = polynomX(date = Date, degree = 1), + loc = ~ t1 + SOI) +autoplot(fit0) +autoplot(fit1) +autoplot(fit2) +``` + +The `autoplot` method builds a `ggplot` object showing the observed +response against the date along with the fitted quantiles for three +levels of the probability of non-exceedance $p$, namely $p=0.90$, $p = +0.95$ and $p= 0.99$. These quantiles are those of the +$\texttt{GEV}\{\mu(t),\,\sigma(t),\, \xi(t)\}$ distribution. When a +timeseries covariate is used as for the object `fit2`, the quantiles +are conditional on the value of the covariate for the corresponding +year. + +The methods `coef`, `summary` can be used to extract the vector +$\widehat{\bs{\psi}}$ of estimated coefficients or get to a summary. + +```{r, label="fits_summary"} +coef(fit2) +summary(fit2) +``` + +The output of `summary` suggests that the coefficient of +$\texttt{SOI}(t)$ is significantly different from zero because in the +row with label `mu_SOI`, the absolute value of the estimate +$\widehat{\psi}^\mu_2$ is larger than twice the corresponding standard +error. The trend coefficient `mu_t1` is in meter by year so its value is +`r round(1e4 * coef(fit2)["mu_t1"], digits = 2)` when expressed +in *centimeter by century*, maybe a more suitable unit. + +Note that the estimated GEV shape parameter in `fit2` is fairly +negative implying a finite upper end-point for the marginal GEV +distributions. + + +## Generalised residuals + +The `resid` method of the `"TVGEV"` class computes the generalised +residuals: + +```{r, label="resid"} +gr <- list() +gr[["0"]] <- autoplot(resid(fit0)) + ggtitle("fit0") +gr[["1"]] <- autoplot(resid(fit1)) + ggtitle("fit1") +gr[["2"]] <- autoplot(resid(fit2)) + ggtitle("fit2") +``` + +```{r, label="residShow", ech=FALSE, results="hide"} +if (opts_knit$get("rmarkdown.pandoc.to") == "html") { + htmltools::tagList(lapply(gr, ggplotly, width = 300, height = 340)) +} else { + lapply(gr, identity) +} +``` + +When a generalised residual falls far away in one of the two tails of +the Gumbel distribution, it may be a good idea to check the influence +of the corresponding observation on the fit. + +When the variable `SOI` is used, the two years `1903` and `1914` have +quite different residual although they correspond to nearly the same +value of the sea level, because they correspond to quite different +values of `SOI`. Although they correspond to severe coastal floodings, +the largest sea levels in the dataset correspond to somewhat of the +residuals. This may mean that coastal flood defenses will have to be +constantly improved. + +## Comparing nested models with likelihood-ratio tests + +The `anova` method can be used to compare two nested models with +Likelihood-Ratio test, for instance $M_0$ and $M_1$. + + +```{r, label="fits_anova1"} +anova(fit0, fit1) +``` + +So the likelihood-ratio test indicates that the linear trend term is strongly +significant. Up to rounding, the maximised log-likelihoods are equal +to those reported p. 113 in @Coles_ExtremeValues book. We can similarly compare the two +fitted models $M_1$ and $M_2$ + + +```{r, label="fits_anova2"} +anova(fit1, fit2) +``` + +So, as written p. 114 in @Coles_ExtremeValues book: *the effect of SOI +is influential on annual maximum sea levels at Fremantle, even after +the allowance for time variation*. Again, the maximised log-likelihoods +found here are in good agreement with that reported in the book. + +Note that it is important to assess the effect of a timeseries +covariates $z(t)$ such as $\texttt{SOI}(t)$ only when the effect of time +has been taken into account. Without this precaution any covariate +with a linear time trend would be found to be influential by a +spurious regression effect. It may indeed be the case that the series +$y(t)$ and $z(t)$ have a common trend. + +## How `TVGEV` works + +When a `TVGEV` function is created, the `design` argument can receive +a call to a function that creates covariates $x_i(t)$ which are +functions of the time i.e. of the variable specified in `date`. A +data frame is created with its columns being the timeseries covariates +$z(t)$ and the functions time $x_i(t)$. All these columns can be used +in the `lm`-style formulas for the GEV parameters. + +```{r DesignFit, echo=FALSE, fig.align="center", out.width="70%"} +library(png); library(knitr) +img1_path <- "images/Fit.png" +knitr::include_graphics(img1_path) +``` +For instance the "design" matrix corresponding to the GEV location +parameter $\mu$ can be extracted from the fitted model object. + +```{r} + head(fit2$X[["loc"]]) +``` +This object could be coerced if needed to a timeseries object such as an +object with class `"xts"` from the **xts** package. + + +# Return levels or "prediction" + +## Return levels + +Remind that the return levels are the quantiles of the GEV response +$y(t)$. The corresponding probability $p$ is often converted into a +return period $T$ in years according to the rule $p = 1 - 1/T$. For +instance the so-called *centennial* return level for $T=100$ years +corresponds to $p=0.99$ i.e., to a probability of exceedance of +$0.01$. + + +## Conditional return levels + + +As long as a `TVGEV` fitted model object involves only covariates that +are functions of the time, the `predict` method only requires an +argument `newdate` which defines the date(s) $t$ for which the +quantiles are to be computed. For an object with no timeseries +covariates, the value passed to this argument is usually a vector +defining a future period: a set of years given by their beginning +date. When timeseries covariates are used, one must give as well the +value of these covariates for each predicted year. Then `newdate` must +be a data frame with all the variables required for the prediction. + +```{r, label="pred12", fig.width=8, fig.height=4, out.width="80%"} +pred1 <- predict(fit1, newdate = c("2020-01-01", "2030-01-01")) +autoplot(pred1) + ggtitle("No TS covariate") +nd <- data.frame(Date = as.Date(c("2020-01-01", "2030-01-01")), + SOI = c(1.5, 2.1)) +pred2 <- predict(fit2, newdate = nd) +autoplot(pred2) + ggtitle("Using the TS covariate `SOI`") +``` + +By default the confidence intervals on the return levels are obtained +by using the "delta method". Yet the `confintMethod` argument of the +`predict` method can be used to get *profile likelihood* intervals +instead. Partial matching can be used both for the argument and for +its value: the choice `"proflik"` can be abbreviated as `"prof"` which +is still well understood. Remind that the confidence intervals are +approximate unless a very large sample is used. Still, profile +likelihood intervals are known to have a better coverage those +obtained by the delta method. + + +```{r, fig.width=8, fig.height=4, out.width="80%" } +predProf1 <- predict(fit1, newdate = c("2020-01-01", "2030-01-01"), + conf = "prof", trace = 0) +autoplot(predProf1) + ggtitle("No TS covariate. Conf.: Prof. Lik ") +nd <- data.frame(Date = as.Date(c("2020-01-01", "2030-01-01")), + SOI = c(1.5, 2.1)) +predProf2 <- predict(fit2, newdate = nd, conf = "prof", trace = 0) +autoplot(predProf2) + ggtitle("Covariable TS `SOI`. Conf: Prof. Lik.") +``` + +Note that the use of the `SOI` covariate leads to slightly narrower +confidence intervals on the quantiles. + +**Remark** In the previous code chunk `trace = 0` was used to avoid a +verbose output. A grid of return periods is used for the computation +and for each return period, the confidence limits are actually +obtained by using a constrained optimisation. When the `trace` +argument is not zero, convergence diagnostics are printed. It may +happen that the optimisation fails to converge. + + +## Marginal return levels + +Rather than fixing a value for the covariates, one may want to +"marginalise out" the return levels w.r.t the values of the covariate, +or to "integrate out" these values, see @EastoeTawn_NSEV2009. The marginal +return levels are not available yet but should be in a future version +of the package. The return level corresponding to a future date of +interest $t^\star$ average over a number of possible values $z^{[j]}$ +or "scenarios" for the covariate $z(t^\star)$ that would be provided. + +```{r DesignNew, echo=FALSE, fig.align="center", out.width="70%"} +img2_path <- "images/Pred.png" +knitr::include_graphics(img2_path) +``` + +# Limitations and possible extensions + +For now the distribution of the maximum on a given period can not be +computed when timeseries covariates are used. + +The **NSGEV** package does not allow for models including *latent +variables*. Such models can be used with **INLA** or **rstan**. + + +# Appendix : using `NA`s for missing observations + +Starting form the `fremantle` data frame, we can build a new data +frame containing all the years between the first and the last year of +the original data frame. The `merge` method can be used for this aim, +with the `Date` as key. All the columns except `Date` will contain `NA`s +for the missing years. + +```{r} +Date = seq(from = df$Date[1], to = df$Date[nrow(df)], by = "year") +dfNA <- merge(df, data.frame(Date), by = "Date", all.y = TRUE) +summary(dfNA) +``` +Then we can fit the same `TVGEV` model as before + +```{r, label="compareNA"} +fit2NA <- TVGEV(data = dfNA, response = "SeaLevel", date = "Date", + design = polynomX(date = Date, degree = 1), + loc = ~ t1 + SOI) +``` + +We see that the results of the estimation with `NA` observations are +identical to those obtained with the missing years. + + +# References diff --git a/vignettes/images/Fit.png b/vignettes/images/Fit.png new file mode 100644 index 0000000000000000000000000000000000000000..fd649a2cf2e11a1ab4a2c0d1285d6a1f728c405f GIT binary patch literal 79466 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 literal 0 HcmV?d00001 diff --git a/vignettes/images/Pred.png b/vignettes/images/Pred.png new file mode 100644 index 0000000000000000000000000000000000000000..8e0aca272931daf297c9039bf4276e1a56984004 GIT binary patch literal 68252 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 Date: Wed, 20 Aug 2025 09:52:07 +0200 Subject: [PATCH 6/9] residuals --- NEWS.md | 4 ++++ R/residTVGEV.R | 35 ++++++++++++++++++++++++----------- man/residuals.TVGEV.Rd | 14 ++++++++------ vignettes/NSGEVTS.Rmd | 2 +- 4 files changed, 37 insertions(+), 18 deletions(-) diff --git a/NEWS.md b/NEWS.md index 1be030f..ec2baea 100644 --- a/NEWS.md +++ b/NEWS.md @@ -12,6 +12,10 @@ - New vignette *Timeseries Covariates with NSGEV*. DRAFT version. +## Bug fixes + +- The generalised residuals computed with `"gumbel"` were + actually *reversed* gumbel. # New in version 0.2.0 diff --git a/R/residTVGEV.R b/R/residTVGEV.R index cfd24ef..00cd477 100644 --- a/R/residTVGEV.R +++ b/R/residTVGEV.R @@ -12,23 +12,25 @@ ##' @param object A \code{TVGEV} object. ##' ##' @param type The approximate distribution wanted. The choices -##' \code{c("unif", "exp", "gumbel")} correspond to the standard -##' uniform, the standard exponential and the standard Gumbel -##' distributions. Partial matching is allowed. +##' \code{c("gumbel", "exp", "unif", "gev4")} correspond to the +##' following distributions: standard Gumbel, the standard +##' exponential, the standard uniform, and the GEV with shape +##' \eqn{-0.25} distributions. Partial matching is allowed. ##' ##' @param ... Not used yet. ##' ##' @return A vector of generalised residuals which should ##' \emph{approximately} be independent and \emph{approximately} ##' follow the target distribution: standard Gumbel, standard -##' exponential or standard uniform, depending on the value of +##' exponential or standard uniform, ... depending on the value of ##' \code{type}. ##' ##' @note The upper 95\% quantile of the standard Gumbel and the ##' standard exponential is close to \eqn{3} which can be used to ##' gauge "large residuals". Using \code{type = "gumbel"} seems ##' better to diagnose abnormally small residuals as may result -##' from abnormally small block maxima. +##' from abnormally small block maxima. The generalised residuals +##' have no physical dimension. ##' ##' @references Cox, D.R. and Snell E.J. (1968) "A General Definition ##' of Residuals". \emph{JRSS Ser. B}, \bold{30}(2), pp. 248-275, @@ -63,26 +65,37 @@ ##' plot(mu, e, type = "p", pch = 16, col = "darkcyan", ##' main = "generalised residuals against 'loc'") residuals.TVGEV <- function(object, - type = c("gumbel", "exp", "unif"), + type = c("gumbel", "exp", "unif", "gev4"), ...) { type <- match.arg(type) Y <- object$data[ , object$response] theta <- psi2theta(model = object, psi = NULL) + ## e <- nieve::pGEV(Y, loc = theta[, 1L], scale = theta[, 2L], + ## shape = theta[, 3L], lower.tail = FALSE) + + ## Apply the (fitted) GEV distribution) to transform to uniform + ## in an increasing fashion then apply the target quantile function e <- nieve::pGEV(Y, loc = theta[, 1L], scale = theta[, 2L], - shape = theta[, 3L], lower.tail = FALSE) + shape = theta[, 3L], lower.tail = TRUE) lims95 <- c(0.025, 0.975) if (type == "exp") { - e <- -log(e) + ## e <- -log(e) + ## lims95 <- -log(1 - lims95) + e <- -log(1 - e) lims95 <- -log(1 - lims95) } else if (type == "gumbel") { - e <- log(-log(e)) - lims95 <- log(-log(1 - lims95)) + ## e <- log(-log(e)) + ## lims95 <- log(-log(1 - lims95)) + e <- -log(-log(e)) + lims95 <- -log(-log(lims95)) + } else if (type == "gev4") { + e <- nieve::qGEV(e, loc = 0, scale = 1, shape = -0.25) + lims95 <- nieve::qGEV(lims95, loc = 0, scale = 1, shape = -0.25) } - names(e) <- rownames(theta) attr(e, "date") <- object$data[ , object$date] attr(e, "type") <- type diff --git a/man/residuals.TVGEV.Rd b/man/residuals.TVGEV.Rd index 5afd43e..97ce21a 100644 --- a/man/residuals.TVGEV.Rd +++ b/man/residuals.TVGEV.Rd @@ -5,15 +5,16 @@ \alias{resid.TVGEV} \title{Generalised Residuals for a \code{TVGEV} Model} \usage{ -\method{residuals}{TVGEV}(object, type = c("gumbel", "exp", "unif"), ...) +\method{residuals}{TVGEV}(object, type = c("gumbel", "exp", "unif", "gev4"), ...) } \arguments{ \item{object}{A \code{TVGEV} object.} \item{type}{The approximate distribution wanted. The choices -\code{c("unif", "exp", "gumbel")} correspond to the standard -uniform, the standard exponential and the standard Gumbel -distributions. Partial matching is allowed.} +\code{c("gumbel", "exp", "unif", "gev4")} correspond to the +following distributions: standard Gumbel, the standard +exponential, the standard uniform, and the GEV with shape +\eqn{-0.25} distributions. Partial matching is allowed.} \item{...}{Not used yet.} } @@ -21,7 +22,7 @@ distributions. Partial matching is allowed.} A vector of generalised residuals which should \emph{approximately} be independent and \emph{approximately} follow the target distribution: standard Gumbel, standard - exponential or standard uniform, depending on the value of + exponential or standard uniform, ... depending on the value of \code{type}. } \description{ @@ -37,7 +38,8 @@ The upper 95\% quantile of the standard Gumbel and the standard exponential is close to \eqn{3} which can be used to gauge "large residuals". Using \code{type = "gumbel"} seems better to diagnose abnormally small residuals as may result - from abnormally small block maxima. + from abnormally small block maxima. The generalised residuals + have no physical dimension. } \examples{ df <- within(TXMax_Dijon, Date <- as.Date(sprintf("\%4d-01-01", Year))) diff --git a/vignettes/NSGEVTS.Rmd b/vignettes/NSGEVTS.Rmd index fe2ee6e..834676c 100644 --- a/vignettes/NSGEVTS.Rmd +++ b/vignettes/NSGEVTS.Rmd @@ -235,7 +235,7 @@ gr[["1"]] <- autoplot(resid(fit1)) + ggtitle("fit1") gr[["2"]] <- autoplot(resid(fit2)) + ggtitle("fit2") ``` -```{r, label="residShow", ech=FALSE, results="hide"} +```{r, label="residShow", echo=FALSE} if (opts_knit$get("rmarkdown.pandoc.to") == "html") { htmltools::tagList(lapply(gr, ggplotly, width = 300, height = 340)) } else { From b3ca24771cd3dd9d20ebd2da3806d8c924baf834 Mon Sep 17 00:00:00 2001 From: yvesdeville Date: Wed, 20 Aug 2025 17:04:09 +0200 Subject: [PATCH 7/9] trace optim --- DESCRIPTION | 1 - NEWS.md | 20 ++++++++++-- R/TVGEV.R | 75 ++++++++++++++++++++++++++++--------------- TODO.md | 2 ++ man/MLE.TVGEV.Rd | 18 ++++++++--- vignettes/NSGEVTS.Rmd | 12 +++---- 6 files changed, 88 insertions(+), 40 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 0b41153..be4ce46 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -9,7 +9,6 @@ Authors@R: role = c("cre", "aut"), email = "deville.yves@alpestat.com", comment = c(ORCID = "0000-0002-1233-488X"))) -Maintainer: Yves Deville Description: Utility functions for Non-Stationary time series with GEV margins. License: GPL-3 LazyData: yes diff --git a/NEWS.md b/NEWS.md index ec2baea..31f9474 100644 --- a/NEWS.md +++ b/NEWS.md @@ -2,7 +2,7 @@ **NSGEV** Package News ====================== -# New in version 0.2.0 (branch `influence` +# New in version 0.2.0 (branch `influence`) ## Enhancements @@ -14,8 +14,22 @@ ## Bug fixes -- The generalised residuals computed with `"gumbel"` were - actually *reversed* gumbel. +- The generalised residuals computed with `"gumbel"` were actually + following the *reversed* Gumbel, not the Gumbel. New (experimental) + choice `"gev4"` for the target distribution. + +- When `TVGEV` was used with `optim = "nloptr"`, the choice `parTrack + = TRUE` did not work as expected. + +## Changes + +- The (non-exported) `MLE.TVGEV` function now has a `trace` argument + which is set to the value of `trace` argument of `TVGEV`. When + `estim = "nloptr"` and a value `> 2` is given the values of the + parameter and of the objective are traced. + +- The Hessian of the negalive log-likelihood is now exact and no longer + computed with `optimHessian`. # New in version 0.2.0 diff --git a/R/TVGEV.R b/R/TVGEV.R index 2bdb996..a5022b6 100644 --- a/R/TVGEV.R +++ b/R/TVGEV.R @@ -1,5 +1,4 @@ - ##***************************************************************************** ##' @description Compute the GEV parameters for the marginal ##' distributions of a \code{TVGEV} model. @@ -201,7 +200,7 @@ parIni.TVGEV <- function(object, y = NULL) { ##' psi0 = NULL, estim = c("optim", "nloptr"), ##' coefLower = if (estim != "nloptr") numeric(0) else c("xi_0" = -0.9), ##' coefUpper = if (estim != "nloptr") numeric(0) else c("xi_0" = 2.0), -##' parTrack = FALSE) +##' parTrack = FALSE, trace = 0) ##' ##' @param object A (possibly incomplete) \code{TVGEV} object. ##' @@ -212,14 +211,24 @@ parIni.TVGEV <- function(object, y = NULL) { ##' @param estim Character giving the optimisation to be used. ##' ##' @param coefLower,coefUpper Numeric vectors or \code{NULL} giving -##' bounds on the parameters. These are used overwrite the "normal" -##' values which are \code{-Inf} and \code{Inf}. These arguments are -##' only used when \code{estim} is \code{"nloptr"}. +##' bounds on the parameters. These are used overwrite the +##' "normal" values which are \code{-Inf} and \code{Inf}. These +##' arguments are only used when \code{estim} is \code{"nloptr"}. +##' These vectors must have \emph{suitably named} elements. It +##' is not necessary to give values for all the elements: the +##' "normal" infinite values will continue to hold for the +##' parameters for which the bounds are not given. When the scale +##' parameter is constant it may help to give a positive value for +##' the element \code{"sigma_0"} of \code{coefLower}. When the +##' shape is constant it may help to give bounds such as such as +##' \code{-0.5} and \code{0.5} for the element \code{"xi_0"}. ##' ##' @param parTrack \code{Logical}. If \code{TRUE}, all parameters at ##' which an evaluation of the log-Likelihood will be stored and ##' returned. ##' +##' @param trace Integer level of verbosity. +##' ##' @return A list with elements that can be copied into those ##' of a \code{TVGEV} object. ##' @@ -246,7 +255,8 @@ MLE.TVGEV <- function(object, estim = c("optim", "nloptr"), coefLower = if (estim != "nloptr") numeric(0) else c("xi_0" = -0.9), coefUpper = if (estim != "nloptr") numeric(0) else c("xi_0" = 2.0), - parTrack = FALSE) { + parTrack = FALSE, + trace = 0) { parNames.GEV <- c("loc", "scale", "shape") @@ -383,7 +393,7 @@ MLE.TVGEV <- function(object, if (parTrack) { negLogLikFun1 <- function(psi, deriv = FALSE, hessian = FALSE, object) { - trackEnv$psi <- c(trackEnv$psi, psi) + trackEnv$psi <- c(trackEnv$psi, psi) negLogLikFun(psi = psi, deriv = deriv, hessian = hessian, object = object) } } else { @@ -393,12 +403,16 @@ MLE.TVGEV <- function(object, cvg <- TRUE if (estim == "optim") { - + if (trace) { + cat("o Mininimisation of the negative log-likelihood\n", + " using `stats::optim`.\n") + } res$fit <- try(optim(par = psi0, fn = negLogLikFun1, deriv = FALSE, hessian = FALSE, - control = list(maxit = 1000), + control = list(maxit = 1000, + trace = pmax(trace - 1, 0)), ## hessian = TRUE, object = object)) @@ -410,18 +424,25 @@ MLE.TVGEV <- function(object, res$negLogLik <- res$fit$value } else { cvg <- FALSE + cat(" The optimisation failed to converge.", + " Hints: give `psi0`, try using `estim = \"nloptr\",", + " give lower and upper bounds.\n") } } } else if (estim == "nloptr") { - + if (trace) { + cat("o Minimisation of the negative log-likelihood", + " using `nloptr::nloptr`.\n") + } opts <- list("algorithm" = "NLOPT_LD_LBFGS", "xtol_rel" = 1.0e-8, "xtol_abs" = 1.0e-8, "ftol_abs" = 1e-5, - "maxeval" = 1000, "print_level" = 0, + "maxeval" = 1000, + "print_level" = pmax(trace - 1, 0), "check_derivatives" = FALSE) - + ## XXX caution! this works when the shape is constant only!!! p <- object$p @@ -456,7 +477,7 @@ MLE.TVGEV <- function(object, } res$fit <- try(nloptr(x0 = psi0, - eval_f = negLogLikFun, + eval_f = negLogLikFun1, lb = lb, ub = ub, deriv = TRUE, @@ -477,6 +498,11 @@ MLE.TVGEV <- function(object, res$negLogLik <- res$fit$objective } else { cvg <- FALSE + if (trace) { + cat(" The optimisation failed to converge.", + " Hints: try using `estim = \"optim\",", + " give `psi0`, give lower and upper bounds.\n") + } } } @@ -497,21 +523,17 @@ MLE.TVGEV <- function(object, res$theta <- psi2theta(object, psi = psiHat, checkNames = FALSE) ## compute Hessian. - ## res$hessian <- hessian(func = negLogLikFun, - ## x = res$estimate, deriv = FALSE, - ## object = object) - - res$hessian <- optimHess(par = res$estimate, - fn = negLogLikFun, - deriv = FALSE, - object = object) + res$hessian <- negLogLikFun(psi = res$estimate, + deriv = TRUE, hessian = TRUE, + object = object)$hessian vcov <- try(solve(res$hessian), silent = TRUE) - if (!inherits(vcov, "try-error")) { - rownames(vcov) <- colnames(vcov) <- object$parNames - res$vcov <- vcov - res$sd <- sqrt(diag(vcov)) + rownames(vcov) <- colnames(vcov) <- object$parNames + res$vcov <- vcov + res$sd <- sqrt(diag(vcov)) + } else { + warning("The (exact) Hessian is not numerically invertible") } } @@ -1155,7 +1177,8 @@ TVGEV <- function(data, estim = estim, coefLower = coefLower, coefUpper = coefUpper, - parTrack = parTrack) + parTrack = parTrack, + trace = trace) ## copy for (nm1 in names(res)) { diff --git a/TODO.md b/TODO.md index a0b127e..800665e 100644 --- a/TODO.md +++ b/TODO.md @@ -4,6 +4,8 @@ This is a temporary reminder list by YD. Not a planning for new development! +- [ ] Make the `predictUncond` function deprecated? + - [ ] **`anova` name** Make an alias of the `anova` method under a better name making clear that this is for a Likelihood Ratio test. May be `LR.test`. diff --git a/man/MLE.TVGEV.Rd b/man/MLE.TVGEV.Rd index 62f9fa9..c7306f5 100644 --- a/man/MLE.TVGEV.Rd +++ b/man/MLE.TVGEV.Rd @@ -8,7 +8,7 @@ MLE.TVGEV(object, y = NULL, psi0 = NULL, estim = c("optim", "nloptr"), coefLower = if (estim != "nloptr") numeric(0) else c("xi_0" = -0.9), coefUpper = if (estim != "nloptr") numeric(0) else c("xi_0" = 2.0), - parTrack = FALSE) + parTrack = FALSE, trace = 0) } \arguments{ \item{object}{A (possibly incomplete) \code{TVGEV} object.} @@ -20,13 +20,23 @@ MLE.TVGEV(object, y = NULL, \item{estim}{Character giving the optimisation to be used.} \item{coefLower, coefUpper}{Numeric vectors or \code{NULL} giving -bounds on the parameters. These are used overwrite the "normal" -values which are \code{-Inf} and \code{Inf}. These arguments are -only used when \code{estim} is \code{"nloptr"}.} +bounds on the parameters. These are used overwrite the +"normal" values which are \code{-Inf} and \code{Inf}. These +arguments are only used when \code{estim} is \code{"nloptr"}. +These vectors must have \emph{suitably named} elements. It +is not necessary to give values for all the elements: the +"normal" infinite values will continue to hold for the +parameters for which the bounds are not given. When the scale +parameter is constant it may help to give a positive value for +the element \code{"sigma_0"} of \code{coefLower}. When the +shape is constant it may help to give bounds such as such as +\code{-0.5} and \code{0.5} for the element \code{"xi_0"}.} \item{parTrack}{\code{Logical}. If \code{TRUE}, all parameters at which an evaluation of the log-Likelihood will be stored and returned.} + +\item{trace}{Integer level of verbosity.} } \value{ A list with elements that can be copied into those diff --git a/vignettes/NSGEVTS.Rmd b/vignettes/NSGEVTS.Rmd index 834676c..93a0938 100644 --- a/vignettes/NSGEVTS.Rmd +++ b/vignettes/NSGEVTS.Rmd @@ -248,12 +248,12 @@ the Gumbel distribution, it may be a good idea to check the influence of the corresponding observation on the fit. When the variable `SOI` is used, the two years `1903` and `1914` have -quite different residual although they correspond to nearly the same -value of the sea level, because they correspond to quite different -values of `SOI`. Although they correspond to severe coastal floodings, -the largest sea levels in the dataset correspond to somewhat of the -residuals. This may mean that coastal flood defenses will have to be -constantly improved. +different residuals although they correspond to the same value of the +sea level, because they correspond to different values of +`SOI`. Although they correspond to severe coastal floodings, the +largest sea levels in the dataset correspond to somewhat "normal" +values of the residuals. This may mean that coastal flood defenses +will have to be constantly improved. ## Comparing nested models with likelihood-ratio tests From f10a1c5ca7897c293b14b78e75894612a972f811 Mon Sep 17 00:00:00 2001 From: yvesdeville Date: Thu, 28 Aug 2025 11:03:28 +0200 Subject: [PATCH 8/9] warn about variables in design --- .Rbuildignore | 3 ++- NEWS.md | 8 ++++++++ R/TVGEV.R | 13 +++++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/.Rbuildignore b/.Rbuildignore index c89cbfa..ef5f149 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -6,4 +6,5 @@ TODO* ^README.md ^README_files$ ^\.github$ -^vignettes/jss.bst \ No newline at end of file +^vignettes/jss.bst +^vignettes/*.Rnw \ No newline at end of file diff --git a/NEWS.md b/NEWS.md index 31f9474..31bda1f 100644 --- a/NEWS.md +++ b/NEWS.md @@ -11,6 +11,10 @@ created bugs!!! - New vignette *Timeseries Covariates with NSGEV*. DRAFT version. + +- A warning is cast when the `design` argument of `TVGEV` is a call + using variables not in `names(data)`. These variables may or may not + be found in the parent environment. ## Bug fixes @@ -30,6 +34,10 @@ - The Hessian of the negalive log-likelihood is now exact and no longer computed with `optimHessian`. + +- The `.Rnw` vignettes, such as the technical vignette `CompDet.Rnw` + should no longer be built. Only the pdf will be shipped with the + package tarball. # New in version 0.2.0 diff --git a/R/TVGEV.R b/R/TVGEV.R index a5022b6..9210d6c 100644 --- a/R/TVGEV.R +++ b/R/TVGEV.R @@ -1055,10 +1055,23 @@ TVGEV <- function(data, desVars <- setdiff(allVars, names(data)) if (!is.null(tv$design)) { + if (is.call(tv$design)) { dfAll <- as.data.frame(eval(tv$design, envir = data)) ## dfAll <- data.frame(data[ , response], dfAll) ## colnames(dfAll) <- c(response, colnames(dfAll)[-1]) + desVarsRaw <- all.vars(tv$design) + if (length(desVarsRaw)) { + ind <- is.na(match(desVarsRaw, names(data))) + if (any(ind)) { + warning("'design' uses variables not in `data`: ", + paste(sprintf("`%s`", desVarsRaw[ind]), + collapse = ", "), + ".\n This may be a source of problems in scoping, ", + "because these variables are\n at the best found ", + "in an environment differing from `data`.") + } + } } else { dfAll <- tv$design } From cee7ece52bb42ca93f37e7072af41e622abcba2b Mon Sep 17 00:00:00 2001 From: yvesdeville Date: Thu, 28 Aug 2025 17:10:01 +0200 Subject: [PATCH 9/9] .Rbuilignore --- .Rbuildignore | 4 +++- vignettes/NSGEVCompDet.Rnw | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.Rbuildignore b/.Rbuildignore index ef5f149..afad9ea 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -7,4 +7,6 @@ TODO* ^README_files$ ^\.github$ ^vignettes/jss.bst -^vignettes/*.Rnw \ No newline at end of file +^vignettes/NSGEVCompDet.Rnw +^vignettes/NSGEVCompDet.R +^vignettes/NSGEVCompDet.pdf \ No newline at end of file diff --git a/vignettes/NSGEVCompDet.Rnw b/vignettes/NSGEVCompDet.Rnw index 467b25a..95baf9d 100644 --- a/vignettes/NSGEVCompDet.Rnw +++ b/vignettes/NSGEVCompDet.Rnw @@ -1,6 +1,6 @@ \documentclass[11pt,a4paper]{article} -%\VignetteIndexEntry{Mauna Loa Example from Rasmussen and Williams' Book} +%\VignetteIndexEntry{Computing Details for NSGEV} %\VignetteEngine{knitr::knitr} \usepackage{makeidx} \usepackage{amsmath,amssymb,amsthm}