From 17605fcb2f14e2a571a01f11256f59fff6343d0a Mon Sep 17 00:00:00 2001 From: Martin Durocher Date: Tue, 16 Jul 2019 11:00:29 -0400 Subject: [PATCH 01/21] update rfa --- CSHShydRology.Rproj | 2 +- DESCRIPTION | 6 +- NAMESPACE | 93 +++++ R/rfa_CvRoi.R | 231 ++++++++++ R/rfa_DataWide.R | 126 ++++++ R/rfa_DistSeason.R | 80 ++++ R/rfa_ExtractAmax.R | 107 +++++ R/rfa_FindNearest.R | 90 ++++ R/rfa_FindThresh.R | 152 +++++++ R/rfa_FitAmax.R | 270 ++++++++++++ R/rfa_FitGev.R | 156 +++++++ R/rfa_FitPot.R | 318 ++++++++++++++ R/rfa_FitRegLmom.R | 268 ++++++++++++ R/rfa_FitRoi.R | 369 ++++++++++++++++ R/rfa_GeoDist.R | 35 ++ R/rfa_GofTest.R | 361 ++++++++++++++++ R/rfa_Intersite.R | 286 +++++++++++++ R/rfa_JulianPlot.R | 82 ++++ R/rfa_PlotMrl.R | 92 ++++ R/rfa_PlotThresh.R | 164 ++++++++ R/rfa_PoolRemove.R | 177 ++++++++ R/rfa_RegSim.R | 214 ++++++++++ R/rfa_SearchThresh.R | 92 ++++ R/rfa_SeasonStat.R | 118 ++++++ R/rfa_amax.R | 69 +++ R/rfa_data.R | 55 +++ R/rfa_fgpa.R | 139 +++++++ R/rfa_gpa.R | 138 ++++++ R/rfa_plot_amax.R | 77 ++++ R/rfa_predict_amax.R | 166 ++++++++ R/rfa_predict_fpot.R | 200 +++++++++ R/rfa_predict_reglmom.R | 111 +++++ R/rfa_which_floodPeaks.R | 201 +++++++++ data/flowAtlantic.rda | Bin 0 -> 14731 bytes data/flowStJohn.rda | Bin 0 -> 136133 bytes data/flowUngauged.rda | Bin 0 -> 42468 bytes man/Amax.Rd | 56 +++ man/CvRoi.Rd | 103 +++++ man/DataWide.Rd | 48 +++ man/DistSeason.Rd | 47 +++ man/ExtractAmax.Rd | 40 ++ man/FindNearest.Rd | 75 ++++ man/FindThresh.Rd | 93 +++++ man/FitAmax.Rd | 83 ++++ man/FitGev.Rd | 70 ++++ man/FitPot.Rd | 117 ++++++ man/FitRegLmom.Rd | 99 +++++ man/FitRoi.Rd | 121 ++++++ man/GPA.Rd | 63 +++ man/GeoDist.Rd | 37 ++ man/GofTest.Rd | 69 +++ man/Intersite.Rd | 104 +++++ man/JulianPlot.Rd | 33 ++ man/PlotMrl.Rd | 50 +++ man/PlotThresh.Rd | 42 ++ man/PoolRemove.Rd | 63 +++ man/RegSim.Rd | 71 ++++ man/SearchThresh.Rd | 42 ++ man/SeasonStat.Rd | 57 +++ man/fgpa.Rd | 58 +++ man/flowAtlantic.Rd | 24 ++ man/flowStJohn.Rd | 22 + man/flowUngauged.Rd | 38 ++ man/plot.amax.Rd | 38 ++ man/predict.amax.Rd | 54 +++ man/predict.fpot.Rd | 47 +++ man/predict.reglmom.Rd | 65 +++ man/which.floodPeaks.Rd | 90 ++++ tests/testthat/test_rfa_CvRoi.R | 78 ++++ tests/testthat/test_rfa_DataWide.R | 122 ++++++ tests/testthat/test_rfa_DistSeason.R | 29 ++ tests/testthat/test_rfa_ExtractAmax.R | 95 +++++ tests/testthat/test_rfa_FindNearest.R | 36 ++ tests/testthat/test_rfa_FitAmax.R | 85 ++++ tests/testthat/test_rfa_FitGev.R | 25 ++ tests/testthat/test_rfa_FitPot.R | 89 ++++ tests/testthat/test_rfa_FitRegLmom.R | 105 +++++ tests/testthat/test_rfa_FitRoi.R | 160 +++++++ tests/testthat/test_rfa_Intersite.R | 127 ++++++ tests/testthat/test_rfa_PoolRemove.R | 50 +++ tests/testthat/test_rfa_SeasonStat.R | 22 + tests/testthat/test_rfa_amax.R | 30 ++ tests/testthat/test_rfa_fgpa.R | 24 ++ tests/testthat/test_rfa_gof.R | 32 ++ tests/testthat/test_rfa_gpa.R | 50 +++ tests/testthat/test_rfa_pot.R | 122 ++++++ tests/testthat/test_rfa_predict_amax.R | 33 ++ tests/testthat/test_rfa_predict_fpot.R | 40 ++ tests/testthat/test_rfa_predict_reglmom.R | 54 +++ tests/testthat/test_rfa_regsim.R | 214 ++++++++++ vignettes/Pauls_demo.html | 61 +-- vignettes/hydrograph_plot.html | 382 +++++++++++++---- vignettes/rfa_amax.R | 57 +++ vignettes/rfa_amax.Rmd | 201 +++++++++ vignettes/rfa_amax.html | 446 ++++++++++++++++++++ vignettes/rfa_gauged.R | 91 ++++ vignettes/rfa_gauged.Rmd | 363 ++++++++++++++++ vignettes/rfa_gauged.html | 486 ++++++++++++++++++++++ vignettes/rfa_pot.R | 104 +++++ vignettes/rfa_pot.Rmd | 312 ++++++++++++++ vignettes/rfa_pot.html | 471 +++++++++++++++++++++ vignettes/rfa_ungauged.R | 19 + vignettes/rfa_ungauged.Rmd | 381 +++++++++++++++++ vignettes/rfa_ungauged.html | 322 ++++++++++++++ 104 files changed, 12252 insertions(+), 130 deletions(-) create mode 100644 R/rfa_CvRoi.R create mode 100644 R/rfa_DataWide.R create mode 100644 R/rfa_DistSeason.R create mode 100644 R/rfa_ExtractAmax.R create mode 100644 R/rfa_FindNearest.R create mode 100644 R/rfa_FindThresh.R create mode 100644 R/rfa_FitAmax.R create mode 100644 R/rfa_FitGev.R create mode 100644 R/rfa_FitPot.R create mode 100644 R/rfa_FitRegLmom.R create mode 100644 R/rfa_FitRoi.R create mode 100644 R/rfa_GeoDist.R create mode 100644 R/rfa_GofTest.R create mode 100644 R/rfa_Intersite.R create mode 100644 R/rfa_JulianPlot.R create mode 100644 R/rfa_PlotMrl.R create mode 100644 R/rfa_PlotThresh.R create mode 100644 R/rfa_PoolRemove.R create mode 100644 R/rfa_RegSim.R create mode 100644 R/rfa_SearchThresh.R create mode 100644 R/rfa_SeasonStat.R create mode 100644 R/rfa_amax.R create mode 100644 R/rfa_data.R create mode 100644 R/rfa_fgpa.R create mode 100644 R/rfa_gpa.R create mode 100644 R/rfa_plot_amax.R create mode 100644 R/rfa_predict_amax.R create mode 100644 R/rfa_predict_fpot.R create mode 100644 R/rfa_predict_reglmom.R create mode 100644 R/rfa_which_floodPeaks.R create mode 100644 data/flowAtlantic.rda create mode 100644 data/flowStJohn.rda create mode 100644 data/flowUngauged.rda create mode 100644 man/Amax.Rd create mode 100644 man/CvRoi.Rd create mode 100644 man/DataWide.Rd create mode 100644 man/DistSeason.Rd create mode 100644 man/ExtractAmax.Rd create mode 100644 man/FindNearest.Rd create mode 100644 man/FindThresh.Rd create mode 100644 man/FitAmax.Rd create mode 100644 man/FitGev.Rd create mode 100644 man/FitPot.Rd create mode 100644 man/FitRegLmom.Rd create mode 100644 man/FitRoi.Rd create mode 100644 man/GPA.Rd create mode 100644 man/GeoDist.Rd create mode 100644 man/GofTest.Rd create mode 100644 man/Intersite.Rd create mode 100644 man/JulianPlot.Rd create mode 100644 man/PlotMrl.Rd create mode 100644 man/PlotThresh.Rd create mode 100644 man/PoolRemove.Rd create mode 100644 man/RegSim.Rd create mode 100644 man/SearchThresh.Rd create mode 100644 man/SeasonStat.Rd create mode 100644 man/fgpa.Rd create mode 100644 man/flowAtlantic.Rd create mode 100644 man/flowStJohn.Rd create mode 100644 man/flowUngauged.Rd create mode 100644 man/plot.amax.Rd create mode 100644 man/predict.amax.Rd create mode 100644 man/predict.fpot.Rd create mode 100644 man/predict.reglmom.Rd create mode 100644 man/which.floodPeaks.Rd create mode 100644 tests/testthat/test_rfa_CvRoi.R create mode 100644 tests/testthat/test_rfa_DataWide.R create mode 100644 tests/testthat/test_rfa_DistSeason.R create mode 100644 tests/testthat/test_rfa_ExtractAmax.R create mode 100644 tests/testthat/test_rfa_FindNearest.R create mode 100644 tests/testthat/test_rfa_FitAmax.R create mode 100644 tests/testthat/test_rfa_FitGev.R create mode 100644 tests/testthat/test_rfa_FitPot.R create mode 100644 tests/testthat/test_rfa_FitRegLmom.R create mode 100644 tests/testthat/test_rfa_FitRoi.R create mode 100644 tests/testthat/test_rfa_Intersite.R create mode 100644 tests/testthat/test_rfa_PoolRemove.R create mode 100644 tests/testthat/test_rfa_SeasonStat.R create mode 100644 tests/testthat/test_rfa_amax.R create mode 100644 tests/testthat/test_rfa_fgpa.R create mode 100644 tests/testthat/test_rfa_gof.R create mode 100644 tests/testthat/test_rfa_gpa.R create mode 100644 tests/testthat/test_rfa_pot.R create mode 100644 tests/testthat/test_rfa_predict_amax.R create mode 100644 tests/testthat/test_rfa_predict_fpot.R create mode 100644 tests/testthat/test_rfa_predict_reglmom.R create mode 100644 tests/testthat/test_rfa_regsim.R create mode 100644 vignettes/rfa_amax.R create mode 100644 vignettes/rfa_amax.Rmd create mode 100644 vignettes/rfa_amax.html create mode 100644 vignettes/rfa_gauged.R create mode 100644 vignettes/rfa_gauged.Rmd create mode 100644 vignettes/rfa_gauged.html create mode 100644 vignettes/rfa_pot.R create mode 100644 vignettes/rfa_pot.Rmd create mode 100644 vignettes/rfa_pot.html create mode 100644 vignettes/rfa_ungauged.R create mode 100644 vignettes/rfa_ungauged.Rmd create mode 100644 vignettes/rfa_ungauged.html diff --git a/CSHShydRology.Rproj b/CSHShydRology.Rproj index 1788e68..eaa6b81 100644 --- a/CSHShydRology.Rproj +++ b/CSHShydRology.Rproj @@ -15,4 +15,4 @@ LaTeX: pdfLaTeX BuildType: Package PackageUseDevtools: Yes PackageInstallArgs: --no-multiarch --with-keep.source -PackageRoxygenize: rd,collate,namespace,vignette +PackageRoxygenize: rd,collate,namespace diff --git a/DESCRIPTION b/DESCRIPTION index 85f24b8..2766770 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -21,7 +21,11 @@ Imports: timeDate, stringr, jsonlite, - curl + curl, + gstat, + lmomco, + lmomRFA, + numDeriv Suggests: knitr, testthat, diff --git a/NAMESPACE b/NAMESPACE index 623d565..30f7a4a 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,11 +1,92 @@ # Generated by roxygen2: do not edit by hand +S3method(AIC,amax) +S3method(AIC,fpot) +S3method(DataWide,data.frame) +S3method(DataWide,formula) +S3method(DataWide,matrix) +S3method(DistSeason,data.frame) +S3method(DistSeason,formula) +S3method(DistSeason,matrix) +S3method(DistSeason,numeric) +S3method(ExtractAmax,default) +S3method(ExtractAmax,formula) +S3method(FitPot,data.frame) +S3method(FitPot,formula) +S3method(FitPot,matrix) +S3method(FitPot,numeric) +S3method(GeoDist,default) +S3method(GeoDist,formula) +S3method(GofTest,amax) +S3method(GofTest,fpot) +S3method(RegSim,data.frame) +S3method(RegSim,matrix) +S3method(RegSim,reglmom) +S3method(SeasonStat,data.frame) +S3method(SeasonStat,default) +S3method(SeasonStat,formula) +S3method(as.list,amax) +S3method(coef,amax) +S3method(coef,fpot) +S3method(coef,reglmom) +S3method(head,roicv) +S3method(logLik,fpot) +S3method(plot,amax) +S3method(plot,isite) +S3method(plot,reglmom) +S3method(plot,roicv) +S3method(predict,amax) +S3method(predict,fpot) +S3method(predict,reglmom) +S3method(predict,roi) +S3method(print,amax) +S3method(print,amaxGof) +S3method(print,fpot) +S3method(print,isite) +S3method(print,reglmom) +S3method(print,roi) +S3method(residuals,roi) +S3method(simulate,amax) +S3method(vcov,amax) +S3method(vcov,fpot) +S3method(which.clusters,formula) +S3method(which.clusters,numeric) +S3method(which.floodPeaks,data.frame) +S3method(which.floodPeaks,formula) +S3method(which.floodPeaks,numeric) +export(CvRoi) +export(DataWide) +export(DistSeason) +export(ExtractAmax) +export(FindNearest) +export(FindThresh) +export(FitAmax) +export(FitGev) +export(FitPot) +export(FitRegLmom) +export(FitRoi) +export(GeoDist) +export(GofTest) +export(Intersite) +export(IntersiteMdl) +export(JulianPlot) +export(PlotMrl) +export(PlotThresh) +export(PoolRemove) +export(RegSim) +export(SearchThresh) +export(SeasonStat) export(binned_MannWhitney) export(booth_plot) export(cut_block) +export(dAmax) export(date_subset) +export(dgpa) export(doys) export(fdcurve) +export(fgpa1d) +export(fgpa2d) +export(fgpaLmom) export(flow_raster) export(flow_raster_qa) export(flow_raster_trend) @@ -13,21 +94,33 @@ export(get_AHCCD_monthly) export(get_peaks) export(get_wscstation) export(hydrograph_plot) +export(lAmax) +export(pAmax) +export(pgpa) export(polar_plot) export(polar_plot_prep) +export(qAmax) +export(qgpa) +export(rAmax) export(read_AHCCD_daily) export(read_AHCCD_monthly) export(read_ECDE_flows) export(regime_plot) +export(rgpa) +export(sitenames) export(slice) export(stack_EC) export(sub_set_Years) +export(which.clusters) +export(which.floodPeaks) export(wtr_yr) import(curl) import(fields) import(grDevices) import(graphics) import(jsonlite) +import(lmom) +import(lmomRFA) import(lubridate) import(stats) import(stringr) diff --git a/R/rfa_CvRoi.R b/R/rfa_CvRoi.R new file mode 100644 index 0000000..c22d129 --- /dev/null +++ b/R/rfa_CvRoi.R @@ -0,0 +1,231 @@ +######################################################################## +#' Cross-validation using region of influence and kriging +#' +#' Return a matrix of criteria evaluated by using region of +#' influence (ROI) and kriging. It includes: Root mean square error +#' (\code{rmse}), relative RMSE (\code{rrmse}), Nash-Sutcliffe (\code{nsh}), +#' Mean absolute deviation (\code{mad}), relative MAD (\code{rmad}) and +#' the skill score based on MAD (\code{smad}). +#' The latter \code{smad} has the same form as \code{nsh} except that +#' absolute error are taken instead of square error. +#' +#' @author Martin Durocher +#' +#' @param x Data. +#' +#' @param nk List of neighborhood sizes to try. +#' +#' @param phy Formula defining the physical descriptors. +#' +#' @param similarity Formula defining the covariates used +#' to evaluate the similarity between site, i.e. Euclidean distance to +#' the target. +#' +#' @param kriging Formula defining the spatial covariates. +#' Necessary for predicting residuals using spatial correlation. +#' +#' @param model Variogram model. See \link[gstat]{vgm}. +#' +#' @param ker Should a (Epanechnikov) kernel be used in to weight +#' local regression model. Otherwise uniform weight are used. +#' +#' @param kfold Number of group used in the cross-validation scheme. +#' Can also be a vector defining the group for each site. +#' +#' @param verbose Logical. Should a progress bar be displayed. +#' +#' @param crit Cross-validation criteria used to evaluate the best choice. +#' +#' @param best.col,best.pch,best.cex Argument for the point indication the best +#' choice. +#' +#' @param ... More arguments to pass to the plot function (\link{par}). +#' +#' +#' @references +#' +#' Martin Durocher, Donald H. Burn, Shabnam Mostofi Zadeh & Fahim Ashkar (2019) +#' Estimating flood quantiles at ungauged sites using nonparametric regression +#' methods with spatial components, Hydrological Sciences Journal, 64:9, +#' 1056-1070, https://doi.org/10.1080/02626667.2019.1620952 +#' +#' @seealso \link{FitRoi} +#' +#' @export +#' +#' @examples +#' +#' attach(flowUngauged) +#' +#' ## Using multidimensional scaling for projecting coordinates +#' coord <- cbind(lon,lat) +#' coord <- cmdscale(GeoDist(coord)) +#' colnames(coord) <- c('lon','lat') +#' +#' ## Transform data if necessary +#' xdf <- data.frame(y = log(l1), +#' area = scale(log(area)), +#' wb = scale(log(wb)), +#' stream = scale(log(stream)), +#' map = scale(log(map)), +#' coord) +#' +#' ## select a validation and training set +#' set.seed(9382) +#' vid <- runif(nrow(xdf)) > .8 +#' tid <- !vid +#' +#' # formula of the relationship between flood quantile and descriptors +#' fphy <- y ~ area + map + wb + stream +#' fsimilarity <- ~ area + map +#' +#' ## Perform cross-validation. +#' system.time(out <- CvRoi(x = xdf, nk = seq(20,150, 10), fold = 5, +#' phy = fphy, similarity = fsimilarity, model = 'Exp', +#' nmax = 20)) +#' +#' head(out, 'nsh') +#' plot(out, 'mad') +#' +CvRoi <- + function(x, + nk, + phy, + similarity, + kriging = NULL, + ker = TRUE, + model = 'Exp', + fold = 5, + verbose = TRUE){ + + x <- as.data.frame(x) + + ## Get response variable + y <- eval(phy[[2]], envir = x) + n <- length(y) + + ## Create indexes of cross-validation group + if(length(fold) == 1){ + ifold <- sample(rep_len(1:fold, n)) + fold <- 1:fold + } else { + ifold <- as.integer(factor(fold)) + fold <- 1:length(unique(ifold)) + } + + ## ---------------------------------------------------------------- + ## Function that compute the cross-validation criteria for a given + ## neighborhood size + ## --------------------------------------------------------------- + FunCv <- function(nk0){ + + ## Compute prediction by local regression + pred <- rep(NA,n) + for(jj in fold){ + + pred[ifold == jj] <- + FitRoi(x = x[ifold != jj,], + xnew = x[ifold == jj,], + nk = nk0, + phy = phy, + similarity = similarity, + kriging = kriging, + model = model, + ker = ker)$pred + } + + ## Compute cross-validation criteria + err <-pred - y + rerr <- pred / y - 1 + + return(c(rmse = sqrt(mean(err^2)), + rrmse = sqrt(mean(rerr^2)), + nsh = 1 - sum(err^2)/sum((y-mean(y))^2), + mad = mean(abs(err)), + rmad = mean(abs(rerr)), + smad = 1 - sum(abs(err))/sum(abs(y-mean(y))) + )) + + } + + ## ---------------------------- + ## Perform cross-validation + ## ---------------------------- + cv <- data.frame(matrix(NA, length(nk),6)) + colnames(cv) <- c('rmse','rrmse','nsh','mad','rmad','smad') + best <- Inf + + if(verbose) + bar <- txtProgressBar() + + for(ii in seq_along(nk)){ + + if(verbose) + setTxtProgressBar(bar, ii/length(nk)) + + ## Get the cross-validation criteria for every sites + cv[ii,] <- FunCv(nk[ii]) + } + + ## return + + ans <- cbind(nk, cv) + class(ans) <- append('roicv', class(ans)) + + return(ans) +} + +#' @export +#' @rdname CvRoi +head.roicv <- function(obj, crit = 'mad'){ + + lstCrit <- c('rmse','rrmse','nsh','mad','rmad','smad') + bid <- which(crit == lstCrit)+1 + + ## Find the best row + if(crit %in% c('nsh','smad')){ + best <- order(obj[,bid], decreasing = TRUE)[1:3] + } else{ + best <- order(obj[,bid])[1:3] + } + + + cat('\nCross-validation for Region of Influence (ROI)\n') + cat('\nBest 3 sizes of neighborhood\n') + ans <- as.matrix(obj[best,]) + print(ans) + +} + +#' @export +#' @rdname CvRoi +plot.roicv <- + function(obj, + crit = 'mad', + best.col = 'red', + best.pch = 16, + best.cex = 1, ...){ + + ## Find the columns of the required criteria + lstCrit <- c('rmse','rrmse','nsh','mad','rmad','smad') + + bid <- which(crit == lstCrit)+1 + + ## Find the best row + if(crit %in% c('nsh','smad')){ + best <- which.max(obj[,bid]) + } else{ + best <- which.min(obj[,bid]) + } + + # produce the graph + form <- as.formula(paste(crit,'~nk')) + plot(form, obj, type = 'l', ...) + + points(obj[best,1], + obj[best,bid], + col = best.col, + pch = best.pch, + cex = best.cex) +} + diff --git a/R/rfa_DataWide.R b/R/rfa_DataWide.R new file mode 100644 index 0000000..47eb611 --- /dev/null +++ b/R/rfa_DataWide.R @@ -0,0 +1,126 @@ +############################################################################## +#' Transpose dataset to a wide format +#' +#' Return a matrix where columns correspond to data. +#' Each row represent a specific time and missing values are added where need. +#' The pivoted variable should be a numerical value. +#' +#' @author Martin Durocher +#' +#' @param x Dataset in long format. First column should be the value +#' to transpose. +#' The second and third columns are respectively site and time variable. +#' If the time variable is omitted, the pivot will ignore it and all columns +#' will start at the first position. +#' +#' @param form Formula that specifies the site and time variable. +#' Must have the form: `value ~ site + time`. +#' +#' @export +#' +#' @examples +#' +#' data(flowAtlantic) +#' xd <- flowAtlantic$ams +#' +#' ## transpose by year +#' xd$year <- format(xd$date, '%Y') +#' DataWide(ams ~ id + year, xd)[60:70,1:5] +#' +#' ## Without time +#' DataWide(ams ~ id, xd)[1:6,1:5] +#' +DataWide <- function(x,...) UseMethod('DataWide',x) + +#' @export +#' @rdname DataWide +DataWide.data.frame <- function(x, order.time = TRUE, order.site = FALSE){ + + ## Verify if there is a time variable + if(ncol(x) == 3){ + ind <- FALSE + + ## verify that there is no duplicate + if(max(table(x[,2],x[,3]))>1) + stop('There is some duplicates') + + } else if(ncol(x) == 2){ + ind <- TRUE + } else{ + stop('Wrong number of variables') + } + + ## Verify that there is no missing value in the data + ## including site and time + x <- na.omit(x) + + ##---------------------------------## + ## reshape data in matrix wide format + ##---------------------------------## + + ## Extract level for the site and time id + site.un <- unique(x[,2]) + site.name <- as.character(site.un) + site.order <- order(site.un) + + nsite <- length(site.name) + + if(nsite < 2) + stop('Must have more than one site') + + ## Transform site and time id in integer + x[,2] <- as.integer(factor(as.character(x[,2]), levels = site.name)) + + if(ind){ + vtime <- lapply(split(x[,2],x[,2]),seq_along) + x <- cbind(x,unsplit(vtime, x[,2])) + + } else { + + time.un <- unique(x[,3]) + time.name <- as.character(time.un) + time.order <- order(time.un) + + x[,3] <- as.integer(factor(as.character(x[,3]), levels = time.name)) + } + + ## split the data in list + xlst <- split(x, x[,2]) + + ## allocate memory + nc <- length(xlst) + nr <- max(x[,3]) + xmat <- matrix(NA, nr, nc) + + ## Affect the value to the wide format + for(jj in 1:nc) + xmat[xlst[[jj]][,3],jj] <- xlst[[jj]][,1] + + ## Format row and columns + colnames(xmat) <- site.name + + if(ind){ + rownames(xmat) <- 1:nr + } else{ + rownames(xmat) <- time.name + } + + ## If needed, sort the rows and columns + if(order.site) + xmat <- xmat[ ,site.order] + + if(order.time & !ind) + xmat <- xmat[time.order,] + + return(xmat) +} + +#' @export +#' @rdname DataWide +DataWide.formula <- function(form, x, ...) + DataWide(model.frame(form, x), ...) + +#' @export +#' @rdname DataWide +DataWide.matrix <- function(x, ...) + DataWide(as.data.frame(x), ...) \ No newline at end of file diff --git a/R/rfa_DistSeason.R b/R/rfa_DistSeason.R new file mode 100644 index 0000000..0530b4c --- /dev/null +++ b/R/rfa_DistSeason.R @@ -0,0 +1,80 @@ +############################################################################## +#' Distance in seasonal space +#' +#' Return a matrix of distances between points in the seasonal space that +#' characterizes timing and regularity. +#' It is equivalent to Euclidean distance applied to regularity (radius) +#' and timing (angle) separately. +#' +#' @author Martin Durocher +#' +#' @param r,a Coordinates in the seasonal space: radius `r` and angle `a`. +#' +#' @param form,x Formula and dataset providing the coordinates of the +#' seasonal space. Must be of the form `radius ~ angle`. +#' +#' @param w Weight to favor angle over radius. +#' By default it is 1/pi, which bring angle in the interval [0,1]. +#' +#' @references +#' +#' Durocher, M., Burn, D. H., & Ashkar, F. (2019). Comparison of estimation +#' methods for a nonstationary index-flood model in flood frequency +#' analysis using peaks over threshold. https://doi.org/10.31223/osf.io/rnepc +#' +#' @export +#' +#' @examples +#' +#' scoord <- data.frame(radius = runif(5), +#' angle = runif(5,0,2*pi)) +#' +#' DistSeason(scoord) +#' DistSeason(radius ~ angle , scoord) +#' +#' +DistSeason <- function(x,...) UseMethod('DistSeason', x) + +#' @export +DistSeason.numeric <- function(r, a, w = 1/pi){ + + ## Extract the pairs or every angles + n <- length(a) + + if(length(r) != n) + stop('Coordinates must be of the same length') + + id <- expand.grid(1:n, 1:n) + aii <- a[id[,1]] + ajj <- a[id[,2]] + + ## Compute the standardized absolute differences between angles + mn <- pmin(aii,ajj) + d <- pmax(aii-mn, ajj-mn) + d <- pmin(2*pi-d, d)*w + a.mat <- matrix(d, nrow = n) + + ## Compute the absolute differences between radius + r.mat <- as.matrix(dist(r, method = 'man')) + + ## squared distances + return(sqrt(r.mat^2 + a.mat^2)) +} + +#' @export +DistSeason.matrix <- function(x, w = 1/pi) + DistSeason(x[,1], x[,2], w) + +#' @export +#' @rdname DistSeason +DistSeason.data.frame <- function(x, w = 1/pi) + DistSeason(x[,1], x[,2], w) + +#' @export +#' @rdname DistSeason +DistSeason.formula <- function(form, x, w = 1/pi){ + x <- as.data.frame(x) + x <- model.frame(form, x) ## form = r ~ a + + return(DistSeason(x[,1], x[,2], w)) +} \ No newline at end of file diff --git a/R/rfa_ExtractAmax.R b/R/rfa_ExtractAmax.R new file mode 100644 index 0000000..cb08403 --- /dev/null +++ b/R/rfa_ExtractAmax.R @@ -0,0 +1,107 @@ +########################################################### +#' Extracts the annual maximums of a daily time series +#' +#' Returns a dataset containing the annual maximums, +#' the date and the number of observations during the year. +#' +#' @author Martin Durocher +#' +#' @param form Formula of the form \code{value ~ date} that specifies the +#' variable from which the annual maximums are extracted and a date variable. +#' +#' @param x Data. If no formula is passed, the first column must be the +#' value and the second the date. +#' +#' @param tol Filter the years having less than \code{tol} days. +#' +#' @param nlab,ylab Names for the added columns representing respectively +#' the number of yearly observations and the year. +#' If set to NULL the given column is not added. +#' +#' +#' @export +#' +#' @examples +#' +#' out <- ExtractAmax(flow ~ date, flowStJohn, tol = 350) +#' head(out) +#' +ExtractAmax <- function(x, ...) UseMethod('ExtractAmax',x) + +#' @export +#' @rdname ExtractAmax +ExtractAmax.formula <- function(form, x, tol = 0, ...){ + + ## reformat dataset according to formula + x <- get_all_vars(form,x) + + if(ncol(x) == 2){ + ## Case of one site + ans <- ExtractAmax(x, tol =tol, ...) + + } else { + ## case multiple sites + + ## split the site + xlst <- split(x[,c(1,3)], x[,2]) + site.value <- sapply(split(x[,2], x[,2]), '[',1) + + ## extract all annual maximums + ans <- lapply(xlst, ExtractAmax, tol = tol, ...) + + ## merge the results in one dataset + cname <- c(colnames(ans[[1]]), colnames(x)[2]) + + for(ii in seq_along(site.value)) + suppressWarnings(ans[[ii]] <- data.frame(ans[[ii]], site.value[ii])) + + ans <- do.call('rbind', ans) + + ## Fix names + colnames(ans) <- cname + rownames(ans) <- NULL + nc <- length(cname) + + ## reorder columns + if(nc == 3){ + ans <- ans[,c(1,3,2)] + } else { + ans <- ans[,c(1,nc,2,seq(3,nc-1))] + } + + } + + return(ans) +} + +#' @export +#' @rdname ExtractAmax +ExtractAmax.default <- + function(x, + tol = 0, + nlab = 'n', + ylab = 'yy'){ + + ## Split data by years + yy <- format(x[,2],'%Y') + xx <- data.frame(x[,1],seq(nrow(x))) + lx <- split(xx,yy) + + ## Identify the annual maximums and number of obs. + nx <- sapply(lx, nrow) + mx <- sapply(lx, function(z) z[which.max(z[,1]),2]) + + ## Filter the original dataset + mx <- mx[nx>=tol] + ans <- x[mx,] + rownames(ans) <- NULL + + ## add n obs. and years if needed + if(!is.null(nlab)) + ans[,nlab] <- nx[nx>=tol] + + if(!is.null(ylab)) + ans[,ylab] <- yy[mx] + + return(ans) +} \ No newline at end of file diff --git a/R/rfa_FindNearest.R b/R/rfa_FindNearest.R new file mode 100644 index 0000000..3419848 --- /dev/null +++ b/R/rfa_FindNearest.R @@ -0,0 +1,90 @@ +############################################################################### +#' Find the nearest sites +#' +#' Return a dataset including only the nearest site to a target. +#' The target has a zero distance and will be at the first column of the output. +#' +#' @author Martin Durocher +#' +#' @param x Dataset with sites in columns and time in row. +#' +#' @param distance Distances with the target. +#' +#' @param n Number of sites to keep. +#' +#' @param super.distance,super.n Distance and number of sites for the super +#' region. This allows to pre-filter sites according to a complementary +#' measure of similarity. +#' +#' @param row Logical. Should only the row of the nearest site be kept. +#' Must be used with correlation or square matrix. +#' +#' @section References: +#' +#' Mostofi Zadeh, S., Burn, D.H., 2019. A Super Region Approach to Improve +#' Pooled Flood Frequency Analysis. Canadian Water Resources Journal +#' 0, 1–14. https://doi.org/10.1080/07011784.2018.1548946 +#' +#' Durocher, M., Burn, D.H., Mostofi Zadeh, S., 2018. A nationwide regional +#' flood frequency analysis at ungauged sites using ROI/GLS with copulas and +#' super regions. Journal of Hydrology 567, 191–202. +#' https://doi.org/10.1016/j.jhydrol.2018.10.011 +#' +#' @export +#' +#' @seealso \link{DataWide} +#' +#' @examples +#' +#' ## Organize data in the proper format +#' attach(flowAtlantic) +#' ams$year <- format(ams$date, '%Y') +#' xmat <- DataWide(ams ~ id + year, ams) +#' dim(xmat) +#' +#' ## Find the nearest neirghbors using great-circle distance. +#' ## Note that it is a good habit to make sure that the column names matches +#' +#' h <- GeoDist(info[colnames(xmat), c('lon','lat')]) +#' xmat0 <- FindNearest(xmat, h[1,], 5) +#' dim(xmat0) +#' +#' ## Distance based on catchment characteristics +#' charac <- scale(log(info[,c('area','map')])) +#' h.super <- as.matrix(dist(charac)) +#' +#' ## Find among the 20 sites with the ones with the most similar +#' ## characteristics and keep the 5 nearest neighbors of the target. +#' xmat0 <- FindNearest(xmat, h[1,], 5, h.super[1,], 20) +#' dim(xmat0) +#' +#' ## subsample a distance or correlation matrix +#' xmat0 <- FindNearest(h, h[1,], 5, row = TRUE) +#' dim(xmat0) +#' +FindNearest <- + function(x, + distance, + n, + super.distance = NULL, + super.n = NULL, + row = FALSE){ + + ## Put a Inf distance to site that are not part of the super region + if(!is.null(super.distance)){ + cid <- order(super.distance)[1:super.n] + distance[-cid] <- Inf + } + + ## find nearest site + cid <- order(distance)[1:n] + + ## Remove the farthest sites + if(row){ + ans <- x[cid,cid] + } else{ + ans <- x[,cid] + } + + return(ans) +} \ No newline at end of file diff --git a/R/rfa_FindThresh.R b/R/rfa_FindThresh.R new file mode 100644 index 0000000..4ca90fe --- /dev/null +++ b/R/rfa_FindThresh.R @@ -0,0 +1,152 @@ +########################################################################## +#' Find automatically a best threshold +#' +#' The function \code{Findthresh} can be used to identify the best +#' threshold according to a specific rules. +#' +#' @author Martin Durocher +#' +#' @param x output form \link{SearchThresh}. +#' +#' @param method Method to identify the threshold. Must be one of +#' \code{sgn}, \code{sgn-max}, \code{sgn-ppy}, \code{max} or \code{ppy}. +#' +#' @param tol.sgn Selection criteria associated with a given p-value of +#' the Anderson-Darling test. +#' +#' @param tol.ppy Selection criteria associated with a given average of +#' peaks per year. +#' +#' @param qua Flood quantiles. Must be one of \code{'q2'}, \code{'q5'}, +#' \code{'q10'}, \code{'q20'}, \code{'q50'} or \code{'q100'}. +#' +#' @param tol.qua Selection criteria associated with a flood quantile. +#' +#' @param ppy Range of accepted averages of peaks per year. +#' +#' @details +#' +#' The method \code{sgn} find the first threshold that has a p-value over a +#' given value (\code{tol.sgn}) of the Anderson-Darling test, while \code{max} +#' find the maximum p-value. +#' The \code{ppy} method find the threshold that has the nearest average of +#' peaks per year to \code{tol.ppy}. +#' The method \code{sgn-max} find the thresholds associated with both methods +#' and return the lowest one. +#' The method \code{sgn-ppy} try first to find the \code{sgn} threshold. +#' If not threshold meets the required p-value, the \code{ppy} threshold is +#' returned. +#' +#' The criteria \code{ppy}, initially filter all the candidates thresholds that +#' are not found in a given interval of average peaks per year. +#' With the \code{sgn} method an additional condition associated to a flood +#' quantile \code{qua} can be specified. +#' It imposes that the relative discrepancies between the candidate threshold +#' and a reference is respected in addition to the criteria with the p-value. +#' This reference is the average of the flood quantiles of the 5 lowest +#' candidate thresholds in the set of candidates. +#' Normally, lower thresholds should have reached stability and their choice can +#' be controlled by the argument \code{ppy}. +#' +#' +#' @references +#' +#' Durocher, M., Zadeh, S. M., Burn, D. H., & Ashkar, F. (2018). Comparison of +#' automatic procedures for selecting flood peaks over threshold based on +#' goodness-of-fit tests. Hydrological Processes, 0(0). +#' https://doi.org/10.1002/hyp.13223 +#' +#' Solari, S., Eguen, M., Polo, M. J., & Losada, M. A. (2017). Peaks Over +#' Threshold (POT): A methodology for automatic threshold estimation using +#' goodness of fit p-value. Water Resources Research, 53(4), 2833-2849. +#' https://doi.org/10.1002/2016WR019426 + +#' +#' @export +#' +#' @examples +#' +#' ## Create list of candidate threshold +#' lstu <- which.floodPeaks(flow~date, flowStJohn, u =500, r = 14) +#' lstu <- sort(unique(flowStJohn[lstu,'flow'])) +#' lstu <- lstu[seq(1,length(lstu)-30,2)] +#' +#' out <- SearchThresh(flow~date, flowStJohn, u = lstu, declust = 'wrc', r = 14) +#' +#' cid <- c('u','ppy','ad') +#' FindThresh(out, method = 'sgn', tol.sgn = 0.25)[,cid] +#' FindThresh(out, method = 'ppy', tol.ppy = 2)[,cid] +#' FindThresh(out, method = 'max')[,cid] +#' +#' ## Make find the first threshold that have at-least p-value > 0.1 +#' ## and relative descripencies between Q100 of less than 20%. +#' ## Otherwise the ppy threshold is chosen. +#' ## Note here that sgn is chosen because the flood quantile stabilizes +#' ## quickly. +#' FindThresh(out, method = 'sgn-ppy', tol.sgn = 0.25, tol.ppy = 1.5, +#' ppy = c(1,3), qua = 'q10', tol.qua = 0.2)[,cid] +#' +#' +FindThresh <- + function(x, + method = 'sgn', + tol.sgn = 0.25, + tol.ppy = 2, + qua = 'q10', + tol.qua = Inf, + ppy = c(0, Inf)){ + + ## Filter by PPY + pid <- x$ppy >= ppy[1] & x$ppy <= ppy[2] + + if(any(pid)){ + x <- x[pid,] + } else{ + stop('There is no threshold found in the required PPY range.') + } + + ## Find automatic thresholds + if(!(qua %in% c('q2','q5','q10','q20','q50','q100'))) + stop('The selected quantile (qua) is not valid') + + ## Relative discrepencies with lowest estimated + qnmin <- min(5, sum(pid)) + qref <- mean(x[nrow(x)-1:qnmin,qua]) + quadif <- abs(1-x[,qua]/qref) + + ids <- which(x$ad >= tol.sgn & quadif <= tol.qua)[1] + idx <- which.max(x$ad) + idp <- which.min(abs(x$ppy - tol.ppy)) + + + if(method == 'max'){ + id <- idx + + } else if(method == 'ppy'){ + id <- idp + + } else if(method == 'sgn' ){ + + if(!is.na(ids)){ + id <- ids + } else { + id <- nrow(x) + } + + } else if(method == 'sgn-max'){ + id <- min(idx, ids) + + } else if(method == 'sgn-ppy'){ + + if(!is.na(ids)){ + id <- ids + } else{ + id <- idp + } + + } else { + stop('Not a valid automatic selection method.') + } + + return(x[id,]) +} \ No newline at end of file diff --git a/R/rfa_FitAmax.R b/R/rfa_FitAmax.R new file mode 100644 index 0000000..a4b35ed --- /dev/null +++ b/R/rfa_FitAmax.R @@ -0,0 +1,270 @@ +############################################################################### +#' At-site frequency analysis using annual maximums +#' +#' Return a fitting of a distribution, normally representing annual maximums. +#' Both maximum likelihood and L-moments estimation methods are available. +#' If the maximum likelihood is used and fails, the L-moments solution +#' will be returned with a warning message is issued. +#' When more than one distribution is passed. The +#' best distribution is selected automatically according to the AIC criteria. +#' +#' @author Martin Durocher +#' +#' @param x Data. +#' +#' @param distr Distribution to fit. See \code{\link{Amax}} for the list +#' of available distribution. +#' +#' @param method Estimation method. +#' Either maximum likelihood ('mle') or L-moments ('lmom'). +#' +#' @param varcov Should the variance-covariance matrix of the parameters +#' be computed. For \code{mle} the covariance matrix is derived from the +#' hessian matrix. For L-moments, non-parametric bootstrap is used. +#' +#' @param nsim Number of simulations used to evaluate the covariance matrix +#' when using L-moment estimator. +#' +#' @return +#' +#' \item{data}{Data Values.} +#' \item{lmom}{L-moments.} +#' \item{para}{Parameter estimates.} +#' \item{varcov}{Covariance matrix of the parameter} +#' \item{llik}{Value of the log-likelihood} +#' +#' +#' @section References: +#' +#' Coles, S. (2001). An introduction to statistical +#' modeling of extreme values. Springer Verlag. +#' +#' Hosking, J. R. M., & Wallis, J. R. (1997). Regional frequency analysis: +#' an approach based on L-moments. Cambridge Univ Pr. +#' +#' @seealso \link{predict.amax}, \link{gofTest}, \link{plot.amax}. +#' +#' @export +#' +#' @examples +#' +#' ## Extract a time series of annual maxima +#' x <- ExtractAmax(flow~date, flowStJohn)$flow +#' +#' ## Fitting of GEV distribution using L-moments +#' +#' fit <- FitAmax(x,'gev') +#' print(fit) +#' coef(fit) +#' AIC(fit) +#' fit$lmom +#' +#' ## The evaluation of the variance-covariance matrix can be turn down +#' fit <- FitAmax(x,'gev', varcov = FALSE) +#' +#' ## Using Maximum likelihood +#' fit <- FitAmax(x,'gev', method ='mle') +#' print(fit) +#' vcov(fit) +#' +#' ## Standard deviation of the parameter +#' sqrt(diag(vcov(fit))) +#' +#' ## Chose the best distribution according to AIC +#' FitAmax(x, distr = c('gev','glo','gno','pe3'), method = 'mle') +#' +FitAmax <- + function(x, + distr = c('gev','gno', 'pe3', 'glo'), + ..., + tol.gev = 0){ + + ## compute lmoments once + lmm <- lmomco::lmoms(x) + + ## If there is only one distribution passed + if(length(distr) == 1) + return(FitAmax0(x, distr = distr, lmm = lmm, ...)) + + ## Fit data and compute the AIC for each distribution + fits <- lapply(distr, function(z) try(FitAmax0(x, distr = z, lmm = lmm, ...))) + crit <- lapply(fits, function(z) try(AIC(z))) + + ## If the fitting fails put AIC to Infinity + crit.err <- sapply(crit, function(z) class(z) != 'numeric') + + if(any(crit.err)) + crit[[crit.err]] <- Inf + + crit <- unlist(crit) + + ## It is assumed for small difference in AIC, the fitting is similar + ## Therefore GEV could selected as default due to its theoritical + ## justification. The tolerate difference is tol.gev + gid <- which(distr == 'gev') + crit[gid] <- crit[gid] - tol.gev + + ## return + return(fits[[which.min(crit)]]) +} + +## see FitAmax for more info +## lmm is an output of lmomco::lmom that can be passed to speed up +## multiple evaluations +FitAmax0 <- + function(x, distr = 'gev', method = 'lmom', + varcov = TRUE, lmm = NULL, nsim = 1000){ + + ################################################# + ## Verify that all values are finite values + if(!all(is.finite(x))) + stop('There is one (or more) non finite values') + + if(varcov & method == 'lmom' & nsim < 2) + stop('There is not enough simulations (nsim) to perform boostrap') + + ## Keep only the firs distribution passed + distr <- distr[1] + ################################################# + + ## Compute the L-moments and associated parameters + if(is.null(lmm)) + lmm <- lmomco::lmoms(x) + + f <- lmomco::lmom2par(lmm,distr) + + if(method == 'mle'){ + + ## Fit the distribution by maximum likelihood + suppressWarnings( + para <- try(lmomco::mle2par(x, distr, para.init = f, silent = TRUE, + hessian = varcov))) + + ## If mle return an error, use the L-moment estimate + if(class(para) == 'try-error'){ + para <- f + varcov <- NA + method = 'lmom' + + ## compute the log-likelihood + llik <- sum(log(lmomco::dlmomco(x,para))) + + warning('Maximum likelihood has fail') + + } else { + + ## Verify and warn the user if optim does not converge + if(para$optim$convergence != 0) + warning('Maximum likelihood may have not coverge') + + ## (If necessary) + ## Compute the covariance matrix by inversing the hessian matrix + if(varcov) + varcov <- chol2inv(chol(para$optim$hessian)) + else + varcov <- NA + + ## compute the log-likelihood value + llik <- -para$optim$value + + ## Remove the optim element from the list for a cleaner output + para <- para[1:3] + } + + } else if(method == 'lmom'){ + para <- f + + ## Compute the covariance matrix by boostrap if required + if(varcov){ + + xboot <- replicate(nsim, lmomco::rlmomco(length(x), para)) + + pboot <- apply(xboot, 2, lmomco::lmoms) + pboot <- lapply(pboot,lmomco::lmom2par, distr) + pboot <- sapply(pboot, getElement, 'para') + + varcov <- as.matrix(Matrix::nearPD(cov(t(pboot)))$mat) + + } else + varcov <- NA + + ## compute the log-likelihood + llik <- sum(log(lmomco::dlmomco(x,para))) + } + + + + ## Return an amax object + ans <- list(lmom = lmm$lambdas, + method = method, + para = para$para, + distr = distr, + varcov = varcov, + llik = llik, + data = x) + + class(ans) <- 'amax' + + return(ans) +} + + +#' @export +print.amax <- function(obj){ + + cat('\nAt-site frequency analysis\n') + + cat('\nDistribution:', obj$distr, + '\nAIC:', format(AIC(obj), digits = 4), + '\nMethod:', obj$method) + + cat('\nEstimate:\n') + print(obj$para, digit = 4) + + if(all(!is.na(obj$varcov))){ + + se <- sqrt(diag(vcov(obj))) + names(se) <- names(obj$para) + + cat('\nStd.err:\n') + print(se, digits = 4) + } + + cat('\nLmoments:\n') + print(data.frame(l1 = obj$lmom[1], + lcv = obj$lmom[2]/obj$lmom[1], + lsk = obj$lmom[3]/obj$lmom[2], + lkt = obj$lmom[4]/obj$lmom[2]), digits = 4) +} + +#' @export +coef.amax <- function(obj) obj$para + +#' @export +AIC.amax <- function(obj, k = 2) + as.numeric(k*length(obj$para) - 2*obj$llik) + +#' @export +as.list.amax <- function(obj){ + class(obj) <- 'list' + return(obj) +} + +#' @export +vcov.amax <- function(obj){ + + ## if exist return the covariance matrix + if(!is.null(obj$varcov)) + ans <- obj$varcov + else + ans <- NA + + ## return + ans +} + +#' @export +simulate.amax <- function(obj, n) + rAmax(n, obj$estimate, obj$distr) + + diff --git a/R/rfa_FitGev.R b/R/rfa_FitGev.R new file mode 100644 index 0000000..615cb60 --- /dev/null +++ b/R/rfa_FitGev.R @@ -0,0 +1,156 @@ +###################################################################### +#' Fit Generalized Extreme Value (GEV) distribution using Generalized +#' maximum likelihood +#' +#' Fit a GEV distribution on annual maxima using the generalized +#' maximum likelihood method with Beta prior. +#' The output is of the class \code{amax}. See \link{FitAmax}. +#' Asymptotic result are computed like the maximum likelihood approach. +#' +#' @author Martin Durocher +#' +#' @param x Data. +#' +#' @param varcov Logical. Should the covariance matrix be returned. +#' +#' @param mu,sig2 Mean and variance of the Beta prior. +#' +#' @param method.optim Optimisation method used by \code{\link{optim}} +#' +#' @param ... Other parameter pass to \code{\link{optim}} +#' +#' @section References: +#' +#' Martins, E.S., Stedinger, J.R., 2000. Generalized maximum-likelihood +#' generalized extreme-value quantile estimators for hydrologic data. +#' Water Resour. Res. 36, 737–744. https://doi.org/10.1029/1999WR900330 +#' +#' @export +#' +#' @examples +#' +#' x <- ExtractAmax(flow~date, flowStJohn)$flow +#' +#' ## Using the default physiographic prior. +#' fit <- FitGev(x) +#' print(fit) +#' coef(fit) +#' vcov(fit) +#' predict(fit, ci = 'delta') +#' +#' ## A uniform prior on interlval -0.5 to 0.5 can be used to approximate +#' ## the maximum likelihood estimate. +#' +#' AIC(FitAmax(x, distr = 'gev', method ='mle')) +#' AIC(FitGev(x, mu = 0, sig2 = 1/12)) +#' +#' ## A regional study can be performed by using an empirical prior +#' ## Here 20 sites with the same GEV distribution are simulated +#' ## without priors. +#' ## Then a regional estimate is obtained using an empirical prior +#' +#' xmat <- replicate(20, rAmax(20, c(100,3, -.1), 'gev') ) +#' flist <- apply(xmat,2, FitAmax, distr = 'gev', varcov = FALSE) +#' pmat <- sapply(flist, getElement,'para') +#' +#' kap0 <- pmin(.5,pmax(-.5,pmat[3,])) +#' +#' FitGev(xmat[,1], mu = mean(kap0), sig2 = var(kap0)) +#' FitAmax(xmat[,1], distr = 'gev', method = 'mle') +#' +FitGev <- function(x, varcov = TRUE, mu = -.1, sig2 = 0.015, + method.optim = 'BFGS',...){ + + + ## Verify that all values are finite values + if(!all(is.finite(x))) + stop('There is one (or more) non finite values') + + ## Compute the L-moments and associated parameters as starting value + lmm <- lmomco::lmoms(x) + startp <- lmomco::lmom2par(lmm,'gev')$para + + ## apply transformation to parameter to ensure positivness of scale parameter + ## and modify the sign of the shape parameter to agree with the parametrization + startp[2] <- log(startp[2]) + + ## Find the parameter of the prior Beta distribution based on + ## mean and variance passed in arguments + mu <- mu + .5 + a <- mu * ( (mu * (1-mu) / sig2) - 1) + b <- a * (1 - mu) / mu + + if(a <= 0 | b <=0) + stop('The parameters of the Beta distribution are not correct') + + ## Function returning Negative log-likelihood of the model + Nllik <- function(p, w = 1){ + -sum(dgev(x,p[1],exp(p[2]), p[3] ,log=TRUE)) - + w * dbeta(p[3]+.5, a, b, log = TRUE) + } + + ## optimize the Nllik to obtain the estimate + out <- optim(startp, Nllik, hessian = varcov, method = method.optim, ...) + + ## Compute the covariance matrix if necessary by iversion of the hessian + ## matrix + if(varcov) + varcov <- chol2inv(chol(out$hessian)) + else + varcov <- NA + + ## Create the output object + pout <- out$par + pout[2] <- exp(pout[2]) + names(pout) <- c('xi','alpha','kappa') + + ans <- list(para = pout, + distr = 'gev', + llik = -Nllik(out$par, w = 0), + varcov = varcov, + method = 'gml', + lmom = lmm$lambdas, + data = x, + prior = c(mu - 0.5, sig2)) + + class(ans) <- 'amax' + + return(ans) +} + +## Copy from R-package evd with modification of the parametrization +dgev <- function (x, xi = 0, alpha = 1, kappa = 0, log = FALSE){ + + ## Verify if the parameter are valid + if (min(alpha) <= 0) + stop("invalid alpha") + + if (length(kappa) != 1) + stop("invalid -kappa") + + ## center and alpha + x <- (x - xi)/alpha + + + if (kappa == 0){ + + ## Case of Gumbel distribution + d <- log(1/alpha) - x - exp(-x) + + } else { + + nn <- length(x) + xx <- 1 - kappa * x + xxpos <- xx[xx > 0 | is.na(xx)] + alpha <- rep(alpha, length.out = nn)[xx > 0 | is.na(xx)] + d <- numeric(nn) + d[xx > 0 | is.na(xx)] <- log(1/alpha) - xxpos^(1/kappa) - + (1-1/kappa) * log(xxpos) + d[xx <= 0 & !is.na(xx)] <- -Inf + } + + if (!log) + d <- exp(d) + + return(d) +} \ No newline at end of file diff --git a/R/rfa_FitPot.R b/R/rfa_FitPot.R new file mode 100644 index 0000000..2ba8af8 --- /dev/null +++ b/R/rfa_FitPot.R @@ -0,0 +1,318 @@ +###################################################################### +#' Peak over threshold (POT) +#' +#' Fit the parameters of a thresholding model using Generalized Pareto +#' distribution (GPA). Include declustering techniques. +#' +#' @param x,form Dataset. If a matrix or data.frame is passed as argument the +#' first column must be the time and the second the values. A formula can be +#' used to specify which variables of a data.frame to use. In this case, it +#' must have the form \code{value~time}. +#' +#' @param dt Date or time of observation. +#' +#' @param u Threshold. +#' +#' @param method Estimation method. Either \code{'lmom'}, \code{'mle'} or +#' \code{'mle2'}. +#' +#' @param declust If necessary, declustering method. +#' Either \code{'run'} or \code{'wrc'}. +#' +#' @param r Lag parameter for declustering. Either the running length between clusters +#' or the minimum separating time between two flood Peaks. +#' The scale must coincide with the observation date \code{dt}. +#' +#' @param rlow For WRC, recession level between two flood peaks in percentages. +#' +#' @param se Should the standard error or the confidence interval be returned. +#' +#' @param ci For \code{'coef'} should confidence interval be returned. +#' For \code{'predict'}, method used to compute confidence intervals. +#' Either \code{'profile'}, \code{'delta'} or \code{'boot'}. +#' +#' @param nsim Number of bootstrap samples. +#' +#' @param unit Length of cycle. Data are normaly years and \code{unit} = 365.25. +#' Can be change to 12 or 52 for daily and weekly data. +#' +#' +#' @details +#' +#' The access functions \code{coef} and \code{vcov} return respectively the +#' parameters and the variance-covariance matrix of the POT model. For the L-moment +#' method the covariance matrix is using bootstraps. +#' The access function \code{predict} evaluates flood quantiles. +#' If \code{dt} is a Date the return period is computed in years using the range +#' of observation. +#' +#' +#' @seealso \link{which.floodPeaks}, \link{which.clusters}, \link{PlotMrl}. +#' +#' @section References: +#' +#' Coles S. (2001) An introduction to statistical modeling of extreme values. +#' Springer Verlag. +#' +#' Davison AC, Smith RL. (1990) Models for Exceedances over High Thresholds. +#' Journal of the Royal Statistical Society Series B (Methodological). +#' 52(3), 393-442. +#' +#' @export +#' +#' @examples +#' +#' xd <- rgpa(100, 1, -.2) +#' fit <- FitPot(xd, u = 0) +#' +#' print(fit) +#' vcov(fit) +#' predict(fit) +#' coef(fit, ci = TRUE) +#' +#' fit <- FitPot(flow~date, flowStJohn, u = 1000, +#' declust = 'wrc', r = 14) +#' +#' print(fit) +#' plot(flow~date,flowStJohn, type = 'l') +#' points(fit$time,fit$excess+fit$u, col = 2, pch = 16) +#' abline(h=1000, col = 3, lwd = 2) +#' +#' predict(fit, se = TRUE, ci = 'delta') +#' + +FitPot <- function(x, ...) UseMethod('FitPot',x) + +#' @export +#' @rdname FitPot +FitPot.data.frame <- function(obj, ...) + FitPot.numeric(x = as.numeric(obj[,2]), dt = as.numeric(obj[,1]), ...) + +#' @export +#' @rdname FitPot +FitPot.matrix <- function(obj, ...) + FitPot.numeric(x = as.numeric(obj[,2]), dt = as.numeric(obj[,1]), ...) + +#' @export +#' @rdname FitPot +FitPot.formula <- function(form, x, ...){ + xd <- model.frame(form,as.data.frame(x)) + return(FitPot.numeric(x = xd[,1], dt = xd[,2], ...)) +} + +#' @export +#' @rdname FitPot +FitPot.numeric <- function(x, dt = NULL, u = 0, method = 'mle', + declust = 'none', r = 1, rlow = .75, nsim = 1000, + varcov = TRUE, unit = 365.25){ + + ## Supply a date variable if not presented + if(is.null(dt)) + dt <- seq_along(x) + + nyear <- sum(is.finite(dt)) / unit + + ## If necessary, extract peaks using a declustering method + if(declust == 'run') + cid <- which.clusters(x, dt, u, r) + else if(declust == 'wrc') + cid <- which.floodPeaks(x, dt, u, r = r, rlow = rlow, ini = 'wrc') + else + cid <- x > u + + ans <- list(excess = x[cid] - u, time = dt[cid]) + + ## Estimatate the parameters + if(method == 'lmom'){ + + ## Estimatate the parameters + ans$estimate <- fgpaLmom(ans$excess) + + ## Covariance matrix estimated by boostraps + if(varcov){ + ans$varcov <- matrix(NA,2,2) + + xboot <- replicate(nsim, + sample(ans$excess, length(ans$excess), replace = TRUE)) + pboot <- t(apply(xboot,2,fgpaLmom)) + + ## Correct + vc <- Matrix::nearPD(cov(pboot))$mat + ans$varcov <- as.matrix(vc) + } + + } else if(method == 'mle'){ + sol <- fgpa1d(ans$excess, sol = TRUE) + ans$estimate <- sol$par + + if(varcov){ + ans$varcov <- sol$varcov + colnames(ans$varcov) <- rownames(ans$varcov) <- names(ans$estimate) + } + + } else if(method == 'mle2'){ + sol <- fgpa2d(ans$excess, sol = TRUE) + + ans$estimate <- sol$par + + if(varcov){ + ans$varcov <- sol$varcov + colnames(ans$varcov) <- rownames(ans$varcov) <- names(ans$estimate) + } + + if( (ans$estimate[2] < -.5 + 1e-4) | (ans$estimate[2] > 1-1e-4) ) + warning(paste('Shape parameter have reach boundary. Normal', + ' approximation of the likelihood may be unreliable')) + } + + ## Complete object + ans$u <- u + ans$method <- method + ans$mrl <- as.numeric(ans$estimate[1]/ (1+ans$estimate[2])) + ans$nyear <- nyear + ans$unit <- unit + ans$ntot <- length(x) + ans$nexcess <- length(ans$excess) + + class(ans) <- 'fpot' + return(ans) +} + + +#' @export +#' @rdname FitPot +coef.fpot <- function(obj, rate = FALSE, ci = FALSE, alpha = 0.05){ + + if(rate) + ans <- c(obj$nexcess/obj$ntot,obj$estimate) + else + ans <- obj$estimate + + if(ci){ + + ## Full likelihood + llikFull <- logLik(obj) + + ## Initiate searching intervals for parameters + ase <- sqrt(obj$varcov[1,1]) + + abnd0 <- c(pmax(1e-8, obj$estimate[1] - 10 * ase), + obj$estimate[1] + 10* ase) + + kbnd0 <- c(-1,2) + + + ## Bound for the deviance + khi <- qchisq(1-alpha,1) + + ## Deviance for the profile likelihood of the scale parameter + Dscl <- function(z){ + + nllik <- function(p) -sum(dgpa(obj$excess, z, p, log = TRUE)) + + ## Compute the profile likelihood + llik0 <- -goptimize(nllik, kbnd0)$objective + + return(2*(llikFull-llik0)) + + } + + ## Deviance for the profile likelihood of the shape parameter + Dshp <- function(z){ + + nllik <- function(p) -sum(dgpa(obj$excess, p, z, log = TRUE)) + + llik0 <- -optimize(nllik, abnd0)$objective + + return(2*(llikFull-llik0)) + } + + ## Find the boundary + + suppressWarnings(lbScl <- + goptimize(function(z) abs(Dscl(z)-khi), + c(abnd0[1],obj$estimate[1]))$minimum) + + suppressWarnings(ubScl <- + goptimize(function(z) abs(Dscl(z)-khi), + c(obj$estimate[1],abnd0[2]))$minimum) + + suppressWarnings(lbShp <- + goptimize(function(z) abs(Dshp(z)-khi), + c(kbnd0[1],obj$estimate[2]))$minimum) + + suppressWarnings(ubShp <- + goptimize(function(z) abs(Dshp(z)-khi), + c(obj$estimate[2],kbnd0[2]))$minimum) + + bnd <- data.frame(lower = c(NA,lbScl,lbShp), + upper = c(NA,ubScl,ubShp)) + + rownames(bnd) <- c('rate','alpha','kappa') + + if(!rate) bnd <- bnd[-1,] + + ans <- data.frame(estimate = ans, bnd) + + } + + return(ans) +} + +#' @export +#' @rdname FitPot +vcov.fpot <- function(obj, rate = FALSE){ + + if(rate){ + ans <- matrix(0,3,3) + + kn <- obj$nexcess/obj$ntot + + ans[1,1] <- kn*(1-kn)/obj$ntot + ans[2:3,2:3] <- obj$varcov + + } else + ans <- obj$varcov + + return(ans) +} + + +#' @export +#' @rdname FitPot +print.fpot <- function(obj){ + + cat('\nAnalysis of peaks over threshold') + + cat('\n\nThreshold : ', obj$u) + cat('\nNumber of excess : ', obj$nexcess) + + if(!is.na(obj$nyear)){ + cat('\nNumber of years : ', format(round(obj$nyear,2))) + cat('\nExcess rate (yearly): ', format(round(obj$nexcess/obj$nyear,4))) + + } else cat('\nExcess rate: ', format(round(obj$nexcess/obj$ntot,4))) + + cat('\nMean residual Life : ', format(obj$mrl, digits = 6)) + + cat('\n\nParameters :\n') + print(obj$estimate, digit = 4) + + if(!is.null(obj$varcov)){ + cat('\nstd.err :\n') + print(sqrt(diag(obj$varcov)), digit = 4) + } +} + + +#' @export +#' @rdname FitPot +logLik.fpot <- function(obj) + sum(dgpa(obj$excess, obj$estimate[1], obj$estimate[2], log = TRUE)) + +#' @export +#' @rdname FitPot +AIC.fpot <- function(obj, k = 2) + -2 * logLik(obj) + 2 * k + + diff --git a/R/rfa_FitRegLmom.R b/R/rfa_FitRegLmom.R new file mode 100644 index 0000000..6354ea6 --- /dev/null +++ b/R/rfa_FitRegLmom.R @@ -0,0 +1,268 @@ +############################################################################### +#' Fitting an index-flood model +#' +#' Returns the at-site L-moments, regional L-moments and the parameters of +#' the regional growth curve for an index-flood model. +#' If required, the homogeneity and goodness-of-fit measures are included. +#' The function can be used for analyzing both annual maximums and peaks over +#' threshold. +#' +#' @author Martin Durocher +#' +#' @param x Dataset with sites in columns and time in rows. +#' +#' @param distr Regional distribution. See \link{Amax}. +#' If \code{NULL} an automatic selection is performed. +#' +#' @param type Type of input data. Either annual maximums (\code{'amax'}) or +#' peaks over threshold (\code{'pot'}). +#' +#' @param diagnostic Should the homogeneity (H) and goodness of fit +#' (Z-score) be evaluated. +#' +#' @param diagnostic.nsim Number of simulations used to evaluate the +#' diagnostic statistics. +#' +#' @param nmon Number of L-moments to evaluate. +#' +#' @details +#' +#' The function \code{coef} return the parameter of the at-site distributions +#' estimated L-moments. The function \code{plot} will present a L-moment ratio +#' diagram. +#' +#' @return +#' \describe{ +#' \item{type}{Type of input data} +#' \item{distr}{Regional distribution} +#' \item{para}{Parameters of the regional distribution} +#' \item{lmom}{At-site L-moments.} +#' \item{rlmom}{Regional L-moments.} +#' \item{nrec}{Record lengths.} +#' \item{stat}{Homogenous criteria and Z-score for goodness-of-fit.} +#' \item{discord}{Discordance measures.} +#' } +#' +#' @seealso \link{predict.reglmom}, \link{PoolRemove}. +#' +#' @section References: +#' +#' Hosking, J. R. M., & Wallis, J. R. (1997). Regional frequency analysis: +#' an approach based on L-moments. Cambridge Univ Pr. +#' +#' Mostofi Zadeh, S., Burn, D.H. (2019). A Super Region Approach to Improve +#' Pooled Flood Frequency Analysis. Canadian Water Resources Journal +#' 0, 1-14. https://doi.org/10.1080/07011784.2018.1548946 +#' +#' Mostofi Zadeh, S., Durocher, M., Burn, D.H., Ashkar, F., 2019. +#' Pooled flood frequency analysis: a comparison based on peaks-over-threshold +#' and annual maximum series. Hydrological Sciences Journal 0, null. +#' https://doi.org/10.1080/02626667.2019.1577556 +#' +#' @export +#' +#' @examples +#' +#' data(flowAtlantic) +#' xd <- cbind(flowAtlantic$ams, +#' year = format(flowAtlantic$ams$date, '%Y')) +#' +#' xmat <- DataWide(ams ~ id + year, xd) +#' +#' fit <- FitRegLmom(xmat) +#' print(fit) +#' plot(fit) +#' coef(fit, 'pe3') +#' +#' +FitRegLmom <- + function(x, + distr = NULL, + type = 'amax', + diagnostic = FALSE, + diagnostic.nsim = 1000, + nmom = 4){ + + ## verify that x is a matrix + if(is.data.frame(x)){ + x <- as.matrix(x) + } else if(!is.matrix(x)){ + stop('Must be a matrix with sites in columns') + } + + ## ------------------------------ ## + ## Evaluate the at-site L-moments + ## ------------------------------ ## + + ## There should be at least 4 L-moments or 5 if it is a Wakaby distribution + + if(is.null(distr)){ + nmom <- max(4,nmom) + } else if(distr == 'wak'){ + nmom <- max(5,nmom) + } else { + nmom <- max(4,nmom) + } + + ## Compute the Lmoments + lmom <- t(apply(x, 2, lmom::samlmu, nmom = nmom)) + + lmom.name <- paste0('TAU',1:nmom) + lmom.name[1:4] <- c('L1','LCV','LSK','LKUR') + colnames(lmom) <- lmom.name + + lmom[,2] <- lmom[,2]/lmom[,1] + + # Create names if necessary + if(is.null(rownames(lmom))){ + sname <- format(1:nrow(lmom), trim = FALSE, justify = 'left') + rownames(lmom) <- paste0("site_", gsub(' ','0',sname)) + } + + ## ------------------------------ ## + ## Compute regional L-moments + ## ------------------------------ ## + + ## record length + f <- function(z) sum(!is.na(z)) + nrec <- apply(x,2, f) + + ## compute the regional lmoments + dd <- lmomRFA::as.regdata(data.frame(rownames(lmom), nrec, lmom), FALSE) + rlmom <- lmomRFA::regavlmom(dd) + + names(rlmom) <- lmom.name + + ##------------------------------------------## + ## Homogenity test and choice of a distribution + ##------------------------------------------## + + ## If no distribution is passed, the diagnostic routine + ## must be performed on the selected growth curve + if (is.null(distr)) + diagnostic <- TRUE + + ## If necessary evaluate the statistics H and Z + if (diagnostic){ + + tst <- lmomRFA::regtst(dd, diagnostic.nsim) + + stat <- c(tst$H, tst$Z) + names(stat) <- c('H1','H2','H3','Zglo','Zgev','Zgno','Zpe3','Zgpa') + discord <- tst$D + + if (is.null(distr)) + distr <- c('glo','gev','gno','pe3')[which.min(abs(stat[4:7]))] + + } else { + ## If no diagnostic is performed + stat <- NULL + discord <- NULL + + } + + ## ------------------------------------- ## + ## Estimation of the regional parameter + ## ------------------------------------- ## + + ## POT method always use Pareto distribution + if (type == 'pot') + distr <- 'gpa' + + if (type == 'amax'){ + v <- lmomco::vec2lmom(rlmom, lscale = FALSE) + para <- lmomco::lmom2par(v, distr)$para + + } else if (type == 'pot'){ + k <- 1/rlmom[2]-2 + para <- c(0, 1 + k, k) + names(para) <- c('xi','alpha','kappa') + + } + + ans <- list(type = type, + distr = distr, + para = para, + lmom = lmom, + rlmom = rlmom, + nrec = nrec, + stat = stat, + discord = discord) + + class(ans) <- 'reglmom' + + return(ans) +} + +#' @export +#' @rdname FitRegLmom +coef.reglmom <- function(obj, distr = NULL){ + + if(is.null(distr)) + distr <- obj$distr + + ## Extract function lmom -> parameter + ffunc <- getFromNamespace(paste0('pel', distr), 'lmom') + + ## Rescale LCV to L2 + lmom <- obj$lmom + lmom[,2] <- lmom[,2]*lmom[,1] + + ans <- matrix(NA, nrow(lmom), length(obj$para)) + + for(ii in 1:nrow(lmom)){ + p0 <- try(ffunc(lmom[ii,])) + + if(class(p0) == 'numeric') + ans[ii, ] <- p0 + } + + colnames(ans) <- names(p0) + rownames(ans) <- rownames(obj$lmom) + + return(ans) +} + + +#' @export +#' @rdname FitRegLmom +print.reglmom <- function(obj){ + + cat('\nRegional frequency analysis with pooling groups\n') + cat('\ntype:', obj$type) + cat('\nNb. site:', nrow(obj$lmom)) + cat('\nStation-year:', sum(obj$nrec)) + + if (any(!is.null(obj$stat))){ + cat('\nHomogeneity:', round(obj$stat[1:3],2)) + + if (obj$type == 'amax'){ + cat('\n\nZ-scores (absolute):\n') + print(round(abs(obj$stat[4:8]),2)) + + } else cat('\n') + } + + cat('\nRegional L-moments:\n') + print(obj$rlmom, digits = 4) + + cat('\nDistribution:', obj$distr) + + cat('\nParameter:\n') + print(obj$para, digits = 4) + +} + + +#' @export +#' @rdname FitRegLmom +plot.reglmom <- function(obj){ + lmm <- obj$lmom[,3:4] + colnames(lmm) <- c('t_3','t_4') + lmom::lmrd(lmm) + points(obj$rlmom[3],obj$rlmom[4], pch = 16, col = 'red', cex = 1.5) +} + +#' @export +#' @rdname FitRegLmom +sitenames <- function(obj) rownames(obj$lmom) \ No newline at end of file diff --git a/R/rfa_FitRoi.R b/R/rfa_FitRoi.R new file mode 100644 index 0000000..77a8c27 --- /dev/null +++ b/R/rfa_FitRoi.R @@ -0,0 +1,369 @@ +######################################################################## +#' Prediction at ungauged sites using region of influence and kriging +#' +#' Return the prediction of a local regression model using region of +#' influence (ROI) where the residuals are further predicted +#' by kriging. +#' +#' @author Martin Durocher +#' +#' @param x Data for training the model. +#' +#' @param xnew Data at new locations (Validation set). +#' +#' @param nk Number of sites in the neighborhoods. If \code{nk} is a list, the +#' first element represents a vector of the neighborhood size for all sites +#' used for training. The second element . +#' +#' @param phy Formula defining the physical descriptors. +#' +#' @param similarity Formula defining the covariates used +#' to evaluate the similarity between site, i.e. Euclidean distance +#' to the target. +#' +#' @param kriging Formula defining the spatial covariates. +#' Necessary for predicting residuals using spatial correlation. +#' +#' @param model Variogram model. See \link[gstat]{vgm} +#' +#' @param ker Should a (Epanechnikov) kernel be used in to weight +#' local regression model. Otherwise uniform weights are used. +#' +#' @param se Logical. Should the standard error be returned. +#' +#' @param fold Number of group or group used to perform cross-validation. +#' +#' @return +#' +#' \item{pred}{Prediction at new sites.} +#' \item{pred.se}{Standard deviation at new sites.} +#' \item{phy}{Part of the prediction attributed to physical descriptor.} +#' \item{phy.se}{Standard deviation associated with the physical descriptor.} +#' \item{fitted}{Fitted values (training sites).} +#' \item{fitted.se}{Standard deviation of the fitted values.} +#' \item{vgm}{Sample variogram.} +#' \item{model}{Fitted variogram model.} +#' +#' @seealso \code{\link{CvRoi}}, \code{\link[gstat]{krige}}, \code{\link{lm}} +#' +#' @references +#' +#' Martin Durocher, Donald H. Burn, Shabnam Mostofi Zadeh & Fahim Ashkar (2019) +#' Estimating flood quantiles at ungauged sites using nonparametric regression +#' methods with spatial components, Hydrological Sciences Journal, 64:9, +#' 1056-1070, https://doi.org/10.1080/02626667.2019.1620952 +#' +#' @export +#' +#' @examples +#' +#' data(flowUngauged) +#' +#' ## Using multidimensional scaling for projecting coordinates +#' coord <- cbind(lon,lat) +#' coord <- cmdscale(GeoDist(coord)) +#' colnames(coord) <- c('lon','lat') +#' +#' +#' +#' ## Transform data if necessary +#' xdf <- data.frame(y = l1, +#' area = scale(log(area)), +#' wb = scale(log(wb)), +#' stream = scale(log(stream)), +#' map = scale(log(map)), +#' coord) +#' +#' ## select a validation and training set +#' set.seed(9382) +#' vid <- runif(nrow(xdf)) > .8 +#' tid <- !vid +#' +#' # formula of the relationship between flood quantile and descriptors +#' fphy <- log(y) ~ area + map + poly(wb,3) + poly(stream,3) +#' fsimilarity <- ~ area + map +#' +#' ## Fit a local regression model +#' fit <- FitRoi(x = xdf[tid,], xnew = xdf[vid,], nk = 60, +#' phy = fphy, similarity = fsimilarity) +#' print(fit) +#' response <- log(xdf[vid,'y']) +#' sd(response - fit$pred) +#' +#' ## Refit the model and perform the kriging of the residuals +#' fitk <- FitRoi(x = xdf[tid,], +#' xnew = xdf[vid, ], +#' nk = 60, +#' phy = fphy, +#' similarity = fsimilarity , +#' model = 'Exp', +#' kriging = ~ lon + lat) +#' +#' print(fitk) +#' sd(response - fitk$phy) +#' sd(response - fitk$pred) +#' +FitRoi <- + function(x, + xnew, + nk, + phy, + similarity, + kriging = NULL, + model = 'Exp', + ker = TRUE, + se = FALSE){ + + x <- as.data.frame(x) + xnew <- as.data.frame(xnew) + + ## Extract coordinate and compute euclidean distance + crd <- rbind(model.frame(similarity, x), + model.frame(similarity, xnew)) + + h <- as.matrix(dist(crd)) + + ## Extract coordinate of the spatial model + if(!is.null(kriging)) + crd2 <- rbind(model.frame(kriging,x), + model.frame(kriging,xnew)) + + ## Create a vector of neighborhood size for all sites. + if(is.list(nk)){ + nk0 <- unlist(nk) + } else{ + nk0 <- rep(nk[1],nrow(h)) + } + + ## add a column to store weights and extract response + x <- get_all_vars(phy, x, .ww = 0) + y0 <- eval(phy[[2]], envir = x) + + + train <- seq(nrow(x)) + valid <- seq(nrow(x)+1,nrow(crd)) + + ##------------------------- + ## Fitt model at target + ##------------------------- + + ## allocate memory + pred <- rep(NA, length(valid)) + + if(se) + predSe <- rep(NA, length(valid)) + + for(ii in seq_along(valid)){ + + ## Delineate a neighborhood + nn <- order(h[valid[ii], train])[1:nk0[ valid[ii] ] ] + + ## Fit local linear model. With weight if necessary. + if(ker){ + x[nn,'.ww'] <- 1-(h[valid[ii],nn]/max(h[valid[ii],nn]))^2 + fit <- lm(phy, data = x[nn,], weights = .ww) + + } else{ + fit <- lm(phy, data = x[nn,]) + } + + if(se){ + out <- predict(fit, xnew[ii,], se.fit = TRUE) + pred[ii] <- out$fit + predSe[ii] <- out$se.fit + + } else{ + pred[ii] <- predict(fit, xnew[ii,]) + } + } + + ## Save the specification of the model provided when the function is called + ans <- list(call = list(nk = nk, + npred = length(valid), + nsite = length(train), + ker = ker, + kriging = kriging, + phy = phy, + similarity = similarity)) + + ##------------------------------------ + ## Perform kriging if necessary + ## ---------------------------------------- + + if(!is.null(kriging)){ + + ## For all training set + yhat <- rep(NA, length(train)) + + if(se) + yhatSe <- rep(NA, length(train)) + + for(ii in train){ + + ## Delineate a neighborhood + nn <- order(h[ii,train])[1:nk0[ii]] + + ## Fit local linear model. With weight if necessary. + if(ker){ + x[nn,".ww"] <- 1-(h[ii,nn]/max(h[ii,nn]))^2 + fit <- lm(phy, data = x[nn,], weights = .ww) + } else { + fit <- lm(phy, data = x[nn,]) + } + + ## Predict the linear model and its standard deviation (if necessary) + if(se){ + out <- predict(fit, x[ii,], se.fit = TRUE) + yhat[ii] <- out$fit + yhatSe[ii] <- out$se.fit + + } else{ + yhat[ii] <- predict(fit, x[ii,]) + } + } + + ## compute residuals + yres <- y0-yhat + + ## Save known component + ans$phy <- pred + + if(se) + ans$phy.se <- predSe + + ans$fitted <- yhat + + if(se) + ans$fitted.se <- yhatSe + + ans$resid <- yres + + ## Extract the coordinates for the residuals + crd2 <- data.frame(yres = c(yres, rep(0,length(pred))), crd2) + sp::coordinates(crd2) <- kriging + + ## Estimate the variogram + if(all(class(model) == 'character')){ + model <- gstat::vgm(model) + vgm0 <- gstat::variogram(yres~1, crd2[train,]) + model0 <- gstat::fit.variogram(vgm0, model) + + ans$vgm <- vgm0 + + } else if(any(class(model) == "variogramModel")){ + model0 <- model + + } else{ + stop('The kriging model is not valid.') + } + + ## save model + ans$model <- model0 + + ## Perform simple kriging on the residuals + out <- gstat::krige(yres~1, crd2[train,], crd2[valid,], + model = model0, beta = 0, + debug.level = 0) + + + ## Evaluate prediction + ans$pred <- pred + out$var1.pred + ans$krige <- out$var1.pred + + if(se) + ans$krige.se <- sqrt(out$var1.var) + + } else { + + ## kriging is not used + ans$pred <- pred + + if(se) + ans$pred.se <- predSe + } + + ## return + class(ans) <- 'roi' + return(ans) +} + +#' @export +#' @rdname FitRoi +print.roi <- function(obj){ + cat('\n\nRegion of Influence (ROI)\n') + cat('\nNumber of sites:', obj$call$nsite) + cat('\nNumber of targets:', obj$call$npred) + + cat('\n\nRegression:') + cat('\n Physic:', format(obj$call$phy)) + cat('\n size:', sort(unique(obj$call$nk))) + cat('\n Similarity', format(obj$call$similarity)) + cat('\n Kernel:', format(obj$call$ker)) + + if(!is.null(obj$model)){ + cat('\n\nKriging:') + cat('\n Coord:', format(obj$call$kriging),'\n\n') + print(as.data.frame(obj$model)[,1:4]) + } + +} + +#' @export +#' @rdname FitRoi +predict.roi <- function(obj, x, fold = 5){ + + ## Organize the cross-validation group info + if(length(fold) == 1){ + k <- 1:fold + fold <- sample(rep_len(k, nrow(x))) + + } else{ + k <- sort(unique(fold)) + } + + ## allocate memory + ans <- rep(0, nrow(x)) + + for(ii in k){ + + if(sum(fold != ii) <= obj$call$nk) + stop('Requires more observations') + + ## For each cross-validation group + validSet <- which(fold == ii) + + if(is.null(obj$call$kriging)){ + + ## Fit model without kriging + hat <- FitRoi(x = x[-validSet,], + xnew = x[validSet,] , + nk = obj$call$nk, + phy = obj$call$phy, + similarity = obj$call$similarity) + + + } else { + + ## Fit model with kriging + hat <- FitRoi(x = x[-validSet,], + xnew = x[validSet,], + nk = obj$call$nk, + phy = obj$call$phy, + similarity = obj$call$similarity, + kriging = obj$call$kriging, + model = obj$model) + } + + ans[validSet] <- hat$pred + } + + return(ans) +} + +#' @export +#' @rdname FitRoi +residuals.roi <- function(obj, x, fold = 5){ + response <- eval(obj$call$phy[[2]], envir = x) + return(predict(obj, x = x, fold = fold) - response) + +} \ No newline at end of file diff --git a/R/rfa_GeoDist.R b/R/rfa_GeoDist.R new file mode 100644 index 0000000..06bbfb3 --- /dev/null +++ b/R/rfa_GeoDist.R @@ -0,0 +1,35 @@ +############################################################################### +#' Great-circle distance +#' +#' Returns the distance matrix of the great-circle distance between all pairs +#' of sites. +#' +#' @author Martin Durocher +#' +#' @param x Dateset of coordinates (lon,lat). +#' +#' @param form Formula to identify coordinates in a dataset. +#' Must be of the form : \code{lon~lat}. +#' +#' @param earth.radius Radius of the earth. Default 6371 km. +#' +#' @export +#' +#' @examples +#' +#' attach(flowAtlantic) +#' +#' GeoDist(lon~lat, flowAtlantic$info)[1:5,1:5] +#' +#' +GeoDist <- function(x, ...) UseMethod('GeoDist', x) + +#' @export +#' @rdname GeoDist +GeoDist.default <- function(x, earth.radius = 6371) + fields::rdist.earth(as.matrix(x), miles = FALSE, R = earth.radius) + +#' @export +#' @rdname GeoDist +GeoDist.formula <- function(form, x, ...) + GeoDist(model.frame(form,x), ...) diff --git a/R/rfa_GofTest.R b/R/rfa_GofTest.R new file mode 100644 index 0000000..69b29ce --- /dev/null +++ b/R/rfa_GofTest.R @@ -0,0 +1,361 @@ +############################################################# +#' Goodness-of-fit test +#' +#' Return the statistic and p-value of a goodness-of-fit test on +#' AMAX and POT models. The null hypothesis (composite) +#' is that the data were generated by the fitted distribution. +#' +#' @author Martin Durocher +#' +#' @param obj Output from \code{\link{FitAmax}} or \code{\link{FitPot}}. +#' +#' @param method Test to be performed. Either Anderson-Darling \code{ad}, +#' or modified Shapiro-Wilk ('shapiro'). +#' For a POT model, the method \code{adtab} +#' perform the Anderson-Darling test and interpolates the +#' p-value from a table. +#' +#' @export +#' +#' @section References: +#' +#' Choulakian, V., Stephens, M.A., 2001. Goodness-of-Fit Tests for the +#' Generalized Pareto Distribution. Technometrics 43, 478-484. +#' https://doi.org/10.2307/1270819 +#' +#' Heo, J.-H., Shin, H., Nam, W., Om, J., Jeong, C., 2013. Approximation of +#' modified Anderson–Darling test statistics for extreme value distributions +#' with unknown shape parameter. Journal of Hydrology 499, 41-49. +#' https://doi.org/10.1016/j.jhydrol.2013.06.008 +#' +#' Ba, I., Ashkar, F., 2017. Discrimination between a group of +#' three-parameter distributions for hydro-meteorological frequency modeling. +#' Can. J. Civ. Eng. 45, 351-365. https://doi.org/10.1139/cjce-2017-0416 +#' +#' Fahim Ashkar & Ba, I. (2017) Selection between the generalized Pareto +#' and kappa distributions in peaks-over-threshold hydrological frequency +#' modelling, Hydrological Sciences Journal, 62:7, 1167-1180, +#' http://dx.doi.org/10.1080/02626667.2017.1302089 +#' +#' @examples +#' +#' ## The same simulated distribution should be accepted p-value >.05 +#' x <- rAmax(100, c(100,30,-.1), 'gev') +#' +#' fit <- FitAmax(x, 'gev', varcov = FALSE) +#' GofTest(fit, nsim = 50) ## nsim is small for speeding-up the demonstration +#' +#' ## The same apply to POT model +#' fit <- FitPot(flow~date, flowStJohn, u = 1000, +#' declust = 'flood', r = 14) +#' +#' ## By default a table is used with GPA using MLE +#'GofTest(fit) +#' +GofTest <- function(x, ...) UseMethod('GofTest', x) + +#' @export +#' @rdname GofTest +GofTest.amax <- function(obj, method = 'ad', nsim = 1000, ...){ + + ## Verification that GML was not used when fitting + if(obj$method == 'gml') + stop('The test is not available for Generalized maximum likelihood') + + ## Simulate boostrap sample + n <- length(obj$data) + opara <- lmomco::vec2par(obj$para, obj$distr) + xboot <- replicate(nsim, lmomco::rlmomco(n,opara)) + + ## Compute the test statistics for the data and the bootstrap samples + if(method == 'ad'){ + stat <- AdStat(obj$data, para = opara) + boot <- apply(xboot, 2, AdStat, type = obj$distr, + method = obj$method, ...) + pv <- mean(boot > stat, na.rm = TRUE) + + } else if(method == 'shapiro') { + stat <- ShapiroStat(obj$data, para = opara) + boot <- apply(xboot, 2, ShapiroStat, type = obj$distr, + method = obj$method, ...) + pv <- mean(boot < stat, na.rm = TRUE) + } + + ans <- list(stat = stat, + pvalue = pv, + distr = obj$distr, + method = method) + + class(ans) <- 'amaxGof' + + ## return + ans +} + +#' @export +print.amaxGof <- function(obj){ + + if(obj$method %in% c('ad','adtab')) + methodName <- 'Anderson-Darling' + else if(obj$method == 'shapiro') + methodName <- 'Modified Shapiro-Wilk' + + cat('\nGoodness-of-fit test\n', + '\nTest =', methodName, + '\nDistribution =', obj$distr) + + cat('\nstatistic :', round(obj$stat,4), + '\np-value :', round(obj$pvalue,4), '\n\n') +} + +## function to compute the statistics of the Anderson-Darling test +AdStat <- function(x, type = NULL, method = NULL, para = NULL, ...){ + + ## Estimate the parameters if necessary + if(is.null(para)){ + if(method == 'lmom'){ + para <- lmomco::lmom2par(lmomco::lmoms(x), type, ...) + } else if(method == 'mle'){ + para <- suppressWarnings(lmomco::mle2par(x,type, ...)) + } else if(method == 'fgpa1d'){ + para <- fgpa1d(x) + para <- lmomco::vec2par(c(0,para), 'gpa') + } else if(method == 'fgpa2d'){ + para <- fgpa2d(x) + para <- lmomco::vec2par(c(0,para), 'gpa') + } else if(method == 'fgpaLmom'){ + para <- fgpaLmom(x) + para <- lmomco::vec2par(c(0,para), 'gpa') + } + } + + n <- length(x) + u <- sort(lmomco::plmomco(x,para)) + w <- (2*(1:n)-1)/n + ans <- n + sum(w * log(u)) + sum((2-w)*log(1-u)) + + return(-ans) +} + +## Function to compute the statistics of the modified Shapiro-Wilk test +ShapiroStat <- function(x, type = NULL, method = NULL, para = NULL, ...){ + ## Estimate the parameters if necessary + if(is.null(para)){ + if(method == 'lmom') + para <- lmomco::lmom2par(lmomco::lmoms(x), type, ...) + else if(method == 'mle') + para <- suppressWarnings(lmomco::mle2par(x,type, ...)) + else if(method == 'fgpa1d'){ + para <- fgpa1d(x) + para <- lmomco::vec2par(c(0,para), 'gpa') + } else if(method == 'fgpa2d'){ + para <- fgpa2d(x) + para <- lmomco::vec2par(c(0,para), 'gpa') + } else if(method == 'fgpaLmom'){ + para <- fgpaLmom(x) + para <- lmomco::vec2par(c(0,para), 'gpa') + } + } + + z <- qnorm(lmomco::plmomco(x,para)) + shapiro.test(z)$statistic +} + + +#' @export +#' @rdname GofTest +GofTest.fpot <- function(obj, method = 'adtab', nsim = 1000){ + + opara <- lmomco::vec2par(c(0,obj$estimate), 'gpa') + n <- length(obj$excess) + + ## Case Anderson-Darling using a table + if(method == 'adtab'){ + stat <- AdStat(obj$excess, para = opara) + pv <- AdGpaTable(obj$estimate[2], A2 = stat) + + ## Case anderson darling using boostrap + } else if(method == 'ad'){ + + if(obj$method == 'lmom') + fitMethod <- 'fgpaLmom' + else if(obj$method == 'mle') + fitMethod <- 'fgpa1d' + else if(obj$method == 'mle2') + fitMethod <- 'fgpa2d' + + stat <- AdStat(obj$excess, para = opara) + + xboot <- replicate(nsim, lmomco::rlmomco(n,opara)) + boot <- apply(xboot, 2, AdStat, type = 'gpa', method = fitMethod) + pv <- mean(boot > stat, na.rm = TRUE) + + ## modified shapiro-wilk using boostrap + } else if(method == 'shapiro'){ + + if(obj$method == 'lmom') + fitMethod <- 'fgpaLmom' + else if(obj$method == 'mle') + fitMethod <- 'fgpa1d' + else if(obj$method == 'mle2') + fitMethod <- 'fgpa2d' + + stat <- ShapiroStat(obj$excess, para = opara) + + xboot <- replicate(nsim, lmomco::rlmomco(n,opara)) + boot <- apply(xboot, 2, ShapiroStat, type = 'gpa', method = fitMethod) + pv <- mean(boot < stat, na.rm = TRUE) + } + + ans <- list(stat = stat, + pvalue = pv, + distr = 'gpa', + method = method) + + class(ans) <- 'amaxGof' + + return(ans) +} + + + + +######################################################################### +# Anderson-Darling (AD) test for the Generalized Pareto distribution (GPA) +# +# Return the critical value or the p-value of the AD test for the GPA +# distribution. The results are obtained by linear interpolation of the +# table provided by Choulakian and Stephens (2001) when scale and shape +# parameter are estimated by maximum likelihood. +# +# @param kap Shape parameter of the GPA. +# +# @param pval P-value of the test. +# +# @param A2 Statistics of the AD test. +# If \code{NULL} the function return +# the critical value associated with \code{'pval'}. +# Otherwise the function return the p-value associated with the provided +# statistics. +# +# @param ... Additional parameter for the function \code{\link{approx}}. +# +# +# Choulakian V, Stephens MA. Goodness-of-Fit Tests for the Generalized +# Pareto Distribution. Technometrics. 2001;43(4):478–84. +# + +AdGpaTable <- function(kap, pval = 0.05, A2 = NULL, ...){ + + ## Table of for the GPA + ad <- c(0.339, 0.471, 0.641, 0.771, 0.905, 1.086, 1.226, 1.559, + 0.356, 0.499, 0.685, 0.830, 0.978, 1.180, 1.336, 1.707, + 0.376, 0.534, 0.741, 0.903, 1.069, 1.296, 1.471, 1.893, + 0.386, 0.550, 0.766, 0.935, 1.110, 1.348, 1.532, 1.966, + 0.397, 0.569, 0.796, 0.974, 1.158, 1.409, 1.603, 2.064, + 0.410, 0.591, 0.831, 1.020, 1.215, 1.481, 1.687, 2.176, + 0.426, 0.617, 0.873, 1.074, 1.283, 1.567, 1.788, 2.314, + 0.445, 0.649, 0.924, 1.140, 1.365, 1.672, 1.909, 2.475, + 0.468, 0.688, 0.985, 1.221, 1.465, 1.799, 2.058, 2.674, + 0.496, 0.735, 1.061, 1.321, 1.590, 1.958, 2.243, 2.922) + + ad <- t(matrix(ad, 8 ,10)) + + kap0 <- c(-0.9, -0.5, -0.2, -0.1, 0, 0.1, 0.2, 0.3, 0.4, 0.5) + pval0 <- c(0.5, 0.25, 0.1, 0.05, 0.025, 0.01, 0.005, 0.001) + + + ## Verify table range + if(pval < 0.001){ + warning('P-value outside range. Value 0.001 will be used') + pval <- 0.001 + } + + if(pval > 0.5){ + warning('P-value outside range. Value 0.5 will be used') + pval <- 0.5 + } + + if(kap < (-0.9)){ + warning('Kappa outside range. Value -0.9 will be used') + kap <- (-0.9) + } + + if(kap > 0.5){ + warning('Kappa outside range. Value 0.5 will be used') + kap <- 0.5 + } + + if(is.null(A2)) + ans <- interp2d(kap0, pval0, ad, kap, pval, reverse = FALSE,...) + else + ans <- interp2d(kap0, pval0, ad, kap, A2, reverse = TRUE, ...) + + return(ans) +} + +######################################################################## +# Interpolation of a table +# +# Return linear interpolation of a table. Can returns either the +# interpolation of the values of the table or the interpolations +# the columns associated with a value in the table(\code{reverse}). +# +# @param x0 References in row of \code{z}. +# +# @param y0 References in column of \code{z} +# +# @param z0 Matrix representing a table to interpolate. +# +# @param x Point where to interpolate in row. +# +# @param y Point where to interpolate in column. +# +# @param reverse Logical. Should the Refrence value en \code{y} be +# interpolated instead of \code{z}. + +interp2d <- function(x0, y0, z0, x, y, reverse = FALSE, ...){ + + ## Verify consistency between x0, y0 and z0 + if(length(x0) != nrow(z0) | length(y0) != ncol(z0)) + stop('Wrong dimension passed in z0') + + ## Case interpolating z0 + if(!reverse){ + + ## y0 is exact + if(sum(y0 == y)>0){ + z <- z0[, which(y0 == y)] + + ## case y0 is not exact + } else{ + z <- sapply(seq(nrow(z0)), + function(k) approx(y0, z0[k,], xout = y, ...)$y) + } + + ## Interpolation z + if(x < min(x0)) ans <- max(z) + else if(x> max(x0)) ans <- min(z) + else ans <- approx(x0, z, xout = x, ...)$y + + ## Case Interpolation y instead of z + } else { + + ##case x0 is exact + if(sum(x0 == x) > 0){ + z <- z0[which(x0 == x),] + + ##case x0 is not exact + } else { + z <- sapply(seq(ncol(z0)), + function(k) approx(x0, z0[,k], xout = x, ...)$y) + } + + ## interpolating y + if(y < min(z)) ans <- max(y0) + else if(y > max(z)) ans <- min(y0) + else ans <- approx(z, y0, xout = y, ...)$y + } + + return(ans) +} diff --git a/R/rfa_Intersite.R b/R/rfa_Intersite.R new file mode 100644 index 0000000..ec8b353 --- /dev/null +++ b/R/rfa_Intersite.R @@ -0,0 +1,286 @@ +########################################################################## +#' Estimating intersite correlation +#' +#' Return a matrix of intersite correlation between paired observations. +#' By default the empirical matrix is estimated and corrected to be +#' positive definite. +#' Can also be estimated by a power exponential model where the weighted least +#' squares approach is used with weights proportional to record lengths. +#' +#' @author Martin Durocher +#' +#' @param x Dataset in the wide format +#' +#' @param method Estimation method. Can be either \code{'emp'} for estimating +#' the empirical matrix or \code{'exp'} for fitting power exponential model. +#' +#' @param distance Matrix of distances. Necessary when using \code{'exp'}. +#' +#' @param nmin Minimal number of pairs necessary to compute pairwise +#' correlations. +#' +#' @param na.sub Value for imputing missing pairwise correlation with +#' \code{'emp'}. +#' +#' @param defpos Logical. Should a correction be applied to the empirical +#' matrix to ensure positive definiteness. +#' +#' @param smooth Smooth parameter of the power exponential model. +#' +#' @param distance.max Maximal distance to consider for paired observations +#' in the fitting of the power exponential model. +#' +#' @param start Initial parameter for optimization with the \code{exp} method. +#' It must have the form \code{(nugget, range)}. +#' +#' +#' @return +#' \describe{ +#' \item{method}{Estimation method.} +#' \item{para}{Parameter of the fitted model. For \code{'emp'} it +#' is the average.} +#' +#' \item{corr}{Raw estimation of the correlations.} +#' \item{model}{Final estimate of the correlations.} +#' \item{rmse}{For \code{'exp'}, root mean square errors of the fitted model.} +#' } +#' +#' @section References: +#' +#' Durocher, M., Burn, D.H., Mostofi Zadeh, S., 2018. A nationwide +#' regional flood frequency analysis at ungauged sites using ROI/GLS with +#' copulas and super regions. Journal of Hydrology 567, 191-202. +#' https://doi.org/10.1016/j.jhydrol.2018.10.011 +#' +#' @export +#' +#' @examples +#' +#' Data(flowAtlantic) +#' +#' ## Organize annual maximums +#' ams <- flowAtlantic$ams +#' ams$year <- format(ams$date, '%Y') +#' xmat <- DataWide(ams ~ id + year, ams) +#' +#' ## Compute distance between sites +#' coord <- flowAtlantic$info[, c('lon','lat')] +#' rownames(coord) <- flowAtlantic$info$id +#' h <- GeoDist(coord) +#' +#' ## make sure that columns match +#' h <- h[colnames(xmat), colnames(xmat)] +#' +#' ## estimate intersite correlation using a model +#' isite <- Intersite(xmat, distance = h, method = 'exp') +#' print(isite) +#' plot(isite, xmat, h) +#' +#' ## Evaluate emprirical correlation matrix +#' isite <- Intersite(xmat[,1:5]) +#' print(isite) +#' round(isite$model,2) +#' +#' +Intersite <- + function(x, + method = 'emp', + distance = NULL, + nmin = 0, + na.sub = 'avg', + defpos = TRUE, + smooth = 1, + distance.max = Inf, + start = NULL){ + + + if(!is.matrix(x)) + stop('Must be a matrix with sites in columns') + + corr <- cor(x, use = 'pairwise.complete.obs', method = 'spearman') + corr <- 2*sin(pi/6*corr) + + ## Flag sites with too few pairwise observations + nmat <- crossprod(!is.na(x)) + cid <- (nmat < nmin) + if (any(cid)) + corr[cid] <- NA + + if (method == 'exp'){ + ## -------------------------------------------- + ## Fit power exponential model for correlation + ## -------------------------------------------- + + if (is.null(distance)) + stop('Distance must be specified for smoothing correlation') + + distance <- as.matrix(distance) + + if(any(colnames(distance) != colnames(x))) + warning('Sites may not matched with distance matrix') + + ##-----------------------------------------------------------## + ## Fit a power exponential model on the pairwise correlation + ##-----------------------------------------------------------## + + ## extract pairs + pcor <- corr[lower.tri(corr)] + ph <- distance[lower.tri(distance)] + w <- nmat[lower.tri(nmat)] + + ## remove NA + pid <- !is.na(pcor) + pcor <- pcor[pid] + ph <- ph[pid] + w <- w[pid] + + ## remove pairs too far apart + pid <- (ph <= distance.max) + pcor <- pcor[pid] + ph <- ph[pid] + w <- w[pid] + + ## Define power exponential model + Fpow <- function(p,h){ + ## ensure positiveness + p[1] <- exp(p[1])/(1+exp(p[1])) + p[2] <- exp(p[2]) + + return(p[1] * exp(-3*( h / p[2])^smooth)) + } + + ## Define MSE of the correlation fit + Fobj <- function(p,h) sum(w*(pcor - Fpow(p,h))^2) + + ## Optimize the MSE + if(is.null(start)){ + start = c(2.2,log(mean(ph))) + } else{ + start = c(log(start[1]/(1-start)), log(start[2])) + } + + sol <- optim(start, Fobj, h = ph) + + rmse <- sqrt(sol$value) + + ## Create the new smooth correlation matrix base on fitted model + corr.model <- Fpow(sol$par,distance) + diag(corr.model) <- 1 + + ## Extract the parameters of the correlation model + para <- c(1-exp(sol$par[1])/(1+exp(sol$par[1])), + exp(sol$par[2]), + smooth) + + names(para) <- c('nugget','range','smooth') + type <- 'exp' + + + } else if(method == 'emp') { + + ##-----------------------------------------------------------## + ## Correct the empirical correlation matrix + ##-----------------------------------------------------------## + pcor <- na.omit(corr[lower.tri(corr)]) + para <- mean(pcor) + rmse <- NULL + corr.model <- corr + + ## define a value for imputation + if(na.sub == 'zero'){ + na.sub <- 0 + } else if(na.sub == 'avg'){ + na.sub <- para[1] + } else if(na.sub == 'NA'){ + na.sub <- NA + defpos <- FALSE ## no correction if there is NA + } + + #impute missing values + cid <- is.na(corr.model) + if (any(cid)) + corr.model[cid] <- na.sub + + ## force the diagonal to 1 + diag(corr.model) <- 1 + + ## If necessary, correct to obtain a positive definite matrix + if(defpos) + corr.model <- as.matrix(Matrix::nearPD(corr.model, corr = TRUE)$mat) + + } + + ## Final output + ans <- list(method = method, + corr = corr, + model = corr.model, + para = para, + rmse = rmse) + + class(ans) <- 'isite' + + return(ans) +} + +#' @export +#' @rdname Intersite +print.isite <- function(obj){ + cat('\nIntersite-correlation\n') + cat('\nMethod:', obj$method) + cat('\nNb. sites:', ncol(obj$corr)) + + if(obj$method == 'exp'){ + cat('\nRMSE:', format(obj$rmse, digits = 4)) + cat('\nParameter:\n') + print(obj$para, digits = 4) + + } else if(obj$method == 'emp'){ + cat('\nAverage:', round(obj$para[1],3)) + } +} + +#' @export +#' @rdname Intersite +plot.isite <- function(obj, xmat, distance, xlab = NULL, ylab = NULL, ...){ + + if(is.null(ylab)) + ylab <- 'Intersite correlation' + + pcorr <- obj$corr[lower.tri(obj$corr)] + pmdl <- obj$model[lower.tri(obj$model)] + + if(obj$method == 'exp' ){ + + ph <- distance[lower.tri(obj$corr)] + pid <- order(ph) + + if(is.null(xlab)) + xlab <- 'Distance' + + plot(ph, pcorr, xlab = xlab, ylab = ylab, ...) + lines(ph[pid], pmdl[pid], col = 2, lwd = 1.5) + + } else if(obj$method == 'emp'){ + + if(is.null(xlab)) + xlab <- 'Pairs' + + plot(pmdl, xlab = xlab, ylab = ylab, ...) + abline(h = obj$para[1], col = 2, lwd = 1.5) + + } else { + warning('There is no intersite correlation to display') + } + +} + +#' @export +#' @rdname Intersite +IntersiteMdl <- function(para, distance){ + + distance <- as.matrix(distance) + corr <- para[1] * exp(-3*( distance / para[2])^para[3]) + diag(corr) <- 1 + + return(corr) +} diff --git a/R/rfa_JulianPlot.R b/R/rfa_JulianPlot.R new file mode 100644 index 0000000..abd36f1 --- /dev/null +++ b/R/rfa_JulianPlot.R @@ -0,0 +1,82 @@ +############################################################################### +#' Plotting Julian date +#' +#' Create axis for plotting circular statistics in a unitary circle. +#' +#' @author Martin Durocher +#' +#' @param rose.col,rose.lwd,rose.cex Property of the polar axes. +#' @param ... Other parameter passed to \link{points}. +#' +#' @seealso \link{SeasonStat}. +#' +#' @export +#' +#' @examples +#' +#' data(flowAtlantic) +#' +#' ss <- SeasonStat(date ~ id, flowAtlantic$ams) +#' +#' JulianPlot() +#' points(y ~ x, ss, pch = 16, col = cut(ss[,'radius'], c(0,.5,.75,1))) +#' +JulianPlot <- function(rose.col = "gray40", rose.lwd = 1.5, + rose.cex = 1.5, rose.radius = seq(.25,1,.25), ...){ + + plot(1, pch = '', ylim = c(-1,1)*1.2, xlim = c(-1,1)*1.2, axes = FALSE, + ylab = "", xlab = "") + + DrawCircle(0,0, radius = rose.radius, col = rose.col, lwd = rose.lwd) + + TextCircle(month.abb, radius = 1.1, col = rose.col, cex = rose.cex) + + segments(0,-1,0,1, col = rose.col, lwd = rose.lwd) + segments(-1,0,1,0, col = rose.col, lwd = rose.lwd) + +} + + +DrawCircle <- function(x = 0, y = NULL, radius = 1, res = 500, ...){ + + if(class(x) %in% c('data.frame','matrix')){ + y <- x[,2] + x <- x[,1] + } else if(class(x) == 'list'){ + y <- x$y + x <- x$x + } else if(class(x) == 'formula'){ + xd <- model.frame(x,y) + y <- x[,2] + x <- x[,1] + } + + if(is.null(y)) stop('Locations not correctly specified') + + ## Series of angles + tt <- c(seq(0,2*pi, len = res),0) + + if(length(x) == length(y) & length(y) == length(radius)){ + for(ii in seq_along(radius)) + lines(radius[ii]*cos(tt) + x[ii], + radius[ii]*sin(tt) + y[ii], type = 'l' ,...) + + } else { + for(ii in seq_along(radius)) + lines(radius[ii]*cos(tt) + x[1], + radius[ii]*sin(tt) + y[1], type = 'l' ,...) + } +} + + +TextCircle <- function(label, x = 0, y = 0, radius = 1, ...){ + + pp <- 1/(length(label)) + + for(ii in seq_along(label)){ + ang <- 2*pi*pp*(ii-1) + xii <- radius*cos(ang) + x + yii <- radius*sin(ang) + y + text(xii, yii,labels = label[ii],...) + } +} diff --git a/R/rfa_PlotMrl.R b/R/rfa_PlotMrl.R new file mode 100644 index 0000000..ded2590 --- /dev/null +++ b/R/rfa_PlotMrl.R @@ -0,0 +1,92 @@ +############################################################# +#' Mean residual life plot +#' +#' Produce a mean residual Life plot to help selecting to help +#' selecting a proper threshold. +#' +#' @author Martin Durocher +#' +#' @param form,x Formula and sample. The must be of the form. +#' +#' @param u Series of candidate thresholds. +#' +#' @param method Estimation method. +#' +#' @param alpha Confidence interal with level \code{1-alpha/2}. +#' +#' @param display Logical. Should the graph be display. +#' +#' @param ... Others arguments are passed to function \code{plot} and +#' \link{which.floodPeaks} +#' +#' @details +#' +#' @seealso \link{FitPot}, \link{which.floodPeaks}. +#' +#' @examples +#' +#' ## Find list of candidate thresholds +#' lstu <- seq(500,2500, len = 50) +#' +#' PlotMrl(flow~date, flowStJohn, u = lstu, declust = 'wrc', r = 14) +#' +#' x <- PlotMrl(flow~date, flowStJohn, u = lstu, declust = 'wrc', r = 14) +#' +#' head(x) +#' +#' @export +PlotMrl <- function(form,x, u, + declust = NULL, + r = 1, + rlow = 0.75, + alpha = 0.05, + ylab = 'Mean Residual Life', + xlab = 'Threshold', + col = 'black', lty = 1, lwd = 1, + col.ci = 'black', lty.ci = 3, lwd.ci = 1, + ylim = NULL, display = TRUE, ...){ + + ## reorganize the data + x <- model.frame(form,x) + dt <- x[,2] + x <- x[,1] + + u <- as.numeric(u) + + sig <- mrl <- nn <- rep(NA,length(u)) + for(ii in seq_along(u)){ + + ## Declustering + if(is.null(declust)) + cid <- x > u[ii] + else if(declust == 'run') + cid <- which.clusters(x, u[ii], r) + else if( declust == 'wrc') + cid <- which.floodPeaks(x, dt, u[ii], r = r, rlow = rlow) + + excess <- x[cid]-u[ii] + mrl[ii] <- mean(excess) + nn[ii] <- length(excess) + sig[ii] <- sd(excess)/sqrt(nn[ii]) + + } + + # Confident intervals + qn <- qnorm(1-alpha/2) + lb <- mrl - qn * sig + ub <- mrl + qn * sig + + ## Adjusted limits + if(is.null(ylim)) ylim <- range(c(lb,ub)) * c(.95,1.05) + + if(display){ + plot(u, mrl, xlab = xlab, ylab = ylab, ylim = ylim, + col = col, lty = lty, lwd = lwd, ...) + lines(u, lb, lty = lty.ci, col = col.ci, lwd = lwd.ci) + lines(u, ub, lty = lty.ci, col = col.ci, lwd = lwd.ci) + } + + ## Return + invisible(data.frame(u = u, n = nn,mrl = mrl, lower = lb, upper = ub)) + +} \ No newline at end of file diff --git a/R/rfa_PlotThresh.R b/R/rfa_PlotThresh.R new file mode 100644 index 0000000..1c1becc --- /dev/null +++ b/R/rfa_PlotThresh.R @@ -0,0 +1,164 @@ +####################################################################### +#' Visual diagnostic for peaks over threshold +#' +#' Create various graphics to assess the selection of a threshold. +#' Includes a plot with respect oh the threshold for the p-values for the +#' Anderson-Darling test, estimated parameter and flood quantiles. +#' Vertical lines are shown for thresholds associated to 1 and 1.5 peaks per +#' years. +#' +#' @author Martin Durocher +#' +#' @param obj Output from \link{SearchThresh}. +#' +#' @param type Type of plot to display. +#' Must be one or more of \code{'ad','mrl','alpha', 'kappa'}. +#' +#' @seealso \link{SearchThresh}, \link{FindThresh}. +#' +#' @export +#' +#' @examples +#' +#' lstu <- seq(500,2000,20) +#' out <- SearchThresh(flow~date, flowStJohn, u = lstu, declust = 'wrc', r = 14) +#' +#' PlotThresh(out) +#' +#' PlotThresh(out, type = 'q50') +#' +#' PlotThresh(out, type = paste0('q',c(2,5,10,20,50,100))) +#' +#' par(mfrow = c(2,2)) +#' PlotThresh(out, type = c('ad','kappa', 'mrl','q10')) +#' +PlotThresh <- function(obj, type = 'ad', ppy = NULL, ...){ + + u1 <- obj$u[which.min(abs(obj$ppy-1))] + u15 <- obj$u[which.min(abs(obj$ppy-1.5))] + + ## Filter the threshold with proper PPY + if(!is.null(ppy)){ + pid <- x$ppy >= ppy[1] & x$ppy <= ppy[2] + + if(any(pid)){ + x <- x[pid,] + } else{ + stop('There is no threshold found in the PP range.') + } + } + + ## ------------------------------------------------ + ## Create a graphic of the Anderson-Darling p-value + ## ------------------------------------------------ + + if('ad' %in% type ){ + plot(ad ~ u, obj, type = 'l', + ylab = 'Anderson-Darling (p-value)', + xlab = 'Threshold') + abline(h = c(0.05, 0.25), lty = 3) + abline(v = c(u15, u1), col = c('blue','red')) + } + + ## ------------------------------------------------ + ## Create a graphic of Mean residual life + ## ------------------------------------------------ + + if('mrl' %in% type ){ + lb <- obj$mrl - 2*obj$mrl_se + ub <- obj$mrl + 2*obj$mrl_se + + plot(mrl ~ u, obj, type = 'l', + ylim = c(.95,1.05) * c(min(lb),max(ub)), + ylab = 'Mean residual Life', + xlab = 'Threshold') + lines(obj$u, lb, lty = 3) + lines(obj$u, ub, lty = 3) + abline(v = c(u15, u1), col = c('blue','red')) + } + + ## ------------------------------------------------ + ## Create a graphic of the shape parameter + ## ------------------------------------------------ + + if('kappa' %in% type ){ + lb <- obj$kappa - 2*obj$kappa_se + ub <- obj$kappa + 2*obj$kappa_se + + plot(kappa ~ u, obj, type = 'l', + ylim = c(.95,1.05) * c(min(lb),max(ub)), + ylab = 'Parameter (kappa)', + xlab = 'Threshold') + lines(obj$u, lb, lty = 3) + lines(obj$u, ub, lty = 3) + abline(v = c(u15, u1), col = c('blue','red')) + } + + ## ------------------------------------------------ + ## Create a graphic of the scale parameter + ## ------------------------------------------------ + + if('alpha' %in% type ){ + lb <- obj$alpha - 2*obj$alpha_se + ub <- obj$alpha + 2*obj$alpha_se + + plot(alpha ~ u, obj, type = 'l', + ylim = c(.95,1.05) * c(min(lb),max(ub)), + ylab = 'Parameter (alpha)', + xlab = 'Threshold') + lines(obj$u, lb, lty = 3) + lines(obj$u, ub, lty = 3) + abline(v = c(u15, u1), col = c('blue','red')) + } + + ## ------------------------------------------------ + ## Create a graphic of a flood quantile + ## ------------------------------------------------ + + qname <- paste0('q',c(2,5,10,20,50,100)) + qq <- qname %in% type + + if(sum(qq) == 1){ + + qlab <- qname[which(qq)] + qlab.se <- paste0(qlab,'_se') + q0 <- obj[,qlab] + qse0 <- obj[,qlab.se] + lb <- q0 - 2 * qse0 + ub <- q0 + 2 * qse0 + + plot(obj$u, q0, type = 'l', + ylim = c(.95,1.05) * c(min(lb),max(ub)), + ylab = paste0('Flood quantile(',toupper(qlab),')'), + xlab = 'Threshold') + lines(obj$u, lb, lty = 3) + lines(obj$u, ub, lty = 3) + abline(v = c(u15, u1), col = c('blue','red')) + } + + ## ------------------------------------------------ + ## Create a graphic of multiple flood quantiles + ## ------------------------------------------------ + + if(sum(qq) > 1){ + + qname0 <- qname[which(qq)] + xq <- obj[,qname0] + + lb <- min(xq[,1]) + ub <- max(xq[,ncol(xq)]) + + plot(obj$u, xq[,1], type = 'l', + ylim = c(.95,1.05) * c(min(lb),max(ub)), + ylab = 'Flood quantiles', + xlab = 'Threshold') + text(obj$u[1], xq[1,1], labels = toupper(qname0[1]), pos = 3) + + for(ii in 2:ncol(xq)){ + lines(obj$u, xq[,ii]) + text(obj$u[1], xq[1,ii], labels = toupper(qname0[ii]), pos = 3) + } + abline(v = c(u15, u1), col = c('blue','red')) + } + +} diff --git a/R/rfa_PoolRemove.R b/R/rfa_PoolRemove.R new file mode 100644 index 0000000..60d4b76 --- /dev/null +++ b/R/rfa_PoolRemove.R @@ -0,0 +1,177 @@ +#' Remove heterogenous sites from a pooling group +#' +#' Return a regional model (\code{'FitRegLmom'}) where heterogenous sites +#' are removed in a stepwise manner. +#' At each step, the removed site that best improves the homogeneity statistic +#' is permanently removed until a stopping criterion. +#' The first site that was passed in a dataset is considered as the target and +#' it cannot be removed. +#' +#' @author Martin Durocher +#' +#' @param obj An output from \link{FitRegLmom}. +#' +#' @param method,tol Which heterogenity statistics used in the procedure. +#' The choices are \code{'H1'}, \code{'H2'} and \code{'H3'}. +#' The algorithm stop when the heterogenity goes below the value \code{tol}. +#' +#' @param nmin,ntot.min Additional stopping criteria. Respectively the +#' minimal number of sites or station-year to be included in the region. +#' +#' @param nsim Number of simulations used to evaluate the heterogenous statistic +#' +#' @param distr.fix Logical, should the selection of the distribution be +#' re-evaluated after removing the site. +#' +#' @param verbose Logical. Should a trace of the removed sites be display. +#' +#' @export +#' +#' @examples +#' +#' data(flowAtlantic) +#' +#' ## Organize data +#' ams <- flowAtlantic$ams +#' ams$year <- format(ams$date, '%Y') +#' xmat <- DataWide(ams ~ id + year, ams) +#' +#' ## Compute distance +#' coord <- flowAtlantic$info[,c('lon','lat')] +#' rownames(coord) <- flowAtlantic$info$id +#' h <- GeoDist(coord) +#' +#' ## Fit a index flood model inside a pooling group +#' xmat0 <- FindNearest(xmat, h[1, colnames(xmat)], 25) +#' fit <- FitRegLmom(xmat) +#' +#' ## Remove site until homogeneity is reached +#' fit.new <- PoolRemove(fit, tol = 2) +#' +#' ## Get the data from the pooling group +#' xmat1 <- xmat[,sitenames(fit.new)] +#' +#' +PoolRemove <- + function(obj, + method = 'H1', + tol = 2, + nmin = 15, + ntot.min = 0, + nsim = 1000, + distr.fix = FALSE, + verbose = TRUE){ + + site.removed <- list() + + ## Select the criteria for evaluating the homogeneity + r <- which(c('H1','H2','H3') == method) + + if(is.null(obj$stat)){ + dd <- lmomRFA::as.regdata(data.frame(rownames(obj$lmom), + obj$nrec, obj$lmom), FALSE) + + tst <- lmomRFA::regtst(dd, diagnostic.nsim) + + obj$stat <- c(tst$H, tst$Z) + + } + + if (obj$stat[r] <= tol){ + warning('The pooling group is already sufficiently homogenous') + return(obj) + } + + repeat{ + + ## verify that removing one site will no lead to a too small region + if(nrow(obj$lmom) - 1 < nmin) + break + + ## monitoring (if require) + if (verbose){ + print(paste('n:', nrow(obj$lmom), + ', h:', round(obj$stat[r],2), + ', t:', sum(obj$nrec), sep = '') ) + } + + + ## remove one site + suppressWarnings(obj.new <- PoolRemove0(obj, method = method, + nsim = nsim, distr.fix = distr.fix)) + + ## verify stopping criteria + ntot.new <- sum(obj.new$nrec) + + if(ntot.new < ntot.min){ + warning('The minimal number of station-years have been reached') + break + + } else{ + ## iterate + obj <- obj.new + } + + ## If a sufficient heterogeous criterion has been reached + if (obj$stat[r] <= tol) + break + + } + + return(obj) + +} + +PoolRemove0 <- function(obj, method, nsim, distr.fix){ + + ## Number of site + nk <- nrow(obj$lmom) + + ## Which homogeneity statistic to use + r <- which(method == c('H1','H2','H3')) + + ## ------------------------- + ## Find the site to remove + ## ------------------------- + + ## Create a regdata object + dd <- lmomRFA::as.regdata(cbind(1:nk, obj$nrec, obj$lmom), FALSE) + + ## Function for computing the homogeneity H without a specific site + FunHmg <- function(ii) lmomRFA::regtst(dd[-ii,],nsim) + + ## find the sites that improve best H + ## Note that the target is always the first site and must be kept + tst.new <- lapply(1:nk, FunHmg) + hmg.new <- sapply(tst.new, getElement, 'H') + mid <- which.min(abs(hmg.new[r,-1])) + 1 + tst0 <- tst.new[[mid]] + + ## ------------------------------- + ## update the pooling group object + ## ------------------------------- + + obj$lmom <- obj$lmom[-mid,] + obj$nrec <- obj$nrec[-mid] + obj$stat <- c(tst0$H, tst0$Z) + obj$discord <- tst0$D + + ## For amax, update the selected distribution + if (!distr.fix & obj$type == 'amax') + obj$distr <- c('glo','gev','gno','pe3')[which.min(abs(obj$stat[4:7]))] + + ## Estimate the new regional L-moments + obj$rlmom <- lmomRFA::regavlmom(dd[-mid,]) + + ## Refit the growth curve with maybe new distribution + if (obj$type == 'amax'){ + v <- lmomco::vec2lmom(obj$rlmom, lscale = FALSE) + obj$para <- lmomco::lmom2par(v, obj$distr)$para + + } else if (obj$type == 'pot'){ + k <- 1/obj$rlmom[2]-2 + obj$para <- c(1 + k, k) + } + + return(obj) +} diff --git a/R/rfa_RegSim.R b/R/rfa_RegSim.R new file mode 100644 index 0000000..a850786 --- /dev/null +++ b/R/rfa_RegSim.R @@ -0,0 +1,214 @@ +############################################################################# +#' Simulation of a regional dataset with intersite correlation. +#' +#' Returns a dataset containing multiple time series in the form of +#' a matrix where the sites are in columns. +#' Different record lengths can be specified for each site +#' and missing values are filled accordingly at the beginning. +#' The rows (time) are independent and the intersite correlation model +#' is based on a multivariate Normal distribution. +#' +#' @author Martin Durocher +#' +#' @param x Matrix (in rows) of parameters or L-moments for all sites to +#' simulate. +#' Can also be an output form \link{FitRegLmom}. +#' +#' @param distr Marginal distribution of each site. +#' If only one value is passed as argument, the same is used for all sites. +#' +#' @param nrec Record lengths of the sites. +#' If only one value is passed in argument, the same is used for all sites. +#' +#' @param corr Correlation matrix for the dependence between site. +#' If only one value is passed, the correlation is assumed +#' the for every pair of sites. +#' +#' @param corr.sqrt Squared correlation matrix. Can be passed to speed up +#' multiple calls. +#' +#' @param lmom Logical. Is the argument `x` a matrix of L-moments or +#' distribution parameters +#' +#' @param lscale Logical. Is the second L-moments the scale (`TRUE`) +#' or the LCV (`FALSE`). +#' +#' @param long Logical. Should the output be returned in a long format. +#' +#' @export +#' +#' @examples +#' +#' ## Extract data +#' data(flowUngauged) +#' lmom <- flowUngauged[1:5, c('l1','lcv','lsk')] +#' +#' ## Simulate data base on at-site L-moments +#' sim <- RegSim(lmom, distr = 'gev', nrec = 11:15, corr = .4) +#' +#' head(sim) +#' +#' sim <- RegSim(lmom, +#' distr = c(rep('gev',4),'gno'), +#' nrec = 10:15, +#' corr = .4, long = TRUE) +#' head(sim) +#' +#' +RegSim <- function(x, ...) UseMethod('RegSim', x) + +#' @export +RegSim.data.frame <- function(x, ...) + RegSim.matrix(as.matrix(x), ...) + +#' @export +#' @rdname RegSim +RegSim.matrix <- + function( + x, + distr, + nrec, + corr = 0, + corr.sqrt = FALSE, + lmom = TRUE, + lscale = FALSE, + long = FALSE) +{ + + ## Extract info + nsite <- nrow(x) + nrec.max <- max(nrec) + + ## Expend distr if constant + if(length(distr) == 1) + distr <- rep(distr, nsite) + + ## Create a matrix if only a scalar is passed as correlation + if (length(corr) == 1){ + corr <- matrix(corr, nsite, nsite) + diag(corr) <- 1 + } + + ## Create a matrix if only a scalar is passed as correlation + if (length(nrec) == 1){ + nrec <- rep(nrec,nsite) + } + + ## Decomposed the correlation matrix if necessary + if( any(is.na(corr))) + stop('Missing value in the correlation matrix') + + if (corr.sqrt){ + corr.L <- corr + } else { + corr.L <- chol(corr) + } + + ## Simulate a normal copula + u <- matrix(rnorm(nrec.max * nsite), nrec.max, nsite) + u <- pnorm(u %*% corr.L) + + ## ------------------------------------------ ## + ## Convert L-moment to parameter if necessary + ## ------------------------------------------ ## + + if (lmom){ + ## Extract list of functions that convert L-moments to parameter + ffunc <- lapply(distr, + function(d) getFromNamespace(paste0('pel',d),'lmom')) + + ## If LCV is passed correct the 2nd L-moments + if(lscale == FALSE) + x[,2] <- x[,2] * x[,1] + + ## Estimate parameters for every site + para <- lapply(1:nrow(x), function(kk) ffunc[[kk]](x[kk, ])) + + } else { + + ## If parameter were passed as matrix, transform to list + para <- lapply(split(x,1:nrow(x)), na.omit) + } + + ## Extract a list of quantile functions for each site + qfunc <- lapply(distr, function(d){ + getFromNamespace(paste0('qua',d),'lmom') + }) + + ## Transform uniform data to proper marginal distribution + ans <- sapply(1:nsite, function(kk){ + qfunc[[kk]](u[,kk], para[[kk]]) + }) + + ## Adjust record length by adding NA to early data + Rlen <- function(x,n){ + nrm <- length(x)-n + + if(nrm > 0) + x[1:nrm] <- NA + + return(x) + } + + ans <- sapply(1:nsite, function(kk) Rlen(ans[,kk], nrec[kk])) + + ## ------------------------------------- ## + ## Transform the data in the long format + ## ------------------------------------- ## + + if(long){ + + ans <- cbind(expand.grid(time = 1:nrow(ans), site = 1:ncol(ans)), + value = as.numeric(ans)) + + ans <- ans[!is.na(ans$value), ] + + } + + return(ans) +} + +#' @export +#' @rdname RegSim +RegSim.reglmom <- function(obj, n = 1, corr = 0, margin = 'atsite') +{ + + nsite <- nrow(obj$lmom) + nmax <- max(obj$nrec) + + corr <- as.matrix(corr) + + if(length(corr) == 1){ + corr <- matrix(corr[1], nsite, nsite) + diag(corr) <- 1 + } + + corr.L <- chol(corr) + + ## ---------------------------------------------------------- ## + ## Perform simulation + ## ---------------------------------------------------------- ## + + if(margin == 'atsite'){ + lmom0 <- obj$lmom + } else if(margin == 'reg'){ + lmom0 <- t(replicate(nsite,obj$rlmom)) + } + + Sim1 <- function(){ + out <- RegSim(lmom0, distr = obj$distr, nrec = obj$nrec, + corr = corr.L, corr.sqrt = TRUE, long = FALSE) + + return(mapply('*', as.data.frame(out), obj$lmom[,1])) + } + + ans <- replicate(n, Sim1()) + colnames(ans) <- obj$station + + ## Case there is one simulation + if(n == 1) + ans <- ans[ , , 1] + + return(ans) +} + diff --git a/R/rfa_SearchThresh.R b/R/rfa_SearchThresh.R new file mode 100644 index 0000000..b34adea --- /dev/null +++ b/R/rfa_SearchThresh.R @@ -0,0 +1,92 @@ +############################################################################## +#' Fit POT models for a list of candidate thresholds +#' +#' The function \code{SearchThresh} returns a data frame containing +#' key value for the automatic selection of a threshold and where each row +#' corresponds to a candidate threshold. +#' The result is extracted from several calls to the function \code{FitPot}. +#' +#' @author Martin Durocher +#' +#' @param u Vector of candidate thresholds. +#' +#' @param nmin Stopping condition verifying that a minimal number of peaks +#' are extracted. +#' +#' @param verbose Logical. Should a progress bar be displayed. +#' +#' @param ... Other arguments passed to \link{FitPot}. +#' +#' @export +#' +#' @examples +#' +#' # Create a list of candidate threshold +#' lstu <- which.floodPeaks(flow~date, flowStJohn, u =500, r = 14) +#' lstu <- sort(unique(flowStJohn[lstu,'flow'])) +#' lstu <- lstu[seq(1,length(lstu)-30,2)] +#' +#' out <- SearchThresh(flow~date, flowStJohn, u = lstu, declust = 'wrc', r = 14) +#' head(out) +#' +#' FindThresh(out, method = 'sgn', tol.sgn = 0.1) +#' FindThresh(out, method = 'ppy', tol.ppy = 2) +#' FindThresh(out, method = 'max') +#' +SearchThresh <- function(form, x, u, nmin = 20, verbose = TRUE, ...){ + + u <- sort(unique(u)) + + if(length(u) < 2) + stop('More than one threshold must be specified.') + + nu <- length(u) + + ans <- matrix(NA, nu, 23) + qq <- c(2,5,10,20,50,100) + qname <- paste0('q',qq) + colnames(ans) <- c('u', 'n','nyear', 'ppy','mrl', 'mrl_se', + 'alpha','kappa', 'alpha_se', 'kappa_se', + qname, paste0(qname,'_se'), + 'ad') + + bar <- txtProgressBar() + for(ii in 1:nu){ + + if(verbose) + setTxtProgressBar(bar, ii/nu) + + fit0 <- try(FitPot(form, x, u = u[ii], declust = 'wrc', r = 14)) + + if(class(fit0) != 'fpot') + next + + gof0 <- GofTest(fit0)$pvalue + + pred0 <- predict(fit0, se = TRUE) + + ans[ii,] <- c(u[ii], ## threshold + fit0$nexcess, ## number of excess + fit0$nyear, ## number of years + fit0$nexcess/fit0$nyear, ## Peaks per year + fit0$mrl, ## Mean residual life + sd(fit0$excess)/sqrt(fit0$nexcess), ## sdev + fit0$estimate, ## parameter + sqrt(diag(fit0$varcov)), ## sdev + pred0[,1], ## flood quantiles + pred0[,2], ## sdev + gof0) ## AD p-value + + if(fit0$nexcess < nmin){ + nu <- ii + ans <- ans[1:nu,] + break + } + } + + ans <- as.data.frame(ans) + + return(ans) +} + + diff --git a/R/rfa_SeasonStat.R b/R/rfa_SeasonStat.R new file mode 100644 index 0000000..8670a01 --- /dev/null +++ b/R/rfa_SeasonStat.R @@ -0,0 +1,118 @@ +################################################################## +#' Seasonal statistics for flood peaks +#' +#' Return the circular or seasonal statistics of flood peaks. +#' The angle represent the average timing of the floods and the radius its +#' regularity. +#' For instance a radius of one represent perfect regularity. +#' Can perform the analysis of multiple sites. +#' +#' @author Martin Durocher +#' +#' @param x Data. If data.frame with two columns, they must be respectively +#' the date and a site variable. +#' +#' @param form Formula that specifies the date and site variable. Must be of the +#' form \code{date ~ site}. +#' +#' @section References: +#' +#' Burn, D.H. (1997). Catchment similarity for regional flood frequency analysis +#' using seasonality measures. Journal of Hydrology 202, 212-230. +#' https://doi.org/10.1016/S0022-1694(97)00068-1 +#' +#' @export +#' +#' @examples +#' +#' dt <- ExtractAmax(flow~date, flowStJohn)$date +#' +#' SeasonStat(dt) +#' +#' ## Illustration of the analysis of multiple sites +#' +#' F0 <- function(ii) data.frame(site = ii, dt = sample(dt, replace = TRUE)) +#' x <- lapply(1:10, F0) +#' x <- do.call(rbind, x) +#' +#' st <- SeasonStat(dt ~ site, x) +#' +#' JulianPlot() +#' points(y ~ x, st, col = 2, pch = 16) +#' +SeasonStat <- function(x, ...) UseMethod('SeasonStat', x) + +#' @export +SeasonStat.default <- function(x){ + + x <- as.Date(x) + + deg <- 2 * pi * DecimalDay(x) + + ## compute average + xbar <- mean(cos(deg)) + ybar <- mean(sin(deg)) + + ## compute the circular statistic + cs <- Xy2polar(xbar, ybar) + + ans <- c(xbar, ybar, cs$angle, cs$radius) + names(ans) <- c('x','y','angle','radius') + + return(ans) +} + +#' @export +#' @rdname SeasonStat +SeasonStat.data.frame <- function(x){ + ans <- lapply(split(x[,1], as.character(x[,2])), SeasonStat) + return(do.call('rbind', ans)) +} + +#' @export +#' @rdname SeasonStat +SeasonStat.formula <- function(form, x){ + x <- model.frame(form,as.data.frame(x)) + return(SeasonStat(x)) +} + +## Convert the day of the year into a decimal value +## take leap year into account +DecimalDay <- function(x){ + + ## Extract julian day + x <- as.Date(x) + yy <- as.numeric(format(x, "%Y")) + dd <- as.numeric(format(x, "%j")) + + ## verify for leap years + isLeap <- is.leapyear(yy) + + ## Convert in decimal + (dd - .5) / (365 + isLeap) + +} + +## Logical is y a leap year +is.leapyear <- function(y) + ((y %% 4 == 0) & (y %% 100 != 0)) | (y %% 400 == 0) + + +## Convert cartesian to polar coordinates +Xy2polar <- function(x,y){ + + ## compute polar coordinates + ang <- atan(abs(y/x)) + r <- sqrt(x^2 + y^2) + + ## correcting angle for + if(sign(x) < 0 & sign(y) >= 0) # second quadrant + ang <- pi - ang + else if(sign(x) < 0 & sign(y) < 0) # third quadrant + ang <- pi + ang + else if(sign(x) >= 0 & sign(y) < 0) # fourth quadrant + ang <- 2*pi - ang + + list(radius = r, angle = ang) +} + diff --git a/R/rfa_amax.R b/R/rfa_amax.R new file mode 100644 index 0000000..062a426 --- /dev/null +++ b/R/rfa_amax.R @@ -0,0 +1,69 @@ +############################################################################ +#' Basic probability functions for distribution of annual maximums +#' +#' Density, distribution function, quantile function and random generation +#' for various distribution used in the modeling annual maximums. +#' +#' @author Martin Durocher +#' +#' @name Amax +#' +#' @param x,q Vector of quantiles. +#' +#' @param p Vector of probabilities. +#' +#' @param n Number of observations. +#' +#' @param para Vector of parameters for the given distribution. +#' +#' @param distr Distribution family. See \link{lmom2par}. +#' +#' @param log Logical. If TRUE, probabilities \code{p} are given as +#' \code{log(p)}. +#' +#' @export +#' +#' @examples +#' +#' u <- runif(5) +#' u +#' x <- qAmax(u, c(100,3,.001), 'gno') +#' pAmax(x, c(100,3,.001), 'gno') +#' +#' x <- rAmax(100, c(100,30,0), 'gev') +#' sum(dAmax(x, c(100,30, 0), 'gev', log = TRUE)) +#' +#' lAmax(c(100, .3, .2), 'gev', lscale = F) +#' +#' + +#' @export +#' @rdname Amax +dAmax <- function(x, para, distr, log = FALSE){ + ans <- lmomco::dlmomco(x, lmomco::vec2par(para,distr)) + + if(log) + ans <- log(ans) + + return(ans) +} + +#' @export +#' @rdname Amax +pAmax <- function(q, para, distr) + lmomco::plmomco(q, lmomco::vec2par(para,distr)) + +#' @export +#' @rdname Amax +qAmax <- function(p, para, distr) + lmomco::qlmomco(p, lmomco::vec2par(para,distr)) + +#' @export +#' @rdname Amax +rAmax <- function(n, para, distr) + lmomco::rlmomco(n, lmomco::vec2par(para,distr)) + +#' @export +#' @rdname Amax +lAmax <- function(l, distr, ...) + lmomco::lmom2par(lmomco::vec2lmom(l, ...), distr)$para diff --git a/R/rfa_data.R b/R/rfa_data.R new file mode 100644 index 0000000..1c61472 --- /dev/null +++ b/R/rfa_data.R @@ -0,0 +1,55 @@ +##################################################################### +#' Streamflow data +#' +#' Daily river discharge for the station 01AD002 on +#' St-John River at Fort Kent, New Brunswick. +#' Data range from 1926 to 2014 and have a drainage area of 14700 sq km. +#' +#' @author Martin Durocher +#' @source \url{https://wateroffice.ec.gc.ca/} +##################################################################### +"flowStJohn" + +##################################################################### +#' L-moments and catchment descriptors of hydrometric stations in Canada +#' +#' The L-moments of the annual maximums at 562 stations +#' were extracted from Water Survery of Canada (HYDAT). +#' Catchment descriptors are available for each station was +#' provided by Environment and Climate Change Canada (ECCC). +#' The best at-site distributions according to the AIC criterion are included. +#' +#' \describe{ +#' \item{site}{Identification number of the station in HYDAT.} +#' \item{area}{Drainage area (sq km).} +#' \item{map}{Mean annual precipitation for the catchment (mm).} +#' \item{wb}{Drainage area covered by waterbodies (pct).} +#' \item{stream}{Stream density (km of streams per catchment sq km).} +#' \item{lon,lat}{Longitude and latitude of the catchment center.} +#' \item{l1, lcv, lsk}{Sample mean, L-coefficient of variation and +#' L-coefficient of skewness of the annual maximum discharges.} +#' \item{dstr}{Distribution selected for the annual maximum discharge based +#' on the Akaike Information Criterion (AIC).} +#' } +#' +#' @author Martin Durocher +#' @source \url{https://wateroffice.ec.gc.ca/} +##################################################################### +"flowUngauged" + +##################################################################### +#' Annual maximums from sites in the Atlantic region of Canada +#' +#' Contains the annual maximums of 45 hydrometric stations found in the +#' region '01' of Water Survery of Canada. +#' Additionaly to the annual maximums, the output list includes catchment +#' descriptors (longitude, latitude, drainage area, mean annual precipitation) +#' and the geographical distance between each station. +#' +#' @author Martin Durocher +#' @source \url{https://wateroffice.ec.gc.ca/} +##################################################################### +"flowAtlantic" + + + diff --git a/R/rfa_fgpa.R b/R/rfa_fgpa.R new file mode 100644 index 0000000..4862e25 --- /dev/null +++ b/R/rfa_fgpa.R @@ -0,0 +1,139 @@ +############################################################### +#' Estimation of the Generalized Pareto distribution. +#' +#' Low level functions for estimating of the generalized Pareto +#' distribution(GPA) with two parameters. Can use +#' either maximum likelihood or the method of L-moments. +#' The algorithm of \code{fgpa2d} is using +#' \code{optim} to directly optimize the log-likelihood (bivariate), while +#' the algorithm of \code{fgpa1d} is using a transformation to use +#' a univariate optimization routine. Additionally, \code{fgpa2d} constraint +#' the shape parameter between -.5 and 1. +#' +#' @author Martin Durocher +#' +#' @name fgpa +#' +#' @param x Sample. +#' +#' @param sol Does solution from \code{optim} be returned. +#' In case of \code{fgpa1d}, it returns the variance covariance matrix. +#' +#' @param par0 Initial parameter. +#' +#' @param ... aditional arguments to pass to \code{\link{optim}} +#' +#' @section Reference: +#' +#' Davison AC, Smith RL. (1990) Models for Exceedances over High Thresholds. +#' Journal of the Royal Statistical Society Series B (Methodological). +#' 52(3):393–442. +#' +#' Hosking JRM (1990). L-Moments: Analysis and Estimation of Distributions Using +#' Linear Combinations of Order Statistics. Journal of the Royal Statistical +#' Society Series B (Methodological). 52(1):105–24. +#' +#' @export +#' +#' @examples +#' +#' x <- rgpa(1000, 1, -.2) +#' fgpa1d(x) +#' fgpa2d(x) +#' fgpaLmom(x) +#' +fgpa1d <- function(x, sol = FALSE){ + + fk <- function(sigma) -mean(log(1-x/sigma)) + + fpara <- function(sigma){ + length(x) * (-log(fk(sigma) * sigma) + fk(sigma) - 1) + } + + mx <- max(x) + + sigma <- NA + suppressWarnings(try( + sigma <- optimize(fpara, interval = c(-10000,10000) * mx, + maximum = TRUE)$maximum)) + + para <- rep(NA,2) + names(para) <- c('alpha','kappa') + try(para[2] <- fk(sigma)) + try(para[1] <- para[2]*sigma) + + if(sol){ + ans <- list(par = para, varcov = matrix(NA,2,2)) + + ## evaluate the covariance matrix + ans$varcov[2,2] <- 1-para[2] + ans$varcov[1,1] <- 2 * para[1]^2 + ans$varcov[1,2] <- ans$varcov[2,1] <- para[1] + ans$varcov <- ans$varcov * ans$varcov[2,2] / length(x) + + } else { + ans <- para + } + + return(ans) + +} + +#' @export +#' @rdname fgpa +fgpa2d <- function(x, sol = FALSE, par0 = NULL, ...){ + + logit0 <- function(z) logit((z+.5)/1.5) + expit0 <- function(z) expit(z)*1.5 -.5 + + ## negative loglikelihood + nllik <- function(para) -sum(dgpa(x,exp(para[1]), + expit0(para[2]), log = TRUE)) + + if(!is.null(par0)){ + par0[1] <- log(par0[1]) + par0[2] <- logit0(par0[2]) + } else + par0 <- c(log(mean(x)),-.6931472) + + ## estimate the parameter + para <- optim( par0, nllik, ...)$par + para[1] <- exp(para[1]) + para[2] <- expit0(para[2]) + + names(para) <- c('alpha','kappa') + + if(sol){ + ans <- list(par = para, varcov = matrix(NA,2,2)) + + ## evaluate the covariance matrix + ans$varcov[2,2] <- 1-para[2] + ans$varcov[1,1] <- 2 * para[1]^2 + ans$varcov[1,2] <- ans$varcov[2,1] <- para[1] + ans$varcov <- ans$varcov * ans$varcov[2,2] / length(x) + + } else { + ans <- para + } + + return(ans) +} + +#' @export +#' @rdname fgpa +fgpaLmom <- function(x){ + lmom0 <- lmomco::lmoms(x, nmom = 3) + return(lmomco::lmom2par(lmom0,'gpa', xi = 0)$para[-1]) +} + + +######################################################################## +# Logit function +# +# Return the logit of a functon or its inverse. +# +logit <- function(x) + log(x/(1-x)) + +expit <- function(x) + exp(x)/(1 + exp(x)) diff --git a/R/rfa_gpa.R b/R/rfa_gpa.R new file mode 100644 index 0000000..7819a8c --- /dev/null +++ b/R/rfa_gpa.R @@ -0,0 +1,138 @@ +########################################################################### +#' Generalized Pareto distribution (GPA) +#' +#' Distribution, density, quantile and random function for the Generalized +#' pareto distriution. +#' +#' @author Martin Durocher +#' +#' @name GPA +#' +#' @param p,q Probabilities or quantiles for the GPA distribution. +#' +#' @param n Number of simulations. +#' +#' @param alpha Scale parameter of the GPA +#' +#' @param kap Shape parameter of the GPA +#' +#' @param lower.tail Should the propability of the lower tail be returned +#' +#' @param log Should the log-density be returned +#' +#' @references +#' +#' Davison, A. C., & Smith, R. L. (1990). Models for Exceedances over High +#' Thresholds. Journal of the Royal Statistical Society. Series B +#' (Methodological), 52(3), 393-442. http://www.jstor.org/stable/2345667 +#' +#' +#' @export +#' +#' @examples +#' +#' kap <- -.2 +#' a <- 1 +#' xd1 <- rgpa(1e4, a, kap) +#' xd2 <- qgpa(runif(1e4), a, kap) +#' +#' qqplot(xd1, xd2) +#' +#' +#' tt <- seq(0.001,6, len = 100) +#' +#' hist(xd1[xd1<6], main = 'GPA distribution', +#' freq = FALSE, ylim =c(0,1), xlim = c(0,6)) +#' +#' lines(tt, dgpa(tt,a,kap)) +#' lines(tt,pgpa(sort(tt), a, kap), col = 2, lty = 2) +#' +#' +pgpa <- function (q, alpha = 1, kap = 0, lower.tail = TRUE) +{ + if (min(alpha) <= 0) + stop("invalid alpha") + + if (length(kap) != 1) + stop("invalid kappa") + + q <- pmax(q, 0)/alpha + + if (kap == 0) + p <- 1 - exp(-q) + else { + p <- pmax(1 - kap * q, 0) + p <- 1 - p^(1/kap) + } + + if (!lower.tail) + p <- 1 - p + + return(p) +} + +#' @export +#' @rdname GPA +rgpa <- function (n, alpha = 1, kap = 0) +{ + if (min(alpha) < 0) + stop("invalid alpha") + if (length(kap) != 1) + stop("invalid kappa") + if (kap == 0) + return(alpha * rexp(n)) + else return(- alpha * (runif(n)^(kap) - 1)/kap) +} + +#' @export +#' @rdname GPA +dgpa <- function (x, alpha = 1, kap = 0, log = FALSE) +{ + if (min(alpha) <= 0) + stop("invalid alpha") + + if (length(kap) != 1) + stop("invalid kappa") + + d <- x/alpha + nn <- length(d) + alpha <- rep(alpha, length.out = nn) + index <- (d > 0 & ((1 - kap * d) > 0)) | is.na(d) + + if (kap == 0) { + d[index] <- log(1/alpha[index]) - d[index] + d[!index] <- -Inf + } + else { + d[index] <- log(1/alpha[index]) - + (1 - 1/kap) * log(1 - kap * d[index]) + d[!index] <- -Inf + } + + if (!log) + d <- exp(d) + + return(d) +} + +#' @export +#' @rdname GPA +qgpa <- function (p, alpha = 1, kap = 0, lower.tail = TRUE) +{ + if (min(p, na.rm = TRUE) < 0 || max(p, na.rm = TRUE) > 1) + stop("`p' must contain probabilities in (0,1)") + + if (min(alpha) < 0) + stop("invalid alpha") + + if (length(kap) != 1) + stop("invalid kappa") + + if (lower.tail) + p <- 1 - p + + if (kap == 0) + return(- alpha * log(p)) + else + return(-alpha * (p^(kap) - 1)/kap) +} \ No newline at end of file diff --git a/R/rfa_plot_amax.R b/R/rfa_plot_amax.R new file mode 100644 index 0000000..3a070d1 --- /dev/null +++ b/R/rfa_plot_amax.R @@ -0,0 +1,77 @@ +############################################# +#' Return level plot +#' +#' Create a plot of the estimated versus sample flood quantiles, where the +#' x-axis is expressed in terms of return period. +#' +#' @author Martin Durocher +#' +#' @param obj Output from \link{FitAmax}. +#' +#' @param ci Logical. Should confidence intervals be displayed. +#' See \link{predict.amax} with argument Delta method. +#' +#' @param col.ci,lty.ci,lwd.ci Graphical parameters defining the display +#' of the confidence interval. +#' +#' @param ... Other graphical parameters. See \code{\link{par}}. +#' +#' @export +#' +#' @examples +#' +#' data(flowStJohn) +#' +#' x <- ExtractAmax(flow~date, flowStJohn)$flow +#' +#' fit <- FitAmax(x, distr = 'gev', method = 'mle') +#' +#' plot(fit, ci = TRUE) + +plot.amax <- function(obj, main = 'Return level plot', + xlab = 'Return period (year)', + ylab = 'Flood quantiles', + ci = FALSE, col.ci = 'red', lty.ci = 2, + lwd.ci = 1, ...){ + + n <- length(obj$data) + x <- sort(obj$data) + p <- obj$para + nrt <- 200 + + ## Plotting axis + xat <- c(1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 5000, 10000) + + prt <- (seq(n) - .5) / n + ip <- seq(min(prt), max(prt), l = nrt) + llip <- -log(-log(ip)) + + pat <- 1-1/xat + irt <- 1-1/ip + + ## Plot empirical points + plot(-log(-log(prt)), x, axes = FALSE, main = main, + ylab = ylab, xlab = xlab, ...) + + axis(2) + + axis(1, at = -log(-log(pat)), lab = xat) + + ## if Confident interval are to be plotted + if(ci){ + + bnd <- predict(obj, q = ip, se = FALSE, ci = 'delta') + + lines(llip, bnd[,1], col = col.ci, lwd = lwd.ci) + + lines(llip,smooth.spline(irt,bnd[,2])$y, + lty = lty.ci, col = col.ci, lwd = lwd.ci) + + lines(llip,smooth.spline(irt,bnd[,3])$y, + lty = lty.ci, col = col.ci, lwd = lwd.ci) + + } else{ + bnd <- predict(obj, q = ip, se = FALSE, ci = 'none') + lines(llip, bnd, col = col.ci, lwd = lwd.ci) + } +} diff --git a/R/rfa_predict_amax.R b/R/rfa_predict_amax.R new file mode 100644 index 0000000..b25fbd4 --- /dev/null +++ b/R/rfa_predict_amax.R @@ -0,0 +1,166 @@ +###################################################################### +#' Predict return levels +#' +#' Return the flood quantile of annual maximum distribution and +#' Confident intervals are provided by bootstrap. +#' +#' @param obj Output from \code{\link{FitAmax}} +#' +#' @param q Probabilities associated to the return level. For example, +#' a 100 years return period is equivalent to \code{q = 0.99}. +#' +#' @param se Return the standard deviation of the return level using +#' the delta method. The fitted model must +#' +#' @param ci Method to compute the confident interval. One of \code{'delta'} +#' for the delta method, \code{'boot'} for parametric boostrap and \code{'norm'} +#' for Monte-Carlo approximation assuming normality of the parameters. +#' +#' @param alpha Probability outside the confident interval. +#' +#' @param nsim Number of simulation use for resampling. +#' +#' @param out.matrix Logical. Should the resampling be returned. If true, +#' a list is returned containing the prediction table (\code{pred}), +#' the parameters (\code{para}) and the return levels (\code{qua}). +#' +#' @export +#' +#' @examples +#' +#' #' ## Extract an time series of annual maxima +#' x <- ExtractAmax(flow~date, flowStJohn)$flow +#' +#' ## Fitting of GEV distribution using L-moments +#' fit <- FitAmax(x,'gev', method = 'mle') +#' +#' ## Get the estimated quantile of 10 and 100 years return period +#' rp <- 1-1/c(10,100) +#' predict(fit, rp) +#' predict(fit, se = TRUE, ci = 'delta') +#' +#' ## The bootstrap sample used for CI are returned +#' fit <- FitAmax(x,'gev', varcov = FALSE) +#' boot <- predict(fit, rp, se = FALSE, ci = 'boot', +#' nsim = 500, out.matrix = TRUE) +#' +predict.amax <- function(obj, q = c(.5, .8, .9, .95, .98, .99), + se = FALSE, ci = 'none', + alpha = .05, nsim = 1000, + out.matrix = FALSE){ + + n <- length(obj$data) + + ## Function that compute the return level for a given vector of parameter + FunQ <- function(z, q0){ + lmomco::qlmomco(q0, lmomco::vec2par(z, obj$distr)) + } + + ## Compute Return level + ans <- FunQ(obj$para, q) + + ## Compute confident intervals by resampling techniques + if(ci == 'boot'){ + + ## using Parametric bootstrap + bootp <- matrix(NA,nsim,length(obj$para)) + p0 <- lmomco::vec2par(obj$para, obj$distr) + + for(ii in 1:nsim){ + + repeat{ + ## simulate + b <- lmomco::rlmomco(n,p0) + + ## estimate + if(obj$method == 'gml'){ + suppressWarnings(p <- try( + FitGev(b, varcov = FALSE, mu = obj$prior[1], sig2 = obj$prior[2]), + silent = TRUE)) + + } else { + suppressWarnings(p <- try( + FitAmax(b, distr = obj$distr, method = obj$method, varcov = FALSE), + silent = TRUE)) + } + + ## Sample only feasible set + if(any(class(p) != 'try-error')) + if(p$method == obj$method) + break + + }# end repeat + + + bootp[ii,] <- p$para + + }# end for + + } else if(ci == 'norm'){ + + ## Verify requirements for using the delta method + if(any(is.na(obj$varcov))) + stop('Covariance matrix was not estimated') + + bootp <- mnormt::rmnorm(nsim, obj$para, obj$varcov) + + } else + bootp <- NA + + + + if(!any(is.na(bootp))){ + ## Compute the return level + bootq <- t(apply(bootp,1, FunQ, q)) + + ## if only one return period was passed in argument + ## pivot the matrix + if(all(dim(bootq) == c(1,nsim))) + bootq <- t(bootq) + + ## Compute the confident interval + bnd <- t(apply(bootq, 2, quantile, c(alpha/2,1 - alpha/2))) + + colnames(bnd) <- c('lower','upper') + } + + + ## Compute the standard deviation via the delta method + if(se | ci == 'delta'){ + + ## Verify requirements for using the delta method + if(any(is.na(obj$varcov))) + stop('Covariance matrix was not estimated') + + ## could eventually be replaced by analogic formulas + g <- sapply(q, function(z) numDeriv::grad(FunQ, obj$para, q0 = z)) + sig <- sqrt(diag(crossprod(g, obj$varcov %*% g))) + + if(ci == 'delta'){ + nq <- abs(qnorm(alpha/2)) + bnd <- cbind(lower = ans - sig * nq, upper = ans + sig * nq) + } + + } + + ## Built the final output + ans <- data.frame(pred = ans) + + if(se) + ans <- cbind(ans, se = sig) + + if(ci %in% c('boot','delta','norm')) + ans <- cbind(ans, bnd) + + if(ncol(ans) == 1){ + ans <- ans[,1] + + } else { + rownames(ans) <- format(q, digits = 3) + } + + if(out.matrix) + ans <- list(pred = ans, para = bootp, qua = bootq) + + return(ans) +} \ No newline at end of file diff --git a/R/rfa_predict_fpot.R b/R/rfa_predict_fpot.R new file mode 100644 index 0000000..ffb436f --- /dev/null +++ b/R/rfa_predict_fpot.R @@ -0,0 +1,200 @@ +############################################################### +#' Prediction of flood quantiles of a given return period. +#' +#' Return a vector or matrix of the flood quantiles, its standard deviation and +#' confidence intervals. +#' +#' @author Martin Durocher +#' +#' @param obj Output of \link{FitPot}. +#' +#' @param rt Return period. +#' +#' @param se Logical. Should the standard deviation be returned. +#' +#' @param ci,alpha Method for evaluation the confidence intervals with +#' probability \code{1-alpha}. Available methods are : +#' Delta method (\code{'delta'}), profile likelihood (\code{'profile'}) +#' and nonparametric bootstrap (\code{'boot'}) +#' +#' @param nsim Number of bootstrap sample. +#' +#' +#' @seealso \link{FitPot} +#' +#' @references +#' +#' Coles S. (2001) An introduction to statistical modeling of extreme values. +#' Springer Verlag. +#' +#' @export +#' +#' @examples +#' +#' data(flowStJohn) +#' +#' fit <- FitPot(flow~date, flowStJohn, u = 1000, +#' declust = 'wrc', r = 14) +#' +#' predict(fit, se = TRUE, ci = 'delta') +#' +predict.fpot <- function(obj, rt = c(2, 5, 10, 20, 50, 100), se = FALSE, + ci = "none", alpha = 0.05, nsim = 1000){ + + ## Define the m-observation return level + lambda <- rt * obj$unit * obj$nexcess / obj$ntot + + ## funtion that compute the return period + Fpred <- function(para){ + + if(abs(para[2]) > 1e-8) + ans <- obj$u + para[1]/para[2] * (1-lambda^(-para[2]) ) + else + ans <- obj$u + para[1] * log(lambda) + + return(ans) + } + + hatRt <- Fpred(obj$estimate) + + ## Standard error by delta method + if(se | ci %in% c('delta','profile')){ + negk <- -obj$estimate[2] + lk <- lambda^negk + ak <- obj$estimate[1]/negk + + gx1 <- obj$estimate[1] * (obj$ntot/obj$nexcess) * lk + gx2 <- (lk-1)/negk + gx3 <- ak * ( lk * log(lambda) - gx2) + + gx <- rbind(gx1, gx2, gx3) + hatSe <- sqrt(diag(t(gx) %*% vcov(obj, rate = T) %*% gx)) + } + + ## Confident interval by delta method + if(ci == 'delta'){ + lb <- hatRt - qnorm(1-alpha/2) * hatSe + ub <- hatRt + qnorm(1-alpha/2) * hatSe + } + + ## Confident interval by nonparametric bootstrap + if(ci == 'boot'){ + + ## Resample + xboot <- replicate(nsim, sample(obj$excess, obj$nexcess, replace = TRUE)) + + ## Refit and predict + if(obj$method == 'lmom') + fn <- function(z) Fpred(fgpaLmom(z)) + else if(obj$method == 'mle2') + fn <- function(z) Fpred(fgpa2d(z)) + else if (obj$method == 'mle') + fn <- function(z) Fpred(fgpa1d(z)) + + pboot <- apply(xboot,2,fn) + + ## Compute interval + bootci <- t(apply(pboot, 1, quantile, c(alpha/2, 1-alpha/2))) + lb <- bootci[,1] + ub <- bootci[,2] + + } + + ## Confident interval by profile likelihood + if(ci == 'profile'){ + + bnd0 <- c(-.5,1) + + ## Bound of the deviance + khi <- qchisq(1-alpha,1) + lb <- lb0 <- pmax(1e-8, hatRt - 10 * hatSe) + ub <- ub0 <- hatRt + 10 * hatSe + + for(ii in seq_along(rt)){ + + ## Deviance function in respect of the return period + Dfun <- function(z){ + + ## Full likelihood + llikFull <- sum(dgpa(obj$excess, obj$estimate[1], + obj$estimate[2], log = TRUE)) + + ## Negative log-likelihood + nllik <- function(p){ + + num <- z - obj$u + + if(abs(p) < 1e-8) + denum <- log(lambda[ii]) + else + denum <- -(lambda[ii]^(-p) -1)/p + + return(-sum(dgpa(obj$excess, pmax(1e-8,num/denum), p, log = TRUE))) + + } + + ## Compute the profile likelihood + llik0 <- -goptimize(nllik, bnd0)$objective + return(2*(llikFull-llik0)) + + } + + ## Lower bound + suppressWarnings(lb[ii] <- + goptimize(function(z) abs(Dfun(z) - khi), + c(lb0[ii],hatRt[ii]))$minimum) + + ## Upper bound + suppressWarnings(ub[ii] <- + goptimize(function(z) abs(Dfun(z) - khi), + c(hatRt[ii], ub0[ii]))$minimum) + + } # end for + + } # end if + + ## Does ci was computed + ci <- !(ci=='none') + + ## construct the output + if(se & !ci) + ans <- data.frame(pred = hatRt, se = hatSe) + else if(!se & ci) + ans <- data.frame(pred = hatRt, lower = lb, upper = ub) + else if(se & ci) + ans <- data.frame(pred = hatRt, se = hatSe, lower = lb, upper = ub) + else + ans <- data.frame(pred = hatRt) + + + ## Format the output + if(ncol(ans) == 1){ + ans <- ans[,1] + } else { + rownames(ans) <- as.character(rt) + } + + return(ans) +} + + +################################# +# One Dimensional Optimization +# +# Perform an initial search inside a grid of points before performing +# standard optimization routine. +# +# param res Number of subdivisions. +# param ... See basic function optimize + +goptimize <- function(fn, interval, res = 20, ...){ + + igrid <- seq(interval[1],interval[2], len = res) + id <- which.min(sapply(igrid,fn)) + + if(id == 1) bnd0 <- igrid[1:2] + else if(id == res) bnd0 <- igrid[c(res-1,res)] + else bnd0 <- igrid[c(id-1,id)] + + return(optimize(fn, bnd0, ...)) +} diff --git a/R/rfa_predict_reglmom.R b/R/rfa_predict_reglmom.R new file mode 100644 index 0000000..8e36d4e --- /dev/null +++ b/R/rfa_predict_reglmom.R @@ -0,0 +1,111 @@ +############################################################################ +#' Flood quantiles estimates +#' +#' Predict the flood quantile of index-flood model for a specific scale +#' factor. By default the flood quantile of the first site (target) is returned. +#' +#' @author Martin Durocher +#' +#' @param obj An output from \link{FitRegLmom}. +#' +#' @param q Probability associated to the flood quantiles. +#' +#' @param indx Index flood factor. By default the sample average of the target. +#' +#' @param ci Logical. Should the confident intervals and the standard deviation +#' be evaluated? +#' +#' @param corr Intersite correlation. Either a matrix or a constant coefficient +#' for all pairs +#' +#' @param nsim Number of simulations used for approximating +#' the confident intervals. +#' +#' @param alpha Significance level. +#' +#' @seealso \link{FitRegLmom}, \link{Intersite}. +#' +#' @references +#' +#' Hosking, J. R. M., & Wallis, J. R. (1997). Regional frequency analysis: +#' an approach based on L-moments. Cambridge Univ Pr. +#' +#' @import lmomRFA lmom +#' +#' @export +#' +#' @examples +#' +#' data(flowAtlantic) +#' +#' h <- GeoDist(flowAtlantic$info[,c('lon','lat')]) +#' ams <- flowAtlantic$ams +#' ams$year <- format(ams$date, '%Y') +#' xd <- DataWide(ams ~ id + year, ams) +#' +#' xd <- FindNearest(xd, h[1,], 25) +#' h <- FindNearest(h , h[1,], 25, row = TRUE) +#' +#' ## Fit the regional model +#' fit <- FitRegLmom(xd) +#' +#' ## estimate flood quantiles +#' predict(fit, c(.3,.7)) +#' +#' ## Evaluate intersite correlation +#' isite <- Intersite(xd) +#' +#' predict(fit, ci = TRUE, corr = isite$model) +#' +predict.reglmom <- + function(obj, + q = c(.5, .8, .9, .95, .98 , .99), + ci = FALSE, + corr = 0, + nsim = 1000, + alpha = 0.05){ + + ## The index-flood is the L1 of the target site + indx <- obj$lmom[1,1] + + + ## Extract quantile function + qfunc <- getFromNamespace(paste0('qua',obj$distr), 'lmom') + + if(ci){ + + ## extract the parameter of each site individually + para <- coef(obj) + + ## Create a regfit object + dd <- as.regdata(cbind(1:nrow(obj$lmom),obj$nrec,obj$lmom),FALSE) + rfit <- regfit(dd,obj$distr) + + ## simulate flood quantile + simq <- regsimq(qfunc, + para = para, + cor = corr, + index = indx, + nrec = obj$nrec, + nrep = nsim, + fit = obj$distr, + f = q, + boundprob = c(alpha/2, 1-alpha/2)) + + ## extract confident interval and standard deviation + ans <- sitequantbounds(simq, rfit, site=1) + colnames(ans) <- c('','pred', 'se', 'lower','upper') + rownames(ans) <- format(q, digits = 3) + + ans <- as.matrix(ans) + ans <- ans[,-1] + + } else { + ## Compute the flood quantiles + ans <- indx * qfunc(q, obj$para) + } + + return(ans) +} + + diff --git a/R/rfa_which_floodPeaks.R b/R/rfa_which_floodPeaks.R new file mode 100644 index 0000000..21ca0be --- /dev/null +++ b/R/rfa_which_floodPeaks.R @@ -0,0 +1,201 @@ +########################################################################### +#' Extracting peaks +#' +#' Returns the indices of the peaks above a threshold according to the +#' declustering method put in place by the Water Resources Council or simple +#' run declustering. +#' See Lang et al. (1999) for more details. +#' +#' @param x,form If numeric, \code{x} is a vector of data. If a formula is passed +#' +#' +#' @param dt Date or time of observations. If not provided, regular step +#' are asumed. +#' +#' @param u Threshold. +#' +#' @param r,rlow,ini Declustering parameters. See details. +#' +#' @details +#' +#' Two conditions are required for peaks to not be +#' rejected. First, two peaks \code{Q1} and \code{Q2} must be separated by a +#' period of at least \code{r} days, where one recommendation is +#' \deqn{4 days + log(A)} +#' and \eqn{A} is the drainage area in squared kilometers. +#' The second conditions is +#' \deqn{Xmin > rlow * min(Q1,Q2).} where \code{Xmin} is lowest point +#' between \code{Q1} and \code{Q2}. By defautlt, \code{rlow = 0.75}. +#' When one of the two conditions is not statisfied the lowest of the two +#' peaks is discarded. +#' The 2 conditions are verify sequentially, from an initial set of peaks. +#' If \code{ini = 'run'}, a run declustering method with one lag is first used to +#' filter the initial set of peaks to the maximums of the respective clusters. +#' If \code{ini = 'lmax'} the 2 condition are verified accross all local maximums. +#' If \code{ini = 'wrc'} (default), the second condition id verified +#' next the first condition is verify on the previously extracted peaks. +#' The two version are very similar and differ only on few cases where the +#' modified version is more conservative and reject peaks that are kept +#' in the initial version. +#' +#' The function \code{which.clusters} is returning the indices of the peaks +#' identified by the run declustering method where clusters are separated by a +#' period of \code{r} consecutive values under the threshold. +#' +#' @section References: +#' +#' Lang M, Ouarda TBMJ, Bobée B. (1999) Towards operational guidelines for +#' over-threshold modeling. Journal of Hydrology. Dec 6;225(3):103–17. +#' +#' @export +#' +#' @examples +#' +#' # Declustering using the flood recommendation. +#' cid <- which.floodPeaks(flow~date, flowStJohn, u = 1000, r = 14, rlow = .75, +#' ini = 'wrc') +#' +#' plot(flowStJohn, type = 'l') +#' points(flowStJohn[cid,], col = 'red', pch = 16) +#' +#' ## Simpler run declustering +#' cid <- which.clusters(flowStJohn$flow, u = 1000, r = 14) +#' +#' plot(flowStJohn, type = 'l') +#' points(flowStJohn[cid,], col = 'red', pch = 16) +which.floodPeaks <- function(x,...) UseMethod('which.floodPeaks', x) + +#' @export +#' @rdname which.floodPeaks +which.floodPeaks.numeric <- function(x, dt = NULL, u, + r = 1, rlow = 0.75, ini = 'wrc'){ + + ## If time is not provided + if(is.null(dt)) + dt <- seq_along(x) + + ## Verify that the time vector are matching + if(length(x) != length(dt)) + stop('Length of the Time vector do not match!') + + ## Extract all peaks above threshold + if(ini == 'clust'){ + peakId <- which.clusters(x, u, r = 1, dt = dt) + + } else if(ini == 'lmax'){ + isPeak <- rep(FALSE, length(x)) + isPeak[which.lmax(x)] <- TRUE + isPeak[x <= u] <- FALSE + peakId <- which(isPeak) + + } else if(ini == 'wrc'){ + peakId <- which.floodPeaks(x, dt, u, r = 0, rlow, ini = 'lmax') + + } else if(ini == 'all'){ + peakId <- seq_along(x) + } + + ## Case there is just one peak above threshold + if(length(peakId) < 2) return(peakId) + + ## Loop accross and keep only + myId <- peakId[1] + ans <- list() + + for(nextId in peakId[-1]){ + + ## Verify if lag r is sufficient + if(abs(dt[nextId]- dt[myId]) < r){ + + ## If not, Keep the highest peak + if(x[nextId] > x[myId]) + myId <- nextId + + next + } + + ## Verify that the a minimal intermediate point is reached + if(min(x[seq(myId, nextId)]) > rlow * min(x[myId], x[nextId])){ + + ## If not, Keep the highest peak + if(x[nextId] > x[myId]) + myId <- nextId + + next + } + + ## Otherwise save the identified peak id + ans <- append(ans,myId) + + ## And move to the next one + myId <- nextId + + }#endfor + + ## Add the last peaks + ans <- append(ans,myId) + + return(unlist(ans)) +} + + +#' @export +#' @rdname which.floodPeaks +which.floodPeaks.formula <- function(form, x, u, ...){ + xdf <- model.frame(form, x) + which.floodPeaks.numeric(xdf[,1], dt = xdf[,2], u, ...) +} + +#' @export +#' @rdname which.floodPeaks +which.floodPeaks.data.frame <- function(x, u, ...){ + which.floodPeaks.numeric(x[,1], dt = x[,2], u, ...) +} + + +#' @export +#' @rdname which.floodPeaks +which.clusters <- function(x,...) UseMethod('which.clusters',x) + +#' @export +#' @rdname which.floodPeaks +which.clusters.formula <- function(form, x, u, r = 1){ + x <- model.frame(form,x) + which.clusters(x[,1], x[,2], u = u, r= r) +} + +#' @export +#' @rdname which.floodPeaks +which.clusters.numeric <- function(x, dt = NULL, u, r = 1){ + z <- seq_along(x) + + if(is.null(dt)) + dt <- z + + if(length(dt) != length(x)) + stop('Different length between data and time.') + + ## Keep value above treshold values, remove missing + ## Also make sure that time value are finite + id <- x > u & !is.na(x) & is.finite(dt) + x <- x[id] + z <- z[id] + dt <- dt[id] + + ## Split data into cluster of adjacent events + id <- cumsum(c(1,diff(dt)) > r) + x <- split(x,id) + z <- split(z,id) + + ## Find the location of the maximum in each cluster and return it + id <- lapply(x, which.max) + return(as.numeric(mapply('[',z,id))) +} + + +# Function that return the Local maximums +which.lmax <- function(x){ + xlow <- c(-Inf, x[1:(length(x)-1)]) + xup <- c(x[2:length(x)],-Inf) + return(which(x > xlow & x >= xup)) +} diff --git a/data/flowAtlantic.rda b/data/flowAtlantic.rda new file mode 100644 index 0000000000000000000000000000000000000000..ddd13899975f33c122d65b6ec8ee0fb8d29dfccb GIT binary patch literal 14731 zcmW+-c{CK>7q1XerczOuQ7YRvODg+}C8;bUl4O}A31#1nnUEwh3Q3kBJ7p=dn}iv= z5h6Q-!5D*?F=qdDe(#U>$2<3(cg{WceD3{x?tP#{k$wMP2gy;wVRl`ALJIp#-{w71 zcyms4HUE~xU}60GrNRSmKD`v*Z+tvLOm=_cAxon|vDb2EgN*;K3H~JQs$f*l5gw^3$?Dlp->WYUH~Wbdb|-uI^ByI+8xuQSRh%gc5h6;H?&EncHR zJm0Tp2Ki3Qc6}r-g=ahrF
  • <8!=N`&dln9Jgr&8sNtLG+EPVvu= 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 WqZ@!%l#+t*Av%Tmlg0!4_WchAw?`)c literal 0 HcmV?d00001 diff --git a/data/flowStJohn.rda b/data/flowStJohn.rda new file mode 100644 index 0000000000000000000000000000000000000000..626c44a06eba5f17a85ff4a2f2e1ccc756534b56 GIT binary patch literal 136133 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

    qMzo- z)*u4>GqMDgt)aJK>=L>F#h#`KE}03ndr6wvL~oIjtx@8|;1_vBkR6ZGG5a9!lg61s zO^l=&>C)oMDGWZ35pUVd5|a`pKO?myhILrEi@`5YeMIyAPNH}8aDxcTCsCnBQv^{> zl$oF!0-2<~h^^?uAUjzoWJn~m39-{%iq60@g;Z<=o@zwc^dh_)y-DTS@woRb;QbEz z>1$Hux(sc2FXtWK9yxY@t%2reY4W zp;iT5EJm@^nUZEP$q_pA%rL$jgV#X&BpR_LK9008nP)`SunSw!B7MktY8Kt2WMf{gUcn;4VCpzaEkUd4w4?H0)3 zEwiTyu8EsiRx;v!0l~6r{z`}2&`wT<#Y7&d6A`z0ju#*yc^aWDBAQ@1Kt*IwckWDv z5w*f(w@-GU)JHmhI+UsIgXwgFLHp`Eoru0>poHKjh=hr>gU#YQnh4TVAS8eWE`mEk`BHnP z4Hx<{QM{O@Oarh8Op^SGLmNS% zAa|OJE#`BUKwi6jH{D*OWLg@FU{VwY>gs>c4g15w8iYUub~*7QO5Y4(m%!}`T0L3E zqRkLfKqHS#fSZ^HXe-;?heCE?5r;|Iij>M#kx@(qdKNch^g#wc6TAXn6w5g#&A~8NHs|aGl6$wgf$UC%|wPCO9KHJm|0UGY?n|I`xM;n z-9le>Ns*A8Z!OBLq3m>zrbvlei3owOl#1vyXOec}OQo`j5H(>uK{$D~NYcc?bRi}1 z^~`?yL_VU!GWyLYb{CaODFPo<%18_LG;BY}LYaMoh9XJ! z9V8A?T=;@m&V_oLpok)-q)B&G$E0+q7fZq^A}a};1;$}?E}CAFEh#C=l~Ed@wh~Wf zfh;uC-`gFVnQC1)Q$XlI#fiA~G?*g7!TK=~mPNa{f51PyLZ-fUC&{@($n+vHX2Dd5 zZ-kWD(9lO5l*L7vaJ$mbr$cvR88W1g>_q7&#Bq=^8>}8>`z%}n`v7N8)U)Ob6SOdDP(VwKy0JTv{XiFsj6tELO}-TM7UYktdh|>U0+(S z`J6Sih7vb7L3E26fwGyEO}cKbEkoFxh-N{(eHNRXZ@1t@l@hDJ*71nUpcQ1Y1)1TF z3GXr+{SicD+9r;}ZuDtG!5Y$J_W~i&ja~eNsY10{TV^m>Rp4VgDz^8d8ZAzQ2&DWL z#3V6jX(_l=vrGg}irOP2K}E_#5H=#KmIbRMI>Lc52esrXbsp0|@08x5-+}LlinXw*;wIhH)5a8viO7@w zLMC)wXJlXmepndJE`tyW?Hxn^4?!3ff;_BdiYZ4FQ>{d3B#yqJDYmd|0>|k*F_jEk z2a6yz^R}GsM&hIV?vPOsvxr&AQYVNVo!U?-gBj8R_F1M^lpsvX;*+GM4_OrlLA-u@ zAH>aU50|o-QkmF(CzHjJW|B&So%ot1j3ZF1NlM8qW;Cn_#q?^1SXc;twsRnjT_8k? zlynogaKiqDGSX~1sMhk0T3c@s)Gj{TS%IJ@vcwKbK=dIOqnM3-3ZnaPQ>Gm)LTNie zC}}>(Lx+H0CJhRgBB4??Gp)x=fJ;-8Si%1FeF-e0H=}uM2>iZS9M2bA>YHfF0%2h# zMcC6tn3sgmR@Z_pL6ew@w6nRttPd9u{v`Q|aFKvmFKAyOp$T(k44bxxk+LWW=&Enh znfuZ@%(6QRvWrlVaXN|YWo96s3P_}aO`l`xVZD7nO9DP!%%^p*q{-e6t_sTRCW+RZ znUdMgBT1bOrkj*?I+_yNlUXKnoic}wtQS%r4ML=D0E8uVri>Jmj;6m+YIPPGmiG~m zF_Q%E=`5iy(yPr7fXV9FG%pzBgAo&&H8iB-X4C8>`biD3x`(&rT6D{-;w8no|BZg^ z$h5E4yin|AmhSS2J5yKF*?sVzK30S2-H0xqtfnu%eEHEQAAT&^A@s>#JnhuPOJ60u z+?{kT?Z)8wL~@Gmj4bNV z?iH1XQSK0*R@z$1>+=?Q<`m zey->Uzx!LxG>bgwgZry&pF;DQjJ80WOn!EmYJdA6m#^Y zOzs<@EM<%YnHVg(x(L~$(ei#0b~juRb8jcuSs7?Z(RYgJ$fJ$h%Fh<%bKm#+6`dOx zXsL>b4IGqA_8VAti2HB41+ARYYA+_%vBOm4orBm4>Y-M_-zoFF?jq6l>>2IpUMCcL z^XEiH=a$r9{$Ct|wy$Vj`b87_ug?>cf3`Evuj_l{=X$2vPlrd4al2!f=YzY87)N6V zCvXI$`72HEv=b>kh2HokRkB}AWx8UQB)9N`cs~4f>S?ACpId1t;Dk%~XC0^YUh;<< z1Y0)OcrT#-E0m$$0_2;*OwOUX{_{)1!qTtl=dsP={P;!K_6ZZx{9aOKrpr6=x$xDL zll$hE)aB>aHq7!j)U2yY8@x6>9?mT6W*_y{rhYu86&!9E7wQ)%)m^ozNP; zHhw0ucpCG1`lJ*561_PhxbwwVE@2IHiGeqlbI|td-i-gj>!km&oq4+I-TKPRxC3@I z9zIEu<`Yo|em*v2kUIOd{B(ioc|Fb{S3q8gDbWZ)p5wfz*bugp$i6`qSxyg5PqhCa zEBaXA^He*dF94_hc|h>+G@rjN!2Zv+Ek?LH_)*)I{7x-r3;S=A_HOA< z(f{z*og3gitm!8f*Rz>lwpldNxV_O=xIbz!>OY~oYOf=0-rbQ%nDJnh*ID+<-i+tS zSFbbv#onmw$_Bse%8)&}sPlxNF?~ysEdKm#ujq+|_vh$(SK#H zS>IVA5$@fjDKCyQZH@bsdJIjf`h`pIKg&kwe!ogvTK`mZ5WP)aNaIb$5)4hdBJ}~A zIEja_&jZYJ%87;QdgWzwHfL|(K6sB%+dQwtQDvB6+;2Q;yx28s&*B|fZwL59oNHYX z_c=Tb`xiZ{u)61RuEfw{JZya8N)k_;RP`-U;@FX*?2Vibzl1!;{tRxD6m6a)-<*kX z!auhi*6+&9T`;H;zR|NZ2~PehNA-;(BVid9(qz=`V=WY?97t&py%IqL$8JQpJ*F^Z z&4$G4oauS=I;m7K7lE;9jJEV|7Yd;I)k^cRL_V*ceK5QJ;?hcfRZrcq@aSn!LF!-o zWi5(oe*MuNk$?l+xg35}_k=LEMs+YyTh>!fR)-))gc=kws>E;1R@(nnUlEqJTv&6d z5Y(Ng;V|O8iR*k!Sieb0YKeRza~YQM!+K z*LJ%$nJ;fiKGP;O{Ht;|x`4b)ep?Rj=5HKac)5^v-wD5vePE3rPtkGorU{QN zctdlf0kKaKORklo!E5x#BUf-Vf+*=0W3sXsk?8&t`hS+$gAaF|ZqJj|NUutEy&E@| zF_V62@I9Z4P5Bd^R$j9uB{Nzpz9~yTApGXAurP&bErlAiRm|cu`Su5e9}Bk*g_spewviwC--AwyJE661qHn#ou0Ah@dM2Z-^E-s9pwvsJ9MK8OT|Hiif1 zUYh6QuZ+7G?w5iLd^z{hCJ3D@e4_Pi=cT8Y@_efse+v9of|WH#;(|r$ zy21GPm$XCylsBaxJyuXBKupK8qv;&%@gL39Nz5;)HbR2kQU0r&M#RNRh6H9 z+dAC{Pt#{EZxTg#QK5D*T4^)AZPVYH+~xg|KH~aWUmU;95-z-=$g2Mbbci1-TiS*m z2tSBkyg4h96Pt5(B7VMW=?rFGf8`NdbI0u$eP!2-NA}i2R~MwTdasNyX7pHAwkqMs zJDGP3R}A28NQhjv)Uz&kGmoCg{7bW9;pM%OmeK`i<*w@gvcE6v2yX3Jqqy_>Y~9NK z;DdR#!-lxpbKBNN=wgLx-fqWs$Nz{U#A~+7!&`rZRz-B-PsKjk(^J$_-;-5aRLiWV zuQ0&pnuz4*pvTx`UdJ18$JQo4=Oqbvrv@v#)6i9ZQBW^lD)qh$CrZ?ta|Os9zR=N} z>^H6Q3HaHa2{~fa(KYWzbZH%;lGO{;rbCLdg&F*M4xhto_Gg^>+Fze({V{gqoa%*f zt&cSxZLMS$u1Y-HP{G?$ZkQ;DGm{@Quv(Kh3+8e;0{VaeNj7R1`lJ#S>#EG%?Ebw< zNnpx4`_TgXi)QYbcz6r9<)0@^(#=SUu-UOCy>vm`5$z$lQW)VQBH~r1lbx(-Tdh1X`vK4paARavF>s#NGI z^Z&>vkb%ryP(gS83-SrjEan@`T6!MUi~J&y#`0Spf13L&W2$UJ&M#ACu=NnuB(moF zBSHAJ!_qoYoQcPWI&0g4l(zC-WwS%SFybrW$jDuyUy@=b-h-8gq@k2LTlcmUa;97HqMTO9<@J}vSVMqxVrpp zvh=@_%;ZA}b(J)CuX@comH!p*7wOL;R@AWT7x&CpsZSZEa^I2l@n1lm56pT|aT>Nt zNXJE_z41M@bqy5S`PSx3hKtB|UXey9Vb;dR z=@KMPm*bx?xhD)#iQZAIxa@^jSE|ohlzm=ivsH&JmOYpGVe1OUbc${`9Jey!?ShX@ zP*PDu%e+i=26c^^28mOb%G9Z+)Rk;y;_+x%rG8?TsU~4hP`Pilh7(q!JFZDS}0MyVn(?m$FS zdUYK=Ydu!KFf^&}<48ept{kn#R$+>cvTA{`La?+uDhx6^Ub`5SSt!)~5M8WVihM`yGe8c{ecvowBxgU z}E%Bj)8~?_>ucj1E zH-1t@Z`i572t9Md^rm27eZQe#Cm+3Wmi1Rfv?JMy?LJ)amhdbdgH>Eun~~HlFOgs^ zZ#G(tJqBc3%=gq@gWyyl%UBV5DfviT({lDR3V&>=c7?1~a1Ci9ua@K8Wzm)?zeYPM zPE9)CJ&A4Dw<1nOeb7DQ7w?*kJy50ZN0MyKz|4}M;1>O9b|(?TF?mZk@Bv;-$>Jt~ zU+K|kBIC2}vQmku5*1wweG2Zu%8n&mL2a$+NDBKl@wG!DTxP76{@YrHORW=>)ZS{o zEh|x{uK7145Eag{lw9kbx;T0xJb6<3R%Wb5mAiKbyy8XK54Q>B@$|=&Cm#*mgzUF6 zdTvKRhd0F^Do(MsYK3&tO~!S)g>11+JkfJ=&W#B1+5bp#`6b#Puw}RxE_&gWeyDrG z48;q`gqR5ezqX&t@}~S)5Nu1>c-dHd44%MvzVKDyYR8t8*2ti#Khoa#wT|7`CCqz% z0KOFW2mh8_PV|;*6CFxHXc*#W%8*p@O{qqn=paK*E2^(uqD4%mx?W6wVQwRxZo+|t)HZ^twWV%sX~Shuddp>&)rJmyEv?+I7XUs-Q>N$Ng%Edy~ZGtEs* z+0h#_&HrCOxB9Mo#q=3TK38&Xit9?RnfjFyDC!ZfU(QN)HOr>NzHj(47dA|9V8)2F z8LF5NMkC9dR30yDG6xE)E9LkpKkX9g^@wB27$TL!oR_3Hb?P`SEZwI+j0QzIvLilF@ZljnbKTs*)dP>D4~7R5)A5-; z4)v`KSn6`WHtS5GC+T9kTO`-_f2+t9VNYY9IbR zoiqP&Kk+6F+=vC2ej`xm18D(mQTB&Zi<&H(wXIkF?y`%GL^UmE{ zjiFJYg+YnJ3gtS2R}oHhqPNk?m~#CI6`XO0o*pk~fiF*$#^rFX&v`0*LxBLTXglH` zO9ZI@rO!M^?-qW%^;2diwvn0KevVoc@H!!WJ8&kGzptF%ReNWvdj6Km2=A?8rQ#cY zS$Y!A#&35-&O!zM4YSPOcUX|z)J#8b32PMmH(Z@npM6HaFb}9-!>Wq-iO@1can|n# z$Be13XHx4vXUoF$J5+9t3~jsVbGl?TRiYto#a|cmZY#t| zJNv2+@vbVG)Csw9VqqrlkbSG;*WULU?aT7nII2IwTE({Y)b8pH!Braqgd0v5RlOOS zp+DCrZ$zH+f3AeSVcYw~r_5G{$wGZx71KGD^I|BjvuHA=rW||vGv-`0osUlCRM=K8d=lZU&tEJ>-$m%zlu4PH7 zut&r%BFkHCXU;cFX{ceE?XYQ*rY4t{r3hzGJCnTvFPH)c0?L(GLY;OI9G_YsmU#yc zu3tL~+VfM?k!`vO6@FSJ5_tfL=Pe`F_Ed-X5L$-?ogwas=%BdBwyl{o45jkXbKe$z z!dRL6ePL>=wlQ#lBV02&g&G%l& z*gqAto2`T7D~RlyfOo-dZ(sNb%_e` z(_YN5VB7qXp(CYeTYlU#_|B7x*2}JtErM{ucNtZ)9Lt@G5;~ql&3jSx-u^>^?p}W6un^=nL>2VR+*-vGAwHpS-`RG*<71x3LQ+ zPiUx_?}z`;o3Jbh?jfqvQM4>mG^d|u!pP@M%X!|Vio+H^x_Vp36)8GjYGI<P!9NM6{gc^s zwpQ6Hrr(?M1B=T|I})m5Gxu9wSzD4&!j$J|{yD9ne)^H!g5u5pOGGOU#~z+zaU3Jh zw%L#2b0gH~74l~41v13=q;+!g6l3L;^OIShdS9u+!i{yv9JColCft#?uB9CC+T+w) zLTlsJ&mw2%YWKs3)?T+iQpvt@!V-EbrGKAlR`v$rV%b%)DK)mL+H$3+(s5iL*t7WP znX+DOBi6|dxRmszZJ~?$ej#0hgFQ-4Rd<3`q^`X6}t|pWD zeoUkt+|0F474f_++!Tt4<;s+{u7W02d}fZs$UWr;DZ?*mGh;OKW4#;L6@{PVu0pR47_xM{GsPci8!X3i7j$;zh(b>&*mMahCJ|&yt^E`xO4(Jh2%y! z0uEkg6bGgcO$cz}qbwo_G9*6~Ri-(LA4RXJwLHq16>dKjrG?v1GaovHo zg+k-^^12wMt*3W#zPM>HG&%8my>|UxX6V;}1GYzK`Ukn;sN8U^*mRwGE4NRM?nQPV zlS@&417cmYQSjf~(u0rb-mR)avJsIs8`)31(_K1!Mh^1$^|=YTp5Tkm~}K`ra^ zoEt`CWIua4dd<|PeXG8%H4xT*YA*Dekwl%t*FZs#XkWgKr(!`2l)-vgbOrNGFhAC< z6d%HGMjrP!Ncr7IijFaws(3;l$nh+xeSV#JJ?EWWSpRH_^Xc|iv!6y}|eZlyZo-1jY;%3(S z1J)>+EG{PepjK*n3jQ*@agl@JwS7+%47?V>LNjU!Sy0wy-MGB)@>Uv5EwkYp-} z@XoEqQu|jAR?hTZDbtxQJyIUWnTRESjZF@Cs9##=IKO&#VRuHDh&gdx_u}g%27xJm za-4bNKv7T6;iJ@~oV-}4B}gSRJ=6Ar-d_C((s(YhW`j^P4L#sjV<}0nMz(4bx|f7; z+6EY=Fb57QG5Z%Tb78+EHNYp;Zyg%HC}mD-Qk!X7#LKp>U!GVa(>MIUu;QJ;QOfvc zW?wHmVkw=^`m8`yZkgK5ow^=gjB>6(Yq=CP*Xv;S!SW_pcfsqjvgU+sf8|_Lt0^JW z+Qcg)mJ*W>cDIDa%LWo-CQNL6#$MIF^~~B!>WnL<2LPqi7Q22BOJ2Fwx~+6@!_w%U)hS>I53 z_h*H{45~)4wPV2>^?`4-S1Rx1wrsrhK;fS^sFO8u8%-S$r*EzkD6 zB_r30_i;bKXBU2*vZwN9)z4V)#iHY>ALzs0SOdqGE2--dE45z``}F5T7rfV2B*Ja- zWvWs|xK}&pCHnLtZX3IuJ2_!l$XCW#^6kFJ=?83+Zd*#X#Jx!@m;A_&mfTK=5#LIl z+A85{t24Lu%dcc?JXj8IFNAHMyc5+c?U(FBW;>?9kpn3=xu+Vtz~@6<{6+8XnrNg0 zU8((1(ZB&;uK5<#C0ipV(|-*M8e9so3WJ19Jnl2!w~~|@rwb`Rsd5t>pZyc_jQH%T z{+zI)Lxq)8oG`ml!ry9|N&gG^hpZGoyN@|V{7TF2r$k6+E=jK1v^~D;HD3Gj^5$eFnx^M2Xb-YStiX=-#jW0SJ%3-Aw2yH^ z)+y`?d6KTZdU0ITPcb>@+f9y#uOt4qk&r=O!;X~o1>U&Q#tQo)1-gpt zxWW6PXH67JMhaVbuXQgGh`ukpoO4`a=s1sV2rzFb#00NKv=Co7Hs1-@gUJjnS*Htd z?0BGYc`Fg7Nz7Pf{>zOSbj{4j1Kq2pFY$i;+>4dZLfy;LV7+akKvE%lGk3`vT!d-w zJbc4n{2VkFo=mrwqx>H1M{F*utcEPBft3f^V01+y_T8PO;2Y4N=lXx+vy8k`mL_>y zeY9XlN+*Zjyp{2hpVIa${(Z-PZZVZMA8ftuw3rIO!#ne9vzyrXoeE-^Dc-6`9+)Tb zj(hJo@u`ewFXA7uY?{lkJ*g-Y4Xj{VZfkD}E@WoSXq(p5oJt3fS)T=JWcDOu0`f8A zrud}3FK~|as!GDl?Wj34IHOd%khyFZ^frrlXaKDw`OAczZxv1_!9xB7a|-I!;O{Gk8FIPAV3N1%@)c|iAv#<&^|Jgr^0p0m+ay_0pCRtZ z7<|Tf&8RY368Y8Weo-IwYB*eb7Ru(s8uGm3Z7~bgMf|%xbU;kL*B8A`n;N#VUm-o* zi{Bz5Nk3{Z`sSik!8u`BWBwGT*tSQKn*zZqoz7>y^jmF-_Ov}1tL|9v{UBm&H=Y=T z?F5hd;E?e=^Z$_N;LjuQuFKWyquUIcsZ;ECV&qo;kXQOHJyeQUtP7Q0O7_ul{_>(s zllvl)X*+Xxza!y|*+}M{inAXcQ%Sx_|F)S`DPU%9-kP_Ah&!COV}{sRV$lW{WWsDi?d`B&1yv}749G?Fx?`nj zd5GxEdZf;a`pb*V^^PgY*X@U>h?Euhik`o$)O7M0At_z+ud79MK^GUoFI%3YECH0)XJ8wEaU=;6%3O%wBc znKybh(zDwxJoAHZPv5rc7~_YEC5G>J7d$hqrsL9gaVAry4+GJ*PJ@)%L%OT{#ys2Q z3q}57Q&^6PpM$N;dARi~x^IWIswLeLQDm8b06!3S3A0@FPGCo7*n~7Gf3L77;-bll zoU-zQ;Y4@`=^c;={R)3Qc>~m}=Vlrq%P~U@ntEO!+{^xy`8h9A|KT3q#Q^6QdD^eF z?S1;>8lyN@k^D%J?0pjR+1;GZ-w>kcxd0uZq(^IM1DARFZ3wmU+OVSDptVz_YL)m6 zRciU#uXH!jA7P1_aV+h93%)jCZF73ACGb|?4++O%{3BhOpfddO0qK>GD^uPfW7b!~ z6Y$;+IbSwU7Bm;~7a!!snB|(IXg3P?6j7wj|$7vYRw#%9U$GiA1Kh@h5 z7H+#ar&(#S3R6yocg=ICr_t$E)@^g)_jXK{*@chLz35y!L#H%F6iTIW?=sM< zey!#1N@ZGtW-N?qG=-XV-w2a(@tx5cY44kM%is91x>X1BI9I6y%+i}C(+A5~DYN=H z8OCI4b-p-e_xy$8>Y3i`ro7EW&Q8&*oq@>(D$fCJ$AOKC4k`cqSu%eskz z`s^7=A$O7~-)8F}>(uMioB$`7T;>?krSUcro<{@>aR*u=X_h z1Xgo~aeE&Dj^DjWsPebNhndaOdCj%SVFDB-sBZ6X9eS^7#nFZEwqgvcKayy#&7E*n z_{tBA_*lKy%ha!!+~EsLdhp%sWk!Zpe8dt|EL?iTA6lF-k4&Ouc)v_3!Sz+K5otMa zV%6=QD>?b4229@Wzu_bieP;`yLDL^ScZ_Q#d+dSia1r=6H#j%$44i-6-&(ckTGxc! zdL;AWohOcRw?hR7vS*k6rvZH`@559FAjV4(jy;RLko=D;voAj8#!J8|&4%}-`?xy$Oaw^x@PG*6Jdhu0)0$HmUvNF>1T-Bxs}D$4i|g)Z%(?d?;F z^t|L2#k^cb-17~#y~GaHnYIaZxZ(s8dz5%nnEX=LxgHuWgWtx@w#S}_Y?jbNx1Vtc ze$}G8k!{2;E&5%rP%-q@)*U|RoZpEb6VL;bui&jGG2EaZ4wSj_Ed`ue~o^N8LORL8IoH`K7xgv zym+%JR%$!q%?uf2?`FK*v(Y;T`#~nY%=jymni7^LEm|gAwx;p*3`N;$JQF{N1hX4-+5eBCGjT}z{{Q&)ZOyfotXx@nP+5^$vetp7!pe$H(X6aI z*yfrwOF~OT;6uwfQ&Tdp4uwoj%aXY?G&yD-n5KB!JU}_b3z7SVAHV44YByf(sMKCt5Q~)g(jt{|c*SyH_j5aph zO8777{^@$D6JzJ%+ogtD*frw!a=}4U^R_J5cJhr*ra)*}CugkZ7RoCIp_Xu)xyf9# z$0F63Y>t+q0FWh?xk%QuztHTfK%BPmY)p46nj1Ffm%}cx!s=PC+Y?p(ccJK(<0iM4 zBN^ntxmgo;qx%Qb;TyeAR%%=wZA|m++A^n+r*6ekK*jrzPP~YJwO6idCn`nC%cw0Q z1?2ByEr%7iy2F2`dz^#6ax0a*4rfQ;8;R8lKCObOT-?`m#I)MfI)NohH|X|2)@}4Z zCZ03GLfLL9^PkXMk$jT1MOXMbP0QNW;N0H0uIMyAm$-0gyvQ?p{p>#S9htOFrjD#s zVryw4OMK`&W1cyKXe_Uqu@2V(l^lhuB}e58CF?2EI$&tKIF-*kx%*Q%oFZp@q0X z^sO6P12|IQAyMpOfnlYC{cFWTBzGXCW{4rGj_kWEn+7uuV5dyPu?n{THL&qW=LXyK zNipY%nJ{Qu?rE7AThCn`$Zz+pv1b@d>U5PyNQ+kGMWYJe3CZ!)d?DqUT2&LSU2V~q z2@Bz()X|UGZ7YpqtDGTgu~hWiXnA;-u_@zLvd6sqsPd6x^k0g7tPeyY zST>?8rPPdkq4N;i z?pnWpC;*KBPMon$@83Db5CO!~);uajbja6}-TJk>slW#DH{ff2UvQozy#+s;hP6Y`75mY(55w54gj!A`uJJr7lOo1zQx_OfTjP0lXLf8(J|(iMiD-S zS=+>Dw-TvIcb35;XJSdg#sRes^#SJ~O9A-6_x%Bt)Pa0VQz~NOIlCn{rDg|1V~u5I z5Y|iGHTd|}MRMXRxwfSioM$_9MIBL&Vcj8>$a#t4->8DaHq5VJ_z}ax$U+$GZ(i#n z%^HOw(+4QarNx?!aM-6SCdy<#N2}b$Q|I~J35EX4RZ0j10xCG)z1GU zI41Wjd|#tSwxL^A*=|#d4DZrzVZCLYTs~3OL2e)mh}$Hy7&9lt=BT*}b7vP@fqcL? zuEM8lqsZB13MPkYtqi0kI$oamWG~>1pX1XK3lu5w64za(VTvd8H!GsqtT!E|0r3lT z;yv@o>pH2?21_sa%eq^oOs{d8K4^`@C6>=AXiuaTW{@aBcvhWD`rW%vMTNH3wHEl%^VD3Y5#oNcY z&I+5_!?Z?INBc=`2pjiqH+jz8ii)*_vkIGHF{SNK&arn|jSfrFQS?#jHyk&=I`dwO zX}^YHj<5z|ukWY?&p;%)4Z0xmn_h<(;pU8lx$!-xva${??(7jh5$B<3!i(UY>MnIq zW2k7d1&V>5^~*6UrBz5n9&rvXQowIPMTW0cipz81JzKyoCs>{Ifb;}wNYAY`4V ztl-9!t`=s|g5RQ($kzi^$!_Y9vtN&M3EfeH)seHoqc}jlXF5P0wQ*jEWbP1ejS0&aq9i=|}o9+w!)E(Q+W_@CuZtOMhoYddM-fCSu&s3JiV zelw7FHi#gd z1Sj)+dO=r9Wg7=RcuW4SkdpsyaSLTy_W*O2`p|5R9&|CUooziRZX}*G(amA~u^(*T zOaCxog@qWOv!F=N5}jCqIyun7HQYh zpQt`Nps4 zBJTi1SE8a$xWOEpJ-;5|vEYDs_jicp{#`~dJk<1WWiF0Pkt(}8pGYXQKilK6pc8mW z|DsEOCCGVWz#h~2g;g5_W%(oa&dM)sG3%Ypz}!B#_#%~-COE$cF8)%a-)^|)A%zba zPw94vhSwv`81URu)7NM5?_>?&Ifwm8aB(6!pEH7xv7FmeoM_or{%Mjze$Y6OzVaM; zBYv;w?!?&ip~UF^8bMr7RDb8%#TsBi0oOZL5eua?W~^D+%a$%Uy+UJ;Q^SSvgSsl1 z{s)UzmkGY>X1oO~pw&J7ExQHM9dd&c{JuGMhCH1monqkS@L}m4qZV}rp77IL24^*& z{vWHs)&_c{#OiO#HH!%CNlR>8$U=1U( z$B;GNVX0pNccwjqJ-5zdTr@5G@Ig~eC-zD>+fUIw6CS2%?ZoFhwJl~D*HCV2ogjA; zHz|?Q+`4(L!rP&nbq~Kbw%^*4D8FKE&@CTrTy1zHz%9Np2P-3#pIiA;9#54`b11ps z(hLl>^Q=FGj=pq7yfFX-*l9BC7~D;4=^Xww5`Wh)QN*-maYKSPaq!a5MSs2}zh{p$ zkR|?`IfB~cVqTuWGG?7-+Vj6oioJ_@w5_{r1tw3P#oYo#!W4;HCtT-e6Lv9HEwYD^#94_6KxU;JqH zM6ycNsM0}Ppsc?5A}hS>i9h?HY4Fy^kzXmtE&VwJ?FuaP3>L}_ojW=Hd4F?LT|f)z zjhdd(a?$tkIl^Ep*W#srQrI+4FE`;YsGhpT%g2Vu_ER0#wu8X{H?JHz&~UZr)>}?* zan@LGSsHbUr9ZE^CLGU4%sI$2UZ>6Rf~IH|4m@`PAGNvzCk@R` z`Q%^nq;+o|dRt>m>H)$XVA*LGwDrG}B9$KM_cUs5MDR2r(c-q9y46BK2T=*2-^uAp z)0ERJ$1G{Nr&~QrTKYm#&@{kFe}U#qQho%FU%Vo8NwhU$Xv#V#YYDa;0hW0p3MqWM z*b!u(WuY;y%`QK%JLDhe=GH{BwVsG9_VtrBwq|T{m{nLs=N;CLu=wjcaK61+_x)DKi0dLzuub=X;hfRC^$81Y@J-$bY^K6 zoI#yrzu+i-;5fjK8fs;k^k6^H<+F{GZDhax>gH7RajWiu+^b*7;KxcTh3I^PZR0!= zpXvLvq&|bzX@8FVq04hmC)RW=x%9TGe5`G^avOH0$BYtw=^7F@$tV_e6KdRJM$Dym zGR6awSIuQ{J~xVd2j6@FJ$#AnrKre9jJj)5?Az4N+*k-e1aT60*NZ#qV-Ueu+7B|8 zmp(tc7B0!oC9lhN{S!#%RFHV4r2@XruM`=BcrC+439VE5vDbEV#YfXzWKF3Ua{&O5V$^ohMw}m2EIk_nY;m*HQMXWTwGfl;SpBL+v8?K7{;f;Y>)0ouxCDF3EUGbTu z;Efku%T$~1S##9x@`5ri*w^gG#9aS9pgwN}U-RquH>x<8lj~m1H1pH?E@aQa0|{RJ z%|Rh3^{w6okvPnHKk+Y;kFPh+rKd6?7j}t4r14}lOCchhy~virpToa5g(yaH6BFPK z7`+8)6Iho6fx;bP#v6fZBFp8g9HT^-TCXaiwZNm`O43qpcr!PRyv+Hv+vI)=`!_;4 z9OVAQfB|m(10jxGk=mk_QEiEaqlz(w%a89YU#yRvFL5inXFV>sD0+agetXvckYRC} zpvjtKW_EQDJGijR(SU8FP1iz)1ed6;2K;2eP}2p!xfk?p z6+^;b6C5)I>|X-7;*)De9;6(oxjanM?KTeR9!_fK;Uc3BzP>TX*QLkg(ma-2!zGXO zouMQg=GiiM{;kaMa(f$KkYda?7v>~v6l0kv)I)f zc0Wn5mi!{}h@~n8rFo)UK6h>x#2R8LS7z+F2W^mM*P?ULKYH-~`cfLoYZ(FW+zWK! z!I90{hlRFN@GD|>Wd<)tm)G9so)tdqlWJW~eihlUu)^LkL+qj#U{8`A6BBC+q`nE2Gj>Q=|brg*?}y&~>NWo@QguUIi$H=_S*+ zZ+g;n*-n>Q935eJuqjjfZ?^x>eDO#=`U+sqHsYIw__2aI$>$#_Qo&nPWQ;>B)3Cz4i`80DnGH#1e@;~N*I%3 zUAwe7cYr@Zh#`&EYb_@N-=-{=EfXU9u+dN5s`OhGHFJb=N}}CGsx)pMmzwlnidIBt zYJWi26(#S0v;(?;FDnm^YRb&Y8jsEakZj~tc%-b7!Bq}dP890-T5t7wL38RWdTaeJ z%-W#mB}=fud0o#rp|P z;C54obQYt2(ByHh#}&9|=BMYhtnDJF$sY*bC5ZilXkP5Br0p*!Xu1z0?WSkC&W>D9 zXHMx1EZ@K0x+&$nyokS&h0c%OtP56!(zLF%F3cDvrAuR8S4mnv|xs zG$F8#+!uffC{Qv6fx~Lr6tj)3=|9Ah-gRbxUtFL?&gqUD@}wuk;o>axdd;IwG-7WjbSSHV9|fY$ z=fIL`%Tp=Vd2CcW^mf9&cBk>1hT}I$FOi`>ZiWrB`V~`+z~6ixv7Pf%*eGaMBS+*m62cT1#1{LxyNKh^T$l7lZ~+7*_5XNlnLkAR*4pO`*(7IZzg$PXJc9VdHSyC zYWACt9DcvR&2zp{7BvH`XLUJ6GfnJVN2`SP$Pz^zqs1yLxm5 z@Mj%XC@Io_^g9e{TP0I{y#0miDSWj(?wMe~8Wy?7ymdJ?IX%ZR3_c;gJ06rziDP)4 z9ygZlrdhiRaNB@xxWN-D@IllRM>R@F5HEzhV5PSpw8y!4C9fd19sRZCtdFH%E0sI|fQxCSS=4$2KT8>Po-az%%<%7H5-T4w$ z0q`|L+GpUGgr~_DVNj~3L}I~4@)7pZabaz;dt{;F zx)@xlWC=A)+82mv(i`z-jYW+$b5=2NIqkB4=Ze;=ipb&!y&{fl-DX8iG2T;PXdgkO zu56k@pVRe#G-Gz!&;qV~s)0%NC9{H)!E-4uZ)uw^6)mppbY7#IAU(e^)wyeX08Ad# z=AZ%EOd(jwHmK74RWPfkVm`&TU>PF)*z|}0QPLgd0Zl;X?jcB*eYmr_6Mwm}WvO0x zP)PYzs!@4jhIwf7WmR-zE%BA{j3tfhe&6~hZJQgAm(ZLVxqd*QI>^dKT_N61TIk8L z(lz8t#C46v$aCaRUb%*3MhiEF1e!Q-?xFN*i^Ol z0%dQ~l{ydFE}MtrX>*zGE9`f*%TiM~w*qH$p_ao!%O_rHEx_STbKX0L(0n_VqAJhd zn2*yQm+%f?6<06^a3|nmKe697!E?*~gz47$k!U2lz)E5oA)E*L@9I2qV8$?P3m?-< zpF>TUic*$wmMMJrE^SgTT6Xm3j~iTsg%a+y5g-9|B65>Na2X?zwr!Q4M=0OsLhtkb zfosIXk-7sDf_Z4U4>VFtZbr*H`3!x`bYFlKiteuytd3lHRriNKtlc_^6e72Q`Ji;XveEci3S2LwKj{ z#Zmwk?^3yWmn&guAz;Mu7iH6+Hd`8PgHI4e-xWzmv4{j(RN0)96Njo)KFI)mWEVB8 z6@HjSw>Mi|$^YdP;lFbKOW{CC>>yyRqaK{AspiW6)=j1NL{ln0Gvt`UArbCZ=p;869d zlPg!*PFNSp$|cLfYWQ3-cj{0Zk_#ScKUU!EEw8ssf?hC0w*{9ib_dO@-^sJ5-@p~r zu;#2VTJoGbEy3_cjUvCxV6abeo@RI-Hpxa>N&i`Yvq>70h2vo}bSWoUqGb?tTHjz^ z5H`oSLPy<};}1l=ZBJtHex=T0dSb>(0n2ADJoV=OnwH@`c#4{Mt?BcTMDzHY9t}z! z2(w<(B7ZjttJXj=byO}tye%l5_l$fIm!BAz0DaDnm;fSq0iCXWu-Tcyqyw=J(#F4g=3mn}t`Gj!xK+kO* zUgson$e>(p3Xx9)q8r0qa}0qf2%@ks{Y&yUB}>nHqajZ0IvHmY9sdVU$=}GPqzqyv zc1DM@bELJH0yatPzdhg|;!5JFr4HpEb1Nh^F=qxPCYP7l{=kF2VEk#R-=1CoCI|tIBR8Dq#3%; z{kY+c@1y7JA}`8Y#9VgH8{R9dmqQ4A0J|z5ill~MZ*I4xbmqp9ZjQe?-m_Bzh~#6~ zLc1D9W$8L89fAypCHPD5KbKD4mubQoDkRYi{9QVHIA2e+Euo%OH%gy^SFzVxhQ)+_oHIF>z)`Me|b18nLk z%z2~hUKxSPrEQTHoV(7%ee4>{-OGn8n{G92afso<)lh*t66I; z$6XIo1qV4>M#|7K+!jH$rLrb6?g>hqQSk(k(z1j(v7oqFUu!Z|9p=aHfl zqBGW^Gn!5s^vLpw*4k1;E@mNHbJh7#a%VAYF>Cbd7+P96&?!p9;Ku7<2Fq`*eyA#> z`924?gm-ox#d6>+1X<7+HPn?VZTk+qeAHSuCO@kuccSdPLU)7l(}-OeDk8qt^9e{c zq#@97)o_LH!t(}@)Qtv(n{fmD-c7yay|f-|{)9Uwaaf7|eyX*?Za9EctBFq<_8Wh; zxzY6=a?je9??4NF(}BmCf2$%B6Q{XQ1MVO|AcS45;s&P}f^e@w|!k^?mgO)?UQTzjC-KRcUdVCP- z-c{AM=*^~%pb*1sR))d@)rXdR8r@^PtsF(4&@f0#bBEAdEP1wN zv*?4gh^mAnnRh|iJV(q`%iC}dD1iC4>2At?ZpFl}3zk`_MLm`n=AfJVJD zF(Hl~WDh}&D~u!9HaAx8ZhVrwPwgS~G4w1z_i88M5Ss6OwOsfKEJ5_)M&S}CR60-v zKHKBU^4Dz5`QG4E`KR>=$i^tM?lNU0L*}~K%fM@!ex7fyn5pKnU{UM5!(d>L1ysM4u zCTZR01*?r#{5i^HN(=tUd&b8p0s!kndfw!hK_BP>4zAbgKO^@~w)*GW+)T#}Y;y5t zTEZcF-4@;H-zqx|Y$#Y6D%jWiDTsCbUXZ}Lbcb<`gHPksQLnedrjVpXc}&we!H`|n zmY%g_A)5c;g;~ov%Oo9r{tLSX2~6MjpN{;4R%5yE z6@H$-0H~H%>3UoLD7B9JCsRpxjgiRg5ghrkITQ9eMU0+6j0PV9P}bA%!@yqMt@aJB z8#SH`Y`}Ga8^U$eKlLO9Jec0D-Ofp|h4_A9h}6OqFKbPg18VKXd9prK5u(OCSeBI~ zB#E1a`nIV()(=4a!pRuvG3zJ42hgPK>`FlUgUprk21C5n`T~`24iDvd)w^TmfbBBu zk(_#SX~gJvnam@;>Z>QF4N$L)J<5a*E())U0GCUg*ekRwA!}%5Nc>RGqg&tkZytFh zrArg1)&|;zjw>`L&P=cVvLLF;RHgr)p<+hxmV49uzg$#6jbTvG1oqb57o3fLszpLWj6RmXNGORWA~n=|CAD*n~yrp_FE~m1!VgMu9w2s4EcLqp1{4!lgxliAxV!Q_A~l#Q!-62 zV}`TKI4>tJu1A@wm62c5dKwnD?n3Xf`lOh$R-U6lHSpSSjTbMB^F&3tDZZXRpB!_> z5UCjxf>X;%i;c@9`{$-S1m~>@ZC7aD8a@|qpV}c$jtg=3;mV86(f@ z^h-7QUZ_e2jkL)=BFElrcXt;l;TtR~_9nE*YNJeLW+?VKCG!%(V2M`-hWhx@OVYe- zf4fO~YRFQEVA<>>^{HZ69WNQyu7JsWE6DFvlNYNXx(h~;H*iO?I|poTXiGco1v z94B6x-f)NhWa(>U450*y{hwezkZ%9c3K%bWSKxaTM=&mm?}V2nWgg;#uCF@U?|0;_erlH9mV>rN(YxTm+H0+Dhc%tr3$l5;vBYQ$6 zFFQ|0A)cIUbeR#fj#MMWByr7YST!?wjd6qj;Cr_nwuk1pH{f7veOvnX;9BG@j)om= z(u(D+q)0PTRiSJibvrRjGu79LcAwH&-qML>x;wCAEmGKZe5!1}Me<3mw>$bBE5$ZD z&I^iOG|b3n-`yZ_;c0>jY{FcaBwdUvKxBf3c*?S+3L`gp!F)(V%k`b^xTVSQzq0XLDSr+<7W-1C98?oMuc?c)fKB6n`ms0g)a!ORlGm z2@6w${yIv&4s^zic%TP-F$zcJYsEa$&#*&Nm>rX2aor{ zS@+Qzb1i$xtqzJVw@oDy9crt$aTNY-1=W-!3leegoh&2kl+CR=EwXh5 z23tc3#bpwbdHFl`Baq<{mGh)gw+;9oPXx35G9y)@tZ%4M$P#+Ubk zil1ojE;1J12zjl7tcW?^`9+M-GDJH{>%dpoZtxhNV9N2tm-eaXcAu(0Se^YbRS;$V zEsrBRln-v@KdSRBCi28O0xBT6DrwHZ?to4CcQ7_O|7lhPoleOF9Xc@oN!@--!hO+uT7}mvN`J#}Rh!|th*yl%s>%d;Ocr(vlVZCdYaU9S4M)Nw z{H}@~oof0v!@@?IuaxJO@9dr3(35kO8==kmyuoZ5%@Y8`#@)<2sa3v zZPdTMH~?EBw9zDP9*7Am>TNact+VY(oip3i?cu%+XuE(>*t!pBBUR%I$sr1F)TKrW z@toRbT6x-)Qj)gcJ)TB7Z56NR-<3XGbJ5>h_N}N0WF6Me^8R(OJTyCeLS;IKM(^Uc zB>M_a+^hES5zltlS|>Se1WX@~^$^WR*RdMs|W5~`4X z$z2=v*aqkQ_LI0`3M)V&l>RBrX!+Ri3>jL-=ReCrLQ5n#}jrs+xO}LQ<`kOZOFv*^^w~FbA{F&g5cuwMmZ@czIDqXH;S%$({W-dY zR*(Ox6c2L7X(`1H@;s_byDG!=m$=f=ylTka_|znsv9g~UXx^_ud^Bd19I&W#;qJl% zSptta4gB@Q4Q(t{3N-E0Ml_xoc98~&eF8u=ZgcXj(QkC7nYE=E;G>r;k@_2*C>_`c zMr;h=v4aBtvz02sfU#uSO7<7PHeHaI>tyq0|7pC_Me4fSWNG#GR*K(0+G^E)y|`5$ ztG}Sy*274SnghibN$ow=;xVg%eZ`!XIZz08c4#r_RY0R2EBm609;Ht-+%m)sOvhLu za8fq9GIGf&pH`*($uOPhQIF{1=$tiQ)nv_7*km zAbWVicP^a3sfVrU4LyTn+5=^g!_K@!fsoZe!v2&qpyDSETQ2zL)AyibOF=D^?bNaa zDJyLwbfRHe0ROy#C>~fE8QrtJ=A$5+CrOp?Vt5_E(5^ic{=cZbU z7QT0v{a+Kcq=*;X%%8nzu(o_$OpboU*SrKq$5P`JSejqMTRDD2T zKiG8I+PZs+ByRXvWd2b*{|_n~9K+teLpw%@&&;L3aBEqEqd8v9lNj&u#r#n8bMw9i5S3udM7S7NvsPOgOVq#8 zoBVV3BwXgU`TFNXskd~det;})Q%=53_Z~kg{2%+e8U9*;*SUU6qY=Po{YN^;JEWF> z@vDmp8dfkV2%6%3tw0TfB@%_GmSaaYJ68e*WR1IfDgZdr*6!`31wp`dl;OTuySzjgtoVv!;I zcd+FM{h+bX7+5!U4{Ueck3tnE6n*>9w(9OY-4?!%Ni1JP4T~&6Y(C+Tkkg0OeQrln zgCv^>0nSC6&^5)Iu;>4cyF2ieqhw7!QTVnS%=xsW=tH<4oEqT8hgr9%i9@ku>u;~Z z$s~mc>7Rk>P97oyaWw4?D0>rNSx-@B=@UK3!lXU?9I2~+A~gD+Z0-O_IjH53^q^`z(QeefMpsuHazsc;ToEM&%3)8zh{*ZN2OZT=xF5{+7bU%SIoy5CC|*?Y3e5;mIl%W z!oUz(d2uwpoI~Mcanh5@t&YO3)bKx3tnKdEf?MzFRdDIUl>O63;L&h|udlJPqz2fO zU(JvAGlBzF8(I*@3+VXhGd|XfkBXMo*3%sr3G%zk3gkL?HF&M0M1eYN>D)EOOVhod zOj{qjm|EUKcgsFYIydYp4;#dK*56>rOSrPl=MJy~ zx60k}_o&pKIm@yBrEBEmt`j^^T_t=JD7Kg2WNB-Pic?ZePuVlj^p zGoMwH3+$zqh@PE-hXiqy$g+v});Ceyswit|*bY1~zQ=WeKg9OOo7bpFb>PgfrQM3e zQ+SiJzw&WW$IvWtu}d7mLj8?uCufM3_&?czP&;(xtx|=vG%MkX&a1KSOCFw&_Zo7S z!dgk`pa54|7h;rlH9F3kz_zjuj6u~`m*w^_b2)D?YG!A4fecehsx z;EJhEfhNM4sDJHIAOODb!;2Nj7@Hbd6;)>ax{bR7N+zai@z&3j+Ba&1KDRrKf6^x6 z{f;YDI3Gi({e^}X=KV>(I(MKr0q8*w2w!BVCH6dONppvgAKz%`Eev-+dXWYicwG>j zYisK{o%>7o9)briHB|)!+s1if-fJ}Hnla)#hfTCmMU*RQ>Fprh4AI`_JLgkgR$j_W ztfHLZyl}5pm+{M-D5osw|4zr@L~t4NDCS@IOYinq+@$Qv2E%TRdljj26`R%CH6GW2WiZgFHEBUF>VwAJ?QfZ^y@?vm7C5*fJmw z0Yb^neJ($;Vv9GU)z0OK!6D=>Y#C}M1+*^ZG4XZ!SDY_3)Mw~#b3y=W!ux{nb3EZ$ zS4S!EgC_#3^^4hQ+ua>zj|+aZJI|Q_(z-ypQ)dm2fpsMtt@jCcbeDC0nu`l)h0`%h z^P3$spMaC1hH%4WtcUQTJ&*XmfnBg$h+RY-*7rd>-T`u`afQPcY6RH zoj9N@nCN6QhG3U3#wrQI@7qA{ffa!8^eOL=0$x-`n>FG#3Zuy&-j_nf5>nr0LD~Lqy zIobkozw=Ait>$GKPhBYGA;CwU3axjWQ;a{lu{EDk!jak8WiM#j@fGnSN&C502V@Xy zuA+=99$zy11pyp{)LZAK`~b_S&P6TZ&QRC6vP8GrX?vBMp%H0gI zghj6p?BO4pa2C5TahbY)G{;!JL>T0>)5Ov5_Glw)$CNFdCf@xd>n{$Ut@623XU+m@ zBp9)`KcA+O=)N;}8q~-w(LDK4xEJ=^@h(gzt_OaQ)J)n_^C=>zgsjV3dUMYkc!}y= zTs|{=$UpwI`Fhv#UtnLY>d8(T_3^d7I_A&Ga0xn)yiVzvjw><28`fRvYK(}U)Ljki zoM`*6t>-qehms`D!2QTl!~`Gk#m#(2>jgqlLXS_jmRf*!k(}P@;?L>T(;;ZGLom-Ic@Fm~k4tyiT7txK86yJUe-)ilGwHr!qs4E0_nKZ>IZMiK(G#<&9!Ve)l zY?#QshVA~hfRPL@WZn-wA#(rDz9A3i=&e^x=ZtIRQ8nIjG7!sG1!Be#ZOh_dTM*An z(v`o8T4o_oEf^W1M=1X71oiYUT9%4H4~7wUwE$0UcWP{Q5TMB z#B=5`j@P_bX;nkOs_hm}%g4t5U3XP%P@;VIkNO8wx1rZYVhrd6K?YU!Hk3mpu*L6|4l^SxczjO2veEfpz zC&3!pbMa6o$wP1sK1t#eIAyX9&-FgZs0#m`B+MvSwxcN2y5Q@^JD1P-{YcHOn(c-UI%+J^Hm(?u=|5Bw zKL|X4e@o>t0rCo(yr0HUAp;*F=6Hz~Ac$mhY@bS$_8EQ<9G{kz+>-{{ao+*~J_X9F zke8a9KIm#Ta{XtK{SYob!EEHNad78MZFA_SzgBW4Ct*d>>=uRTtDa1Ohp}qxggeqQ zcYO;cj538QcNb+UQ-8z{^i>ZUv%t$#-g0kdMe^{9B2;6?av7Q=@9eHaJz1)q%eY2Y z-%>b*tJeDac4kC`IYO*w4RJ!^tI3VS<_MH^-wgNHkr7qhFj~s9C}8yiafXH638VU$ z!ouilO3LPXnixmSMeQMjU*8fDPjgh&8iGH$&Z+5`6nmP=LRhUm@;TxG487*#Njun* zyNh!^Its8)`6%Gfl~|?o8U1lxX^iDz9Oa**L+NLLCS$I(kT`~ojXu@nSR8A|gCP{T6oI&gUTLG0`LBugaGGC={%(xN zytYeyd?u#p-UuO8kDWeV+{0LpF|ANjp8}h#U+x&e-pGfv0VN52Pn6NDvV=x`poo>w zKY3z@K!G_Bj9py8M6g)BTDf;N$4?2XK{du8Xy%{ua!LZsEaiDQL~)Xk(3;zoo)vqX z=*iB@0acR{#x{4wCUaKg+*UB6@^v8jaU<-k^)+=!myy?9~g zys^t!*nvFsiFQ8&j1QK|_FAqQ&Mo#0f)Nv93@OZi-%P64G0pc2u5&KQklA?#A5JG%Q%!5;KD+=(;=R zkMvWdk8ua1UWM>5y{=GNaRsV~#_X3pVni z$_VKd#F@`20#e*Mxd@1+8W|c-vy20Ij(jR{ZeKy31105;BnG!GK@(V|Pu4unh&bh^ z`7D<)z#~GL=(gr1;2&s3Ng)HJ*FAXSpsOjq;Q#c2Ju{Ukv*t@-!4rZeor4AqfF3z_ z5~BSPLie&F-;MJn(^<;bl^x7n$N21|VRPaBMd>=ll(>ueqG*%tPgN-AU(-1zB>^j$ zRQv0}JtWcg_L;KuR<<{Vvg#geXi;oc(emAA=1 zkalPfHmzJ$Lx?LC(llYuTusaMXG90sdd`yBr+-PKtcON5^@78AZ|;Rz&%0(Qyiz?% z!HZprCtEHPrLFikU>ERqAo!CM`~dOXa*kYkFAV;l3Ju?^N6v-D*F=YK!kV9$CqDHo z8;lv>$n%s1i$?x57Bo4GV1F*9l?Cb$hU>C6t>tC%5g<}Zi+d;D{UqmBgF@X z$R0$J=N@H40t_+_j_I2D{USxf&50p@tfcyAw+a30n(Q{~MFZ&#x~s?qb7R-yJzb=3 zxo$J(q;7=)ui^@vEXRtE8Ns%-0lH`~@dxGSB0n$Z@EXE41Cj3PXIJx`3j;h8j!Bkx zZpb9ppX93Js4dw}%NxJBySq;Z?WqBX>k_@e;_MK@$* zQ*&QUzv;#T)+dyjpa?&1{S@1~_#NyUFZ<$~QM`%(LL4TyfMnUSS-ODrYX+4 z^SopzT(7vh`W=H zV-LB!K!$)-Z~MWoKT0pp#~5)t{1_Gr`2mcg2OFH^C;3eQs8(4<#A=)33mz?Bu#1@} zw1bzlHVD65u~R8(PYtkR(v8dK2%p0Z_7o>YOa2N`!+H)xTo(ZF(g4X%rJWT8Tm-Ye zcS*nrJY#Xl>>5U80RO9Z&ZK>7?=q_YYf0Nr-L1^C2Um+u8h#a5iqV>~(}4=-E#!;( z2kl&mH9c}5p)(g#Wf`wiUNT@z-r&m|4`~HC4-Hjp9*jlY0p)U(0jrVImVBTc3U2sz zED^pvuu=DmvJJCSB5Cq>$C~SYuu+kXwtql%fw`iv99RDVZ)7pfd|tuw0u}K>;=OAk z{9YSBm#iJ8M-?R3L-6txXTfvw&lYpCKm*v3Nu*HA$E`U2A7^O9O4A7uQ!U-hnI@fr z2kK7GU96`y{rDJv*8-N8fuEI(pJX_1Bc5H6z*BuIWp})#u@O{-$m3+&(mA{QXv%%l zyAqnGtK~cVT=Ukc>#*6vpw>9c z^Q6pI^nEYEHE$zsnsbos^VTuVf+fsQVtQq|yl}Y+k?=KuF@)P;hv~M9N)*<4>Pdtnwc&>VXXr1? z$6zcQ+}pFVF7bv)Z%tPt*--(R4XYKKpu73bc$*N~u5(b^kb|ma5)C8AQewt|efB2j zE}M>xDV^IrROE$RgQ8o*2(|V#W->*+{g|u*AJI6DUOc*ZIB*J<47Tlutn)&YMea_J z%W{q8Jxznird&)YT09`e5cWyVDUYB~e7XW<}E~_HCsi?C1eSL}^bJ&*Es;H%PKdA?{;>DaIyr&XXUq?N|6S5II3?Z;ojC z*c)(e5-l{Rial-|l@}}fatI^XV8^W?zjxA}vpY^6Ct&I(S}&%j@IJglxORC8Gz6-!b#Z5%=z;zBu-pKC zL7d*E#35GlMck-SF zN^Cu7VR9%uC8<-2tB71Uddy^k#BZ1XA4O*#mQ?=s;hAX~r)kP5E6R-~D>EymX;G79 z%F4_X%^F)wrkpZ!%FtYpZCc4p$t^1tGA*@I#YV0;(~L|_jx{_`yK^`u##&DmFfNq^FjQHA7KB}KA&%S-|zx=2a{4T5IW>3mc?G9 z{J`70BWb-hv#c1A#Pn!>lz_6yjB!ya}I&?eqIntCKj+!HP zt|+xDjI3p}HVPC*qJ&YWg{cDlsmM@j7EMm6it@Hu+biIA6lu2J7bh>+UD1a~v)FZT zw#MG{f%i9>((Fq)gUWXbJdbR@T8}t{HXQAYPc^~%`_gj8_HEJ>Tg_f1+1p)Nv1RZj zQe>OZM_AA|;rO8;4;#kw&39D;0H|1rJ)A0e?w~W| zl-)u+66tX&Yq~ud*G*StU2Ds0#<(Rfc!S zt(zhU7p>MlMqJk`1`EXQlY2PTFP-EdeV2V%V>=eq70c$a5l{kR9`!46Dp-^7O$EG=%zG%B zh~CNOMy`(jtp7y6n-FT-Jxy0$pz8ve@3d|6tJ@w|*s?MG>9^bb1n}*qwNOd-nTYSD zV1rsqwrGj7tKF1ij=}^tt0S-*!|r0q7FD=-lbd&ygF>?XeP5iCG1N*j!~cO zZCF3?Wr_}6UCrum5?=&DDV1}kw+^Yxo{Euj))z?DRospXi;lW!+rKak!Q3PU3uic( z$L{J?W(;9rF|FY|NDxpo)iGQJV&kl0j4Pk2#zm#omx-6iCwqZ#mF0MOy}*DiK!b>T zg+`Zhs^p&$z+H6YtmSA1^^eJTw7*p++BHCHgdARj<{Uo3|5&9ss~<}2edWC)CIfl3 z9#=zc2h&9OpO0~SDC%kftnJko; zbr_>N{%6{iCtL$JEmQwiG(XzSB+MpmfH$^~_m4Cu-}bO=IM5R5VE>;vG1@KRVt9U+ zc_~~D6-y3UYubW0GbzqeJ3XC~a18+gkPX%m$2i58Q8Rg=KrGPx;=fqLGMy~CIJk$L zKp3o2;AJPv%V;CV&r0SgH}sQzNgL!>uVx?5_1S6o5d3?{>HoJffjYsuvuNs@L!IwkU=u&YewB zo0MtF5YMKRzP9&Umns5?-FaFSFr>d;EA?IXX7iWh9C5fU5lDW9zwp?_Bc$oH=vl>` zgb4U@wyk@YTqvIpf5g+!oiOv5-Z(EZDWSBJ`6~5i(N!Bt=&SS5Nc{z~-^#CeH;XiL zWkSiT0*Dos!@5gdNGVeDF+RHO;(zQ;7+PW;_3ixm=Uqbt=L=aW49}>Ax=O`O&SF#l z@VUbKMh$KLd4K)bcV{Cxe_Ai*LDb6LXX?8_KGgf#WzNJiviP>7WIJjPf$2>aQ_mw;0c66iK<= zlqb|Ba%!`GZZ^3c5javrdHke7f`~-U87jDyI_vriZ78ju&-s<<8>0I*2k!RUh29~p zckFwK= z9qy;hQ>bq!$Ekm4TA5{xvAZeD)-T+{IdAR0gE9Ji*-5xKy<#Fzay1V@$@YN_Q8v29 z&a8EbVUz5EhZzbK<~`K!$)M|O-!pwoVuSen2^f6!`cyijM|G`75gz8XqEppgf_PAYQ-Znk^07& z9El5m<8o}cb!G{(SYg1e#`yjO;qgx>our=M7q>J&n~hB>70yK2J;eTwr%4)UFrHGZ zo{A)0oLN=gV)z}~MkZO$l2}bg{STP_7ThQPPjsZ)T9VBRVEFLJnEo_W#_<;GHN+XD z8zQ8!VjeEUe{!Oq^^6rE>QU2L%hrg#0|qaisE^#C*kH1k_cHnso)fG>h?;P$7_zFeoWhfgM*a7fq#s$l`tQ@qY3aQ&^RcA!;jjfR3D z8_!Bo|7fLVI{g@WN6oi8nFbs)akfQqhHrU95cnRGj6dK~*a6^(d(}ZW%yNN`iCHnq z50QYd<$;nH|71&Hyp7%4;X z39Af<@p)>!Px*@2L;R%o-iT9?Kj_wC#%-?tyEG2i#3OMcR!8-4bS;?PAY8|5g4>Sz zeZeP&nU)E$hM+3abxXPF1wBBQRDtW$P8UiZLpfb9lMB5RRZ4mK7$YNnZBTaBw%#`) z6EA2m#JEy%g*$XC^<O=@{h-)o8k2mDon@3;T*E2L*e<#~j2{Mgv_z@# z#IGg9`q@G$ISN%r!8nW8qs!z=UQ3C>Ey5t3L(LpvoFFHS&LB3?c|XVkdw2&oski!^ zW9)MPg30x;EZi3JQqn>>pPiN+2>d}^#Yz#GNf$_b&Kkfsvf&5N=VJ6Q*Sun|Wa^#e zo;6p0U*pvb>k+oY{9=oJx`?>jO$AoXOUa3s%>Sq*^61sL&jx4pf0|OWqfc}sfcfab z1b?&4`pH}+=DIC}n<)}zu`QGmtQ4wzxnAfsI){V<7zu)I`+<7EPyX(+{h=G;!~;XV zBl7@9f-XoBWLx>WI6MWKltD?z0+X4ynS>#obufA*$wxZh&hh_}D&7&mevQM6_gjb4 zYizMEBFnh*6wOIIV8AdOgL0#B)bI0nyDT9)@IUMFR!2_^mXWVXFGYzm<Q4^$eDy<4O=Nz^t0=bg*VPxw^*)n`d@T`s3OCY&p4eD+VvqG=& zv;s?qIL5RfmzRL?F@GDuToqa)Js7IqZ-V^QIf>>O|f_ z6axA7$n0l0jB;J8H`UO)i@CIZC#aV0+~FJBJx}^+o$#Z31e=j|r_e^bZd+pMFe)k9 zdjMf_i+gt;6vnGfy7tr|E#F3no)90iuOHtsF?g-MvEjofcpq2mY$MSObrq!FG%Fa5 zfHBIiIB|!3O>d*)*TIjURHL&I-SRyBq~S1l(L_vJC}1wuj+#whe4aEIL`7D&&@5hs^-WsVSjXr3VdlNW zjTTFDZbXQ>E#Ked-w!yk3w04_%1MHI)amgJD4#lMK0L?nG`NzPPkiEwSN9CfqQSeT_KNxL`3Kt@&#YPV{?SqdLZf)LjU0k577U@{*Y2alRq$LMle=bFN4pu$h4X-9{l8^HC%B=^iIN4DZ>A{QJIYLid=1%d4ASaMI}Rc z*;-o;6{R1x)ELf~_L@f9I<`kw@DyI6kEe&WJvTe0+Lt=CC0T}3mNj4hVE@$G1H7(3 zp5?#ujkIQ4wCo7#igBgx$H0V(R?YkKu^#q)wt=+YEK=kScfhZ6TfX)ON6SYwL8UxC zKZ|tPET>B9XOa1ejgk4(MKEt$0O_)xC|RFB*jc#UT{2u3gWMziX&h5?6pzw_27lA4PpO{_en!CEd4K#a{*2?NTU*EyuNC{$Dx} zvjnr4nm&v5du5w-A2+qsIic2p;qJ2=E7J#z1pgyvB|#q$U{ovPL5hXzhWZ`=-TE=h zJ+-d7j55tz`fZa}!oivi7*>;)=F((jb{X;jsZ%B_GC)89i|Ps2i@QLV#w^^+ z{3%QHrLs3a0hMi1U3-n$YIwQLw%&~G%_Gg7MD<#;>JQZ{u{%#UDzW~Qa~wlDQ^!f$ zt~{-B1Gg==|7xR-J49f+=B2?$PN}b|BfQ1$jYxw>;7T0StNl*9lnHRp@j}C+P4_hJ za$2Vc2OFYTU@90i62HPmv~QC(*re@HmfQ6(Cs>v%>&qVBJV`iWQXhZjZgv5Gl1qK= zP;SBSs5YJpFia&&YSpCoxVwp|;Hpa2e>Nk`ld1WO*J3oBa&30Y!!+c-pJXa?cwpOo zjO{l9ocG{%FnCNqhoNwPpES4!g6%J|KgN_ydsw7e{_y4Xv7tz23*LH^`eCf9R4v?V zX-@d(w$9sbT(5j1eDD!lnD~qOV&@7;ptiCtXh*}^p-lIi3MDp11;MRU+mJb&VV}a6@VR#hSr})EJv&LBs^mgL zI(5fG4J`u!%>Z;VdX}fi%A;uc{+`|D?p?ZwQzQJD3HSEl4-I#ph8ThAreK&Y~Og8ScxAbVOvmo8~=UEoKE{9 zF!}6wZ~4mke<7-p7Q-#Jl>6Jx$$qQ}R{jF{UgMn~-jB`(Opq=Yf@Y=3!71!?P(BI-O!EcH1??cD*lUAK<&&iddl`m|YBIO?t= zb}a8>C*0vFA6N|Rl1q{e+9>Wm%I1{f{=B3p%OSw6GqB&G(qSxWD|+8lUtPW0R#qGg z9aMH@x7ixeS>h@V6Q3JeP*UpaEPsC25%Ut2ElioF`QH3`z7k>GB$NtE@HZ=jh7c4* zQRAexsWW*m!*tQjTOf?fF&Pwv369x;f4hR7_TQM5;Euj;+ugm-(j0V0Z22#}P9F>B zywM%aCMjWj-P%_rUwM`F(%olxtEsZmI_aAPYB!^z=4u;eAGk?Mqua<&ymV})f;%S* zoDaf)3SKBU|7+?tTO?xBR>Pu6JV%~d#_iz!2tAkNC)hg@KGDBZVl_u9({sH!dzv(4{gXB57>Y<|tLy2A4k@podfe7Y8_p|7*!K-GgjTm zZ0dg3R7wROby74+<;SzB9rmxWzE&4aKY!{WXACnDs10e(3>V5Umo+(o2eB$eewV2$ zX^Dq->&I6NQ(S_B;6@ls`~I z$wRsZ)hT;N(>d4|@;JrpX7QLDNC=#{RVOt^gs!!<=qg=9*$))c*R)Tl%{i_cw%SVC zJypjzm5KVWwrcUfw0%~b6h_Ea5N4}qTeN-+cumH$>}Z;~*mLl*HU>=15ds^1_nF;n z`E`mq@iR+S%HNujaVKcuV9(%5Mr*n4&1VHkmaRGmY9NJ2H0%N9KN;pCO%GKqlE_oA zZogI3*rwIs7i7}O(pnyh_hGDPU%dGFi9jyKY*#wMb$|jldj_yXNmz>$U@MJ=1 zo_({KnI?G`p!GaTt1BX|1(8t16|A(@2Y;-2Y(Hro8a2 zm687UipBYvppWh;^QPFNt=jfp{Wp9hmejZn-NsCAOOk(R+o@xemYf#{k6?#u_7M3a z5tUfm8#$naZ!r6b954sagFJKYYx+W5$c~hk`FTJB=|6GEl(z(Py-ria|9quQ+<7wG ze4mJ(;A22zN$z0weTa*s|W;b%#j@p}6t)eKY6bdQ*xf5%MXYLhCs2O7S=2 zN_`lHkeJWAam(q6yRLXJhhd$Q4qsVf`Bs;Tw8TfM=1rnvJlDJLAIXiA>t%!3fpbWs zRPwgaDo%Hza)2$eRM%{r<&&`y=6FevMps8G-rQFqkOpEe`gcmU7o4rL-OFZXWYtDV z!gGb>htgJ46!j>hOw%)@Xjd?Yk5)D~K(!DLrL!(j6Cv^89vGP|981s%D#+z(S2=?5 z7=wA}20pOf14q-QC5I@x{nTQ~*4eI=+1A?X>o<7f=(EEB?I24(Yi8d>7o`tjqi1{i zS?;w`|G9xXEoRh=p-9$`WLmcccree1!_Z2~t6)pc)i5m3ml4>KWFRPMNC)}Le5tId zk`l{Ib^Y*_UB$z%s@I(G^1Mk2Yh2I?{Kn8bt=V*>xZF4&{39c&8@)0#ug?6xG0)M$ zk--ZtO3VwKXp722f^>o}fAci9?!@e^TE&f_8fhXGY)J8VJw;KV;~Iy`;;G$9x-@+x z_fX>k(^CB2TJdV8F-{mV$WAZg+gB^oJ1Kh!CfBJ{=FhnI+OaL$+bC(wE>2#`TGC=b zTDZ{JzxOGQw99(<4kEF~V<^empX#q`0BFKWN*eWN+^eHfw6nIW-WRUKA=14kojlh- z%&mx_s!qDGq>8mPFgbEU8kbOET%t@xu|_cdHOH*=Gib{0bqMhYe&VG)DymX*BfDil z&5jbhb{QFi%yfwSPK1E9SjfSCi4K5_(#c7@QmUw4_EN5pcew~h^yz+x?OuTtlltqT zG|a^30||7~^FY6JiRW~-w0^YRBSg8X*~6pp1~+rOOEdw8B?|m>4?EL zDpP9#hn(R6PuJwn#7>0;)iIcC<#(`{It^thO_kbClDS_TZWrSQ6$^Cr82)RA8Q1yt z4Yuo~W)lEgDil)=BJ1ns9H|m37zugeC2dlo>6~JXFaFCKyi)(rABj0uncgt=b7ias zBTVAG%yxJHBqVJ>;0nQO3dx58RvSX!wu||%c$-LS*RikLjvM97&F-LeB2q@1sl_}I z@krub)Sbk(>-jv&<&p*cM8nA&W6LiLfVZc0DWZ#Bfp ze>0REsnmF>r#c}zhybo9R3@gIb?-Ahmc~|(L|Gd&?Ver;o5nHO2$N9 zSi=6$wyO*%B~5QOq=kZRfuD(gO74c^j7x^*Q7O>5=kg5Nmf{5mPjz@)I0+AS{c&=O zZLjrOC9SbyhSvYA=?HN*h`)*X01+26Y^P-2GFFqq=w>PTA_^dOHe&NsMqf1!|6BI3 z?+x{wU67B+^Z}kUTTv8@Hm%S>)`L2q2*)8qM*D)X79CVaC|HFWcVMNFdDzczV7c5? zG9XQmz3N#gga(+F@L5hd$1|v)D=qpay+7I;Jc(q?AKG>+!O)~J+#1PBROf{pqy9A1 zJPBXpOQhhav`?QiJ!IBde+|XmzAkWn0dObbmK6`*Z=1o+#-0a5@Tc6NHt32#>AB$0 z3eHaBMBbjRnqX6c>|J&$)wLcNDD1F5rGJj)U82Twm|JaO`vQTKD++%ZG}E_~o99R^ zZP=epb-*nW!`AA!?hs~eo*PW*S@X!$;khXqRh+V`#?hqxx~E=1S)IM&l7_YqZP0eG z9E26VP&ylZ?UFSDGKkwp4A3@!Gc5c|fWve%)2#nQ`PWPtNB@HV$dC?&i|!{WSZ&(a zw~dGV^Tdg57!x9u7r|Ar4=V~&fV;sX?q(^-CuTs&o1cYpEl0+IQRsrYG*|D<*IqjG$|SXybC@F!kLf%o?!_a9R&nnGo=e*+-C9 zNOhFqeBrIG9$}J|_JNUdUwoD6l=?{IM|n{dX#Zq}NH*538Y!&ZAXz+yB$=_Fc@%x< zI@@>DU6|Ve+JMO()?d^6m5#a$$deRgKDt}OZ^_(}JRT_9^L(nva;68@o< zOB}A!tDtT2F5UpGlT}YS=KrXJwM_TDA;@2){Rp>w_p!i0|5_F|NW5d~Y(k*+vH5Er zaXp*FcZA}uM0R~Kyvl4GiES_RecmtS90UJL3ziqftA|H?B(z&e4|@##jx_mF zhC>?U@vGnxf~@s*@DAUkq0f))S;My}sWIhknQHVRYI?rYVD0+UHKR77r=O!KA8>^+ z587982eAc)dwl#L^9IFlEK=_85%}l?Xx+=($$JNoH)-n1uBTI8QA@_6^#a27?g)wH zVojjxAFABKbhGr?ZiY<3SF867Vp=_WUl+@52RIF?XXz)wi$_lwU=A z$*1%MSFgWeRbqdnHj`eVcFP{rm2p=!%oAD28CNsK$qWlQGxi*1b;{>39)j06gX)J_ zPB9ez<<#b9rV*=4O!@*kXPK}D{MPK>)MLE;Or2a=p?0gr9(^gkjdN*BW{WxL`{na< zx?a1jnnLPn<+{PGpFMj;f7AAHw^;(Jx8ex4A%|n z4p1&0L!{rg@vA+JDd0KY@2bo^aO!lMlKoF{*u-3}##y1D&nc*DjR0 zg8?-gnM=7wppA3_ol-a)<7b*`r%%vqZ7pK=jh9|jjI4;8&CAa$9{;a5e{f;2<;f@c zOmy)L3sDt++e5#H7Q;5yze1V@@+J*f%SQ0mI$pfRL%i`ko24i+?6Va4uAcQLx$C-s zJ*@U5-Gf^1N6hhrDsl3Lnoi<%tqbxEI10D8SP@dAQ!gX1JHZ&=8OMBr$wZ3FFwkOF z7l;l8BS?{qdgfteq*NHd=2&5t(CMY}mgTI(&Y8?6td;gw>*e@ov00 z?D^wbOr`$HRj-i{>;HNHe(9`h7v2XLEN${6@ON z^90ZPF^%ha-s%{2L?{GJY7#%@eA*TX*1}gaH3=sDC&w9Lm4RI)zo6lCDn#2E$JMMp zk{{3_Y>eLL;)qTOf)0eKO7v2y8RDZ?RbkXCN?6V;UZy2@_6LYXK9;kO=^45Bsyu2+9{8-65P?vYpYfNFK7z8nN(;k5EsQ6>kivpBtPA& z7--noZN!Gus`(ue&U7^VR z9|I)!x!WZdue6k*s5B$3@xKp(aafk{QL#SGh?O(P1A17f?+3V86Eh_=c05yB5B#;E z0_^fLCs<+X4>g9~GKaTmgzm|qaBSLo=3qv#~ zWT0r5XQT7v<_n_=$l$7K$pJLc{`=%5LmLUaixl^hRtfU9beYX{5^$sD>hr9%_EK?e zS!uL7v$`;3WarswQtA7_^i6_I_Y`E21NKb_h%|7=n;H>*I2@`rO!tr|GuVD1o|}?$ z5?3i-)zQJVrc(**09zK`^&`u+Rh#~8`c||MJdaHvlq}OG(b8;@tq}&$j zJ~sR%j0Ase&1P!U9{WwkEIC==0uYBs%VP$4{*d%{t**8ELQH8M?`MWUycv)hu4=cANq}`!1MY17_JHp~4J5m=(p|HpUwwI5+Iy0T!|ZwD5R)-n zLY9o)VS$T6jo+QMc;1&}<|X7t^a>{^JIS>X`M7I{NY=|`3i5!MZOAGNY&tgmJts0B zSr5R-LLvE){2jW2njx-?`q!}0;U=ksln4JqK704-`U>7ZPvOlPPveca!K4G^?yHH3 zretb@G~S3Zk4|_7u&b=kQ!Zl!tUAgQ+{0)&PqO_=(Zgc=iTwF4^gU$u1n<-FO3KfS z)z!RMFtsQfX@b083dyHah<#>X>Rfd&MWTz7xz?4rZcq8*60<{(D8Gt*gqd74Xoa^s zwlc0LRGxX1tn^jFm2Sw#LT_H;&+<16Z4PTXTV9YE;#<|C<|vNLP>;`7n!4D5#GZ;= zhGc#2pG+rI$Z$wF&r+AR)Z}j3J;(!lLqqI0)v-{-HDk(wQ<4(e$2wsd6$aJ29k8Bx z$rIp;r8A6oNy@fUid_W2B?1f+<{69R1WD!1zAZ{qqOuZ`03PY8eS|qIdP=b;%KzNs zM7?TTOS!4I)o@n0v~5LG%2dpKR`L8%-m63(^$f?7WC$7Uu2b=1qeDn?P zx>mFe_qFMEwDw1Resh)N9fnu)rCKlUGEk3ROkE{2SW?_&h|&6C?#A@1`(r83>}+hp z#zWj!(m8E*-+pjM$|v*7C)CbSAfQ`9jv&w#C#?U2`p$EKVO6|nieI`eQZ1U`GIV2U z1hffwXcx2w##y*y$oBeM+J-V?G~V{9V{PayOPnC<jEix7wVB^^>N8*mI6y z4Ygx$$~D9B`6-LVVZ`rezUxeKf-}gQEzjdLt-^AW&OG zfzveTQA=XD1Ah0^J-{y~@wjwJo7lm`KmL`6r5-TH<}#^Q(%oUq0~FBOf%UE@|IH*N zxDC@?or`a#kh~0b*RBcd0smIdbq3jSfg%I`Gu7TcZylhcuDal(_ii6(CHUerc8P`m z`IbjEC-?UhT|b;xH!E!Ts>ba_eU3E1c1*aGo=>fS z%lH#2?cw5Y0bS+>ajsF)&vJ{jdUXM&Xn!Ad$XAp+u)xw8*iQ2XvN0!n8Ns#l{g+RL zUs#hJ&OT!8O8C=sqBB4kM!lF-UZ!~LZhFBFzHtuYWGRXl5JFt%>XZx@MVq!cX)o$8 zZG5eEjGgEW{?HElo)>%!BhQXtpPi0!TsFz+O6TA@Bd<}lQBQc#5td0nXh$4zKfMQA zC=j&0MvDSx;I%(O!weieI1tgd1Y%C>L_JJ+$DK=f7w8MErM#5-kYUpF3A z2H!^j5$5^f31!R-BMp7!cU52aRc(+ZC*mN^0^mhOh%Eck-i_iEdpPh5$`9<|rk*M_ zuUK5M#7*B8yjQ$(l8BgEd+Pp^mH=^4&-(EBR(3A3s7!jfVaDH$lu4%7}a6NS-F{W*c zx?WRA5~>3{?4PaA^(~RNeXsN17dVnrWPu*^C(H;^f(eWNc{WB9Z|GV|$+b#y=#TFv z+$ui#b}-DoMEp|y9%=vA=+mpDug523w|xGu=B@ZvV4<*pc^FN(9fh>2@C~zX%PgYA z@iJiDQ>)0fJ-YIXhdPvs>gJJNPeqO-OZulb^#g~I6^1zZyvg_i@2Pr~zct$YDhyq1 zizL+fX3ca+?vK-3liT5$T@+W!cB7+mPBZPM;sVcA@>tkQe{Fb;2IdYOb&eDeuTs8u z5pLw!)+sT2c@o+k%WiS->=sw+`!BwT*a@0mQA_hwvVR*tz7V!!yuoMLQ_&|7qj^-l znc8)=E+G^CsZ7oBT`JrLIOPN=v+F=A?O>?u&Y4yuEY_L)%|v#g0vy{4-lg7gw6{EB z`-HI!bCpmuyUg(k_mkVsth`mWt?J%P#L%yhg=%t9t5+u0s%v1rNm%c2v&0S1&DmjE zQ5W6Y2}_Kgi8k%;N`AwWJdz_gh&Tj{{jtqB(x4d}WW$QLf#J~-lfsuDSYKQQK2N7R z(H<5@G~KlnPpws-6aC(4dWAjY{!yRdCqNAr6vp8mkA!e9t7+KEOJ7Er)EQ8Yt7fEVFOB28Q*~Pj^?^z<0JDxfNj6TN!v7%T`0s%LGK9vjf0!17{ zWkNV6z%;hyAvH=j%Q@&rmQ*s2oSmWQ3k^d-nFc)dANz9&ZN!kz6l{9b=7L%dHT(bJ zG@rI4N9WD22jK=mhYfh|!ThZ?{$x|c$THKP($}tn3bemwO$nk3$qi=R z1$XhA%q>?vqFJQrWB!H5FpUHo}7p*Za6A^(pQ?PVyBoKsT&TQ^HIfUyhY9r>F z`}obXHo*MC70ftsU0iDZVX$vlki7I9nxgpnYgB?mFn1bT?g4eQWu}jmyLDZ^iM>5k z0${J}LCG6nLq8DdSDiS}o=Tu%tPdK#ChU~bFN-ToPmK;MdA_g4z9q0YuMA||NHeN%W6v>V4PIP`KFl>(B#~cv>Pw8%BMzAXIZ9aJ^%c~A z)lOGjt&N4t*7K^1kNY*Mmn`<&>9-v$u%o&f7UOd9H29e)Hy_OglZJQ@Aj=HVzhFk5 z&rz<^X@4J&g?^W<_a9<9*%+agU-22v>|*k9J0QjRdTIvaZk^(gwfx{FjZ2$HP1GbQ zIm%5}mXmto5xH&97Q~;bWR+a}R|b)Rw_2P{iP3o&n^!*O4X&NaIgN~6%d=?$Cf|?2 zQ9dJ)BR&PhVS9T)sj5ts%E;8TI=Np}*Wu2a4q03XYx*s>pu{o(PPqvL*w0R$U#xhL zC`rq&H(QF=Ze%WD`&n_4%^Hz-kEuHG7;v;%`G?dK%f6pT{o$5yGj|!9r5V$GP%;pA^#TcX`r>#p$DC!Ya>{ zU-Zwk_y+ZBc$C)g-xu5(>vq!+i~rQVQ=bz94!S8k?@(m!Yfsc-v#G~) zi!=kBPN7+(YQ@Rkk1^;j@Kk@xT85vZG(AdD1&Y!ZuE+RyGv7}l15nuG!gvDEOor=4 zG63F~IePsZtlttS%Ywls(W@D|(MQo+@E<>mAxEG1oO%SChqb5VLcG* zP4G?8d)TQnb5pa@-tdzyudlHEH8CM6+(mwnPq>9%;5<^B7W4J+EbufE2Bl17&#DyX z7|$XbZ{VS;4XV`ejXc`C<|6!0cNccj`S) z+*NZO>Ms*>5@1xh+0p&1Ru?Df^ADXwMaYM6d!~PU_*op(g?P=J$goF*n)NyK2-{~$ zXp>+F;_leUYwhm?r6j&EG%HqvJBt>jHWjy5L1C%wrU2yfI2khEQQUy}=rr;q-_S!0 zyC4y?!ZyvZ((%KsE~^v_S$F5W{=ObDq?>tDB%#*H+8~UT+|WCS+`}Q z@HolWFr4f=&wUApz{4!VVf;DsMw2^97tA~MwQI!UWY1~H8j4$QxQn%481R6DCyW=t z5YKK8xiFlUb^*VcKD`sM;SigFm+7<$?Tolzio%WTv3iAxR~Mc^%krd#lf=@D;N5J0 z`m*)Weu{a36t{4Qk~PZfr#^A-6hlDceUtOxq3n;+y`l5OkKmgOCr!t7bA~$5oq+lm z<;}qTq;o@=%z~2ZKh#rBmUaRKFEcaM#dc>f9|+^+`eHg`x0mKe3jcZoa(CPIHkv(z zeg|x0$!8;ZKT!}Hg_-Dat8b`)1^#E)VX3C@3A66Y{kO(|axlcb0Tz%-@X`t`M$~yDM2^^z~HhJwo>#gs)?Fs;*1|Lsnd2Jz+$=cf1JP z68|aN-u(Cj!+b;-3C!0dboNYBRgXof`)Ke*w71CTpJS?U0}DHe|0-^X*`zYx;xXL> zZhC7+Y}CLEIr6so98j^*L4(v#R*H*tfp+M-6Z6S|=njiMRgre8@PssOgxzq-Fb{B| zFd4BFM|0pj`#H=)fuY(lUtCX}BqVOiMc7`tIrIbF&^hP_Nl+!0eNvX!xpX`}#=#@{ z7^)rJaTwz%SZ+*E z|D-Ogri2y0YKZNv9h|ykfy+|kr~}Pgpd4Sz(0B&+BUW$8FI$xYd%Xwn4>l7{rf8x9LL7y3ir2r%4>d zP0a;Xn?j)%sc#TBPeycrB%vtaA)Jee8!|r^*m42rZ9cQ8euMiEv0l4#h;WH34&<0m zhYKeRPbiO|{=|hHmYzkzpm_V^Xq=zHvE8t00{)UKVO=xiMB*O0nw$qqaXg^UKK4iG z%!pwoCda=8h6&}+-+H1BP<7$~^(mRQuJLDxfhAGUDd#+$iWdOTZ7}^9)7c+285EV9 zIX}zwfua+YA5mW{NYtcim zu1%}?9+)BoplUG)(qGo}eK~WE*p`55S3jli*MwpJ^^tgzYEB0BQIky+o?TtM$M)e; zX969(gZ+77p|#U3KQdE#mv@+2>E0^dL&|7)yDjRbK3{WnXzrU$JJ7GpNv21iJfe3U84B)xbZS8VzvGLF5a-ve{kcc7^dbLoUKoC_Gt`oocoJC>$Vsw``=o@ zg!F+8zOU{|4IHG#(4r>D^h8-1$-0&C*T`+plr4%0m`TFCqyEC!NrdPc=&PQd8>0hw zW_4^3`7-ai;C*#27~nK7>6Y08ww5}qR=BqqM*Z&a`>_@X2Z<6y<8jy6+RfAt3+cQ*? zqK1n7{zujSCah3i`BVANSsvKHSB+RC=Lc$hcMDBdA2Z5@hqJCa-1>Yey`N-tu*VuDNLx8fxp18v>T(= zyYF>1ZlP{DD3$NNz^x54k(BFohH8u`a116DUL)j+2eKnZPESt|5ZMASJc^l^gr608 z@ClgxD3Oo*6(AIu(z(Y*I7!;XWTZ_O&4)y!Eo;Bmo^t&+_W40 zq^Z#KBjZ7$${*@P4JL|{#7i9?jSQ1NS#G6w8VlC@d+8o9FmCngKV?n~X-{UKcr3g> z6?OsVOpQ@Zpm>f`|~hj+W%+HTZKj^U}phk)1F7AEF#1vezNj72j1nONo`d zcr*xYed_rjg!>Y$!{q78C_B+V*jCw+wnIWX!&di7{g|Zj)w9ivBQwqYPPPZ8pF)AZ zN}IQASt$Ri(KeU!;Af5M%s|GMLX zJ$dMTgQKxHeY!CHu-upN%)G4;Yb{8B_x^f%_8v+bNkQQwb)0pSs|0a+=12vB(XhX+ z$TF`^DyjK=x@H`^xbOzB)rwFmZ1^7!3&(BUmXC!EESeDFXC|y*S!W*DTc)2e9Nv`~ z+~nJ`5fpky1*1D@d*Y4i>*hu_@0#Nyv~rO=_z|`u%HkP9o-G4=_GAa}B)DuVqfbda zMs(9=_@q!XQKd`J2)uVY;==K!6iKZXX`O!C@DHXV?G>xXPQ!m_rNu{9F&D*Im-Qw9 zb26wcM)yZd$?p8)Vu*r3AA+qw@WsK6tHA0s^bs^=@AhSrz`B}~FSMmN$&dMtgqqbN z2M~{1CkTpK+_uPXv-~#iSJ5tXNYj2JrcKISME0GS=OZ8v@=_M$z;K&IMFm?%j#w^9 z1O?!I>+b1gtpyqI;Ul7WRwXqI5OglR`b^5U`aev>F{ug$+a-#-*nMbWJn1b}M) zJ>(vTywIrj$o;&Zlex1MkL^dKE2dcMZEu5FgvZ)_L#Df!>}XMPb9yIGNyY$D`>58~ z8ID+l;r4qotHBCG7(TvPa8N|XV*XPVs>+&u!l5pxe>XoimvN-h_a!vHp4mf$rp%`P zXRfkZ?fe1kWee4M=MD~4p}1s0+_oR?Tw~h=_^U2hF9L|Iwq*pdt?+GZ58RM3VBFLX zjm(G{#?OC?Z(0Y%B?=K!lG-J8x;v^6{$ymD*m zmRpP7mmAdGYUvQ2;;qvOHjP*Ix=4+l{zn-^+yX9Bqb%GD-WJDwwe9n4f+$Pb;G+5o zpvt|=6wa!m?Ds3T6j}9jQR4?#m7(I3zwIBtuzIQ{=xg^boK3lzredR?&XNA1iv;1oI9He|V* zaz8_>@=J;m2J?ng zeU^t}p6@rpXYF$;h2Yv0d*DEK+pYqpfIg`D#F!dPQ|c?!$m{@Xm0`c~tlaa8Kd&wf zh-@R=Mqf_n#LA<0qXC|zDJy1$Y2F0C){}fg)5+G1x@X17li2W_WrK^r>4-9jXmZ@U zLOv2fadoZJ98tgTj44QcO}!HzNWmn2dhsj+wO*>VJw$#aHp72oeDOhvM+f^Ost}9C zvUGK-32ADL=L0(?KHcA0k+#hRGGMv0mzsuzrzD-o!{&=dXL&~_dolK&xnTII&%Ev% z3KMr-A<@f(L?9EcK>KSq`0x0?z2N>Up`74e$q`Ld;|1NGW-n;jv%h$s$kMnD$l}FM zjgyT>AtMOm>ZAO4YrXjgW#1LpL54W(`=J6>va80s?Q)+xj{PjL{*`aD(!R~eM}4`h zcXEJ44=RHSNXJpUr@_7EIU2T1 zW?2mbwNX}kPqgtxnX}_oF-R3l9wUucbig=X{aPQ}frqL_6-$$>X=FSTwT#pk@eIg)uI%6s0gMPb>5QZUvbKGR z4yHOel-QD^>Q0C}H~psTaGV=i>UvX=qrJ&Xf{%kFb( zr|{yfiGrg!LcIMvftSA5q%*?tqQRNP#bs{w2MA;VtLcfN#Bz;CQ+xC$t!B*S#Z1=} zM~aBdn@|Aimh_-1HL;&1P>I!k?t+~>r;4|fEuzEz8)f>Txg6HVh;_PF%CqT)cd;Yg z{DO<3ef~I&lI*w*HA+Wp><2ffPi_x_Mysl+FklZOPc=t`m1Rl{%O^QoCL-1_mX`NCk-k0Xj3B<`803CpWRBXx9XbsSIU1zP~zBSK?72U zrY{ju#|0Yn8%K1^bknY#nDe#G7){`if@h8WF;QN+gx~^F-pTd=okZ0mGu|tc{^r*uGz)-);4C}9mI@v z|2jJJzb3B#ZP$+rS}UkjQ9+`j2BZ?}1_)#-iiikN(NbkeD_TS1F!E?jlS} znCK8F!9WsUEzqn@;oai~18vvU{!Da?D2F z5n!XLyumJd3hEL27&m+g^?WKOnqLvVtAd#0Y3N!*Y0j_S4MLwRV>RnqQF}nRduO1) zsz^fE!RkRR<)><0Fb57DFfA84xyOg^>m1=V|Keq>D3mPO;2!L$Th(9hVQJ<*;*C5; zQiCFBa z@!JH;B{IvfR%o%2k{t}Qbwm~k6>R+Z9~|_9U?!117Tp*1+z@1kSxs+nQ9p6u80K*s zZ_m624`UXd5jptm*B-$H1A~~Pjs>ej|1=MLpMkl>UpCptJ8tq)dJL=>FW70pB7Zt? zha;};xkrrBUi>&h*3{0BJ!=V>DxmCq?$A(9t(&JXh^SrktYmM52DLWJKF4FXCUofM z=?RkEhVVX-FMFQ z=#{9=STADKyxjx6u!`c~=#{doy&B&)S2%FyUrsG2MdXYlQ2+2aDw8YyL!kt`dMJ-E z=dGg7=p$4?O!0cw{6UpaMVXw+iz;XsfZS?p-``w9IONsIF~#d~h6fKqbr+S3J_B6A z95(4#5sYvZ`4qXBGQr_Re|{ zDLEZG&>`@%qEdeB%(<%20P_z6Coyu~_UvZbej|6Mv(``SPYdymXCm?~?xgOJ=WSJi z(6ZIVBo*FDEb5~k@w||fhR->gX&1nFhM4xxLS%3{l^^-5uTcN zSUStm^oMSzgpS%C%*@l@5aM1khnokT#H|A}@<<2^a<%;KwZZ;>lu%`TYDH_kCNgQJ zmf=3@M8Az_HcVDQ+}o6V0$$orMp1%<8+8YJG#Fw>b8alA*);NYLjEo56nF8&$X*eW zLJe_9*7<$$Nm<&x)15)RNlo_}rN}l;E~HjK!5#hO(Z>Sca*A5WS4B{<4_Jy9g_oHF z^!NTRigA1_hX*`W*-O>E3$^w6j3jZ0=%e`#w5op7iB9>t%^x7DG&ctNB4Q77FR!RA?g05i?zS9AM&;rC3z7zLRHCW&2z`-8JRX4y6Z z`eMaz6b(i4k|Z$Bu<3_1r1ShB3g#+SgZs+^$>F!Zw*`xn@>sFa>P_lR6$dQ4lOEm< z^ghZ88(2t2eT^j$O44zM4cTd5$g7JmF+xW3vQq94I>4WKxQ@pb2$4W@zVwzjUy)6< zvbe^(Pu6eT0dEpNq;iyTIqo^xMdjU%;GKJ@Gm*K;U(NRP+LK?Th~EU2$+ZqENzyv{ zpH=bfcc>U)Wg8dSy7MATziFGQF#Jhu1#r$Jr?Y4qH+T_@g&sad{$B4=<-eQCEql(} z4W!84;BS#~7_USl;z)bBkhlnbSi~JuRNDV$DNMNX#^+Yl?)QmxPuPj*Ck(o+ek4A!-Crp{=>z}KNn2f<^0gg`-SA>Veq zVZaqRd@K4ocY4K;-U2{7z43FFPb@1Czmx49oDV>b> zc=)I3wsEmMnPWZO3H>nnLHt@nxK0>@+BAdR z_4!~XYtCzpqRYbyxqt7Gi-f~9-oR>|{?a2!QbXuv1SE0&ozPL;m9%ZrzQt(?d%WQX zdmVR!&0o5DZvvGxW_T2;SSIF}R1kWgq7>k==lm#xX^%9S zdPaWx_vNQwu)_u0Cn*zdd^>efiZ?vsUJ*?j{?8Or;iOz_j#KSa`H8$%*W`;`=q0+f zDHy3Gp*yEjQ7ewfD$vG-GlqBchjNfGb}bD&?4Q{?+rr~ z5F2J)jM5&_3@^G>S9u6AaYmiQPlqJgJ!SfO9+TK13*H$kC#~ZX2Pb0pa|X42PgUWM z+1)A+rS=NR4!ovuQYB0(i>|^&=9n{N)A0Pu$*c|jcLH0LAzN7AIj*yu zqCV0w!}1Ehw^0h>FOP{erpGWpAh@%3W5LV@%oh5I+wgz2S*dqwmm2*y)7Gdj!_WKa zWvsPUBd>#oe7Ywu+A1Qnei=_|Qz+mC^1vcjb+Q_`ts4!K zf$J4PRKQ(LD~GeqlS|tba?(mTVT@7iENrPBj{o-&p#-c^d5L{t!rxefDdeBDk#ELG zmjGiCa%kBp*Eg^QmeahBByMOMy9+Qp4H@vuNTBuHvJDYULgBRNxzZEDKE3Jnzg<3; zH2HZpqJVa4E1#|YCJ|Os`4jJNhPh%-V5PlRN+VUq(rtWGm$kaC$-{}&)tO2*dWdV1 zU&fwgpi03ClI%73UviXu3+i!rf$~qB)Js3NM#_Z_Nq8;&WENXAGI>d{P=nDY@NA*I zT)5!o9yU{#i_sBei+b6#8}qyP;EQ>@F>!^O9X`52715-~*EeApI!*KDBz~y~oUwG! ze?4GwpJ@SC3pt~@Q;s9GMGXDIe8N5clOe%67@e2a!xPyAPt&~6QL_~wz> zoF>7dvN$=fV5<)~H*>yUln zq&XvEla_kRLc0Sw6Nf&-5}P~5^SWy@ZLBm5n>+X3SQ=uv+^~C|Bqeb(<%+Ga*IV$e z+&D@}ixCk{TJVs%PJ@qwU5z;!fMpN&&3k!=Cc`ETzP@1y?Om`=zF&=$xlcQzCVl?L zqr9-$dc|DnD&B9Ls8?m*4e4R3f2HL_yQaB!u9v0of=?058%}YQy+t;1rO%_jh2c$l zpp2fXVvP(n&`ALb2W3&>Sc+*8lCj)oU6OpF(^Hnv|2^DZJQfy?7Zv1ne2E-4o^jj` zSaHb-WQ=&dC08zrCLDBJNx;{jCMUF&(wFuY{-xFM3o%^Ok;%wn29ggz4L{N| zQqHHnRqI3XO+kcyB$WtjZ}r?_0ZQ`imow{9IVUOxUGxG?(0M(_3ukrIZiEs{3k#dST4;C1h)A?kMSon$W>i;wU1mZ^-*`bPfEP6-f zx$_mV_zvtBON)9RZS-&qzV3**es`SiadX{Pm~x5m_ck;!QbIUGZYdNbKHXSei-PKI zC4^eDBbch=%Jb==Z`7X%vpe?^V=yO~y2cMPS;G9(NxM_wha{ND@bN=q?!0umLgH>? z@y8D9_oUmBe<>LtW{^(CJr^_BBdh^@x(7oqMQS<9t9hkBUF8Yr@Dbh$R5W#+v?i0Z zic{*~ZJB+GGJOhMo+w&fkSQOf#Nc5a!jogG2(tew)g{oU&rCd0%cPz+f$89Ck(FKT z_fJy&OCq&@Ds$@u6yrwZK-=00Un-gL_r->VA07KJ{j!n#uc(D|>rf8f#*%^fL5>b2 z?9+)~u$YpAOb4R15)kOdEpG6nh0}1Rfma(UC1em*Sl^S2z|}U{#(a(y= zJ$8=nU;oC%V&s-G&roHFRc!E?OT{-cm-#5LN4172XG&ElneedToODajAWyen*_p1c z#j9IAY>^n(muUJ8|4rcZm@^y8CB8t|jP(99bTq3cczPD;&s)yVFpS6;(1_2VVWA%Q zZW2&gP%_+Xkkr+B$=1c{FZP$$u9TvvxheU97r3lV@6}c@pUcEJc}P~se-T)wS{+h=%BQvKe5lrV+1^Y^k^|y7}yD>);-gZeqN?X6;k{9LDkB{r+@uX}IL`9kJF8 zHBOo_6neNd0RHFrTP4`Yk#LYnUxMx=xw6cQw16+9T9y+P`L_>Gp7u^af>xUTPI6)7 z!oP^bHgKg)7OMRDP5MnsY=Oj5Olh0-mDc1{sU|R2Fq&sx%c0%EVJm5YC|)Cm&UyLC zIJu{J z0``>o^rr$P%x2jWN1_X!|L=)@f!(tRxy;(=X_#U2JJVDot#5jLJ4xy@Ph?Kn0G7dW zcjCI~{>L{r^na#pB`!NEz}v(Sy*A3((5rfmCkA}wZ?Yd_10s_-n|Z;EOBOz)8-6F; zQ9RRld7MTlh?gl=Gxjem$QwZ!!+9TU*CK5ZTVX1Gr2t)_xI}g|{F}03k{jvJpvQ?b zOP>J!3E7i2hrOqYs|pjY>(cSf~&u&itPv_Bzi8wb7J<@r~=RM)xXTw5W zDRt65FIQ}SY5Qos(C37b){O+#eOf$6$x|+&(%2Wk-SkQgm|$t#1ijD{a0_bTOc z??$~A8wkle9M4>eo0}M`~4yaNOwoEZSrbVZ{C6fDDYaKL(8P%@MqV2ahhwj`zN8cviNC_y5KSR8(B1vL3YUnFIUca^-{)~kN9^o}%)FWdx zU2W)x%7Vi_%$iXg618fxqq>;VEoo-!yrz`Mw;Wfn8n2Sgqdg`OZ{*D77laI}gSJ@%=Wrmfw?oRWMc?St?p>3FC}{LCqMmvVF8o{Y>V;G|!l*hq2Jk)T_t9g0fCYFyWx$)*`LBdFJg zlRyxSb;5Fxr~hz<*HnvbRcxu)l{{3_Pu^Z}pA7AWPP68|GW{dwr?if*aNF5ys!DlI zMZZg<-ZHkgtx`C!>T%5k7g=xgrG5!-g6?g&c@cG5OahFyGhxjnmwxIky7!3Tzgl6u zTQc3dtN}sw-*N~y%+oY5cEC1N--Xo@luXKbiLqM@pl7g89duz`R-}i$B-G4~w9o9J zrrW}VEtY@wKaEhOE7YWU9c(S#C91S6cYGWn{WvZNt>aODn;tD85inJTne5PSEqS_1 zQh~}_7e5e0T{|h{3icYpgx@P4dozaqx;7>lBY+vP#F%&>HAAjsmhl?3Ql0WEDeaD- z4|RWP-15A#NXhAwx(arS{-S?}Wlz_3o+SO<2;jV0&h;;y2y@pqr!e5&}q^S0F(- zo?!Ixnfq8-lx!nS+b(jGNePOp$7{Hywf4jTNz`ro^`N)`{3GSYvr*Dp-Epqc>4>R^ z)LOf`{|+@>ag_F%P>v(#oBv6UQpb|w8b}7JmQ%^v3aZ~KaWULelaK>+6}7bU_iN@& zT})N5fzHPeF-kBoM~;lL5W!H=u>bj*rHNoL@Nm{?qa8X)d1^9?$Fz_u{<3zYMU^NO zN1)MX)56hDHin(h0*^>pP2$;@-jTMqDD^}48O!% zIH@(S^&jEEdrc2aujHv_PJEay8Y+9u0^WN54R4q3zgE}m_bA*PIX9%`@XtZFY8my6 zI$;VkJ(P&27pV^xjXJ6D8rLLM6~{alTVKWJcIlzPu<?59z!>(LvAt`UQ>lwXHos@y){k)3oZdvTfO>|Tv;qS z3I@l3$4sIrDQhL|UP}2CnI+f2##nzdXkJi>Qk;mp8|K;%$(#w<;l}Lm<4(*OXX|gf zCM{~;c^Nc08-OjMV9K#}+F!(Ew_BW#ZvR>A8E3f2xOr;&n~7$3IeE%wEUkH4ops+r zKh$AIa7Tm6h3NN&SeXb$+ z)4KfnTk?CX{?6`XAK(K1eccb95W`t)vG|Ez@-y)#2~2(Mke%bNMd^i|35ID}YdL<~LREJxcmnrjD(+=eO|4?@1(VnCc>DeBC{yEs-V`zo5URs_Npk*PplM| zZFH6&9_ya%m>nGOkFohN*+;RAtr2`B`dhojJwve4F1h8_p5sNRvXnn;E@N6fA4j@d zIQQ+q(Ee0oXl2>(CrRq=i?eF})O8=f#Ox-_$0y#eD~EEn=M} zJwki#HVmVmREd$5_C+6Vk}K32{|F&ap z5Cgj}hu)&!!e1FiS+D}$r@?=x5sN%|KrOKZ_*0Q@gS1#8exG$a4URTu?ZHgqw1d!A zs$Lqloc0INd+8Z^>F_OmqAphXN;1&E24&5@J|OQXuXS{rXfb4)X4hb)NUi^~mG7z* z2Lll{vsR5EJs53Z1!H=7VU!m_P!&*fEp1}3*x1a!=CDn`@or0)Sx}~8H(!6q`(!$$ z;EtJ8AANoB5&Z)jXLGWBP^W2k)$1Mh?j?$Jb_1rLr#~et8ZrvaTOdvN94SkDR^`c= z7bJw!(raD&YjkI{2N`A2(Gju0=<6YWLLv&{GU82-`qY> zI>lyVrEgrKE40#oTkv=4zN&DOO1bm9l(|*aT|TOMUbD&MlRlM5JHoIz6Inv*D8RT~ z1Iv?5tNwpzC*0uE%(0!J-lV@3n7ods_!(!oPDYxlL%b~r%LlbG75j?6WBqAX2$pIm z94Ba|V^zcrPZ}tu5~H^JofH;qxBaV>~e7#|&|^d>sScRUpKeZ!9cjG=9W! zWBrn`!bY!<;BdNR$iYtW1$D%H)*KauW?P&s6_49l_l0da69vR24etJN-({bLP*4_) zWyCNAHplb(gHHh)La6>GjzbX@fm#ui1Cr8wcW3Y*9m9V{4Wc*E0Nql0&6h*ra&o6) zEhzBDH$DDG5|R|!UDcoL+<#wOpf&mot$+p|-%N>YMJ>=y5~MDo4j3Eg3E_YylVbKe zjo0|%)c#a#yU8E-!)Qn!dV9qRh@z7C=G(cF=rJev{su3i>$gqz@L%a?Q73|VzJ`}j zE(i3bvr=xOQA6U**TCb5_yct>7x+G|W?u3k)Yn$LYJ;Kui|=qjK8g(fXfw{;O^hTV z_7?LtL<)@6<|e^k^OHP2+Jo1|I-qrv&_3ekOZ^F(EI!t)DH3rCNOfaAQf?8Is%a-# zrg#au3#FWDm30^bxSjQuuX?>Q(fwelnIa*?WlJ>;8eO_MT_@7{6l?)LpS?8gs#_1l z7#7Zenu1N(P>0;wccy?ToBt?rA2-Uhu~P5D!o~#R9*N<`l-CBqgkm`5<6CgEun@&7 zPPxr_1X>yVlnF|&PKx%@s3KV`FON?R^9HnOUjwc@Uz1s%{y})lGN}QV1Uc-3em{r? z>YwD`?HR4fc@o?^mbz;mxzR-^$O9kRLX&ZssFh3#KZkK`WBS5GUdu&)gc`DgbVk@0 zkFd0JixPgJzz(scc z2h57mznJt;V;?aQ?fLjx)T5lxW4g@l**|)|kjL&m3gbD}Z86*+g}{qgY{z4!NU3!* zYm4?)Y-Yqm^LEn_{e^)ZzS$aig`WcPihVg@x!K_h9vFrl6_g)GTBHT$Fd zkhiru&U{iF#+eGG3)JsT6~?Uk09V2Bp~p_+WF+m@;)1l>8+h}Xs$z*tBvtN<-vS51 z3x)1>#wh)7vI|yKItLYpU4m=W(W7HaaCgBsPPxc(Vh?Yg>yh{m;m)&yyaxK4JO7}z zOSfSD%)p9+VT}5CjByLSIgN)aIOPG{$ZhS z6o7+1$i@3B-1&k1Wc`IQ)r7vJ#E~eP?HO3u>{uwTKcU^fk@P*i80u^>?4G5fy9!4s zL*SqrTDj>N)E4D{mY&VB;uP;U5$3+Cnxe0)vzD2;-eRr$-CeY^Sk+d@3Vo~^{;@s~c! z5ilW#eFvlVqkZmQA8o4Cgs*}ND27oFN5#$@$}Ve}@`Ji7PLtgL{|{1yE6uA2tELwDF^(|{|w@I`u3o*u8u!Kl&$k?;$b-eA`=<4645Mlhi&x%d?hb{rO22U;8QYQOHkkaz( zvzuyRxy*sDW*0T8cO@UE6Z-u%^=3<@dMkfQ2yHPw4qToEO)PfS))E%u4s%t3?FXaW z11uxICzXt`Buzc6Pkz$~Wh@lijg(dc4Z7xo>~Qnx1QZ}3?S!ABF3&8fHucd@0{^w< zhXy}K&B#C7&{cq&h7GHI@y0%1JW?*Th3=WRNy&ySiU|Q@f|K+>@+yj5j%7l@bq&1< zCp?>@!fvOMRo-1dx+*|vJsaJ=pxX3-j+VP=p~cXAWRzDf*k62ehn+PuD=9zqi}}J3 zlf~pC%_R;!*LWlM!ccpmPeD8um8~5Pf|RHLe#@TL>>k~iE|*#ipN(Cg%1(UCyh zpDsYIuXL1UVjN$JzLQc)xUq!PPo-J#o4YghWWHu2SDlmeLb+cFq zji39?ejiDCj^&E^`xd&113 z^+PXeB?>z?36a@RFe(3-JgBsc+p=(&pv(dVGAwm{fHddf` zSBHa`;`W1EfRYHqXZ}(3{2DNor%F*z}Q%CD^%``o#y~S(hlOxM&mPQsB35bfaM*d9w&=E)bGd@|@&&V(GgHcAC`;zM7 zXT%NsENZ*ZHaZAKk!~yd@|w_bFJ$>mQ~r;}_e1V(g(?!uwI6;6Nl4#UgkRk@x!|{c zkGv|DUhs$`3y+VOM4+hFO4oM^C%iq_|7g$+Ybh`Dr@vPWm|`VqKlIhK0@gFNxW!=N zu6Z;St7zd@1G|L&5ZU`p-97aUXs?p_8!PE=e8aA6vS6;Ur5qH*AudyXyZJZ}iqw|ueiI@VcrUeHKQ6Kj0f#r_~ zdZ5OB4{L~6m^7RWJQR&wZNSf&CKx+BNMQeb!ewK%(&1ad@Qmmme7K2CKM4HP5Q^If zyT4j7H`BlK>BfQ#YB9~QZ0v-Q(XBXb zE{^=EEdHWmvx++_pA12bkR{ngXvAvW5@n_Ew~V{KdRR4Ocvv(Y(5j7?r2LsuCHPio zS=Z}vxfQY{al|V1xfjrY7B8^@u?N$6`CQrXTic?{cZt8#PW&B|5jMELfCwK|aoaqd9aPyR|K&;PY zDNi^@EvTaMbUDq-O0e>`#yl_u5tV@Li=Bjzpb=RNu0EHl8|=d>QlCB9sDoeiN9MY3 zqo>xE;u-V)tCdTVQwChcy!xCJ~(-+INg{!5?7RC|ms&5c$q za)M99t*N`MKP+>;=gyk8CQ}yM*wc1 zdT}>YG16!Dp~`mlqc5#bPp-y%BGI9z#8;qoh>sQqnA z)2)PDeqhmA?cm(oftSt#a3qIFN1on5A?7`|`-qAi+n?rirS7@WpLoQmOF*5(Jq@3V zV}Jl3A%@_3_mwI{(F49@1)n68+~ zl*oTOvF|KyGwQ=WY4gZwlZ)8_-@|8#zZG>b-V*A9$Nc-k7DX>g1TKS$9J@m;1!ET4 z4dYQObO2r1Eg}Z^iQ|bi2vw{HPYt z-5`~V=mCt@q|(q*k&Eat^a*7eg?_MfYDXYn^1(5c)>~hgT1hoUnVODKY%~ogSQ6U4 z6k+kr8%~3t^v}WgmGk`1`sZ1&1T_KAtJ#3A9Q=9>S%QKsi*3NETsB|h0`sL681v^- z<9M@`>Z~5rF$}?QhZj%JICHuhZn5LfMZ?`sVI6#03uwOp<}{P#ZNO((&azne5o%BE J1F_Xt{|}s>Ld^gG literal 0 HcmV?d00001 diff --git a/data/flowUngauged.rda b/data/flowUngauged.rda new file mode 100644 index 0000000000000000000000000000000000000000..77c7e2f0001b6f320b3d091d54de3cc0eea71931 GIT binary patch literal 42468 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 literal 0 HcmV?d00001 diff --git a/man/Amax.Rd b/man/Amax.Rd new file mode 100644 index 0000000..27558a8 --- /dev/null +++ b/man/Amax.Rd @@ -0,0 +1,56 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/rfa_amax.R +\name{Amax} +\alias{Amax} +\alias{dAmax} +\alias{pAmax} +\alias{qAmax} +\alias{rAmax} +\alias{lAmax} +\title{Basic probability functions for distribution of annual maximums} +\usage{ +dAmax(x, para, distr, log = FALSE) + +pAmax(q, para, distr) + +qAmax(p, para, distr) + +rAmax(n, para, distr) + +lAmax(l, distr, ...) +} +\arguments{ +\item{x, q}{Vector of quantiles.} + +\item{para}{Vector of parameters for the given distribution.} + +\item{distr}{Distribution family. See \link{lmom2par}.} + +\item{log}{Logical. If TRUE, probabilities \code{p} are given as +\code{log(p)}.} + +\item{p}{Vector of probabilities.} + +\item{n}{Number of observations.} +} +\description{ +Density, distribution function, quantile function and random generation +for various distribution used in the modeling annual maximums. +} +\examples{ + +u <- runif(5) +u +x <- qAmax(u, c(100,3,.001), 'gno') +pAmax(x, c(100,3,.001), 'gno') + +x <- rAmax(100, c(100,30,0), 'gev') +sum(dAmax(x, c(100,30, 0), 'gev', log = TRUE)) + +lAmax(c(100, .3, .2), 'gev', lscale = F) + + +} +\author{ +Martin Durocher +} diff --git a/man/CvRoi.Rd b/man/CvRoi.Rd new file mode 100644 index 0000000..d01ae62 --- /dev/null +++ b/man/CvRoi.Rd @@ -0,0 +1,103 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/rfa_CvRoi.R +\name{CvRoi} +\alias{CvRoi} +\alias{head.roicv} +\alias{plot.roicv} +\title{Cross-validation using region of influence and kriging} +\usage{ +CvRoi(x, nk, phy, similarity, kriging = NULL, ker = TRUE, + model = "Exp", fold = 5, verbose = TRUE) + +\method{head}{roicv}(obj, crit = "mad") + +\method{plot}{roicv}(obj, crit = "mad", best.col = "red", + best.pch = 16, best.cex = 1, ...) +} +\arguments{ +\item{x}{Data.} + +\item{nk}{List of neighborhood sizes to try.} + +\item{phy}{Formula defining the physical descriptors.} + +\item{similarity}{Formula defining the covariates used +to evaluate the similarity between site, i.e. Euclidean distance to +the target.} + +\item{kriging}{Formula defining the spatial covariates. +Necessary for predicting residuals using spatial correlation.} + +\item{ker}{Should a (Epanechnikov) kernel be used in to weight +local regression model. Otherwise uniform weight are used.} + +\item{model}{Variogram model. See \link[gstat]{vgm}.} + +\item{verbose}{Logical. Should a progress bar be displayed.} + +\item{crit}{Cross-validation criteria used to evaluate the best choice.} + +\item{best.col, best.pch, best.cex}{Argument for the point indication the best +choice.} + +\item{...}{More arguments to pass to the plot function (\link{par}).} + +\item{kfold}{Number of group used in the cross-validation scheme. +Can also be a vector defining the group for each site.} +} +\description{ +Return a matrix of criteria evaluated by using region of +influence (ROI) and kriging. It includes: Root mean square error +(\code{rmse}), relative RMSE (\code{rrmse}), Nash-Sutcliffe (\code{nsh}), +Mean absolute deviation (\code{mad}), relative MAD (\code{rmad}) and +the skill score based on MAD (\code{smad}). +The latter \code{smad} has the same form as \code{nsh} except that +absolute error are taken instead of square error. +} +\examples{ + +attach(flowUngauged) + +## Using multidimensional scaling for projecting coordinates +coord <- cbind(lon,lat) +coord <- cmdscale(GeoDist(coord)) +colnames(coord) <- c('lon','lat') + +## Transform data if necessary +xdf <- data.frame(y = log(l1), + area = scale(log(area)), + wb = scale(log(wb)), + stream = scale(log(stream)), + map = scale(log(map)), + coord) + + ## select a validation and training set + set.seed(9382) + vid <- runif(nrow(xdf)) > .8 + tid <- !vid + + # formula of the relationship between flood quantile and descriptors + fphy <- y ~ area + map + wb + stream + fsimilarity <- ~ area + map + + ## Perform cross-validation. + system.time(out <- CvRoi(x = xdf, nk = seq(20,150, 10), fold = 5, + phy = fphy, similarity = fsimilarity, model = 'Exp', + nmax = 20)) + + head(out, 'nsh') + plot(out, 'mad') + +} +\references{ +Martin Durocher, Donald H. Burn, Shabnam Mostofi Zadeh & Fahim Ashkar (2019) + Estimating flood quantiles at ungauged sites using nonparametric regression + methods with spatial components, Hydrological Sciences Journal, 64:9, + 1056-1070, https://doi.org/10.1080/02626667.2019.1620952 +} +\seealso{ +\link{FitRoi} +} +\author{ +Martin Durocher +} diff --git a/man/DataWide.Rd b/man/DataWide.Rd new file mode 100644 index 0000000..9be953c --- /dev/null +++ b/man/DataWide.Rd @@ -0,0 +1,48 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/rfa_DataWide.R +\name{DataWide} +\alias{DataWide} +\alias{DataWide.data.frame} +\alias{DataWide.formula} +\alias{DataWide.matrix} +\title{Transpose dataset to a wide format} +\usage{ +DataWide(x, ...) + +\method{DataWide}{data.frame}(x, order.time = TRUE, order.site = FALSE) + +\method{DataWide}{formula}(form, x, ...) + +\method{DataWide}{matrix}(x, ...) +} +\arguments{ +\item{x}{Dataset in long format. First column should be the value +to transpose. +The second and third columns are respectively site and time variable. +If the time variable is omitted, the pivot will ignore it and all columns +will start at the first position.} + +\item{form}{Formula that specifies the site and time variable. +Must have the form: `value ~ site + time`.} +} +\description{ +Return a matrix where columns correspond to data. + Each row represent a specific time and missing values are added where need. + The pivoted variable should be a numerical value. +} +\examples{ + +data(flowAtlantic) +xd <- flowAtlantic$ams + +## transpose by year +xd$year <- format(xd$date, '\%Y') +DataWide(ams ~ id + year, xd)[60:70,1:5] + +## Without time +DataWide(ams ~ id, xd)[1:6,1:5] + +} +\author{ +Martin Durocher +} diff --git a/man/DistSeason.Rd b/man/DistSeason.Rd new file mode 100644 index 0000000..4ebc7a0 --- /dev/null +++ b/man/DistSeason.Rd @@ -0,0 +1,47 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/rfa_DistSeason.R +\name{DistSeason} +\alias{DistSeason} +\alias{DistSeason.data.frame} +\alias{DistSeason.formula} +\title{Distance in seasonal space} +\usage{ +DistSeason(x, ...) + +\method{DistSeason}{data.frame}(x, w = 1/pi) + +\method{DistSeason}{formula}(form, x, w = 1/pi) +} +\arguments{ +\item{w}{Weight to favor angle over radius. +By default it is 1/pi, which bring angle in the interval [0,1].} + +\item{form, x}{Formula and dataset providing the coordinates of the +seasonal space. Must be of the form `radius ~ angle`.} + +\item{r, a}{Coordinates in the seasonal space: radius `r` and angle `a`.} +} +\description{ +Return a matrix of distances between points in the seasonal space that +characterizes timing and regularity. +It is equivalent to Euclidean distance applied to regularity (radius) +and timing (angle) separately. +} +\examples{ + +scoord <- data.frame(radius = runif(5), + angle = runif(5,0,2*pi)) + +DistSeason(scoord) +DistSeason(radius ~ angle , scoord) + + +} +\references{ +Durocher, M., Burn, D. H., & Ashkar, F. (2019). Comparison of estimation + methods for a nonstationary index-flood model in flood frequency + analysis using peaks over threshold. https://doi.org/10.31223/osf.io/rnepc +} +\author{ +Martin Durocher +} diff --git a/man/ExtractAmax.Rd b/man/ExtractAmax.Rd new file mode 100644 index 0000000..5bf620c --- /dev/null +++ b/man/ExtractAmax.Rd @@ -0,0 +1,40 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/rfa_ExtractAmax.R +\name{ExtractAmax} +\alias{ExtractAmax} +\alias{ExtractAmax.formula} +\alias{ExtractAmax.default} +\title{Extracts the annual maximums of a daily time series} +\usage{ +ExtractAmax(x, ...) + +\method{ExtractAmax}{formula}(form, x, tol = 0, ...) + +\method{ExtractAmax}{default}(x, tol = 0, nlab = "n", ylab = "yy") +} +\arguments{ +\item{x}{Data. If no formula is passed, the first column must be the +value and the second the date.} + +\item{form}{Formula of the form \code{value ~ date} that specifies the +variable from which the annual maximums are extracted and a date variable.} + +\item{tol}{Filter the years having less than \code{tol} days.} + +\item{nlab, ylab}{Names for the added columns representing respectively +the number of yearly observations and the year. +If set to NULL the given column is not added.} +} +\description{ +Returns a dataset containing the annual maximums, +the date and the number of observations during the year. +} +\examples{ + +out <- ExtractAmax(flow ~ date, flowStJohn, tol = 350) +head(out) + +} +\author{ +Martin Durocher +} diff --git a/man/FindNearest.Rd b/man/FindNearest.Rd new file mode 100644 index 0000000..2c394e4 --- /dev/null +++ b/man/FindNearest.Rd @@ -0,0 +1,75 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/rfa_FindNearest.R +\name{FindNearest} +\alias{FindNearest} +\title{Find the nearest sites} +\usage{ +FindNearest(x, distance, n, super.distance = NULL, super.n = NULL, + row = FALSE) +} +\arguments{ +\item{x}{Dataset with sites in columns and time in row.} + +\item{distance}{Distances with the target.} + +\item{n}{Number of sites to keep.} + +\item{super.distance, super.n}{Distance and number of sites for the super +region. This allows to pre-filter sites according to a complementary +measure of similarity.} + +\item{row}{Logical. Should only the row of the nearest site be kept. +Must be used with correlation or square matrix.} +} +\description{ +Return a dataset including only the nearest site to a target. +The target has a zero distance and will be at the first column of the output. +} +\section{References}{ + + +Mostofi Zadeh, S., Burn, D.H., 2019. A Super Region Approach to Improve + Pooled Flood Frequency Analysis. Canadian Water Resources Journal + 0, 1–14. https://doi.org/10.1080/07011784.2018.1548946 + +Durocher, M., Burn, D.H., Mostofi Zadeh, S., 2018. A nationwide regional + flood frequency analysis at ungauged sites using ROI/GLS with copulas and + super regions. Journal of Hydrology 567, 191–202. + https://doi.org/10.1016/j.jhydrol.2018.10.011 +} + +\examples{ + +## Organize data in the proper format +attach(flowAtlantic) +ams$year <- format(ams$date, '\%Y') +xmat <- DataWide(ams ~ id + year, ams) +dim(xmat) + +## Find the nearest neirghbors using great-circle distance. +## Note that it is a good habit to make sure that the column names matches + +h <- GeoDist(info[colnames(xmat), c('lon','lat')]) +xmat0 <- FindNearest(xmat, h[1,], 5) +dim(xmat0) + +## Distance based on catchment characteristics +charac <- scale(log(info[,c('area','map')])) +h.super <- as.matrix(dist(charac)) + +## Find among the 20 sites with the ones with the most similar +## characteristics and keep the 5 nearest neighbors of the target. +xmat0 <- FindNearest(xmat, h[1,], 5, h.super[1,], 20) +dim(xmat0) + +## subsample a distance or correlation matrix +xmat0 <- FindNearest(h, h[1,], 5, row = TRUE) +dim(xmat0) + +} +\seealso{ +\link{DataWide} +} +\author{ +Martin Durocher +} diff --git a/man/FindThresh.Rd b/man/FindThresh.Rd new file mode 100644 index 0000000..1d47d05 --- /dev/null +++ b/man/FindThresh.Rd @@ -0,0 +1,93 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/rfa_FindThresh.R +\name{FindThresh} +\alias{FindThresh} +\title{Find automatically a best threshold} +\usage{ +FindThresh(x, method = "sgn", tol.sgn = 0.25, tol.ppy = 2, + qua = "q10", tol.qua = Inf, ppy = c(0, Inf)) +} +\arguments{ +\item{x}{output form \link{SearchThresh}.} + +\item{method}{Method to identify the threshold. Must be one of +\code{sgn}, \code{sgn-max}, \code{sgn-ppy}, \code{max} or \code{ppy}.} + +\item{tol.sgn}{Selection criteria associated with a given p-value of +the Anderson-Darling test.} + +\item{tol.ppy}{Selection criteria associated with a given average of +peaks per year.} + +\item{qua}{Flood quantiles. Must be one of \code{'q2'}, \code{'q5'}, +\code{'q10'}, \code{'q20'}, \code{'q50'} or \code{'q100'}.} + +\item{tol.qua}{Selection criteria associated with a flood quantile.} + +\item{ppy}{Range of accepted averages of peaks per year.} +} +\description{ +The function \code{Findthresh} can be used to identify the best +threshold according to a specific rules. +} +\details{ +The method \code{sgn} find the first threshold that has a p-value over a +given value (\code{tol.sgn}) of the Anderson-Darling test, while \code{max} +find the maximum p-value. +The \code{ppy} method find the threshold that has the nearest average of +peaks per year to \code{tol.ppy}. +The method \code{sgn-max} find the thresholds associated with both methods +and return the lowest one. +The method \code{sgn-ppy} try first to find the \code{sgn} threshold. +If not threshold meets the required p-value, the \code{ppy} threshold is +returned. + +The criteria \code{ppy}, initially filter all the candidates thresholds that +are not found in a given interval of average peaks per year. +With the \code{sgn} method an additional condition associated to a flood +quantile \code{qua} can be specified. +It imposes that the relative discrepancies between the candidate threshold +and a reference is respected in addition to the criteria with the p-value. +This reference is the average of the flood quantiles of the 5 lowest +candidate thresholds in the set of candidates. +Normally, lower thresholds should have reached stability and their choice can +be controlled by the argument \code{ppy}. +} +\examples{ + +## Create list of candidate threshold +lstu <- which.floodPeaks(flow~date, flowStJohn, u =500, r = 14) +lstu <- sort(unique(flowStJohn[lstu,'flow'])) +lstu <- lstu[seq(1,length(lstu)-30,2)] + +out <- SearchThresh(flow~date, flowStJohn, u = lstu, declust = 'wrc', r = 14) + +cid <- c('u','ppy','ad') +FindThresh(out, method = 'sgn', tol.sgn = 0.25)[,cid] +FindThresh(out, method = 'ppy', tol.ppy = 2)[,cid] +FindThresh(out, method = 'max')[,cid] + +## Make find the first threshold that have at-least p-value > 0.1 +## and relative descripencies between Q100 of less than 20\%. +## Otherwise the ppy threshold is chosen. +## Note here that sgn is chosen because the flood quantile stabilizes +## quickly. +FindThresh(out, method = 'sgn-ppy', tol.sgn = 0.25, tol.ppy = 1.5, + ppy = c(1,3), qua = 'q10', tol.qua = 0.2)[,cid] + + +} +\references{ +Durocher, M., Zadeh, S. M., Burn, D. H., & Ashkar, F. (2018). Comparison of + automatic procedures for selecting flood peaks over threshold based on + goodness-of-fit tests. Hydrological Processes, 0(0). + https://doi.org/10.1002/hyp.13223 + +Solari, S., Eguen, M., Polo, M. J., & Losada, M. A. (2017). Peaks Over + Threshold (POT): A methodology for automatic threshold estimation using + goodness of fit p-value. Water Resources Research, 53(4), 2833-2849. + https://doi.org/10.1002/2016WR019426 +} +\author{ +Martin Durocher +} diff --git a/man/FitAmax.Rd b/man/FitAmax.Rd new file mode 100644 index 0000000..6f45196 --- /dev/null +++ b/man/FitAmax.Rd @@ -0,0 +1,83 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/rfa_FitAmax.R +\name{FitAmax} +\alias{FitAmax} +\title{At-site frequency analysis using annual maximums} +\usage{ +FitAmax(x, distr = c("gev", "gno", "pe3", "glo"), ..., tol.gev = 0) +} +\arguments{ +\item{x}{Data.} + +\item{distr}{Distribution to fit. See \code{\link{Amax}} for the list +of available distribution.} + +\item{method}{Estimation method. +Either maximum likelihood ('mle') or L-moments ('lmom').} + +\item{varcov}{Should the variance-covariance matrix of the parameters +be computed. For \code{mle} the covariance matrix is derived from the +hessian matrix. For L-moments, non-parametric bootstrap is used.} + +\item{nsim}{Number of simulations used to evaluate the covariance matrix +when using L-moment estimator.} +} +\value{ +\item{data}{Data Values.} +\item{lmom}{L-moments.} +\item{para}{Parameter estimates.} +\item{varcov}{Covariance matrix of the parameter} +\item{llik}{Value of the log-likelihood} +} +\description{ +Return a fitting of a distribution, normally representing annual maximums. +Both maximum likelihood and L-moments estimation methods are available. +If the maximum likelihood is used and fails, the L-moments solution +will be returned with a warning message is issued. +When more than one distribution is passed. The +best distribution is selected automatically according to the AIC criteria. +} +\section{References}{ + + +Coles, S. (2001). An introduction to statistical + modeling of extreme values. Springer Verlag. + +Hosking, J. R. M., & Wallis, J. R. (1997). Regional frequency analysis: + an approach based on L-moments. Cambridge Univ Pr. +} + +\examples{ + +## Extract a time series of annual maxima +x <- ExtractAmax(flow~date, flowStJohn)$flow + +## Fitting of GEV distribution using L-moments + +fit <- FitAmax(x,'gev') +print(fit) +coef(fit) +AIC(fit) +fit$lmom + +## The evaluation of the variance-covariance matrix can be turn down +fit <- FitAmax(x,'gev', varcov = FALSE) + +## Using Maximum likelihood +fit <- FitAmax(x,'gev', method ='mle') +print(fit) +vcov(fit) + +## Standard deviation of the parameter +sqrt(diag(vcov(fit))) + +## Chose the best distribution according to AIC +FitAmax(x, distr = c('gev','glo','gno','pe3'), method = 'mle') + +} +\seealso{ +\link{predict.amax}, \link{gofTest}, \link{plot.amax}. +} +\author{ +Martin Durocher +} diff --git a/man/FitGev.Rd b/man/FitGev.Rd new file mode 100644 index 0000000..f3140d5 --- /dev/null +++ b/man/FitGev.Rd @@ -0,0 +1,70 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/rfa_FitGev.R +\name{FitGev} +\alias{FitGev} +\title{Fit Generalized Extreme Value (GEV) distribution using Generalized +maximum likelihood} +\usage{ +FitGev(x, varcov = TRUE, mu = -0.1, sig2 = 0.015, + method.optim = "BFGS", ...) +} +\arguments{ +\item{x}{Data.} + +\item{varcov}{Logical. Should the covariance matrix be returned.} + +\item{mu, sig2}{Mean and variance of the Beta prior.} + +\item{method.optim}{Optimisation method used by \code{\link{optim}}} + +\item{...}{Other parameter pass to \code{\link{optim}}} +} +\description{ +Fit a GEV distribution on annual maxima using the generalized +maximum likelihood method with Beta prior. +The output is of the class \code{amax}. See \link{FitAmax}. +Asymptotic result are computed like the maximum likelihood approach. +} +\section{References}{ + + +Martins, E.S., Stedinger, J.R., 2000. Generalized maximum-likelihood +generalized extreme-value quantile estimators for hydrologic data. +Water Resour. Res. 36, 737–744. https://doi.org/10.1029/1999WR900330 +} + +\examples{ + +x <- ExtractAmax(flow~date, flowStJohn)$flow + +## Using the default physiographic prior. +fit <- FitGev(x) +print(fit) +coef(fit) +vcov(fit) +predict(fit, ci = 'delta') + +## A uniform prior on interlval -0.5 to 0.5 can be used to approximate +## the maximum likelihood estimate. + +AIC(FitAmax(x, distr = 'gev', method ='mle')) +AIC(FitGev(x, mu = 0, sig2 = 1/12)) + +## A regional study can be performed by using an empirical prior +## Here 20 sites with the same GEV distribution are simulated +## without priors. +## Then a regional estimate is obtained using an empirical prior + +xmat <- replicate(20, rAmax(20, c(100,3, -.1), 'gev') ) +flist <- apply(xmat,2, FitAmax, distr = 'gev', varcov = FALSE) +pmat <- sapply(flist, getElement,'para') + +kap0 <- pmin(.5,pmax(-.5,pmat[3,])) + +FitGev(xmat[,1], mu = mean(kap0), sig2 = var(kap0)) +FitAmax(xmat[,1], distr = 'gev', method = 'mle') + +} +\author{ +Martin Durocher +} diff --git a/man/FitPot.Rd b/man/FitPot.Rd new file mode 100644 index 0000000..4e4a3b9 --- /dev/null +++ b/man/FitPot.Rd @@ -0,0 +1,117 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/rfa_FitPot.R +\name{FitPot} +\alias{FitPot} +\alias{FitPot.data.frame} +\alias{FitPot.matrix} +\alias{FitPot.formula} +\alias{FitPot.numeric} +\alias{coef.fpot} +\alias{vcov.fpot} +\alias{print.fpot} +\alias{logLik.fpot} +\alias{AIC.fpot} +\title{Peak over threshold (POT)} +\usage{ +FitPot(x, ...) + +\method{FitPot}{data.frame}(obj, ...) + +\method{FitPot}{matrix}(obj, ...) + +\method{FitPot}{formula}(form, x, ...) + +\method{FitPot}{numeric}(x, dt = NULL, u = 0, method = "mle", + declust = "none", r = 1, rlow = 0.75, nsim = 1000, + varcov = TRUE, unit = 365.25) + +\method{coef}{fpot}(obj, rate = FALSE, ci = FALSE, alpha = 0.05) + +\method{vcov}{fpot}(obj, rate = FALSE) + +\method{print}{fpot}(obj) + +\method{logLik}{fpot}(obj) + +\method{AIC}{fpot}(obj, k = 2) +} +\arguments{ +\item{x, form}{Dataset. If a matrix or data.frame is passed as argument the +first column must be the time and the second the values. A formula can be +used to specify which variables of a data.frame to use. In this case, it +must have the form \code{value~time}.} + +\item{dt}{Date or time of observation.} + +\item{u}{Threshold.} + +\item{method}{Estimation method. Either \code{'lmom'}, \code{'mle'} or +\code{'mle2'}.} + +\item{declust}{If necessary, declustering method. +Either \code{'run'} or \code{'wrc'}.} + +\item{r}{Lag parameter for declustering. Either the running length between clusters +or the minimum separating time between two flood Peaks. +The scale must coincide with the observation date \code{dt}.} + +\item{rlow}{For WRC, recession level between two flood peaks in percentages.} + +\item{nsim}{Number of bootstrap samples.} + +\item{unit}{Length of cycle. Data are normaly years and \code{unit} = 365.25. +Can be change to 12 or 52 for daily and weekly data.} + +\item{ci}{For \code{'coef'} should confidence interval be returned. +For \code{'predict'}, method used to compute confidence intervals. +Either \code{'profile'}, \code{'delta'} or \code{'boot'}.} + +\item{se}{Should the standard error or the confidence interval be returned.} +} +\description{ +Fit the parameters of a thresholding model using Generalized Pareto +distribution (GPA). Include declustering techniques. +} +\details{ +The access functions \code{coef} and \code{vcov} return respectively the +parameters and the variance-covariance matrix of the POT model. For the L-moment +method the covariance matrix is using bootstraps. +The access function \code{predict} evaluates flood quantiles. +If \code{dt} is a Date the return period is computed in years using the range +of observation. +} +\section{References}{ + + +Coles S. (2001) An introduction to statistical modeling of extreme values. + Springer Verlag. + +Davison AC, Smith RL. (1990) Models for Exceedances over High Thresholds. + Journal of the Royal Statistical Society Series B (Methodological). + 52(3), 393-442. +} + +\examples{ + +xd <- rgpa(100, 1, -.2) +fit <- FitPot(xd, u = 0) + +print(fit) +vcov(fit) +predict(fit) +coef(fit, ci = TRUE) + +fit <- FitPot(flow~date, flowStJohn, u = 1000, + declust = 'wrc', r = 14) + +print(fit) +plot(flow~date,flowStJohn, type = 'l') +points(fit$time,fit$excess+fit$u, col = 2, pch = 16) +abline(h=1000, col = 3, lwd = 2) + +predict(fit, se = TRUE, ci = 'delta') + +} +\seealso{ +\link{which.floodPeaks}, \link{which.clusters}, \link{PlotMrl}. +} diff --git a/man/FitRegLmom.Rd b/man/FitRegLmom.Rd new file mode 100644 index 0000000..fdc849c --- /dev/null +++ b/man/FitRegLmom.Rd @@ -0,0 +1,99 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/rfa_FitRegLmom.R +\name{FitRegLmom} +\alias{FitRegLmom} +\alias{coef.reglmom} +\alias{print.reglmom} +\alias{plot.reglmom} +\alias{sitenames} +\title{Fitting an index-flood model} +\usage{ +FitRegLmom(x, distr = NULL, type = "amax", diagnostic = FALSE, + diagnostic.nsim = 1000, nmom = 4) + +\method{coef}{reglmom}(obj, distr = NULL) + +\method{print}{reglmom}(obj) + +\method{plot}{reglmom}(obj) + +sitenames(obj) +} +\arguments{ +\item{x}{Dataset with sites in columns and time in rows.} + +\item{distr}{Regional distribution. See \link{Amax}. +If \code{NULL} an automatic selection is performed.} + +\item{type}{Type of input data. Either annual maximums (\code{'amax'}) or +peaks over threshold (\code{'pot'}).} + +\item{diagnostic}{Should the homogeneity (H) and goodness of fit +(Z-score) be evaluated.} + +\item{diagnostic.nsim}{Number of simulations used to evaluate the +diagnostic statistics.} + +\item{nmon}{Number of L-moments to evaluate.} +} +\value{ +\describe{ + \item{type}{Type of input data} + \item{distr}{Regional distribution} + \item{para}{Parameters of the regional distribution} + \item{lmom}{At-site L-moments.} + \item{rlmom}{Regional L-moments.} + \item{nrec}{Record lengths.} + \item{stat}{Homogenous criteria and Z-score for goodness-of-fit.} + \item{discord}{Discordance measures.} +} +} +\description{ +Returns the at-site L-moments, regional L-moments and the parameters of +the regional growth curve for an index-flood model. +If required, the homogeneity and goodness-of-fit measures are included. +The function can be used for analyzing both annual maximums and peaks over +threshold. +} +\details{ +The function \code{coef} return the parameter of the at-site distributions +estimated L-moments. The function \code{plot} will present a L-moment ratio +diagram. +} +\section{References}{ + + +Hosking, J. R. M., & Wallis, J. R. (1997). Regional frequency analysis: + an approach based on L-moments. Cambridge Univ Pr. + +Mostofi Zadeh, S., Burn, D.H. (2019). A Super Region Approach to Improve + Pooled Flood Frequency Analysis. Canadian Water Resources Journal + 0, 1-14. https://doi.org/10.1080/07011784.2018.1548946 + +Mostofi Zadeh, S., Durocher, M., Burn, D.H., Ashkar, F., 2019. + Pooled flood frequency analysis: a comparison based on peaks-over-threshold + and annual maximum series. Hydrological Sciences Journal 0, null. + https://doi.org/10.1080/02626667.2019.1577556 +} + +\examples{ + +data(flowAtlantic) +xd <- cbind(flowAtlantic$ams, + year = format(flowAtlantic$ams$date, '\%Y')) + +xmat <- DataWide(ams ~ id + year, xd) + +fit <- FitRegLmom(xmat) +print(fit) +plot(fit) +coef(fit, 'pe3') + + +} +\seealso{ +\link{predict.reglmom}, \link{PoolRemove}. +} +\author{ +Martin Durocher +} diff --git a/man/FitRoi.Rd b/man/FitRoi.Rd new file mode 100644 index 0000000..960322e --- /dev/null +++ b/man/FitRoi.Rd @@ -0,0 +1,121 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/rfa_FitRoi.R +\name{FitRoi} +\alias{FitRoi} +\alias{print.roi} +\alias{predict.roi} +\alias{residuals.roi} +\title{Prediction at ungauged sites using region of influence and kriging} +\usage{ +FitRoi(x, xnew, nk, phy, similarity, kriging = NULL, model = "Exp", + ker = TRUE, se = FALSE) + +\method{print}{roi}(obj) + +\method{predict}{roi}(obj, x, fold = 5) + +\method{residuals}{roi}(obj, x, fold = 5) +} +\arguments{ +\item{x}{Data for training the model.} + +\item{xnew}{Data at new locations (Validation set).} + +\item{nk}{Number of sites in the neighborhoods. If \code{nk} is a list, the +first element represents a vector of the neighborhood size for all sites +used for training. The second element .} + +\item{phy}{Formula defining the physical descriptors.} + +\item{similarity}{Formula defining the covariates used +to evaluate the similarity between site, i.e. Euclidean distance +to the target.} + +\item{kriging}{Formula defining the spatial covariates. +Necessary for predicting residuals using spatial correlation.} + +\item{model}{Variogram model. See \link[gstat]{vgm}} + +\item{ker}{Should a (Epanechnikov) kernel be used in to weight +local regression model. Otherwise uniform weights are used.} + +\item{se}{Logical. Should the standard error be returned.} + +\item{fold}{Number of group or group used to perform cross-validation.} +} +\value{ +\item{pred}{Prediction at new sites.} +\item{pred.se}{Standard deviation at new sites.} +\item{phy}{Part of the prediction attributed to physical descriptor.} +\item{phy.se}{Standard deviation associated with the physical descriptor.} +\item{fitted}{Fitted values (training sites).} +\item{fitted.se}{Standard deviation of the fitted values.} +\item{vgm}{Sample variogram.} +\item{model}{Fitted variogram model.} +} +\description{ +Return the prediction of a local regression model using region of +influence (ROI) where the residuals are further predicted +by kriging. +} +\examples{ + +data(flowUngauged) + +## Using multidimensional scaling for projecting coordinates +coord <- cbind(lon,lat) +coord <- cmdscale(GeoDist(coord)) +colnames(coord) <- c('lon','lat') + + + +## Transform data if necessary +xdf <- data.frame(y = l1, + area = scale(log(area)), + wb = scale(log(wb)), + stream = scale(log(stream)), + map = scale(log(map)), + coord) + + ## select a validation and training set + set.seed(9382) + vid <- runif(nrow(xdf)) > .8 + tid <- !vid + + # formula of the relationship between flood quantile and descriptors + fphy <- log(y) ~ area + map + poly(wb,3) + poly(stream,3) + fsimilarity <- ~ area + map + + ## Fit a local regression model + fit <- FitRoi(x = xdf[tid,], xnew = xdf[vid,], nk = 60, + phy = fphy, similarity = fsimilarity) + print(fit) + response <- log(xdf[vid,'y']) + sd(response - fit$pred) + + ## Refit the model and perform the kriging of the residuals + fitk <- FitRoi(x = xdf[tid,], + xnew = xdf[vid, ], + nk = 60, + phy = fphy, + similarity = fsimilarity , + model = 'Exp', + kriging = ~ lon + lat) + + print(fitk) + sd(response - fitk$phy) + sd(response - fitk$pred) + +} +\references{ +Martin Durocher, Donald H. Burn, Shabnam Mostofi Zadeh & Fahim Ashkar (2019) + Estimating flood quantiles at ungauged sites using nonparametric regression + methods with spatial components, Hydrological Sciences Journal, 64:9, + 1056-1070, https://doi.org/10.1080/02626667.2019.1620952 +} +\seealso{ +\code{\link{CvRoi}}, \code{\link[gstat]{krige}}, \code{\link{lm}} +} +\author{ +Martin Durocher +} diff --git a/man/GPA.Rd b/man/GPA.Rd new file mode 100644 index 0000000..e7378ed --- /dev/null +++ b/man/GPA.Rd @@ -0,0 +1,63 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/rfa_gpa.R +\name{GPA} +\alias{GPA} +\alias{pgpa} +\alias{rgpa} +\alias{dgpa} +\alias{qgpa} +\title{Generalized Pareto distribution (GPA)} +\usage{ +pgpa(q, alpha = 1, kap = 0, lower.tail = TRUE) + +rgpa(n, alpha = 1, kap = 0) + +dgpa(x, alpha = 1, kap = 0, log = FALSE) + +qgpa(p, alpha = 1, kap = 0, lower.tail = TRUE) +} +\arguments{ +\item{alpha}{Scale parameter of the GPA} + +\item{kap}{Shape parameter of the GPA} + +\item{lower.tail}{Should the propability of the lower tail be returned} + +\item{n}{Number of simulations.} + +\item{log}{Should the log-density be returned} + +\item{p, q}{Probabilities or quantiles for the GPA distribution.} +} +\description{ +Distribution, density, quantile and random function for the Generalized +pareto distriution. +} +\examples{ + +kap <- -.2 +a <- 1 +xd1 <- rgpa(1e4, a, kap) +xd2 <- qgpa(runif(1e4), a, kap) + +qqplot(xd1, xd2) + + +tt <- seq(0.001,6, len = 100) + +hist(xd1[xd1<6], main = 'GPA distribution', + freq = FALSE, ylim =c(0,1), xlim = c(0,6)) + +lines(tt, dgpa(tt,a,kap)) +lines(tt,pgpa(sort(tt), a, kap), col = 2, lty = 2) + + +} +\references{ +Davison, A. C., & Smith, R. L. (1990). Models for Exceedances over High +Thresholds. Journal of the Royal Statistical Society. Series B +(Methodological), 52(3), 393-442. http://www.jstor.org/stable/2345667 +} +\author{ +Martin Durocher +} diff --git a/man/GeoDist.Rd b/man/GeoDist.Rd new file mode 100644 index 0000000..b3760f6 --- /dev/null +++ b/man/GeoDist.Rd @@ -0,0 +1,37 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/rfa_GeoDist.R +\name{GeoDist} +\alias{GeoDist} +\alias{GeoDist.default} +\alias{GeoDist.formula} +\title{Great-circle distance} +\usage{ +GeoDist(x, ...) + +\method{GeoDist}{default}(x, earth.radius = 6371) + +\method{GeoDist}{formula}(form, x, ...) +} +\arguments{ +\item{x}{Dateset of coordinates (lon,lat).} + +\item{earth.radius}{Radius of the earth. Default 6371 km.} + +\item{form}{Formula to identify coordinates in a dataset. +Must be of the form : \code{lon~lat}.} +} +\description{ +Returns the distance matrix of the great-circle distance between all pairs + of sites. +} +\examples{ + +attach(flowAtlantic) + +GeoDist(lon~lat, flowAtlantic$info)[1:5,1:5] + + +} +\author{ +Martin Durocher +} diff --git a/man/GofTest.Rd b/man/GofTest.Rd new file mode 100644 index 0000000..135815f --- /dev/null +++ b/man/GofTest.Rd @@ -0,0 +1,69 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/rfa_GofTest.R +\name{GofTest} +\alias{GofTest} +\alias{GofTest.amax} +\alias{GofTest.fpot} +\title{Goodness-of-fit test} +\usage{ +GofTest(x, ...) + +\method{GofTest}{amax}(obj, method = "ad", nsim = 1000, ...) + +\method{GofTest}{fpot}(obj, method = "adtab", nsim = 1000) +} +\arguments{ +\item{obj}{Output from \code{\link{FitAmax}} or \code{\link{FitPot}}.} + +\item{method}{Test to be performed. Either Anderson-Darling \code{ad}, +or modified Shapiro-Wilk ('shapiro'). +For a POT model, the method \code{adtab} +perform the Anderson-Darling test and interpolates the +p-value from a table.} +} +\description{ +Return the statistic and p-value of a goodness-of-fit test on +AMAX and POT models. The null hypothesis (composite) +is that the data were generated by the fitted distribution. +} +\section{References}{ + + + Choulakian, V., Stephens, M.A., 2001. Goodness-of-Fit Tests for the + Generalized Pareto Distribution. Technometrics 43, 478-484. + https://doi.org/10.2307/1270819 + + Heo, J.-H., Shin, H., Nam, W., Om, J., Jeong, C., 2013. Approximation of + modified Anderson–Darling test statistics for extreme value distributions + with unknown shape parameter. Journal of Hydrology 499, 41-49. + https://doi.org/10.1016/j.jhydrol.2013.06.008 + + Ba, I., Ashkar, F., 2017. Discrimination between a group of + three-parameter distributions for hydro-meteorological frequency modeling. + Can. J. Civ. Eng. 45, 351-365. https://doi.org/10.1139/cjce-2017-0416 + + Fahim Ashkar & Ba, I. (2017) Selection between the generalized Pareto + and kappa distributions in peaks-over-threshold hydrological frequency + modelling, Hydrological Sciences Journal, 62:7, 1167-1180, + http://dx.doi.org/10.1080/02626667.2017.1302089 +} + +\examples{ + +## The same simulated distribution should be accepted p-value >.05 +x <- rAmax(100, c(100,30,-.1), 'gev') + +fit <- FitAmax(x, 'gev', varcov = FALSE) +GofTest(fit, nsim = 50) ## nsim is small for speeding-up the demonstration + +## The same apply to POT model +fit <- FitPot(flow~date, flowStJohn, u = 1000, + declust = 'flood', r = 14) + +## By default a table is used with GPA using MLE +GofTest(fit) + +} +\author{ +Martin Durocher +} diff --git a/man/Intersite.Rd b/man/Intersite.Rd new file mode 100644 index 0000000..623acd4 --- /dev/null +++ b/man/Intersite.Rd @@ -0,0 +1,104 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/rfa_Intersite.R +\name{Intersite} +\alias{Intersite} +\alias{print.isite} +\alias{plot.isite} +\alias{IntersiteMdl} +\title{Estimating intersite correlation} +\usage{ +Intersite(x, method = "emp", distance = NULL, nmin = 0, + na.sub = "avg", defpos = TRUE, smooth = 1, distance.max = Inf, + start = NULL) + +\method{print}{isite}(obj) + +\method{plot}{isite}(obj, xmat, distance, xlab = NULL, ylab = NULL, + ...) + +IntersiteMdl(para, distance) +} +\arguments{ +\item{x}{Dataset in the wide format} + +\item{method}{Estimation method. Can be either \code{'emp'} for estimating +the empirical matrix or \code{'exp'} for fitting power exponential model.} + +\item{distance}{Matrix of distances. Necessary when using \code{'exp'}.} + +\item{nmin}{Minimal number of pairs necessary to compute pairwise +correlations.} + +\item{na.sub}{Value for imputing missing pairwise correlation with +\code{'emp'}.} + +\item{defpos}{Logical. Should a correction be applied to the empirical +matrix to ensure positive definiteness.} + +\item{smooth}{Smooth parameter of the power exponential model.} + +\item{distance.max}{Maximal distance to consider for paired observations +in the fitting of the power exponential model.} + +\item{start}{Initial parameter for optimization with the \code{exp} method. +It must have the form \code{(nugget, range)}.} +} +\value{ +\describe{ + \item{method}{Estimation method.} + \item{para}{Parameter of the fitted model. For \code{'emp'} it + is the average.} + + \item{corr}{Raw estimation of the correlations.} + \item{model}{Final estimate of the correlations.} + \item{rmse}{For \code{'exp'}, root mean square errors of the fitted model.} +} +} +\description{ +Return a matrix of intersite correlation between paired observations. +By default the empirical matrix is estimated and corrected to be +positive definite. +Can also be estimated by a power exponential model where the weighted least +squares approach is used with weights proportional to record lengths. +} +\section{References}{ + + +Durocher, M., Burn, D.H., Mostofi Zadeh, S., 2018. A nationwide + regional flood frequency analysis at ungauged sites using ROI/GLS with + copulas and super regions. Journal of Hydrology 567, 191-202. + https://doi.org/10.1016/j.jhydrol.2018.10.011 +} + +\examples{ + +Data(flowAtlantic) + +## Organize annual maximums +ams <- flowAtlantic$ams +ams$year <- format(ams$date, '\%Y') +xmat <- DataWide(ams ~ id + year, ams) + +## Compute distance between sites +coord <- flowAtlantic$info[, c('lon','lat')] +rownames(coord) <- flowAtlantic$info$id +h <- GeoDist(coord) + +## make sure that columns match +h <- h[colnames(xmat), colnames(xmat)] + +## estimate intersite correlation using a model +isite <- Intersite(xmat, distance = h, method = 'exp') +print(isite) +plot(isite, xmat, h) + +## Evaluate emprirical correlation matrix +isite <- Intersite(xmat[,1:5]) +print(isite) +round(isite$model,2) + + +} +\author{ +Martin Durocher +} diff --git a/man/JulianPlot.Rd b/man/JulianPlot.Rd new file mode 100644 index 0000000..6fac882 --- /dev/null +++ b/man/JulianPlot.Rd @@ -0,0 +1,33 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/rfa_JulianPlot.R +\name{JulianPlot} +\alias{JulianPlot} +\title{Plotting Julian date} +\usage{ +JulianPlot(rose.col = "gray40", rose.lwd = 1.5, rose.cex = 1.5, + rose.radius = seq(0.25, 1, 0.25), ...) +} +\arguments{ +\item{rose.col, rose.lwd, rose.cex}{Property of the polar axes.} + +\item{...}{Other parameter passed to \link{points}.} +} +\description{ +Create axis for plotting circular statistics in a unitary circle. +} +\examples{ + +data(flowAtlantic) + +ss <- SeasonStat(date ~ id, flowAtlantic$ams) + +JulianPlot() +points(y ~ x, ss, pch = 16, col = cut(ss[,'radius'], c(0,.5,.75,1))) + +} +\seealso{ +\link{SeasonStat}. +} +\author{ +Martin Durocher +} diff --git a/man/PlotMrl.Rd b/man/PlotMrl.Rd new file mode 100644 index 0000000..1e42922 --- /dev/null +++ b/man/PlotMrl.Rd @@ -0,0 +1,50 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/rfa_PlotMrl.R +\name{PlotMrl} +\alias{PlotMrl} +\title{Mean residual life plot} +\usage{ +PlotMrl(form, x, u, declust = NULL, r = 1, rlow = 0.75, + alpha = 0.05, ylab = "Mean Residual Life", xlab = "Threshold", + col = "black", lty = 1, lwd = 1, col.ci = "black", lty.ci = 3, + lwd.ci = 1, ylim = NULL, display = TRUE, ...) +} +\arguments{ +\item{form, x}{Formula and sample. The must be of the form.} + +\item{u}{Series of candidate thresholds.} + +\item{alpha}{Confidence interal with level \code{1-alpha/2}.} + +\item{display}{Logical. Should the graph be display.} + +\item{...}{Others arguments are passed to function \code{plot} and +\link{which.floodPeaks}} + +\item{method}{Estimation method.} +} +\description{ +Produce a mean residual Life plot to help selecting to help +selecting a proper threshold. +} +\details{ + +} +\examples{ + +## Find list of candidate thresholds +lstu <- seq(500,2500, len = 50) + +PlotMrl(flow~date, flowStJohn, u = lstu, declust = 'wrc', r = 14) + +x <- PlotMrl(flow~date, flowStJohn, u = lstu, declust = 'wrc', r = 14) + +head(x) + +} +\seealso{ +\link{FitPot}, \link{which.floodPeaks}. +} +\author{ +Martin Durocher +} diff --git a/man/PlotThresh.Rd b/man/PlotThresh.Rd new file mode 100644 index 0000000..195a663 --- /dev/null +++ b/man/PlotThresh.Rd @@ -0,0 +1,42 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/rfa_PlotThresh.R +\name{PlotThresh} +\alias{PlotThresh} +\title{Visual diagnostic for peaks over threshold} +\usage{ +PlotThresh(obj, type = "ad", ppy = NULL, ...) +} +\arguments{ +\item{obj}{Output from \link{SearchThresh}.} + +\item{type}{Type of plot to display. +Must be one or more of \code{'ad','mrl','alpha', 'kappa'}.} +} +\description{ +Create various graphics to assess the selection of a threshold. +Includes a plot with respect oh the threshold for the p-values for the +Anderson-Darling test, estimated parameter and flood quantiles. +Vertical lines are shown for thresholds associated to 1 and 1.5 peaks per +years. +} +\examples{ + +lstu <- seq(500,2000,20) +out <- SearchThresh(flow~date, flowStJohn, u = lstu, declust = 'wrc', r = 14) + +PlotThresh(out) + +PlotThresh(out, type = 'q50') + +PlotThresh(out, type = paste0('q',c(2,5,10,20,50,100))) + +par(mfrow = c(2,2)) +PlotThresh(out, type = c('ad','kappa', 'mrl','q10')) + +} +\seealso{ +\link{SearchThresh}, \link{FindThresh}. +} +\author{ +Martin Durocher +} diff --git a/man/PoolRemove.Rd b/man/PoolRemove.Rd new file mode 100644 index 0000000..11db338 --- /dev/null +++ b/man/PoolRemove.Rd @@ -0,0 +1,63 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/rfa_PoolRemove.R +\name{PoolRemove} +\alias{PoolRemove} +\title{Remove heterogenous sites from a pooling group} +\usage{ +PoolRemove(obj, method = "H1", tol = 2, nmin = 15, ntot.min = 0, + nsim = 1000, distr.fix = FALSE, verbose = TRUE) +} +\arguments{ +\item{obj}{An output from \link{FitRegLmom}.} + +\item{method, tol}{Which heterogenity statistics used in the procedure. +The choices are \code{'H1'}, \code{'H2'} and \code{'H3'}. +The algorithm stop when the heterogenity goes below the value \code{tol}.} + +\item{nmin, ntot.min}{Additional stopping criteria. Respectively the +minimal number of sites or station-year to be included in the region.} + +\item{nsim}{Number of simulations used to evaluate the heterogenous statistic} + +\item{distr.fix}{Logical, should the selection of the distribution be +re-evaluated after removing the site.} + +\item{verbose}{Logical. Should a trace of the removed sites be display.} +} +\description{ +Return a regional model (\code{'FitRegLmom'}) where heterogenous sites +are removed in a stepwise manner. +At each step, the removed site that best improves the homogeneity statistic +is permanently removed until a stopping criterion. +The first site that was passed in a dataset is considered as the target and +it cannot be removed. +} +\examples{ + +data(flowAtlantic) + +## Organize data +ams <- flowAtlantic$ams +ams$year <- format(ams$date, '\%Y') +xmat <- DataWide(ams ~ id + year, ams) + +## Compute distance +coord <- flowAtlantic$info[,c('lon','lat')] +rownames(coord) <- flowAtlantic$info$id +h <- GeoDist(coord) + +## Fit a index flood model inside a pooling group +xmat0 <- FindNearest(xmat, h[1, colnames(xmat)], 25) +fit <- FitRegLmom(xmat) + +## Remove site until homogeneity is reached +fit.new <- PoolRemove(fit, tol = 2) + +## Get the data from the pooling group +xmat1 <- xmat[,sitenames(fit.new)] + + +} +\author{ +Martin Durocher +} diff --git a/man/RegSim.Rd b/man/RegSim.Rd new file mode 100644 index 0000000..13f043b --- /dev/null +++ b/man/RegSim.Rd @@ -0,0 +1,71 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/rfa_RegSim.R +\name{RegSim} +\alias{RegSim} +\alias{RegSim.matrix} +\alias{RegSim.reglmom} +\title{Simulation of a regional dataset with intersite correlation.} +\usage{ +RegSim(x, ...) + +\method{RegSim}{matrix}(x, distr, nrec, corr = 0, corr.sqrt = FALSE, + lmom = TRUE, lscale = FALSE, long = FALSE) + +\method{RegSim}{reglmom}(obj, n = 1, corr = 0, margin = "atsite") +} +\arguments{ +\item{x}{Matrix (in rows) of parameters or L-moments for all sites to +simulate. +Can also be an output form \link{FitRegLmom}.} + +\item{distr}{Marginal distribution of each site. +If only one value is passed as argument, the same is used for all sites.} + +\item{nrec}{Record lengths of the sites. +If only one value is passed in argument, the same is used for all sites.} + +\item{corr}{Correlation matrix for the dependence between site. +If only one value is passed, the correlation is assumed +the for every pair of sites.} + +\item{corr.sqrt}{Squared correlation matrix. Can be passed to speed up +multiple calls.} + +\item{lmom}{Logical. Is the argument `x` a matrix of L-moments or +distribution parameters} + +\item{lscale}{Logical. Is the second L-moments the scale (`TRUE`) +or the LCV (`FALSE`).} + +\item{long}{Logical. Should the output be returned in a long format.} +} +\description{ +Returns a dataset containing multiple time series in the form of +a matrix where the sites are in columns. +Different record lengths can be specified for each site +and missing values are filled accordingly at the beginning. +The rows (time) are independent and the intersite correlation model +is based on a multivariate Normal distribution. +} +\examples{ + +## Extract data +data(flowUngauged) +lmom <- flowUngauged[1:5, c('l1','lcv','lsk')] + +## Simulate data base on at-site L-moments +sim <- RegSim(lmom, distr = 'gev', nrec = 11:15, corr = .4) + +head(sim) + +sim <- RegSim(lmom, + distr = c(rep('gev',4),'gno'), + nrec = 10:15, + corr = .4, long = TRUE) +head(sim) + + +} +\author{ +Martin Durocher +} diff --git a/man/SearchThresh.Rd b/man/SearchThresh.Rd new file mode 100644 index 0000000..fbac4aa --- /dev/null +++ b/man/SearchThresh.Rd @@ -0,0 +1,42 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/rfa_SearchThresh.R +\name{SearchThresh} +\alias{SearchThresh} +\title{Fit POT models for a list of candidate thresholds} +\usage{ +SearchThresh(form, x, u, nmin = 20, verbose = TRUE, ...) +} +\arguments{ +\item{u}{Vector of candidate thresholds.} + +\item{nmin}{Stopping condition verifying that a minimal number of peaks +are extracted.} + +\item{verbose}{Logical. Should a progress bar be displayed.} + +\item{...}{Other arguments passed to \link{FitPot}.} +} +\description{ +The function \code{SearchThresh} returns a data frame containing +key value for the automatic selection of a threshold and where each row +corresponds to a candidate threshold. +The result is extracted from several calls to the function \code{FitPot}. +} +\examples{ + +# Create a list of candidate threshold +lstu <- which.floodPeaks(flow~date, flowStJohn, u =500, r = 14) +lstu <- sort(unique(flowStJohn[lstu,'flow'])) +lstu <- lstu[seq(1,length(lstu)-30,2)] + +out <- SearchThresh(flow~date, flowStJohn, u = lstu, declust = 'wrc', r = 14) +head(out) + +FindThresh(out, method = 'sgn', tol.sgn = 0.1) +FindThresh(out, method = 'ppy', tol.ppy = 2) +FindThresh(out, method = 'max') + +} +\author{ +Martin Durocher +} diff --git a/man/SeasonStat.Rd b/man/SeasonStat.Rd new file mode 100644 index 0000000..44d860c --- /dev/null +++ b/man/SeasonStat.Rd @@ -0,0 +1,57 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/rfa_SeasonStat.R +\name{SeasonStat} +\alias{SeasonStat} +\alias{SeasonStat.data.frame} +\alias{SeasonStat.formula} +\title{Seasonal statistics for flood peaks} +\usage{ +SeasonStat(x, ...) + +\method{SeasonStat}{data.frame}(x) + +\method{SeasonStat}{formula}(form, x) +} +\arguments{ +\item{x}{Data. If data.frame with two columns, they must be respectively +the date and a site variable.} + +\item{form}{Formula that specifies the date and site variable. Must be of the +form \code{date ~ site}.} +} +\description{ +Return the circular or seasonal statistics of flood peaks. +The angle represent the average timing of the floods and the radius its +regularity. +For instance a radius of one represent perfect regularity. +Can perform the analysis of multiple sites. +} +\section{References}{ + + +Burn, D.H. (1997). Catchment similarity for regional flood frequency analysis + using seasonality measures. Journal of Hydrology 202, 212-230. + https://doi.org/10.1016/S0022-1694(97)00068-1 +} + +\examples{ + +dt <- ExtractAmax(flow~date, flowStJohn)$date + +SeasonStat(dt) + +## Illustration of the analysis of multiple sites + +F0 <- function(ii) data.frame(site = ii, dt = sample(dt, replace = TRUE)) +x <- lapply(1:10, F0) +x <- do.call(rbind, x) + +st <- SeasonStat(dt ~ site, x) + +JulianPlot() +points(y ~ x, st, col = 2, pch = 16) + +} +\author{ +Martin Durocher +} diff --git a/man/fgpa.Rd b/man/fgpa.Rd new file mode 100644 index 0000000..0aac531 --- /dev/null +++ b/man/fgpa.Rd @@ -0,0 +1,58 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/rfa_fgpa.R +\name{fgpa} +\alias{fgpa} +\alias{fgpa1d} +\alias{fgpa2d} +\alias{fgpaLmom} +\title{Estimation of the Generalized Pareto distribution.} +\usage{ +fgpa1d(x, sol = FALSE) + +fgpa2d(x, sol = FALSE, par0 = NULL, ...) + +fgpaLmom(x) +} +\arguments{ +\item{x}{Sample.} + +\item{sol}{Does solution from \code{optim} be returned. +In case of \code{fgpa1d}, it returns the variance covariance matrix.} + +\item{par0}{Initial parameter.} + +\item{...}{aditional arguments to pass to \code{\link{optim}}} +} +\description{ +Low level functions for estimating of the generalized Pareto +distribution(GPA) with two parameters. Can use +either maximum likelihood or the method of L-moments. +The algorithm of \code{fgpa2d} is using +\code{optim} to directly optimize the log-likelihood (bivariate), while +the algorithm of \code{fgpa1d} is using a transformation to use +a univariate optimization routine. Additionally, \code{fgpa2d} constraint +the shape parameter between -.5 and 1. +} +\section{Reference}{ + + +Davison AC, Smith RL. (1990) Models for Exceedances over High Thresholds. + Journal of the Royal Statistical Society Series B (Methodological). + 52(3):393–442. + +Hosking JRM (1990). L-Moments: Analysis and Estimation of Distributions Using + Linear Combinations of Order Statistics. Journal of the Royal Statistical + Society Series B (Methodological). 52(1):105–24. +} + +\examples{ + +x <- rgpa(1000, 1, -.2) +fgpa1d(x) +fgpa2d(x) +fgpaLmom(x) + +} +\author{ +Martin Durocher +} diff --git a/man/flowAtlantic.Rd b/man/flowAtlantic.Rd new file mode 100644 index 0000000..1791080 --- /dev/null +++ b/man/flowAtlantic.Rd @@ -0,0 +1,24 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/rfa_data.R +\docType{data} +\name{flowAtlantic} +\alias{flowAtlantic} +\title{Annual maximums from sites in the Atlantic region of Canada} +\format{An object of class \code{list} of length 2.} +\source{ +\url{https://wateroffice.ec.gc.ca/} +} +\usage{ +flowAtlantic +} +\description{ +Contains the annual maximums of 45 hydrometric stations found in the +region '01' of Water Survery of Canada. +Additionaly to the annual maximums, the output list includes catchment +descriptors (longitude, latitude, drainage area, mean annual precipitation) +and the geographical distance between each station. +} +\author{ +Martin Durocher +} +\keyword{datasets} diff --git a/man/flowStJohn.Rd b/man/flowStJohn.Rd new file mode 100644 index 0000000..69d114f --- /dev/null +++ b/man/flowStJohn.Rd @@ -0,0 +1,22 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/rfa_data.R +\docType{data} +\name{flowStJohn} +\alias{flowStJohn} +\title{Streamflow data} +\format{An object of class \code{data.frame} with 32234 rows and 2 columns.} +\source{ +\url{https://wateroffice.ec.gc.ca/} +} +\usage{ +flowStJohn +} +\description{ +Daily river discharge for the station 01AD002 on +St-John River at Fort Kent, New Brunswick. +Data range from 1926 to 2014 and have a drainage area of 14700 sq km. +} +\author{ +Martin Durocher +} +\keyword{datasets} diff --git a/man/flowUngauged.Rd b/man/flowUngauged.Rd new file mode 100644 index 0000000..e00465d --- /dev/null +++ b/man/flowUngauged.Rd @@ -0,0 +1,38 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/rfa_data.R +\docType{data} +\name{flowUngauged} +\alias{flowUngauged} +\title{L-moments and catchment descriptors of hydrometric stations in Canada} +\format{An object of class \code{data.frame} with 562 rows and 11 columns.} +\source{ +\url{https://wateroffice.ec.gc.ca/} +} +\usage{ +flowUngauged +} +\description{ +The L-moments of the annual maximums at 562 stations +were extracted from Water Survery of Canada (HYDAT). +Catchment descriptors are available for each station was +provided by Environment and Climate Change Canada (ECCC). +The best at-site distributions according to the AIC criterion are included. +} +\details{ +\describe{ + \item{site}{Identification number of the station in HYDAT.} + \item{area}{Drainage area (sq km).} + \item{map}{Mean annual precipitation for the catchment (mm).} + \item{wb}{Drainage area covered by waterbodies (pct).} + \item{stream}{Stream density (km of streams per catchment sq km).} + \item{lon,lat}{Longitude and latitude of the catchment center.} + \item{l1, lcv, lsk}{Sample mean, L-coefficient of variation and + L-coefficient of skewness of the annual maximum discharges.} + \item{dstr}{Distribution selected for the annual maximum discharge based + on the Akaike Information Criterion (AIC).} + } +} +\author{ +Martin Durocher +} +\keyword{datasets} diff --git a/man/plot.amax.Rd b/man/plot.amax.Rd new file mode 100644 index 0000000..39e40cd --- /dev/null +++ b/man/plot.amax.Rd @@ -0,0 +1,38 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/rfa_plot_amax.R +\name{plot.amax} +\alias{plot.amax} +\title{Return level plot} +\usage{ +\method{plot}{amax}(obj, main = "Return level plot", + xlab = "Return period (year)", ylab = "Flood quantiles", + ci = FALSE, col.ci = "red", lty.ci = 2, lwd.ci = 1, ...) +} +\arguments{ +\item{obj}{Output from \link{FitAmax}.} + +\item{ci}{Logical. Should confidence intervals be displayed. +See \link{predict.amax} with argument Delta method.} + +\item{col.ci, lty.ci, lwd.ci}{Graphical parameters defining the display +of the confidence interval.} + +\item{...}{Other graphical parameters. See \code{\link{par}}.} +} +\description{ +Create a plot of the estimated versus sample flood quantiles, where the +x-axis is expressed in terms of return period. +} +\examples{ + +data(flowStJohn) + +x <- ExtractAmax(flow~date, flowStJohn)$flow + +fit <- FitAmax(x, distr = 'gev', method = 'mle') + +plot(fit, ci = TRUE) +} +\author{ +Martin Durocher +} diff --git a/man/predict.amax.Rd b/man/predict.amax.Rd new file mode 100644 index 0000000..312d0dc --- /dev/null +++ b/man/predict.amax.Rd @@ -0,0 +1,54 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/rfa_predict_amax.R +\name{predict.amax} +\alias{predict.amax} +\title{Predict return levels} +\usage{ +\method{predict}{amax}(obj, q = c(0.5, 0.8, 0.9, 0.95, 0.98, 0.99), + se = FALSE, ci = "none", alpha = 0.05, nsim = 1000, + out.matrix = FALSE) +} +\arguments{ +\item{obj}{Output from \code{\link{FitAmax}}} + +\item{q}{Probabilities associated to the return level. For example, +a 100 years return period is equivalent to \code{q = 0.99}.} + +\item{se}{Return the standard deviation of the return level using +the delta method. The fitted model must} + +\item{ci}{Method to compute the confident interval. One of \code{'delta'} +for the delta method, \code{'boot'} for parametric boostrap and \code{'norm'} +for Monte-Carlo approximation assuming normality of the parameters.} + +\item{alpha}{Probability outside the confident interval.} + +\item{nsim}{Number of simulation use for resampling.} + +\item{out.matrix}{Logical. Should the resampling be returned. If true, +a list is returned containing the prediction table (\code{pred}), +the parameters (\code{para}) and the return levels (\code{qua}).} +} +\description{ +Return the flood quantile of annual maximum distribution and +Confident intervals are provided by bootstrap. +} +\examples{ + +#' ## Extract an time series of annual maxima +x <- ExtractAmax(flow~date, flowStJohn)$flow + +## Fitting of GEV distribution using L-moments +fit <- FitAmax(x,'gev', method = 'mle') + +## Get the estimated quantile of 10 and 100 years return period +rp <- 1-1/c(10,100) +predict(fit, rp) +predict(fit, se = TRUE, ci = 'delta') + +## The bootstrap sample used for CI are returned +fit <- FitAmax(x,'gev', varcov = FALSE) +boot <- predict(fit, rp, se = FALSE, ci = 'boot', + nsim = 500, out.matrix = TRUE) + +} diff --git a/man/predict.fpot.Rd b/man/predict.fpot.Rd new file mode 100644 index 0000000..9f27bcf --- /dev/null +++ b/man/predict.fpot.Rd @@ -0,0 +1,47 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/rfa_predict_fpot.R +\name{predict.fpot} +\alias{predict.fpot} +\title{Prediction of flood quantiles of a given return period.} +\usage{ +\method{predict}{fpot}(obj, rt = c(2, 5, 10, 20, 50, 100), se = FALSE, + ci = "none", alpha = 0.05, nsim = 1000) +} +\arguments{ +\item{obj}{Output of \link{FitPot}.} + +\item{rt}{Return period.} + +\item{se}{Logical. Should the standard deviation be returned.} + +\item{ci, alpha}{Method for evaluation the confidence intervals with +probability \code{1-alpha}. Available methods are : +Delta method (\code{'delta'}), profile likelihood (\code{'profile'}) +and nonparametric bootstrap (\code{'boot'})} + +\item{nsim}{Number of bootstrap sample.} +} +\description{ +Return a vector or matrix of the flood quantiles, its standard deviation and +confidence intervals. +} +\examples{ + +data(flowStJohn) + +fit <- FitPot(flow~date, flowStJohn, u = 1000, + declust = 'wrc', r = 14) + +predict(fit, se = TRUE, ci = 'delta') + +} +\references{ +Coles S. (2001) An introduction to statistical modeling of extreme values. + Springer Verlag. +} +\seealso{ +\link{FitPot} +} +\author{ +Martin Durocher +} diff --git a/man/predict.reglmom.Rd b/man/predict.reglmom.Rd new file mode 100644 index 0000000..9aa30d8 --- /dev/null +++ b/man/predict.reglmom.Rd @@ -0,0 +1,65 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/rfa_predict_reglmom.R +\name{predict.reglmom} +\alias{predict.reglmom} +\title{Flood quantiles estimates} +\usage{ +\method{predict}{reglmom}(obj, q = c(0.5, 0.8, 0.9, 0.95, 0.98, 0.99), + ci = FALSE, corr = 0, nsim = 1000, alpha = 0.05) +} +\arguments{ +\item{obj}{An output from \link{FitRegLmom}.} + +\item{q}{Probability associated to the flood quantiles.} + +\item{ci}{Logical. Should the confident intervals and the standard deviation +be evaluated?} + +\item{corr}{Intersite correlation. Either a matrix or a constant coefficient +for all pairs} + +\item{nsim}{Number of simulations used for approximating +the confident intervals.} + +\item{alpha}{Significance level.} + +\item{indx}{Index flood factor. By default the sample average of the target.} +} +\description{ +Predict the flood quantile of index-flood model for a specific scale +factor. By default the flood quantile of the first site (target) is returned. +} +\examples{ + +data(flowAtlantic) + +h <- GeoDist(flowAtlantic$info[,c('lon','lat')]) +ams <- flowAtlantic$ams +ams$year <- format(ams$date, '\%Y') +xd <- DataWide(ams ~ id + year, ams) + +xd <- FindNearest(xd, h[1,], 25) +h <- FindNearest(h , h[1,], 25, row = TRUE) + +## Fit the regional model +fit <- FitRegLmom(xd) + +## estimate flood quantiles +predict(fit, c(.3,.7)) + +## Evaluate intersite correlation +isite <- Intersite(xd) + +predict(fit, ci = TRUE, corr = isite$model) + +} +\references{ +Hosking, J. R. M., & Wallis, J. R. (1997). Regional frequency analysis: + an approach based on L-moments. Cambridge Univ Pr. +} +\seealso{ +\link{FitRegLmom}, \link{Intersite}. +} +\author{ +Martin Durocher +} diff --git a/man/which.floodPeaks.Rd b/man/which.floodPeaks.Rd new file mode 100644 index 0000000..6c255fc --- /dev/null +++ b/man/which.floodPeaks.Rd @@ -0,0 +1,90 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/rfa_which_floodPeaks.R +\name{which.floodPeaks} +\alias{which.floodPeaks} +\alias{which.floodPeaks.numeric} +\alias{which.floodPeaks.formula} +\alias{which.floodPeaks.data.frame} +\alias{which.clusters} +\alias{which.clusters.formula} +\alias{which.clusters.numeric} +\title{Extracting peaks} +\usage{ +which.floodPeaks(x, ...) + +\method{which.floodPeaks}{numeric}(x, dt = NULL, u, r = 1, + rlow = 0.75, ini = "wrc") + +\method{which.floodPeaks}{formula}(form, x, u, ...) + +\method{which.floodPeaks}{data.frame}(x, u, ...) + +which.clusters(x, ...) + +\method{which.clusters}{formula}(form, x, u, r = 1) + +\method{which.clusters}{numeric}(x, dt = NULL, u, r = 1) +} +\arguments{ +\item{x, form}{If numeric, \code{x} is a vector of data. If a formula is passed} + +\item{dt}{Date or time of observations. If not provided, regular step + are asumed. + + @param u Threshold.} + +\item{r, rlow, ini}{Declustering parameters. See details.} +} +\description{ +Returns the indices of the peaks above a threshold according to the +declustering method put in place by the Water Resources Council or simple +run declustering. +See Lang et al. (1999) for more details. +} +\details{ +Two conditions are required for peaks to not be +rejected. First, two peaks \code{Q1} and \code{Q2} must be separated by a + period of at least \code{r} days, where one recommendation is + \deqn{4 days + log(A)} +and \eqn{A} is the drainage area in squared kilometers. +The second conditions is +\deqn{Xmin > rlow * min(Q1,Q2).} where \code{Xmin} is lowest point +between \code{Q1} and \code{Q2}. By defautlt, \code{rlow = 0.75}. +When one of the two conditions is not statisfied the lowest of the two +peaks is discarded. +The 2 conditions are verify sequentially, from an initial set of peaks. +If \code{ini = 'run'}, a run declustering method with one lag is first used to +filter the initial set of peaks to the maximums of the respective clusters. +If \code{ini = 'lmax'} the 2 condition are verified accross all local maximums. +If \code{ini = 'wrc'} (default), the second condition id verified +next the first condition is verify on the previously extracted peaks. +The two version are very similar and differ only on few cases where the +modified version is more conservative and reject peaks that are kept +in the initial version. + +The function \code{which.clusters} is returning the indices of the peaks +identified by the run declustering method where clusters are separated by a +period of \code{r} consecutive values under the threshold. +} +\section{References}{ + + +Lang M, Ouarda TBMJ, Bobée B. (1999) Towards operational guidelines for + over-threshold modeling. Journal of Hydrology. Dec 6;225(3):103–17. +} + +\examples{ + +# Declustering using the flood recommendation. +cid <- which.floodPeaks(flow~date, flowStJohn, u = 1000, r = 14, rlow = .75, + ini = 'wrc') + +plot(flowStJohn, type = 'l') +points(flowStJohn[cid,], col = 'red', pch = 16) + +## Simpler run declustering +cid <- which.clusters(flowStJohn$flow, u = 1000, r = 14) + +plot(flowStJohn, type = 'l') +points(flowStJohn[cid,], col = 'red', pch = 16) +} diff --git a/tests/testthat/test_rfa_CvRoi.R b/tests/testthat/test_rfa_CvRoi.R new file mode 100644 index 0000000..658fe5a --- /dev/null +++ b/tests/testthat/test_rfa_CvRoi.R @@ -0,0 +1,78 @@ +############################################################################### +## Test function CvRoi +## Martin Durocher +############################################################################## + +rm(list = ls()) +attach(flowUngauged) + +## Using multidimensional scaling for projecting coordinates +coord <- cbind(lon,lat) +coord <- cmdscale(GeoDist(coord)) +colnames(coord) <- c('lon','lat') + +## Transform data if necessary +xdf <- data.frame(y = l1, + ly = log(l1), + area = scale(log(area)), + wb = scale(log(wb)), + stream = scale(log(stream)), + map = scale(log(map)), + coord) + + +## select a validation and training set +set.seed(9382) +vid <- runif(nrow(xdf)) > .8 +tid <- !vid + +response <- xdf[vid,'ly'] + +# formula of the relationship between flood quantile and descriptors +fphy <- ly ~ area + map + wb + stream +fsimilarity <- ~ area + map +fkriging <- ~ lon + lat + +## Perform cross-validation. +out <- CvRoi(x = xdf, nk = seq(20,150, 10), fold = 5, + phy = fphy, similarity = fsimilarity, model = 'Exp') + +## verify output scale +expect_true(all(out$mad < 0.5)) +expect_true(all(out$nsh > 0.7)) + +expect_equal(class(out), c('roicv', 'data.frame')) +expect_equal(dim(out), c(14,7)) +print(out) + +## verify that it is correctly sorted +z <- head(out, 'nsh')[,'nsh'] +expect_equal(z, sort(z,decreasing = TRUE)) + +z <- head(out, 'mad')[,'mad'] +expect_equal(z, sort(z)) + +expect_equal(out$nk, seq(20,150, 10)) +plot(out, 'rmse', best.cex = .5, best.col = 'green', best.pch = 1, lty =3) +plot(out, 'smad', ylab = '', xlab = '') + +## ----------------------------- +## modify formula +## ----------------------------- + +fphy <- ly ~ area + map + poly(wb,3) + poly(stream,3) +out <- CvRoi(x = xdf, nk = seq(40,60, 10), fold = 10, + phy = fphy, similarity = fsimilarity, model = 'Exp') + +expect_true(all(out$mad < 0.5)) +expect_true(all(out$nsh > 0.7)) + +fphy <- log(y) ~ area + map + wb + wb +out <- CvRoi(x = xdf, nk = seq(40,60, 10), fold = 10, + phy = fphy, similarity = fsimilarity, model = 'Exp') + +expect_true(all(out$mad < 0.5)) +expect_true(all(out$nsh > 0.7)) + + +detach(flowUngauged) diff --git a/tests/testthat/test_rfa_DataWide.R b/tests/testthat/test_rfa_DataWide.R new file mode 100644 index 0000000..149f12f --- /dev/null +++ b/tests/testthat/test_rfa_DataWide.R @@ -0,0 +1,122 @@ +############################################################################## +# Testing DataWide function +# Martin Durocher +############################################################################# + +rm(list = ls()) + +## basic test +xini <- x0 <- data.frame(1:12, expand.grid(1:3,1:4)[,c(2,1)]) +names(xini) <- names(x0) <- c('value','site','time') + +xmat <- DataWide(xini) +xmat0 <- matrix(xini$value, 3,4) + +expect_true(all(xmat == xmat0)) + +## using factor +lb.s <- paste0('s',c(2,1,4,3)) +lb.t <- paste0('t',c(2,3,1)) +x0[,2] <- factor(x0[,2], labels = lb.s) +x0[,3] <- factor(x0[,3], labels = lb.t) + +xmat <- DataWide(x0) +expect_true(all(xmat == xmat0)) +expect_equal(colnames(xmat), lb.s) +expect_equal(rownames(xmat), lb.t) + +## verify ordering + +x1 <- xini[order(as.character(x0[,2]), + as.character(x0[,3])),] + +xmat <- DataWide(x1, order.time = FALSE, order.site = FALSE) +xmat1 <- matrix(c(6,3,12,9, + 4,1,10,7, + 5,2,11,8), 3,4, byrow = TRUE) + +expect_true( all(xmat == xmat1)) + +xmat <- DataWide(x1, order.time = TRUE, order.site = FALSE) +xmat1 <- matrix(c(4,1,10,7, + 5,2,11,8, + 6,3,12,9), 3,4, byrow = TRUE) + +expect_true( all(xmat == xmat1)) + +xmat <- DataWide(x1, order.time = FALSE, order.site = TRUE) +xmat1 <- matrix(c(3,6,9,12, + 1,4,7,10, + 2,5,8,11), 3,4, byrow = TRUE) + +expect_true( all(xmat == xmat1)) + +xmat <- DataWide(x1, order.time = TRUE, order.site = TRUE) +expect_true( all(xmat == xmat0)) + +## using formula + +x0 <- x0[,c(2,3,1)] +xmat <- DataWide(value~site+time, x0) +expect_true( all(xmat == xmat0)) + +## Create the missing value when necessary + +x1 <- x0 +cnew <- xini[,3] +cnew[4] <- 4 +x1[,2] <- factor(cnew, labels = paste0('t',c(2,3,1,4))) + +xmat <- DataWide(value~site+time, x1) + +xmat1 <- matrix(c( 1, NA, 7, 10, + 2, 5, 8, 11, + 3, 6, 9, 12, + NA, 4, NA, NA), 4,4, byrow = TRUE) +id1 <- c(4,5,12,16) +expect_equal(xmat[-id1], xmat1[-id1]) +expect_equal(xmat[id1], xmat1[id1]) + +## if time is a date + +x0[,2] <- rep(c(as.Date('2000/1/2'), + as.Date('2000/1/3'), + as.Date('2000/1/1')),4) + +xmat <- DataWide( value~site+time, x0) +xmat1 <- matrix(c(3,6,9,12, + 1,4,7,10, + 2,5,8,11), 3,4, byrow = TRUE) +expect_true( all(xmat == xmat1)) + +## If there is a missing value + +x1 <- x0 +x1$value[1] <- NA + +xmat <- DataWide(value~site+time, x1) +expect_equal(xmat[-2], xmat1[-2]) +expect_true(is.na(xmat[2])) + +## Raise error for duplicate + +x1$site[5] <- 's2' +expect_error(DataWide(value~site+time, x1)) + +## Testing the independent mode + +x2 <- x0 +x2[,2] <- sample(1:12) +xmat <- DataWide(value ~ site, x2) + +expect_true(all(xmat == xmat0)) + + +x2 <- x2[-1, ] +xmat <- DataWide(value ~ site, x2) +xmat0 <- matrix(c(2,4,7,10, + 3,5,8,11, + NA,6,9,12), 3,4, byrow = TRUE) + +cid <- !is.na(xmat) +expect_true(all(xmat[cid] == xmat0[cid])) diff --git a/tests/testthat/test_rfa_DistSeason.R b/tests/testthat/test_rfa_DistSeason.R new file mode 100644 index 0000000..d8a4198 --- /dev/null +++ b/tests/testthat/test_rfa_DistSeason.R @@ -0,0 +1,29 @@ +###################################################### +## testing DistSeason +## Martin Durocher +####################################################### + +nsite <- 1000 +scoord <- data.frame(angle = runif(nsite,0,2*pi), + radius = runif(nsite)) + +d1 <- DistSeason(radius ~ angle , scoord) + +radMat <- as.matrix(dist(scoord[,2], method = 'man')) + +angMat <- mx <- matrix(0, nsite,nsite) + +for(ii in seq(nsite-1)){ + for(jj in seq(ii+1,nsite)){ + + mx[jj,ii] <- max(scoord[c(ii,jj),1]) - min(scoord[c(ii,jj),1]) + angMat[jj,ii] <- min(2*pi - mx[jj,ii], mx[jj,ii])/pi + angMat[ii,jj] <- angMat[jj,ii] + mx[ii,jj] <- mx[jj,ii] + } +} + +d2 <- sqrt(angMat^2+radMat^2) + +expect_equal(d1,d2) + diff --git a/tests/testthat/test_rfa_ExtractAmax.R b/tests/testthat/test_rfa_ExtractAmax.R new file mode 100644 index 0000000..73a36af --- /dev/null +++ b/tests/testthat/test_rfa_ExtractAmax.R @@ -0,0 +1,95 @@ +###################################################### +## Testing ExtractAmax +## Martin Durocher +####################################################### + +rm(list = ls()) + +## Verify that the function return the right output +x <- ExtractAmax(flow~date, flowStJohn) +expect_equal(dim(x), c(89,4)) +expect_equal(names(x), c("flow","date","n","yy" )) + +## Verify the filtering work. there is one year of 92 observations +x <- ExtractAmax(flow~date, flowStJohn, tol = 92) +expect_equal(dim(x), c(89,4)) + +x <- ExtractAmax(flow~date, flowStJohn, tol = 93) +expect_equal(dim(x), c(88,4)) + +## Verify that work with data.frame +y <- ExtractAmax(flowStJohn[,c('flow','date')], tol = 365) +expect_identical(y,x) + +## multiple site +x2 <- rbind(cbind(station = 1, x),cbind(station = 2, x)) + +ex1 <- ExtractAmax(flow~date, x) +ex2 <- ExtractAmax(flow~station + date, x2) + +ex1.2 <- rbind(cbind(ex1, station = 1), + cbind(ex1, station = 2))[,c(1,5,2,3,4)] + +expect_true( all(ex2 == ex1.2)) + + +## create a dataset +dt <- seq(as.Date('1970/10/01'), as.Date('2010/12/31'), 'day') +n <- length(dt) +xd <- data.frame(value = rlnorm(n), date = dt) +xts <- ts(xd$value, start = dt[1]) + + +## verify the default colnames +a <- ExtractAmax(xd) +expect_equal(colnames(a), c('value','date','n', 'yy')) + +## Verify the option nlab and ylab for renaming +a <- ExtractAmax(xd, nlab = 'nn', ylab = 'year') +expect_equal(colnames(a), c('value','date','nn', 'year')) + +## Verify the option nlab and ylab for removing colums +a <- ExtractAmax(xd, nlab = NULL, ylab = NULL) +expect_equal(colnames(a), c('value','date')) + +## Verify that extra columns are preserved +xd0 <- xd +xd0$year <- format(xd0$date,'%Y') +xd0$month <- format(xd0$date,'%m') + +a <- ExtractAmax(xd0) +expect_equal(colnames(a), c('value','date','year','month','n', 'yy')) + +## verify that extracted years are right. +expect_equal(a$year, a$yy) + +## verify the "tol" option filter the year +yy <- format(a$date,'%Y') +expect_equal(yy, as.character(1970:2010)) + +xd0 <- with(xd0, xd0[year != '2000' & month != '5', ]) +a <- ExtractAmax(xd0, tol = 360) + +expect_equal(a$yy, as.character(c(1971:1999,2001:2010))) + +## verify formula work +a <- ExtractAmax(value ~ date, xd0, tol = 360, nlab = NULL, ylab = NULL) +expect_equal(colnames(a), c('value','date')) + +## Multiple sites +xd1 <- rbind(cbind(xd0, site = 1), cbind(xd0, site = 2)) + +a0 <- ExtractAmax(value ~ site + date, xd1, tol = 360, nlab = NULL, ylab = NULL) + +a1 <- a0[a0$site == 1,-2] +a2 <- a0[a0$site == 2,-2] +expect_equal(colnames(a0), c('value', 'site', 'date')) +expect_true(all((a == a1) & a == a2)) + +## Verify columns for multiple sites +a0 <- ExtractAmax(value ~ site + date, xd1, nlab = 'nn', ylab = NULL) +expect_equal(colnames(a0), c('value', 'site', 'date','nn')) + +a0 <- ExtractAmax(value ~ site + date, xd1) +expect_equal(colnames(a0), c('value', 'site', 'date', 'n', 'yy')) + diff --git a/tests/testthat/test_rfa_FindNearest.R b/tests/testthat/test_rfa_FindNearest.R new file mode 100644 index 0000000..6b1dae2 --- /dev/null +++ b/tests/testthat/test_rfa_FindNearest.R @@ -0,0 +1,36 @@ +############################################################################## +# Testing FindNearest function +# Martin Durocher +############################################################################# + +## create data +x <- matrix(0:99, nrow = 10) +id <- c(2,4,3,6,10,8,7,9,1,5) +x <- x[id, id] +x[lower.tri(x)] <- t(x)[lower.tri(x)] +diag(x) <- 0 +colnames(x) <- paste0('site',1:10) + +## VSerify the result of the search works +x0 <- FindNearest(x, x[2,], 3) +expect_equal(x0[2,], sort(x[2,])[1:3]) +expect_equal(colnames(x0), c('site2', 'site9', 'site3')) +expect_equal(dim(x0), c(10,3)) + +## Verify the argument "row" works +x0 <- FindNearest(x, x[2,], 3, row = TRUE) +expect_equal(dim(x0), c(3,3)) +expect_equal(x0, x[c(2,9,3),c(2,9,3)]) + +## Verify the super region option +id <- c(1,3,5,7,9,2,4,6,8,10) +x2 <- x[id, id] +colnames(x2) <- paste0('site',1:10) + +x0 <- FindNearest(x, x[1,], 3, x2[1,], 5) + +xs0 <- FindNearest(x, x2[1,],5) +xs1 <- FindNearest(xs0, xs0[1,],3) + +expect_equal(x0,xs1) + diff --git a/tests/testthat/test_rfa_FitAmax.R b/tests/testthat/test_rfa_FitAmax.R new file mode 100644 index 0000000..f591c8a --- /dev/null +++ b/tests/testthat/test_rfa_FitAmax.R @@ -0,0 +1,85 @@ +###################################################### +## testing FitAmax +## Martin Durocher +####################################################### +rm(list = ls()) +uu <- (1:100 - .5) /100 +xgev <- qAmax(uu, c(100,30,0), 'gev') +vname <- c("lmom", "method", "para", "distr", "varcov", "llik", "data") + +## Verify that important distribution and method works +TestObj <- function(f){ + expect_is(f, 'amax') + expect_equal(names(f), vname) + expect_true(is.na(f$varcov)) + expect_equal(length(f$data), 100) + expect_equal(length(coef(f)), 3) + expect_true(all(is.finite(coef(f)))) +} + +S <- function(z) signif(as.numeric(z)) + +TestObj(f <- FitAmax(xgev, distr = 'gev', method = 'lmom', varcov = FALSE)) +expect_equal(S(f$para), c(99.8386, 30.1261, 0.0000)) +expect_equal(S(f$para), c(99.8386, 30.1261, 0.0000)) + +TestObj(f <- FitAmax(xgev, distr = 'gno', method = 'lmom', varcov = FALSE)) +expect_equal(S(f$lmom), c(117.228, 20.8818, 3.54844, 3.19116, 1.18389)) + +TestObj(FitAmax(xgev, distr = 'glo', method = 'lmom', varcov = FALSE)) +TestObj(FitAmax(xgev, distr = 'pe3', method = 'lmom', varcov = FALSE)) +TestObj(FitAmax(xgev, distr = 'gev', method = 'mle', varcov = FALSE)) +TestObj(FitAmax(xgev, distr = 'gno', method = 'mle', varcov = FALSE)) +TestObj(FitAmax(xgev, distr = 'glo', method = 'mle', varcov = FALSE)) + +TestObj(f <- FitAmax(xgev, distr = 'pe3', method = 'mle', varcov = FALSE)) +expect_match(f$method , 'mle') +expect_match(f$distr , 'pe3') + +## verify output quantities are fine +f <- FitAmax(xgev,'gev', method = 'lmom', varcov = TRUE, nsim = 10) +expect_true(all(is.finite(vcov(f)))) +expect_equal(dim(vcov(f)), c(3,3)) +expect_equal(S(AIC(f)), 1000.42) +expect_true(all(is.finite(coef(f)))) + + +f <- FitAmax(xgev,'gev', method = 'mle', varcov = TRUE) +expect_true(all(is.finite(vcov(f)))) +expect_equal(dim(vcov(f)), c(3,3)) +expect_equal(S(AIC(f)), 1000.39) + + +## Verify the automatic selection +f <- FitAmax(xgev, distr = c('gev','glo','gno','pe3'), method = 'mle') +expect_match(f$distr, 'gno') + +f <- FitAmax(xgev, distr = c('gev','glo','gno','pe3'), + method = 'mle', tol.gev = 2) +expect_match(f$distr, 'gev') + +f <- FitAmax(xgev, distr = c('gev','gum'), method = 'mle') +expect_match(f$distr, 'gum') + +f <- FitAmax(xgev, distr = c('gev','glo','gno','pe3'), + method = 'lmom', varcov = FALSE) +expect_match(f$distr, 'gno') + +f <- FitAmax(xgev, distr = c('gev','glo','gno','pe3'), + method = 'lmom', varcov = FALSE, tol.gev = 2) +expect_match(f$distr, 'gev') + +f <- FitAmax(xgev, distr = c('gev','gum'), method = 'lmom', + varcov = FALSE) +expect_match(f$distr, 'gum') + + +## Verifying return error +expect_error(FitAmax(xgev, distr = 'gev', nsim = 1)) + +xgev[1] <- NA +expect_error(FitAmax(xgev, distr = 'gev')) + +xgev[1] <- Inf +expect_error(FitAmax(xgev, distr = 'gev')) + diff --git a/tests/testthat/test_rfa_FitGev.R b/tests/testthat/test_rfa_FitGev.R new file mode 100644 index 0000000..e38c2d4 --- /dev/null +++ b/tests/testthat/test_rfa_FitGev.R @@ -0,0 +1,25 @@ +###################################################### +## testing FitGev +####################################################### +rm(list = ls()) + +S <- function(z) signif(as.numeric(z)) + +uu <- (seq(1000)-.5)/1000 +xgev <- qAmax(uu, c(100,30, -.15), 'gev') +f <- FitGev(xgev) + +expect_equal(S(f$para), c(99.9884, 29.9728, -0.149058)) +expect_match(f$distr, 'gev') +expect_match(f$method, 'gml') +expect_equal(f$prior, c(-0.1, 0.015)) +expect_true(all(is.finite(vcov(f)))) +expect_equal(length(f$data), 1000) +expect_equal(S(AIC(f)), 10134.6) + + +## as approximation to mle when uniform prior is used +f <- FitGev(xgev, varcov = FALSE, mu = 0, sig2 = 1/12) +f0 <- FitAmax(xgev, 'gev', method = 'mle', varcov = FALSE) +expect_equal(S(AIC(f0)), S(AIC(f))) +expect_true(all((1-coef(f)/coef(f0))^2 < 1e-6)) diff --git a/tests/testthat/test_rfa_FitPot.R b/tests/testthat/test_rfa_FitPot.R new file mode 100644 index 0000000..e38196c --- /dev/null +++ b/tests/testthat/test_rfa_FitPot.R @@ -0,0 +1,89 @@ +###################################################### +## testing FitPot and predict.fpot functions +## Martin Durocher +####################################################### + +rm(list = ls()) + +uu <- (1:10000)/10001 +xd <- qgpa(uu, 1, -.2) +xd0 <- qgpa(uu, 1, 0) + +## Simple fit +fit <- FitPot(xd, u = 0) + +## verify the output +expect_equal(fit$excess, xd) +expect_equal(fit$time,1:10000) +expect_equal(signif(fit$estimate), + c(alpha=1.001330, kappa =-0.198129)) +expect_equal(fit$u,0) +expect_equal(fit$method, 'mle') + +vm <- matrix(c(0.000240263, 0.000119972, + 0.000119972, 0.000143551), + 2,2) +colnames(vm) <- rownames(vm) <- c('alpha','kappa') +expect_equal(signif(fit$varcov),vm) +expect_equal(signif(fit$mrl), 1.24874) +expect_equal(fit$ntot, 10000) +expect_equal(fit$nexcess, length(fit$excess)) + +## verify basic functions +print(fit) +expect_equal(vcov(fit), fit$varcov) +expect_equal(coef(fit), fit$estimate) +expect_equal(signif(AIC(fit)),23993.1) + +## Check MLE2 for bounded estimation +expect_warning(fit <- FitPot(c(xd0, 30:40), u = 5, method = 'mle2')) +expect_equal(coef(fit)[2], c(kappa = -.5)) +expect_equal(fit$nexcess, length(fit$excess)) + +## Verify that vcov is not returned +fit <- FitPot(xd0, u = 5, method = 'mle2', varcov = F) +expect_true(is.null(fit$varcov)) +expect_true(is.null(vcov(fit))) + +## try Lmoment estimator +fit <- FitPot(xd0, u = 5, method = 'lmom', varcov = F) +fit <- FitPot(xd0, u = 5, method = 'lmom', varcov = T, nsim = 5) + + +## Verif confidence interval for parameter by profile likelihood +cc <- coef(fit, ci = TRUE) +expect_equal(colnames(cc), c('estimate','lower','upper')) +expect_equal(rownames(cc), c('alpha','kappa')) + +vm <- matrix(c(0.9759520, 0.715246, 1.477390, + 0.0159441, -0.251472, 0.297897), + 2,3, byrow = TRUE) + +expect_true(all(signif(cc)==vm)) + +## verify unit +expect_equal(fit$unit, 365.25) + +fit <- FitPot(xd0, u = 5, method = 'lmom', varcov = F, unit = 100) +expect_equal(fit$nyear, 100) + + +## verify the declustering + +fit <- FitPot(flow~date, flowStJohn, u = 1000, + declust = 'wrc', r = 10, rlow = .6) +xid <- which.floodPeaks(flow~date, flowStJohn, u = 1000, r = 10, rlow = .6) +expect_equal(flowStJohn$flow[xid], fit$excess + fit$u) + +fit <- FitPot(flow~date, flowStJohn, u = 900, declust = 'run', r = 10) +xid <- which.clusters(flow~date, flowStJohn, u = 900, r = 10) +expect_equal(flowStJohn$flow[xid], fit$excess + fit$u) + +## verify formula +fit1 <- FitPot(flow~date, flowStJohn, u = 1000, + declust = 'wrc', r = 10, rlow = .6) + +fit2 <- FitPot(flowStJohn$flow, flowStJohn$date, u = 1000, + declust = 'wrc', r = 10, rlow = .6) + +expect_equal(fit1,fit2) diff --git a/tests/testthat/test_rfa_FitRegLmom.R b/tests/testthat/test_rfa_FitRegLmom.R new file mode 100644 index 0000000..d2250f7 --- /dev/null +++ b/tests/testthat/test_rfa_FitRegLmom.R @@ -0,0 +1,105 @@ +############################################################################## +# Testing fitting FitRegLmom function +## Martin Durocher +############################################################################# + +library(lmomRFA) +rm(list = ls()) + +## Import data for tests +set.seed(0) + +lmm0 <- c(100,30,.3) +lmom20 <- t(replicate(20,lmm0)) +coord20 <- replicate(2,runif(20)) +h20 <- as.matrix(dist(coord20)) +colnames(coord20) <- c('lon','lat') + +## Define evaluation functions +rxd <- function(x,y) max(abs(1-y/x)) +axd <- function(x,y) max(abs(y-x)) +rmad <- function(x,y) mean(abs(1-y/x)) +mad <- function(x,y) mean(abs(y-x)) + +nrec0 <- 10001:10020 +sim20 <- RegSim(lmom20, distr = 'gev', nrec = nrec0, lscale = TRUE) + +fit1 <- FitRegLmom(sim20, distr = 'gno') + +## verify the output format +expect_equal(names(fit1),c('type', 'distr', 'para', 'lmom','rlmom', + 'nrec', 'stat', 'discord')) + +expect_true( all(fit1$nrec == nrec0)) +expect_equal(dim(fit1$lmom), c(20,4)) + +## Verify that the right regional L-moment and parameter are found +expect_true(mad(fit1$rlmom[1:3], c(1,.3,.3)) <.01) +expect_true(mad(pelgno(fit1$rlmom),fit1$para) < 1e-4) + +## verify that right number of lmom is returned +fit <- FitRegLmom(sim20, distr = 'gev', nmom = 5) +expect_equal(ncol(fit$lmom), 5) + +fit <- FitRegLmom(sim20, distr = 'gev', nmom = 1) +expect_equal(ncol(fit$lmom), 4) + +fit <- FitRegLmom(sim20, distr = 'wak', nmom = 1) +expect_equal(ncol(fit$lmom), 5) + +fit <- FitRegLmom(sim20, distr = 'gum', nmom = 7) +expect_equal(ncol(fit$lmom), 7) +expect_equal(names(fit$rlmom), + c("L1", "LCV", "LSK", "LKUR", "TAU5", "TAU6", "TAU7")) + +## Verify that the diagnostics work + +nrec0 <- 101:120 +sim20 <- RegSim(lmom20, distr = 'gev', nrec = nrec0, lscale = TRUE) + +fit1 <- FitRegLmom(sim20, diagnostic = TRUE) + +## right format +expect_true(length(fit1$stat)==8) +expect_true(length(fit1$discord)==20) + +## right selection +lstd <- c('glo','gev','gno','pe3','gpa') +expect_true(lstd[which.min(abs(fit1$stat[4:8]))] == fit1$distr) + +## diagnostics done with the right arguments +fit1 <- FitRegLmom(sim20) +expect_true(length(fit1$stat)==8) + +fit1 <- FitRegLmom(sim20, distr = 'gev', diagnostic = TRUE) +expect_true(length(fit1$stat)==8) + +fit1 <- FitRegLmom(sim20, distr = 'gev', diagnostic = FALSE) +expect_null(fit1$stat) +expect_null(fit1$discord) + +fit1 <- FitRegLmom(sim20, distr = 'gev') +expect_null(fit1$stat) +expect_null(fit1$discord) + +## test fitting a pooling group using POT + +set.seed(12) + +coord5 <- replicate(2,runif(5)) +h5 <- as.matrix(dist(coord5)) + +para <- cbind(rep(0,5), 1.1, -.1) +para0 <- c(0,.9,-.1) + +sim <- RegSim(para, distr = 'gpa', nrec = 1e4, lmom = FALSE) + +fit1 <- FitRegLmom(sim, type = 'pot') +fit2 <- FitRegLmom(sim, distr = 'gpa') + +expect_true(fit1$para[1] == 0) +expect_false(any(fit1$para == fit2$para)) + +expect_true(axd(fit1$para,para0) < 0.01) +expect_true(axd(fit2$para,para0) < 0.01) + diff --git a/tests/testthat/test_rfa_FitRoi.R b/tests/testthat/test_rfa_FitRoi.R new file mode 100644 index 0000000..fb38a8e --- /dev/null +++ b/tests/testthat/test_rfa_FitRoi.R @@ -0,0 +1,160 @@ +############################################################################### +## Test function FitRoi +## Martin Durocher +############################################################################## + +rm(list = ls()) +attach(flowUngauged) + +## Using multidimensional scaling for projecting coordinates +coord <- cbind(lon,lat) +coord <- cmdscale(GeoDist(coord)) +colnames(coord) <- c('lon','lat') + +## Transform data if necessary +xdf <- data.frame(y = l1, + ly = log(l1), + area = scale(log(area)), + wb = scale(log(wb)), + stream = scale(log(stream)), + map = scale(log(map)), + coord) + + +## select a validation and training set +set.seed(9382) +vid <- runif(nrow(xdf)) > .8 +tid <- !vid + +response <- xdf[vid,'ly'] + +# formula of the relationship between flood quantile and descriptors +fphy0 <- ly ~ area + map + wb + stream +fphy1 <- log(y) ~ area + map + poly(wb,2) + poly(stream,2) +fphy2 <- log(y) ~ area + map + wb + stream + +fsimilarity <- ~ area + map +fkriging <- ~ lon + lat + +## Fit a local regression model +fit0 <- FitRoi(x = xdf[tid,], xnew = xdf[vid,], nk = 60, + phy = fphy0, similarity = fsimilarity) + +sd(response - fit0$pred) +plot(response, fit0$pred);abline(0,1) + +fit1 <- FitRoi(x = xdf[tid,], xnew = xdf[vid,], nk = 60, + phy = fphy1, similarity = fsimilarity) + +sd(response - fit1$pred) +plot(response, fit1$pred);abline(0,1) + +fit2 <- FitRoi(x = xdf[tid,], xnew = xdf[vid,], nk = 60, + phy = fphy2, similarity = fsimilarity) + +expect_equal(fit0$pred, fit2$pred) +expect_true(cor(fit2$pred, fit1$pred) > .99) +expect_true(sd(response - fit1$pred) < .5) + +expect_equal(class(fit1),'roi') +expect_true(all(names(fit1) == c('call','pred'))) +expect_true(all(names(fit1$call) == + c('nk','npred','nsite','ker','kriging','phy','similarity'))) + +expect_equal(length(fit1$pred), sum(vid)) + +##Verify the se option +fit1 <- FitRoi(x = xdf[tid,], xnew = xdf[vid,], nk = 60, + phy = fphy1, similarity = fsimilarity, se = TRUE) + +expect_equal(length(fit1$pred), length(fit1$pred.se)) +expect_true(all(names(fit1) == c('call','pred','pred.se'))) + +print(fit1) +##-------------------------- +## Using kriging +##--------------------------- + +## Refit the model and perform the kriging of the residuals +fitk <- FitRoi(x = xdf[tid,], + xnew = xdf[vid, ], + nk = 60, + phy = fphy1, + similarity = fsimilarity , + kriging = fkriging, + model = 'Exp') + +lname <- c("call", "phy", "fitted", "resid", "vgm", "model", "pred", 'krige') +expect_true(all(names(fitk) == lname)) + +expect_true(max(abs(fitk$phy + fitk$krige - fitk$pred)) <1e-8 ) +expect_true(max(abs(fitk$fitted + fitk$resid - xdf$ly[tid])) <1e-8) + +expect_true(sd(response - fitk$pred) < .4) + +expect_equal(as.character(fitk$model[2,1]),'Exp') + +## Test with another kriging model ans SE +fitk <- FitRoi(x = xdf[tid,], + xnew = xdf[vid, ], + nk = 60, + phy = fphy1, + similarity = fsimilarity , + kriging = fkriging, + model = 'Sph', se = TRUE) + +expect_equal(as.character(fitk$model[2,1]),'Sph') + +print(fitk) + +expect_equal(length(fitk$phy),length(fitk$phy.se)) +expect_equal(length(fitk$fitted),length(fitk$fitted.se)) +expect_equal(length(fitk$krige),length(fitk$krige.se)) + +## Pass a kriging model directly +fitk2 <- FitRoi(x = xdf[tid,], + xnew = xdf[vid, ], + nk = 60, + phy = fphy1, + similarity = fsimilarity , + kriging = fkriging, + model = fitk$model) + +expect_equal(fitk2$model,fitk$model) +expect_equal(fitk2$pred,fitk$pred) + +##------------------------------ +## testing predict and residual +##------------------------------ + +out <- predict(fit1, xdf[tid,]) +expect_equal(length(out), sum(tid)) + +out <- predict(fit1, xdf) +expect_equal(length(out), nrow(xdf)) + +##Catch error with Not enough site +expect_error(predict(fit1, xdf[1:60,])) + +## The same output wheen fold is passed + +out1 <- predict(fit1, xdf) +expect_true(any(out1 != out)) + +kf <- sample(rep_len(1:5, nrow(xdf))) + +out1 <- predict(fit1, xdf, fold = kf) +out2 <- predict(fit1, xdf, fold = kf) +expect_equal(out1, out2) + +## check residuals +res <- residuals(fit1, xdf, fold = kf) +res2 <- out1 - log(xdf$y) +expect_equal(res, res2) + +## with kriging +out <- predict(fitk, xdf) +expect_equal(length(out), nrow(xdf)) + + +detach(flowUngauged) diff --git a/tests/testthat/test_rfa_Intersite.R b/tests/testthat/test_rfa_Intersite.R new file mode 100644 index 0000000..17dd488 --- /dev/null +++ b/tests/testthat/test_rfa_Intersite.R @@ -0,0 +1,127 @@ +############################################################################## +# Testing intersite function +# Martin Durocher +############################################################################# + +library(lmomRFA) + +## Set simulation data +set.seed(0) + +data(flowUngauged) +lmom5 <- flowUngauged[1:5, c('l1','lcv','lsk')] +lmom20 <- flowUngauged[1:20, c('l1','lcv','lsk')] + +coord5 <- replicate(2,runif(5)) +h5 <- as.matrix(dist(coord5)) + +coord20 <- replicate(2,runif(20)) +h20 <- as.matrix(dist(coord20)) + +colnames(coord5) <- colnames(coord20) <- c('lon','lat') + +## Create a simulation of a large dataset +set.seed(8) + +corr.mat <- exp(-h20) +nrec0 <- sample(10001:10020) + +sim <- RegSim(lmom20, distr = 'gev', nrec = nrec0, + corr = corr.mat, long = TRUE) + +sim$site <- factor(sim$site) +lvl <- paste0('site_',1:20) +levels(sim$site) <- lvl + + +## ------------------------ +## Case emp +## ------------------------ + +smat <- DataWide(value ~ site + time, sim) + +ifit <- Intersite(smat, method = 'emp') + +expect_equal(ifit$method, 'emp') + +expect_equal(colnames(ifit$corr), lvl) +expect_equal(rownames(ifit$corr), lvl) + +expect_equal(colnames(ifit$model), lvl) +expect_equal(rownames(ifit$model), lvl) + +expect_true(ifit$para[1] >.1) +expect_null(ifit$distance) +expect_null(ifit$rmse) + +## test definite positivness +decomp <- chol(ifit$model) + +## verify that the correlation are good +mad <- mean(abs(as.vector(corr.mat - ifit$corr))) +expect_true(mad < 0.01) + +mad <- mean(abs(as.vector(ifit$model - ifit$corr))) +expect_true(mad < 1e-4) + +## Verify the minimum number of pairs + +sby <- split(sim,sim[,2]) +sby[[1]] <- sby[[1]][1:100,] +sby[[2]] <- sby[[2]][190:1000,] +sim1 <- do.call(rbind, sby) + +## If there is no common pairwise records +x1 <- DataWide(value ~ site + time, sim1) +ifit <- Intersite(x1, method = 'emp') +expect_true(is.na(ifit$corr[1,2])) + +## if there is less than 100 pairwise records +ifit <- Intersite(x1, method = 'emp', nmin = 100) +expect_true(is.na(ifit$corr[5,1])) + +## impute zero +ifit <- Intersite(x1, method = 'emp', nmin = 100, + na.sub = 'zero', defpos = FALSE) + +expect_equal(ifit$model[5,1], 0) + +## impute avg (default) +ifit <- Intersite(x1, method = 'emp', nmin = 100, + defpos = FALSE) + +expect_equal(ifit$model[5,1], ifit$para[1]) + +## correct for definite positivness +ifit <- Intersite(x1, method = 'emp', nmin = 100, + na.sub = 'zero') + +mad <- abs(ifit$model[5,1]-ifit$model[2,1]) +expect_true(mad > 1e-8) + +## ------------------------ +## Case method = exp +## ------------------------ + +## Fit the model and verify that a warning is issue if the label don't match +rownames(h20) <- colnames(h20) <- paste0(lvl,'0') + +x0 <- DataWide(value ~ site + time, sim) + +expect_warning(Intersite(x0, method = 'exp', distance = h20)) + +rownames(h20) <- colnames(h20) <- lvl +ifit <- Intersite(x0, method = 'exp', distance = h20) + +expect_equal(ifit$method, 'exp') + +expect_equal(names(ifit$para),c('nugget', 'range', 'smooth')) +mad <- max(abs(ifit$para - c(0,3,1))) +expect_true(mad < .05) + +mad <- mean(abs(as.vector(ifit$model-corr.mat))) +expect_true(mad < 0.01) + +mad <- mean(abs(as.vector(corr.mat - ifit$corr))) +expect_true(mad < 0.01) + diff --git a/tests/testthat/test_rfa_PoolRemove.R b/tests/testthat/test_rfa_PoolRemove.R new file mode 100644 index 0000000..f26bfd3 --- /dev/null +++ b/tests/testthat/test_rfa_PoolRemove.R @@ -0,0 +1,50 @@ +######################################################### +## Verify the removing sites +## Martin Durocher +######################################################### + +rm(list = ls()) +set.seed(20) + +## prepare a dataset +coord20 <- replicate(2,runif(20)) +h20 <- as.matrix(dist(coord20)) +colnames(coord20) <- c('lon','lat') + +para <- cbind(rep(100,20), 30, -.2) +distr <- c(rep('gev',18), rep('pe3',3)) +sim20 <- RegSim(para, distr = distr, nrec = 300, + lscale = TRUE, lmom = FALSE) + +fit1 <- FitRegLmom(sim20) + +## Remove no site +out1 <- PoolRemove(fit1, nmin = 30) +expect_equal(out1, fit1) + +## Remove one site +out1 <- PoolRemove(fit1, nmin = 19) +expect_equal(nrow(out1$lmom), 19) + +mid <- 20 +expect_equal(out1$nrec, fit1$nrec[-mid]) +expect_equal(out1$lmom, fit1$lmom[-mid,]) +expect_equal(length(out1$discord), length(fit1$discord[-mid])) + +expect_false(any(out1$para == fit1$para)) +expect_true(out1$stat[1] < fit1$stat[1]) + + +out1 <- PoolRemove(fit1, nmin = 15) +expect_true(out1$stat[1] < 2) + +out1 <- PoolRemove(fit1, ntot.min = 5900) +expect_true(nrow(out1$lmom) == 20) + +## The first site must be protected for removing +sim21 <- sim20[,c(20,2:19,1)] + +fit1 <- FitRegLmom(sim21) +out1 <- PoolRemove(fit1, nmin = 19) + +expect_equal(out1$lmom[1,],fit1$lmom[1,]) diff --git a/tests/testthat/test_rfa_SeasonStat.R b/tests/testthat/test_rfa_SeasonStat.R new file mode 100644 index 0000000..932763b --- /dev/null +++ b/tests/testthat/test_rfa_SeasonStat.R @@ -0,0 +1,22 @@ +###################################################### +## testing SeasonStat +## Martin Durocher +####################################################### + +## Verify that a known exemple work +fit <- SeasonStat(ex1$date) +expect_true(class(fit) == 'numeric') +ref <- c(-0.4259258, 0.8665048, 2.0276568, 0.9655275) +expect_true(all(abs(ref-fit) < 1e-5)) + +## verify that multiple stations works +fit2 <- SeasonStat(date~station, ex2) +expect_true(class(fit2) == 'matrix') +expect_true(all(rbind(fit,fit) == fit2)) + +## Verify that using a date in characters works +expect_equal(fit,SeasonStat(as.character(ex1$date))) + +## return an error if it is not a date +expect_error(SeasonStat(1:5)) +expect_error(SeasonStat(month.name)) diff --git a/tests/testthat/test_rfa_amax.R b/tests/testthat/test_rfa_amax.R new file mode 100644 index 0000000..a45d0df --- /dev/null +++ b/tests/testthat/test_rfa_amax.R @@ -0,0 +1,30 @@ +###################################################### +## testing Amax functions +## Martin Durocher +####################################################### + +rm(list = ls()) + +uu <- (1:100 - .5) /100 + +x <- rAmax(10, c(0,1,0), 'gno') +expect_equal(length(x), 10) + +x <- rAmax(10, c(0,1,0), 'gev') +expect_equal(length(x), 10) + +q <- qAmax(uu, c(100,30,-.5), 'gev') +p <- pAmax(q, c(100,30,-.5), 'gev') +expect_equal(uu,p) + +q <- qAmax(uu, c(100,30,-.5), 'gno') +p <- pAmax(q, c(100,30,-.5), 'gno') +expect_equal(uu,p) + +AIC0 <- -2*sum(dAmax(f0$data, f0$para, f0$distr, log = TRUE)) + 6 +expect_equal(AIC0, AIC(f0)) + +f0 <- FitAmax(q, 'gum', method = 'lmom', varcov = FALSE) +AIC0 <- -2*sum(dAmax(f0$data, f0$para, f0$distr, log = TRUE)) + 4 +expect_equal(AIC0, AIC(f0)) + diff --git a/tests/testthat/test_rfa_fgpa.R b/tests/testthat/test_rfa_fgpa.R new file mode 100644 index 0000000..7e4f178 --- /dev/null +++ b/tests/testthat/test_rfa_fgpa.R @@ -0,0 +1,24 @@ +############################################################## +## Test the low level function to fit Generalized Pareto +## Martin Durocher +############################################################### + +x <- qgpa(seq(0.01,.99, l = 1001)) + +expect_equivalent(signif(fgpaLmom(x)), c(1.0374800, 0.0756554)) +expect_equivalent(signif(fgpa1d(x)), c(1.067500, 0.105857)) +expect_equivalent(signif(fgpa2d(x)), c(1.067550, 0.105841)) + +## verify that take initial value +expect_length(fgpa2d(x, par0 = c(1.07,.106)),2) + +expect_true(all(names(f1 <- fgpa1d(x, sol = TRUE)) == c('par','varcov'))) +expect_true(all(names(f2 <- fgpa2d(x, sol = TRUE)) == c('par','varcov'))) + +expect_equivalent(as.numeric(f1$varcov), + c(0.002035810, 0.000953542, 0.000953542, 0.000798693)) + +## +x <- qgpa(seq(0.01,.99, l= 1001), 1, -1) +expect_true(fgpa1d(x)[2] < -.5) +expect_true(fgpa2d(x)[2] > -.5) \ No newline at end of file diff --git a/tests/testthat/test_rfa_gof.R b/tests/testthat/test_rfa_gof.R new file mode 100644 index 0000000..7b644ec --- /dev/null +++ b/tests/testthat/test_rfa_gof.R @@ -0,0 +1,32 @@ +################################################# +## Test function GofTest +## Martin Durocher +################################################## + +set.seed(1) + +u <- seq(1000)/1001 +x <- qAmax(u, c(100,30,-.1), 'gev') + +fit <- FitAmax(x, 'gev', varcov = FALSE) +out <- GofTest(fit, nsim = 5) +expect_true(out$pvalue > .9) +expect_equal(signif(out$stat), 0.00575069) + +fit <- FitAmax(u, 'gev', varcov = FALSE) +out <- GofTest(fit, nsim = 5) +expect_true(out$pvalue < .1) + +## Just make sure that they don't create error +fit <- FitAmax(x, 'glo', method = 'mle', varcov = FALSE) +GofTest(fit, method = 'ad', nsim = 5) + +fit <- FitAmax(x, 'pe3', method = 'lmom', varcov = FALSE) +GofTest(fit, method = 'shapiro', nsim = 5) + +## For POT +x <- qgpa(u, 1.1, .1) +f <- FitPot(x , u = 0) +out <- GofTest(f) +expect_equal(signif(out$stat), 0.0116331) +GofTest(f, method = 'ad', nsim = 5) diff --git a/tests/testthat/test_rfa_gpa.R b/tests/testthat/test_rfa_gpa.R new file mode 100644 index 0000000..a530abb --- /dev/null +++ b/tests/testthat/test_rfa_gpa.R @@ -0,0 +1,50 @@ +################################################# +## Test basic functions for generalized pareto distribution +## Martin Durocher +################################################## + +## qgpa and pgpa are inverse +u <- seq(0.001,.999, l = 21) + +for(kk in seq(-.5,1,l=31)){ + q <- qgpa(u,1,0) + expect_equal(pgpa(q,1,0), u) +} + +expect_equal(qgpa(.25,1,0),qgpa(.75,1,0, lower.tail = FALSE)) + +## Verify lower tail option +q <- qgpa(u,1,.1, lower.tail = FALSE) +expect_equal(expect_equal(pgpa(q,1,.1, lower.tail = FALSE), u), u) + +## validation with evd package +expect_equal(signif(dgpa(.5,1,0)), 0.606531) +expect_equal(signif(dgpa(.2,1,-.1, log = TRUE)), -0.217829) +expect_equal(signif(dgpa(.25,.5,-.2)), 1.12895) +expect_equal(signif(dgpa(.75, 1.5,.2)), 0.437400) + +expect_equal(signif(qgpa(.5,1,0)), 0.693147) +expect_equal(signif(qgpa(.25,.5,-.2)), 0.14806) +expect_equal(signif(qgpa(.75, 1.5,.2)), 1.81606) + +## Behaviour with value 0-1 and Inf +expect_error(qgpa(-1,1,0)) +expect_error(qgpa(2,1,0)) +expect_error(qgpa(.5,-1,0)) +expect_error(qgpa(.5,1,c(0,0))) + +expect_equal(qgpa(0,1,0),0) +expect_equal(qgpa(1,1,0),Inf) +expect_equal(pgpa(-Inf,1,0),0) +expect_equal(pgpa(Inf,1,0),1) + +# monotone +expect_true(all(diff(pgpa(u,1,0))>0 ) ) + +## random value +expect_length(rgpa(5,1,0) , 5) + +set.seed(1) +x <- pgpa(rgpa(5000,1,0),1,0) +expect_lt(max(abs(sort(x-.5)/5000)), 1e-4) + diff --git a/tests/testthat/test_rfa_pot.R b/tests/testthat/test_rfa_pot.R new file mode 100644 index 0000000..a38dfcb --- /dev/null +++ b/tests/testthat/test_rfa_pot.R @@ -0,0 +1,122 @@ +############################################################################# +## Pad POT +############################################################################# + +dt <- seq(as.Date('2000/02/02'), as.Date('2010/12/20'), 'days') +xd <- data.frame(dt = dt, x = seq_along(dt)) + +## pad the begining and the end +xp <- PadPOT(x~dt, xd) + +dref <- as.Date('2005/05/05') +v1 <- xp[xp[,1] == dref,2] +v2 <- xd[xd[,1] == dref,2] + +expect_equal(colnames(xp),colnames(xd)) + +expect_equal(xp[1,2],0) +expect_equal(xp[nrow(xp),2],0) +expect_equal(v1,v2) +expect_equal(unique(diff(xp[,1])),1) + +## Affect the right value +xp <- PadPOT(x~dt, xd, value = 5) + +expect_equal(xp[1,2],5) +expect_equal(xp[nrow(xp),2],5) + + +## Verify inner missing + +xd <- xd[!(xd[,1] == dref),] + +xp <- PadPOT(x~dt, xd, value = 5) +v1 <- xp[xp[,1] == dref,2] + +expect_equal(xp[1,2],5) +expect_equal(xp[nrow(xp),2],5) +expect_equal(v1,5) + +## Verify the sorting + +xd <- xd[sample.int(nrow(xd)),] +xp <- PadPOT(x~ dt, xd, value = 5) +v1 <- xp[xp[,1] == dref,2] + +expect_equal(xp[1,2],5) +expect_equal(xp[nrow(xp),2],5) +expect_equal(v1,5) +expect_equal(unique(diff(xp[,1])),1) + +############################################################################# +## Basic GPA fiting +############################################################################# + + +## Correspondance between method +xd <- qgpa(1:100/101, 1, -.1) +expect_equivalent(FitPot(xd, u = 0, method = 'mle')$estimate, + fgpa1d(xd)) +expect_equivalent(FitPot(xd, u = 0, method = 'mle2')$estimate, + fgpa2d(xd)) +expect_equivalent(FitPot(xd, u = 0, method = 'lmom')$estimate, + fgpaLmom(xd)) + +expect_equivalent(FitPot(xd, u = 0, method = 'mle')$varcov, + fgpa1d(xd, sol = TRUE)$varcov) + +expect_equivalent(FitPot(xd, u = 0, method = 'mle2')$varcov, + fgpa2d(xd, sol = TRUE)$varcov) + +fit <- FitPot(xd, u = 0, method = 'mle') + +expect_equal(coef(fit),fit$estimate) +expect_equal(vcov(fit),fit$varcov) + +############################################################################# +## declustering +############################################################################# + +x <- flowStJohn$flow + +## Verify the local optimum function +expect_equal(id1 <- which.lmax(x[1:100]), + c(1, 5, 9, 13, 21, 27, 43, 52, 59, 61, 70, 76, 84, 86)) + +expect_equal(id2 <- which.lmin(x[1:100]), + c(4, 12, 18, 23, 33, 38, 40, 47, 58, 60, 66, 69, 75, 83, 90, 100)) + +expect_equal(x[id1], lmax(x[1:100])) +expect_equal(x[id2], lmin(x[1:100])) + +x0 <- x +x0[599] <- NA ##988 + +expect_equal(which.lmax(x0[1:1000]), which.lmax(x[1:1000])) + +## validate with evd::clusters +expect_equal(which.clusters(x[1:1000], u = 1000, r = 5), + c(206, 402, 415, 562, 586, 949)) + +## different length x and dt + +expect_error(which.clusters(x[1:1000], 1:999, u = 1000, r = 5)) + +## declustering of the FitPot correspond to function "which" +id_wrc <- which.floodPeaks(x, u = 900, r = 14, ini = 'wrc') +fit <- FitPot(x, u = 900, r = 14, declust = 'wrc') +expect_equal(fit$time, id_wrc) + +id_run <- which.clusters(x, u = 900, r = 14) +fit <- FitPot(x, u = 900, r = 14, declust = 'run') +expect_equal(fit$time, id_run) + +############################################################################## +## Find Threshold function +############################################################################## + +lstu <- seq(600,1500,20) + +obj <- SearchTresh(flow~date, flowStJohn, u = lstu, declust = 'wrc', r = 14) + + diff --git a/tests/testthat/test_rfa_predict_amax.R b/tests/testthat/test_rfa_predict_amax.R new file mode 100644 index 0000000..a157e2f --- /dev/null +++ b/tests/testthat/test_rfa_predict_amax.R @@ -0,0 +1,33 @@ +###################################################### +## testing predict.amax function +####################################################### +rm(list = ls()) + +x <- ExtractAmax(flow~date,flowStJohn, tol = 355) + +fit <- FitAmax(x$flow,'gev', method = 'mle') + +rp <- 1-1/c(10,100) +rlev <- predict(fit, q = rp) +expect_equal(signif(rlev), c(3356.64, 4250.40)) +expect_is(rlev, 'numeric') + +out <- predict(fit, se = TRUE, ci = 'delta') +expect_true(all(colnames(out) == c('pred','se','lower','upper'))) +expect_is(out, 'data.frame') + +out <- predict(fit, se = FALSE, ci = 'delta') +expect_true(all(colnames(out)== c('pred','lower','upper'))) + +out <- predict(fit, se = TRUE) +expect_true(all(colnames(out) == c('pred','se'))) + + +## The bootstrap sample used for CI are returned +fit <- FitAmax(x$flow, distr = 'gev', varcov = FALSE) +boot <- predict(fit, rp, se = FALSE, ci = 'boot', + nsim = 5, out.matrix = TRUE) + +expect_is(boot, 'list') +expect_true(all(names(boot) == c('pred','para','qua'))) + diff --git a/tests/testthat/test_rfa_predict_fpot.R b/tests/testthat/test_rfa_predict_fpot.R new file mode 100644 index 0000000..159c13d --- /dev/null +++ b/tests/testthat/test_rfa_predict_fpot.R @@ -0,0 +1,40 @@ +###################################################### +## testing predict.fpot functions +## Martin Durocher +####################################################### + +rm(list = ls()) + +uu <- (1:10000)/10001 +xd <- qgpa(uu, 1, -.1) + +## verify the predict output +fit <- FitPot(xd, u = 5, varcov = F, method = 'lmome',unit = 100) +expect_error(pp <- predict(fit, se = TRUE)) + +## verif the output when se is returned +fit <- FitPot(xd, u = 5) +pp <- predict(fit, rt = c(2,20,100), se = TRUE) +expect_equal(dim(pp), c(3,2)) +expect_equal(rownames(pp), as.character(c(2,20,100))) + +## verify delta confidence interval +pp <- predict(fit, se = TRUE, ci = 'delta', alpha = .1) +expect_equal(pp$pred + qnorm(.95) * pp$se, pp$upper) +expect_equal(pp$pred - qnorm(.95) * pp$se, pp$lower) +expect_equal(colnames(pp), c('pred','se','lower','upper')) + +se.ref <- c(0.836256, 1.371230, 1.878190, 2.480310, 3.434020, 4.284160) +expect_equal(signif(pp$se), se.ref) + +## verify profile confidence interval +pp <- predict(fit, rt = c(10,100), ci = 'profile') +pp.ref <- matrix(nrow = 2, ncol = 3, byrow = TRUE, + data = c(12.1644, 10.8399, 14.8732, + 16.9163, 13.3549, 27.1540)) + +expect_true(all(signif(pp)==pp.ref)) + +## verify profile confidence interval +pp <- predict(fit, ci = 'boot', nsim = 10) +expect_equal(dim(pp), c(6,3)) diff --git a/tests/testthat/test_rfa_predict_reglmom.R b/tests/testthat/test_rfa_predict_reglmom.R new file mode 100644 index 0000000..c6d8401 --- /dev/null +++ b/tests/testthat/test_rfa_predict_reglmom.R @@ -0,0 +1,54 @@ +######################################################### +## Verify the predict.reglmom function +## Martin Durocher +######################################################### + +rm(list = ls()) +set.seed(48) + +## Define evaluation functions +rxd <- function(x,y) max(abs(1-y/x)) +axd <- function(x,y) max(abs(y-x)) +rmad <- function(x,y) mean(abs(1-y/x)) +mad <- function(x,y) mean(abs(y-x)) + +coord20 <- replicate(2,runif(20)) +h20 <- as.matrix(dist(coord20)) +colnames(coord20) <- c('lon','lat') + +para <- cbind(rep(100,20), 30, 0) +sim20 <- RegSim(para, distr = 'gev', nrec = 1e4, + lscale = TRUE, lmom = FALSE) + +sim20 <- FindNearest(sim20, h20[2,],15) + +fit1 <- FitRegLmom(sim20) + +q0 <- c(.7,.93) +q1 <- .1 +q2 <- c(.5, .8, .9, .95, .98, .99) + +hat0 <- lmom::quagev(q0,c(100,30,0)) +hat1 <- lmom::quagev(q1,c(100,30,0)) +hat2 <- lmom::quagev(q2,c(100,30,0)) + +## verify output format +out <- predict(fit1, q0) +expect_equal(length(out), 2) +expect_equal(class(out), 'numeric') + +out <- predict(fit1,q0, ci = TRUE, nsim = 5) +expect_equal(dim(out),c(2,4)) +expect_equal(class(out),'matrix') +expect_equal(colnames(out),c('pred','se','lower','upper')) +expect_equal(rownames(out), c('0.70','0.93')) + + +## Verify prediction +expect_true(rxd(predict(fit1, q0),hat0) < 0.01) +expect_true(rxd(predict(fit1, q1),hat1) < 0.01) +expect_true(rxd(predict(fit1),hat2) < 0.01) + +out <- predict(fit1,q1, ci = TRUE, nsim = 5) +expect_equal(class(out),'numeric') +expect_equal(length(out), 4) diff --git a/tests/testthat/test_rfa_regsim.R b/tests/testthat/test_rfa_regsim.R new file mode 100644 index 0000000..e3f6160 --- /dev/null +++ b/tests/testthat/test_rfa_regsim.R @@ -0,0 +1,214 @@ +############################################################################## +# Testing simulation function RegSim +# Martin Durocher +############################################################################# + +library(lmomRFA) +rm(list = ls()) + +## Import data for testing +set.seed(0) + +data(flowUngauged) +lmom5 <- flowUngauged[1:5, c('l1','lcv','lsk')] +lmom20 <- flowUngauged[1:20, c('l1','lcv','lsk')] + +coord5 <- replicate(2,runif(5)) +h5 <- as.matrix(dist(coord5)) + +coord20 <- replicate(2,runif(20)) +h20 <- as.matrix(dist(coord20)) + +colnames(coord5) <- colnames(coord20) <- c('lon','lat') + +## -------------------------------- ## +## Section should work correctly ## +## -------------------------------- ## + +## Define evaluation functions +rxd <- function(x,y) max(abs(1-y/x)) +axd <- function(x,y) max(abs(y-x)) +rmad <- function(x,y) mean(abs(1-y/x)) +mad <- function(x,y) mean(abs(y-x)) + +## Verify that the right dimension is output +sim5 <- RegSim(lmom5, distr = 'gev', nrec = 3) +sim20 <- RegSim(lmom20, distr = 'pe3', nrec = 7) + +expect_equal(dim(sim5), c(3,5)) +expect_equal(dim(sim20), c(7,20)) +expect_equal(class(sim5), 'matrix') +expect_null(colnames(sim5)) +expect_null(rownames(sim5)) + +## Verify that record length are correct +sim <- RegSim(lmom5, distr = 'gev', nrec = 11:15) +sim.n <- apply(!apply(sim,2,is.na),2, sum) + +expect_equal(sim.n, 11:15) + +## Verify that the long format work + +sim <- RegSim(lmom5, distr = 'gno', nrec = 11:15, long = TRUE) +sim.agg <- aggregate(value ~ site, sim, length) + +expect_equal(dim(sim.agg),c(5,2)) +expect_equal(sim.agg[,2],11:15) +expect_equal(names(sim.agg), c('site','value')) +expect_equal(class(sim.agg),'data.frame') + +## Verify that using constant correlation works +set.seed(1) + +fun <- function(rho){ + sim <- RegSim(lmom5, distr = 'gev', nrec = 1e5, corr = rho) + corr <- cor(sim, method = 'spearman') + corr <- 2*sin(pi/6*corr) + axd(corr[lower.tri(corr)], rho) +} + +expect_true(fun(0) < .01) +expect_true(fun(.4) < .01) +expect_true(fun(.9) < .01) + + +## Verify that correlation coefficients are of correct +set.seed(2) + +mat.corr <- exp(-h5) + +fun <- function(rho, L = FALSE){ + sim <- RegSim(lmom5, distr = 'gev', nrec = 1e5, corr = rho, corr.sqrt = L) + corr <- cor(sim, method = 'spearman') + corr <- 2*sin(pi/6*corr) + axd(corr,rho) +} + +expect_true(fun(mat.corr) <.01) + +## Verify that correlation coefficients are correct using corr.sqrt + +set.seed(2) +mat.corr.sqrt <- chol(mat.corr) +sim <- RegSim(lmom5, distr = 'gev', nrec = 1e5, corr = mat.corr.sqrt, corr.sqrt = TRUE) +corr <- cor(sim, method = 'spearman') +corr <- 2*sin(pi/6*corr) + +expect_true(axd(mat.corr,corr) <.01) + +## Verify that the L-moments are correct + +set.seed(3) + +sim <- RegSim(lmom5, distr = 'pe3', nrec = 1e5) + +sim.lmom <- t(apply(sim, 2, samlmu)) + +expect_true(rmad(lmom5[,1],sim.lmom[,1]) < 0.01) +expect_true(rmad(lmom5[,2],sim.lmom[,2]/sim.lmom[,1]) < 0.01) +expect_true(rmad(lmom5[,3],sim.lmom[,3]) < 0.01) + +## Verify that using lscale = TRUE works +set.seed(4) + +lmom5.mod <- lmom5 +lmom5.mod[,2] <- lmom5[,1] * lmom5[,2] + +sim.mod <- RegSim(lmom5.mod, distr = 'gno', nrec = 1e5, lscale = TRUE) + +sim.mod.lmom <- t(apply(sim.mod, 2, samlmu)) + +expect_true(rmad(lmom5[,1],sim.mod.lmom[,1]) < 0.01) +expect_true(rmad(lmom5[,2],sim.mod.lmom[,2]/sim.lmom[,1]) < 0.01) +expect_true(rmad(lmom5[,3],sim.mod.lmom[,3]) < 0.01) + +## Verify that passing parameter directly works +set.seed(5) + +para5 <- t(apply(lmom5.mod, 1, lmom::pelgno)) + +sim <- RegSim(para5, distr = 'gno', nrec = 1e5, lmom = FALSE) + +sim.lmom <- t(apply(sim, 2, samlmu)) + +expect_true(rmad(lmom5[,1],sim.lmom[,1]) < 0.01) +expect_true(rmad(lmom5[,2],sim.lmom[,2]/sim.lmom[,1]) < 0.01) +expect_true(rmad(lmom5[,3],sim.lmom[,3]) < 0.01) + +## Verify the right distribution is selected +set.seed(6) + +lmm <- c(100, 30, .2) +distr <- c('gev','gno','glo','pe3') +para <- rbind(pelgev(lmm), + pelgno(lmm), + pelglo(lmm), + pelpe3(lmm)) + +lmom <- rbind(lmrgev(para[1,],4), + lmrgno(para[2,],4), + lmrglo(para[3,],4), + lmrpe3(para[4,],4)) + +sim <- RegSim(para, distr = distr, nrec = 1e5, lmom = FALSE) + +sim.lmom <- t(apply(sim, 2, samlmu)) +expect_true(rmad(lmom[,1],sim.lmom[,1]) < 0.01) +expect_true(rmad(lmom[,2],sim.lmom[,2]) < 0.01) +expect_true(rmad(lmom[,3],sim.lmom[,3]) < 0.01) +expect_true(rmad(lmom[,4],sim.lmom[,4]) < 0.01) + +sim <- RegSim(lmom, distr = distr, nrec = 1e5, lscale = TRUE) +sim.lmom <- t(apply(sim, 2, samlmu)) + +expect_true(rmad(lmom[,1],sim.lmom[,1]) < 0.01) +expect_true(rmad(lmom[,2],sim.lmom[,2]) < 0.01) +expect_true(rmad(lmom[,3],sim.lmom[,3]) < 0.01) +expect_true(rmad(lmom[,4],sim.lmom[,4]) < 0.01) + + +## Verify behavior with kappa distribution +set.seed(7) + +sim <- RegSim(lmom[-3,], distr = 'kap', nrec = 1e5, lscale = TRUE) + +sim.lmom <- t(apply(sim, 2, samlmu)) +expect_true(rmad(lmom[-3,1],sim.lmom[,1]) < 0.01) +expect_true(rmad(lmom[-3,2],sim.lmom[,2]) < 0.01) +expect_true(rmad(lmom[-3,3],sim.lmom[,3]) < 0.01) +expect_true(rmad(lmom[-3,4],sim.lmom[,4]) < 0.01) + +sim <- RegSim(lmom, distr = c('nor','exp','gum','kap'), + nrec = 10, lscale = TRUE) +expect_equal(dim(sim), c(10,4)) + +## -------------------------------- ## +## Section Must raised an error ## +## -------------------------------- ## + +## Verify when length of arguments are not the right format +expect_error(RegSim(lmom5, distr = 'gev', nrec = c(10,10))) +expect_error(RegSim(lmom5, distr = c('gev','glo'), nrec = 10)) +expect_error(RegSim(lmom5, distr = 'kap', nrec = 10)) + +## Verify robustess to missing values +lmom5.mod <- lmom5 +lmom5.mod[3,3] <- NA + +expect_error(RegSim(lmom5.mod, distr = 'gev', nrec = 10)) + +expect_error(RegSim(lmom5, distr = c('gum',NA,'gev','pe3',NA), nrec = 10)) +expect_error(RegSim(lmom5, distr = NA, nrec = 10)) +expect_error(RegSim(lmom5, distr = 'gev', nrec = NA)) +expect_error(RegSim(lmom5, distr = 'gev', nrec = c(1:4,NA))) + +corr.mod <- matrix(.4,5,5) +diag(corr.mod) <- 1 +corr.mod[2,1] <- NA + +expect_error(RegSim(lmom5, distr = 'gev', nrec = 10, corr = NA)) +expect_error(RegSim(lmom5, distr = 'gev', nrec = 10, corr = corr.mod)) + +## Correlation must be positive definite +expect_error(RegSim(lmom5.mod, distr = 'gev', nrec = 10, corr = -1)) + diff --git a/vignettes/Pauls_demo.html b/vignettes/Pauls_demo.html index ddb46fb..2635931 100644 --- a/vignettes/Pauls_demo.html +++ b/vignettes/Pauls_demo.html @@ -19,10 +19,10 @@ - - @@ -291,9 +271,6 @@ code > span.fu { color: #900; font-weight: bold; } code > span.er { color: #a61717; background-color: #e3d2d2; } - - - @@ -302,8 +279,8 @@

    Demonstration of Paul’s CSHShydRology functions

    -

    Paul Whitfield

    -

    June 17, 2018

    +

    Paul Whitfield

    +

    June 17, 2018

    @@ -365,10 +342,10 @@

    June 17, 2018

    Which is pretty typically constructed hydrograph. The colours show the presence of some quality flags, but I find this form too time compressed.

    So I use a function to look at the data. First a raster plot of the data.

    -

    +

    Then a qa plot that shows the flags.

    -

    +

    Lots of ice cover and a couple of year with long periods of estimated flows. I am troulbed with 1999 where there seems to be no ice cover. An anlyst might want to query this with Water Survey of Canada.

    Now we can look at other things about the data.

    First a regime plot, and then a flow duration curve. First since we are going to be needing day of year or day of water year we create a dataframe that contains those using the dates in mdata. THese functions are more investigative and let the user assign their own titles. For here, I get one using the function get_station to retrieve the information from HYDAT_list.

    @@ -376,11 +353,11 @@

    June 17, 2018

    -

    +

    -

    +

    -

    +

    Leith and Whitfield (1998) and Whitfield and Cannon (2000 a&b)

    In the 1990’s there were starting to be a few papers on impacts of climate change on hydrology. Rory Leith and I spent a long time looking into how one could show differences is seasonal patterns as in much of BC mean, minimum, and maximum flows were not changing. We could see shifts in monthly data that were not significant and daily flows were simply too noisy so we implemented a method of binning days together so we could compare a period of days from one decade to another. This is implemented in the binned_MannWhitney function. Alex Cannon and I then applied that method to all of Canada and my students and I later applied it to Arctic temepratures, Canadian climate date, and New Mexico streamflow. Significant increases (decreases) are shown by blue (red) symbols.

    @@ -411,10 +388,10 @@

    Leith and Whitfield (1998) and Whitfield and Cannon (2000 a&b)

    ylims <- c(0, max(mplot$series$period1, mplot$series$period2)) plot(mplot$series$period, mplot$series$period1, pch = 21, col = "blue", type = "b", ylim = ylims, main = mplot$StationID) points(mplot$series$period, mplot$series$period2, pch = 21, col = "green", bg = scol[mplot$series$code], type = "b")
    -

    +

    In 1999-2000+ there was a lot of public interest in this topic, as there is today. One issue was that the public was not always able to grasp the details to see the big picture. So Alex and I created a polar version of the output that lets the view see increases and decreases and statistical significance in sort of a cartoon. Red is used for signifi

    -

    +

    diff --git a/vignettes/hydrograph_plot.html b/vignettes/hydrograph_plot.html index 9c40fa3..6dd0b90 100644 --- a/vignettes/hydrograph_plot.html +++ b/vignettes/hydrograph_plot.html @@ -20,46 +20,256 @@ - + @@ -81,52 +291,52 @@

    hydrograph_plot

    Plotting daily streamflows, without and with winter shading

    Note that the value returned by the function, if successful, is TRUE

    -
    daily_flows <- W05AA008[, c(3, 4)]
    -result1 <- hydrograph_plot(flows = daily_flows, winter_shading = FALSE)
    -

    -
    result2 <- hydrograph_plot(flows = daily_flows, winter_shading = TRUE)
    -

    + +

    + +

    The period of the plot can be restricted by setting the option prd, nwhich is a string like “2011-10- 01/2012-09-30” indicating the beginning and end dates of the plot.

    -
    myprd <- "2000-01-01/2000-12-31"
    -result3 <- hydrograph_plot(
    -  flows = daily_flows, winter_shading = TRUE,
    -  prd = myprd
    -)
    -

    + +

    Adding Precipitation

    You can also plot precipitation data. In this example fake precipitation data are used.

    -
    precip <- data.frame("Date" = daily_flows$Date, "precip" = abs(rnorm(nrow(daily_flows))) * 10)
    -result4 <- hydrograph_plot(
    -  flows = daily_flows, precip = precip, winter_shading = TRUE,
    -  prd = myprd
    -)
    -

    + +

    The axes of the precipitation and flow can be modified as needed to prevent overlap of the two series, if desired. The default is to multiply the precipitation range by 1.5 of the maximum value, however the range can be multiplied by any positive value to prevent this.

    -
    result5 <- hydrograph_plot(
    -  flows = daily_flows, precip = precip, winter_shading = TRUE,
    -  prd = myprd, range_mult_precip = 2, range_mult_flow = 1.8
    -)
    -

    + +

    Changing Axis Labels

    Only the default y-axis label can be over-ridden. Note that you can use a Unicode character or an expression to get a superscripted 3.

    -
    ylab <- expression(paste("Discharge [m"^"3", "/s]"))
    -par(mgp = c(2.5, 1, 0)) # move axis labels closer to plot
    -result6 <- hydrograph_plot(
    -  flows = daily_flows, precip = precip,
    -  prd = myprd, ylabel = ylab
    -)
    -

    + +

    The precipitation label can also be adjusted.

    -
    ylab_precip <- "Rainfall [mm]"
    -result7 <- hydrograph_plot(
    -  flows = daily_flows, precip = precip,
    -  prd = myprd, precip_label = ylab_precip
    -)
    -

    + +

    Other format options

    @@ -137,21 +347,21 @@

    Other format options

  • forcing the y axis to start at exactly zero
  • For example:

    -
    result8 <- hydrograph_plot(
    -  flows = daily_flows, precip = precip,
    -  prd = myprd, leg_pos = "right"
    -) # change legend to the right side
    -

    -
    result9 <- hydrograph_plot(
    -  flows = daily_flows, precip = precip,
    -  prd = myprd, leg_box = TRUE
    -) # add legend fill and outline
    -

    -
    result10 <- hydrograph_plot(
    -  flows = daily_flows, precip = precip,
    -  prd = myprd, zero_axis = F
    -) # default plot outside of function with buffer around axis
    -

    + +

    + +

    + +

    diff --git a/vignettes/rfa_amax.R b/vignettes/rfa_amax.R new file mode 100644 index 0000000..3b4b788 --- /dev/null +++ b/vignettes/rfa_amax.R @@ -0,0 +1,57 @@ +## ------------------------------------------------------------------------ +library(CSHShydRology) + +## Extract the annual maximums +anData <- ExtractAmax(flow ~ date, flowStJohn, tol = 365) + +## ------------------------------------------------------------------------ +fitMle <- FitAmax(anData$flow, 'gev', method = 'mle') +print(fitMle) + +## ------------------------------------------------------------------------ +## Fit GEV distribution using L-moments +fitLmm <-FitAmax(anData$flow, 'gev', method = 'lmom', varcov = FALSE) + +## ------------------------------------------------------------------------ +## Flood quantiles of 10 and 100 return periods +predict(fitMle, q = c(.9,.99), se = TRUE, ci = 'delta', alpha = .1) + +## ------------------------------------------------------------------------ +out <- predict(fitLmm, q = c(.9,.99), ci = 'boot', + nsim = 100, out.matrix = TRUE) + +## Estimated Flood quantiles +out$pred + +## Bootstraps sample of model parameters +head(out$para) + +## Bootstraps sample of flood quantiles +head(out$qua) + +## ---- fig.height= 4,fig.width=6------------------------------------------ +## Return level plot +plot(fitMle, ci = TRUE) + +## ------------------------------------------------------------------------ +## Anderson-Darling goodness of fit test +GofTest(fitLmm, nsim = 500) + +## ------------------------------------------------------------------------ +## +FitAmax(anData$flow, 'ln3', method = 'lmom', varcov = FALSE) + +## ------------------------------------------------------------------------ +## Candidates distribution +candidates <- c('gev','glo','ln3','pe3') + +## Function that compute the AIC for a given distribution +FAIC <- function(d) + AIC(FitAmax(anData$flow, d, method = 'mle', varcov = FALSE)) + +## AIC of all distribution +sapply(candidates, FAIC) + +## Automatic selection of the distribution +FitAmax(anData$flow, candidates, method = 'mle', tol.gev = 2) + diff --git a/vignettes/rfa_amax.Rmd b/vignettes/rfa_amax.Rmd new file mode 100644 index 0000000..a161a61 --- /dev/null +++ b/vignettes/rfa_amax.Rmd @@ -0,0 +1,201 @@ +--- +title: "At-site flood frequency analysis using annual maximums" +output: + rmarkdown::html_vignette +vignette: > + %\VignetteIndexEntry{annual-maximums} + \usepackage[utf8]{inputenc} + %\VignetteEngine{knitr::rmarkdown} +editor_options: + chunk_output_type: console +--- + +## Introduction + +In this document I will show how to use `CSHShydRology` to perform at-site +flood frequency analysis using annual maximums. +First we will extract the annual maximums using the function `ExtractAmax` from +the daily discharge of the Saint-John River at Fort Kent (NB). +Note that incomplete years of data, i.e. with fewer than 365 days of observation +are removed and a total 88 annual maximums are extracted. + +```{r} +library(CSHShydRology) + +## Extract the annual maximums +anData <- ExtractAmax(flow ~ date, flowStJohn, tol = 365) +``` + +The annual maximums are assumed to be independent and identically distributed. +Risk is measured in terms of return period $T$ that characterizes the +average waiting time separating two events of the same magnitude. +In practice this is equivalent to evaluate the flood quantile associated with +the probability $p = 1-1/T$. +The test of Mann-Kendall is frequently performed to verify if the data do not +contain significant trends. + +## Estimation of the flood quantiles + +According to extreme value theory, as the number of annual maximums increase, +their distribution converge to a Generalized Extreme Value (GEV) distribution +$$ +F(x) = \exp\left\{ - \left[ 1 - \kappa \left(\frac{x-\xi}{\alpha} \right) + \right]^{1/\kappa} \right\}. +$$ + +The GEV distribution can be fitted using the `FitAmax` function as show in the +example below. +Here, the parameters are estimated using the maximum likelihood method. +A summary of the estimated parameters, their standard deviations and the sample +L-moments are returned. + +```{r} +fitMle <- FitAmax(anData$flow, 'gev', method = 'mle') +print(fitMle) +``` + +It is also possible to use the L-moment method to estimate the parameters. +Note that by default `FitAmax` compute the covariance matrix of the parameters. +For the maximum likelihood method, the covariance matrix is derived analytically +from the the hessian matrix, while for the L-moment estimator a parametric +bootstrap is used and a correction is made to ensure the positive definiteness +of the matrix. +The evaluation of the covariance matrix can be avoided by providing the +arguments `varcov = FALSE`. + +```{r} +## Fit GEV distribution using L-moments +fitLmm <-FitAmax(anData$flow, 'gev', method = 'lmom', varcov = FALSE) +``` + + +The flood quantile of the GEV distribution can be obtained from the formula +$$ +x_T = \mu + \frac{\alpha}{\xi}\left[ 1+\log(1/T)^\kappa \right] . +$$ +These predictions are evaluated using the `predict` function. +By default return period of 2, 5, 10, 20, 50 and 100 years are provided. +The example below shows how to obtain the flood quantile of return periods +10 and 100 years using the argument `q = 1-1/T`. +The standard deviation of the flood quantiles is estimated using the Delta +method when requested by the argument `se = TRUE`. +Similarly, confidence intervals are evaluated using the standard deviations by +providing the argument `ci = 'delta'`. + +```{r} +## Flood quantiles of 10 and 100 return periods +predict(fitMle, q = c(.9,.99), se = TRUE, ci = 'delta', alpha = .1) +``` + +confidence intervals can also be obtained using parametric bootstraps with the +option `ci = 'boot'`. +This may be required if the normal approximation of the confidence intervals is +realistic. +The argument `out.matrix` requests that the bootstrap samples of the parameters +and the flood quantiles be returned. + +```{r} +out <- predict(fitLmm, q = c(.9,.99), ci = 'boot', + nsim = 100, out.matrix = TRUE) + +## Estimated Flood quantiles +out$pred + +## Bootstraps sample of model parameters +head(out$para) + +## Bootstraps sample of flood quantiles +head(out$qua) +``` + + +## Verification of the model + +The return level plot provides a visual assessment of the fitted distribution by +comparing the sampled and estimated flood quantiles. +The graphic below shows a good agreement between the two. +The confidence intervals are obtained using normal approximation based on +the delta method. + +```{r, fig.height= 4,fig.width=6 } +## Return level plot +plot(fitMle, ci = TRUE) +``` + +Another diagnostic is the goodness of fit test of Anderson-Darling that verifies +if the observations were likely to be generated by a GEV distribution. +A p-value superior to 0.05 indicates that the hypothesis of a GEV cannot +be rejected at this significant level. + +```{r} +## Anderson-Darling goodness of fit test +GofTest(fitLmm, nsim = 500) +``` + +## Selection of the best distribution + +The GEV distribution is not the only distribution used in flood frequency +analysis. +Frequent alternative candidates are the shifted log-normal distribution +(`'ln3'`), the Generalized logistic distribution (`'glo'`) and the Pearson +type III distribution (`'pe3'`). +These distribution can be fitted by the function `FitAmax` in the same way as +the GEV. + +```{r} +## +FitAmax(anData$flow, 'ln3', method = 'lmom', varcov = FALSE) +``` + +A best distribution can be selected using the Akaike Information Criterion (AIC) +as returned by the function `AIC`. +However, the process of selecting the best ditribution can be automatized, +by passing a list of distribution. +In this exemple below, all candidates have similar AIC, which +indicates that all distributions represent reasonable choices. +The argument `tol.gev` can be used to ensure that the selected candidate has +a AIC greater than the GEV distribution by a given margin, otherwise GEV will be +prefered. + +```{r} +## Candidates distribution +candidates <- c('gev','glo','ln3','pe3') + +## Function that compute the AIC for a given distribution +FAIC <- function(d) + AIC(FitAmax(anData$flow, d, method = 'mle', varcov = FALSE)) + +## AIC of all distribution +sapply(candidates, FAIC) + +## Automatic selection of the distribution +FitAmax(anData$flow, candidates, method = 'mle', tol.gev = 2) +``` + +## Conclusion + +In this document we showed how to evaluate flood quantiles using annual maximum +river discharge. +Initially, the extraction of the annual maximums (`ExtractAmax`) was discussed. +Instructions were provided to estimate (`FitAmax`) the model for different +distributions and to select a best distribution using the AIC (`FitAmax.auto`). +The function to obtain the flood quantiles and their uncertainties (`predict`) +was presented. +Finally, the return level plot (`plot`) was presented as a common way to +visualize the quality of the fitting and goodness of fit test were discussed. +For a general introduction to the technical aspect of modeling annual maximums, +the readers are referred to Coles (2001) or Hosking and Wallis (1997). + +## References + +Coles, S., 2001. An introduction to statistical modeling of extreme values. + Springer Verlag. + +Hosking, J.R.M., Wallis, J.R., 1997. Regional frequency analysis: an approach + based on L-moments. Cambridge Univ Pr. + +Önöz, B., Bayazit, M., 2012. Block bootstrap for Mann–Kendall trend test of + serially dependent data. Hydrol. Process. 26, 3552–3560. + https://doi.org/10.1002/hyp.8438 + + diff --git a/vignettes/rfa_amax.html b/vignettes/rfa_amax.html new file mode 100644 index 0000000..49f2d1d --- /dev/null +++ b/vignettes/rfa_amax.html @@ -0,0 +1,446 @@ + + + + + + + + + + + + + + +At-site flood frequency analysis using annual maximums + + + + + + + + + + + + + + + + + +

    At-site flood frequency analysis using annual maximums

    + + + +
    +

    Introduction

    +

    In this document I will show how to use CSHShydRology to perform at-site flood frequency analysis using annual maximums. First we will extract the annual maximums using the function ExtractAmax from the daily discharge of the Saint-John River at Fort Kent (NB). Note that incomplete years of data, i.e. with fewer than 365 days of observation are removed and a total 88 annual maximums are extracted.

    + +

    The annual maximums are assumed to be independent and identically distributed. Risk is measured in terms of return period \(T\) that characterizes the average waiting time separating two events of the same magnitude. In practice this is equivalent to evaluate the flood quantile associated with the probability \(p = 1-1/T\). The test of Mann-Kendall is frequently performed to verify if the data do not contain significant trends.

    +
    +
    +

    Estimation of the flood quantiles

    +

    According to extreme value theory, as the number of annual maximums increase, their distribution converge to a Generalized Extreme Value (GEV) distribution \[ +F(x) = \exp\left\{ - \left[ 1 - \kappa \left(\frac{x-\xi}{\alpha} \right) + \right]^{1/\kappa} \right\}. +\]

    +

    The GEV distribution can be fitted using the FitAmax function as show in the example below. Here, the parameters are estimated using the maximum likelihood method. A summary of the estimated parameters, their standard deviations and the sample L-moments are returned.

    + +
    ## 
    +## At-site frequency analysis
    +## 
    +## Distribution: gev 
    +## AIC: 1411 
    +## Method: mle
    +## Estimate:
    +##        xi     alpha     kappa 
    +## 2101.3761  668.9518    0.1667 
    +## 
    +## Std.err:
    +##       xi    alpha    kappa 
    +## 78.39437 54.31311  0.06214 
    +## 
    +## Lmoments:
    +##     l1  lcv     lsk    lkt
    +## 1 2390 0.17 0.05924 0.1399
    +

    It is also possible to use the L-moment method to estimate the parameters. Note that by default FitAmax compute the covariance matrix of the parameters. For the maximum likelihood method, the covariance matrix is derived analytically from the the hessian matrix, while for the L-moment estimator a parametric bootstrap is used and a correction is made to ensure the positive definiteness of the matrix. The evaluation of the covariance matrix can be avoided by providing the arguments varcov = FALSE.

    + +

    The flood quantile of the GEV distribution can be obtained from the formula \[ +x_T = \mu + \frac{\alpha}{\xi}\left[ 1+\log(1/T)^\kappa \right] . +\] These predictions are evaluated using the predict function. By default return period of 2, 5, 10, 20, 50 and 100 years are provided. The example below shows how to obtain the flood quantile of return periods 10 and 100 years using the argument q = 1-1/T. The standard deviation of the flood quantiles is estimated using the Delta method when requested by the argument se = TRUE. Similarly, confidence intervals are evaluated using the standard deviations by providing the argument ci = 'delta'.

    + +
    ##          pred       se    lower    upper
    +## 0.90 3356.637 117.7915 3162.888 3550.387
    +## 0.99 4250.404 238.4630 3858.167 4642.641
    +

    confidence intervals can also be obtained using parametric bootstraps with the option ci = 'boot'. This may be required if the normal approximation of the confidence intervals is realistic. The argument out.matrix requests that the bootstrap samples of the parameters and the flood quantiles be returned.

    + +
    ##          pred    lower    upper
    +## 0.90 3353.148 3112.853 3579.481
    +## 0.99 4215.448 3769.084 4842.902
    + +
    ##          [,1]     [,2]       [,3]
    +## [1,] 2198.886 694.3178 0.29491048
    +## [2,] 2045.032 509.8983 0.06180076
    +## [3,] 2190.424 684.1633 0.26932810
    +## [4,] 2065.349 699.4900 0.17976989
    +## [5,] 2059.068 763.4021 0.35657464
    +## [6,] 2141.801 869.8455 0.44253605
    + +
    ##          [,1]     [,2]
    +## [1,] 3340.821 3946.917
    +## [2,] 3116.273 4086.693
    +## [3,] 3345.020 3994.800
    +## [4,] 3359.980 4254.547
    +## [5,] 3240.346 3784.825
    +## [6,] 3381.299 3850.716
    +
    +
    +

    Verification of the model

    +

    The return level plot provides a visual assessment of the fitted distribution by comparing the sampled and estimated flood quantiles. The graphic below shows a good agreement between the two. The confidence intervals are obtained using normal approximation based on the delta method.

    + +

    +

    Another diagnostic is the goodness of fit test of Anderson-Darling that verifies if the observations were likely to be generated by a GEV distribution. A p-value superior to 0.05 indicates that the hypothesis of a GEV cannot be rejected at this significant level.

    + +
    ## 
    +## Goodness-of-fit test
    +##  
    +## Test = Anderson-Darling 
    +## Distribution = gev
    +## statistic : 0.2591 
    +## p-value : 0.48
    +
    +
    +

    Selection of the best distribution

    +

    The GEV distribution is not the only distribution used in flood frequency analysis. Frequent alternative candidates are the shifted log-normal distribution ('ln3'), the Generalized logistic distribution ('glo') and the Pearson type III distribution ('pe3'). These distribution can be fitted by the function FitAmax in the same way as the GEV.

    + +
    ## 
    +## At-site frequency analysis
    +## 
    +## Distribution: ln3 
    +## AIC: 1411 
    +## Method: lmom
    +## Estimate:
    +##       zeta      mulog   sigmalog 
    +## -3552.1611     8.6825     0.1214 
    +## 
    +## Lmoments:
    +##     l1  lcv     lsk    lkt
    +## 1 2390 0.17 0.05924 0.1399
    +

    A best distribution can be selected using the Akaike Information Criterion (AIC) as returned by the function AIC. However, the process of selecting the best ditribution can be automatized, by passing a list of distribution. In this exemple below, all candidates have similar AIC, which indicates that all distributions represent reasonable choices. The argument tol.gev can be used to ensure that the selected candidate has a AIC greater than the GEV distribution by a given margin, otherwise GEV will be prefered.

    + +
    ##      gev      glo      ln3      pe3 
    +## 1411.247 1412.612 1411.144 1411.133
    + +
    ## 
    +## At-site frequency analysis
    +## 
    +## Distribution: gev 
    +## AIC: 1411 
    +## Method: mle
    +## Estimate:
    +##        xi     alpha     kappa 
    +## 2101.3761  668.9518    0.1667 
    +## 
    +## Std.err:
    +##       xi    alpha    kappa 
    +## 78.39437 54.31311  0.06214 
    +## 
    +## Lmoments:
    +##     l1  lcv     lsk    lkt
    +## 1 2390 0.17 0.05924 0.1399
    +
    +
    +

    Conclusion

    +

    In this document we showed how to evaluate flood quantiles using annual maximum river discharge. Initially, the extraction of the annual maximums (ExtractAmax) was discussed. Instructions were provided to estimate (FitAmax) the model for different distributions and to select a best distribution using the AIC (FitAmax.auto). The function to obtain the flood quantiles and their uncertainties (predict) was presented. Finally, the return level plot (plot) was presented as a common way to visualize the quality of the fitting and goodness of fit test were discussed. For a general introduction to the technical aspect of modeling annual maximums, the readers are referred to Coles (2001) or Hosking and Wallis (1997).

    +
    +
    +

    References

    +

    Coles, S., 2001. An introduction to statistical modeling of extreme values. Springer Verlag.

    +

    Hosking, J.R.M., Wallis, J.R., 1997. Regional frequency analysis: an approach based on L-moments. Cambridge Univ Pr.

    +

    Önöz, B., Bayazit, M., 2012. Block bootstrap for Mann–Kendall trend test of serially dependent data. Hydrol. Process. 26, 3552–3560. https://doi.org/10.1002/hyp.8438

    +
    + + + + + + + + diff --git a/vignettes/rfa_gauged.R b/vignettes/rfa_gauged.R new file mode 100644 index 0000000..dec66d1 --- /dev/null +++ b/vignettes/rfa_gauged.R @@ -0,0 +1,91 @@ +## ------------------------------------------------------------------------ +library(CSHShydRology) +attach(flowAtlantic) + +## Compute the distance between descriptors +covar <- scale(log(info[,c('area','map')])) +distance.covar <- as.matrix(dist(covar)) +colnames(distance.covar) <- rownames(distance.covar) <- as.character(info$id) + +## Compute great-circle distance +coord <- info[,c('lon','lat')] +distance.geo <- GeoDist(coord) +colnames(distance.geo) <- rownames(distance.geo) <- as.character(info$id) + +## ------------------------------------------------------------------------ +SeasonStat(ams[ams$id == ams$id[1], ]$date) +st <- SeasonStat(date ~ id, ams) +head(st) + + +## ------------------------------------------------------------------------ +## Distance using cartesian coordinates +distance.st <- as.matrix(dist(st[,c('x','y')])) +colnames(distance.geo) <- rownames(distance.geo) <- as.character(info$id) + +## Distance using polar coordinates +distance.st2 <- DistSeason(radius ~ angle , st) +colnames(distance.st2) <- rownames(distance.st2) <- as.character(info$id) + +## ---- fig.height=5, fig.width=5------------------------------------------ +set.seed(0) +km <- kmeans(as.dist(distance.st2), 3, nstart = 5) +regime <- c('blue','darkgreen','orange')[km$cluster] + +JulianPlot() +points(st, pch = 16, col = regime) + +## ------------------------------------------------------------------------ + +## Organisation of the data in a matrix +ams$year <- format(ams$date, '%Y') +xd <- DataWide(ams ~ id + year, ams) + +## Extract a pooling groups +distance.target <- distance.st2[colnames(xd),'01AK007'] +xd.target <- FindNearest(xd, distance = distance.target, 25) + +## ----fig.height=5, fig.width=6------------------------------------------- + +## Fit regional growth curve +fit.target <- FitRegLmom(xd.target) +fit.target + +plot(fit.target) + +## ------------------------------------------------------------------------ +## Remove heterogenous sites +fit.target2 <- PoolRemove(fit.target) + +## New heterogeneity measure +fit.target2$stat[1] + +## ------------------------------------------------------------------------ +sid <- sitenames(fit.target2) +icor <- Intersite(xd[,sid]) +round(icor$model[1:3,1:3],2) + +## ----fig.height=5, fig.width=6------------------------------------------- + +## Fit the exponential model +geo.target <- distance.geo[sid,sid] + +icor2 <- Intersite(xd[,sid], method = 'exp', + distance = geo.target, + distance.max = 300) +icor2 + +## Display the results +theta <- icor2$corr[lower.tri(icor2$corr)] +theta.model <- icor2$model[lower.tri(icor2$corr)] +h <- geo.target[lower.tri(icor2$corr)] + +plot(h, theta, pch = '.', cex = 2) +points(h, theta.model, col = 'red', pch = 16) + + +## ------------------------------------------------------------------------ +predict(fit.target2, q = c(.9, .99), ci = TRUE, corr = icor$model) + +predict(fit.target2, q = c(.9, .99), ci = TRUE, corr = icor$para) + diff --git a/vignettes/rfa_gauged.Rmd b/vignettes/rfa_gauged.Rmd new file mode 100644 index 0000000..2997aee --- /dev/null +++ b/vignettes/rfa_gauged.Rmd @@ -0,0 +1,363 @@ +--- +title: "Prediction of flood quantiles at ungauged sites" +output: + rmarkdown::html_vignette +vignette: > + %\VignetteIndexEntry{gauged-RFA} + %\VignetteEngine{knitr::rmarkdown} + \usepackage[utf8]{inputenc} +--- + +## Introduction + +In this document I will show how to use `CSHShydRology` to perform regional +flood frequency analysis using pooling groups and the index-flood model. +The methodology is presented using 45 hydrometric sites located in the Atlantic +provinces of Canada. +The dataset `flowAtlantic` contains the annual maximums of river discharge `ams` +and catchment descriptors: drainage area, mean annual precipitation. + +## Measure of similarity + +For this analysis, pooling groups are formed as the nearby sites from which +regional information can be transfered to a site of interest (target). +Different measures of similarity exist to identify the members of a pooling +group. +Geograpical distance and Euclidean distance between the catchment descriptors +may be consider. +The example below shows how to obtain these distance. +Notice that the descriptors are transformed and scaled before the +Euclidean distance is computed. +Also, the `Geodist` function use the Haversine formula to compute a great-circle +distance between point. + +```{r} +library(CSHShydRology) +attach(flowAtlantic) + +## Compute the distance between descriptors +covar <- scale(log(info[,c('area','map')])) +distance.covar <- as.matrix(dist(covar)) +colnames(distance.covar) <- rownames(distance.covar) <- as.character(info$id) + +## Compute great-circle distance +coord <- info[,c('lon','lat')] +distance.geo <- GeoDist(coord) +colnames(distance.geo) <- rownames(distance.geo) <- as.character(info$id) +``` + +Another measure of similarity is the one based on the seasonality of the annual +maximum discharge that characterizes the type of flood regime the site +of interest. +An angular value (radian) can be attributed to the moment when a flood is +observed +$$ +\theta_i = \mathrm{(Julian \,date)}_i\left( \frac{2\pi}{365}\right). +$$ +Accordingly, a sample of $n$ angular values is summarized by averaging each +Cartesian coordinate separately. + +$$ +\begin{align} +\bar x &= \frac{1}{n}\sum_{i=1}^n \cos(\theta_i) \\ +\bar y &= \frac{1}{n}\sum_{i=1}^n \sin(\theta_i) +\end{align} +$$ +However, these summary statistics are easier to interpret in polar coordinates. + +$$ +\begin{align} +\theta &= \arctan \left( \bar y / \bar x\right)\\ +r &= \sqrt{\bar x^2 + \bar y^2} \\ +\end{align} +$$ +Here, $\bar \theta$ represents the average moment of occurrence for the annual +maximum discharges and $\bar r$ represent its regularity during the year. +In particular, values of $\bar r$ close to 1 entails that the maximum discharge +occurs almost the same day every year, while values close to 0 imply that the +maximum discharge could be observed at any moment of the years. +Even for regional frequency analysis based threshold modeling, Mostofi Zadeh +et al. (2019) showed that the seasonality based on annual maximum discharges +should be preferred. + +The seasonality of one or several sites can be estimated using the `SeasonStat` +function. + +```{r} +SeasonStat(ams[ams$id == ams$id[1], ]$date) +st <- SeasonStat(date ~ id, ams) +head(st) + +``` + +Next, the distance between sites can be evaluated using the Eucledean distance +between cartesian or polar coordinates. The function `DistSeason` compute the distance between pairs $(r_j,\theta_j)$ and +$(r_k, \theta_k)$ according to + +$$ +h_{i,j} =\sqrt{\|r_j-r_k \|^2 + \left(\frac{\|\theta_j-\theta_k\|}{\pi}\right)^2} +$$ + +```{r} +## Distance using cartesian coordinates +distance.st <- as.matrix(dist(st[,c('x','y')])) +colnames(distance.geo) <- rownames(distance.geo) <- as.character(info$id) + +## Distance using polar coordinates +distance.st2 <- DistSeason(radius ~ angle , st) +colnames(distance.st2) <- rownames(distance.st2) <- as.character(info$id) +``` + + +The graphic below shows the seasonal statistics of the Atlantic rivers. +A k-means algorithm is used to divide the sites in three regions. +One region includes sites with more nival regimes (blue), where annual floods +are occurring more regularly around May. +A second region (green) represents sites with a more pluvial regime with a +lower regularity and rainfall events occurring during winter. +Finally, a third region (orange) regroups sites with mixed regimes where +a dominant spring freshet occurs between March and May, but where maximum +discharges are also frequently cause by rainfalls at other moments of the year. + +```{r, fig.height=5, fig.width=5} +set.seed(0) +km <- kmeans(as.dist(distance.st2), 3, nstart = 5) +regime <- c('blue','darkgreen','orange')[km$cluster] + +JulianPlot() +points(st, pch = 16, col = regime) +``` + + +## Pooling groups + +The index-flood model is frequently used to evaluate flood quantile based on a +regional growth curve that characterizes a pooling group. +This model assumes that all at-site distributions are proportional to the same +regional growth curve up to a scale factor. +This scale factor is usually taken as the sample mean. +Most of the time, this regional growth curve is estimated using the L-moment +algorithm that takes the average of the sample L-moments of all standardized +distributions inside the pooling group to derive the parameters of the regional +growth curve. +A best distribution is then selected by identifying the distribution where the +L-moments are the most coherent with the sample estimates. +See Burn (1990) and Hosking and Wallis (1997) for a more in depth +introduction. + +The example below first used the function `DataWide`, to construct a matrix of +the data where sites are represented by columns and years by rows. +Next, nearest sites to the target `01AK007` are extracted. +Here, the target is assumed to be the site with distance 0. +Notice also that the example below makes sure that the distance matrix respect +the order imposed by the columns of `xd`. + + +```{r} + +## Organisation of the data in a matrix +ams$year <- format(ams$date, '%Y') +xd <- DataWide(ams ~ id + year, ams) + +## Extract a pooling groups +distance.target <- distance.st2[colnames(xd),'01AK007'] +xd.target <- FindNearest(xd, distance = distance.target, 25) +``` + +Finally, the regional growth curve is estimated using the regional L-moments. +The summary of the fitted model indicates that the best distribution is the +generalized extreme value (GEV) distribution. +This is determined by the Z-scores that identify the distribution with the +closest L-kurtosis to its sample estimates. +A complementary tool to the Z-score is the L-moment ratio diagram +that illustrates the L-skewness and the L-kurtosis of all sites. +It can be seen in the figure below that the average (dot) is located near the +theoretical line of the GEV. + +```{r fig.height=5, fig.width=6} + +## Fit regional growth curve +fit.target <- FitRegLmom(xd.target) +fit.target + +plot(fit.target) +``` + +To assess the hypothesis of the index-flood model, the degree of homogeneity of +the pooling group must be verified. +Accordingly, for a homogenous group each at-site L-coefficient of +variation $V$ or LCV should be close to their regional value. +Therefore, a large +dispersion of the LCV provide evidences that the pooling groups is not homogenous. +To this end, a common heterogeneity measure is +$$ +H = \frac{V-\mu_V}{\sigma_V} +$$ +where values $H < 1$ can be interpreted as acceptably homogenous, $1\leq H<2$ possibly +heterogenous and $H \geq 2$ definitely heterogenous. + +A pooling group may be found overall heterogeneous only because it contents few +heterogenous elements. +In turns, each site can be removed from the pooling group and the one that best +improve the heterogeneity measure $H$ should be permanently removed. +This process can be repeated until a homogenous pooling group is found or that +a given stopping criteria is reached. +The function `PoolRemove` search for the heterogenous sites, removes them and +updates the regional growth curve. +In the present situation, two sites are removed to obtain a homogenous pooling group. + +```{r} +## Remove heterogenous sites +fit.target2 <- PoolRemove(fit.target) + +## New heterogeneity measure +fit.target2$stat[1] +``` + + +## Intersite correlation + +Snow accumulation or large rainfall system may create floods that affect +multiple sites simultaneously. +This generates a spatial dependence that will result in +larger uncertainties for the estimated flood quantiles in contrast to a scenario +where all sites are independent. +Better inference for the estimated flood quantiles can be obtained by a using +parametric bootstrap that accounts for intersite correlation. +For this resampling scheme, a multivariate Normal distribution is simulated at +each time step and the at-site distribution are transformed to the original +scale using at-site L-moments. + +The spearman correlation $\rho_{i,j}$ between pairs of the i-th and j-th sites +measure the degree of association between series of flood events. +This measure is well suited to quantify the intersite correlations between +paired observations as it is not affected by the at-site distributions. +The relation +$$ +\theta_{i,j} = 2 \sin\left(\rho_{i,j}\frac{\pi}{6}\right) +$$ +links the correlation coefficients $\theta_{i,j}$ of the +multivariate Normal distribution to the spearman correlation. +However, corrections should be done to ensure that the final covariance matrix +is positive definite (Higham, 2002). + + +The function `Intersite` can be used to estimate the parameter of the +multivariate normal distribution. +The output is a list containing among others the correlation coefficient `$corr` +and their corrected value `model`. +The function `sitename` can be used to extract the names of the sites in a +pooling group. +This is useful to extract data or distance matrix from the pooling groups after +heterogenous site have been extracted. + +```{r} +sid <- sitenames(fit.target2) +icor <- Intersite(xd[,sid]) +round(icor$model[1:3,1:3],2) +``` + +Due to the spatial distribution of the physical mechanism that generates +intersite correlation. +The strength of the dependence may depend on the distance between the sites. +An exponential model can be fitted by the function `Intersite` if a distance $h$ +is provided. +Note that it is important that the order of the column in the matrix of data and +distance, be the same. +The exponential model has the form + +$$ +\widehat{\theta}_{i,j} = \begin{cases} +(1-\tau) \exp\left(-3 \left|\frac{h}{\gamma}\right|^p \right) & h > 0 \\ +1 & h = 0\\ +\end{cases} +$$ +where the nugget effect $\tau \in [0,1]$ that represents a discontinuity at the +origin $h = 0$ and the range parameter $\gamma > 0$ that controls the decay of +the correlation with respect to the distance are estimated by weighted least +squares with weights proportional to the number of paired observations. + + +```{r fig.height=5, fig.width=6} + +## Fit the exponential model +geo.target <- distance.geo[sid,sid] + +icor2 <- Intersite(xd[,sid], method = 'exp', + distance = geo.target, + distance.max = 300) +icor2 + +## Display the results +theta <- icor2$corr[lower.tri(icor2$corr)] +theta.model <- icor2$model[lower.tri(icor2$corr)] +h <- geo.target[lower.tri(icor2$corr)] + +plot(h, theta, pch = '.', cex = 2) +points(h, theta.model, col = 'red', pch = 16) + +``` + + +## Flood quantiles + +Flood quantiles can be obtained from the function `predict`. +However to obtain reliable confidence intervals, bootstraps is necessary and so +the covariance matrix of the multivariate Normal distribution must be passed +as an argument. +The argument `corr` can also be a single value that corresponds to a +constant coefficient of correlation. +When, the function `Intersite` evaluates the covariance correlation matrix +empirically, it evaluated the average coefficient of correlation that can +be used as a common value. + +```{r} +predict(fit.target2, q = c(.9, .99), ci = TRUE, corr = icor$model) + +predict(fit.target2, q = c(.9, .99), ci = TRUE, corr = icor$para) +``` + +## Conclusion + +In this document we showed how to perform a regional flood frequency analysis +using similarity based seasonal statistics and pooling groups. +First seasonal statistics were evaluated (`SeasonStat`) as well as the +the pairwise distance (`DistSeason`) of the sites in the seasonal space. +The annual maximums were then reorganized in a matrix with sites in columns +and years in rows (`DataWide`). +Next, the nearest sites to a target were identified (`FindNearest`) and +an index flood model was fitted (`FitRegLmom`) using the L-moments algorithm. +It was found that the pooling group of the target was not homogenous. +The most heterogenous sites were then removed in a stepwise manner +(`PoolRemove`) and the flood quantiles were finally estimated (`predict`). +To account for the intersite correlation that may lead to underestimate the +true uncertainty of the estimated flood quantiles, +a power exponential model was considered (`Intersite`). + +## References + +* Burn, D. H. (1990). An appraisal of the “region of influence” approach to flood + frequency analysis. Hydrological Sciences Journal, 35(2), 149–165. + https://doi.org/10.1080/02626669009492415 + +* Burn, D. H. (1997). Catchment similarity for regional flood frequency analysis + using seasonality measures. Journal of Hydrology, 202(1–4), 212–230. + https://doi.org/10.1016/S0022-1694(97)00068-1 + +* Durocher, M., Burn, D. H., & Mostofi Zadeh, S. (2018). A nationwide regional + flood frequency analysis at ungauged sites using ROI/GLS with copulas and + super regions. Journal of Hydrology, 567, 191–202. + https://doi.org/10.1016/j.jhydrol.2018.10.011 + + +* Higham, Nick (2002). Computing the nearest correlation matrix - a problem + from finance; IMA Journal of Numerical Analysis 22, 329–343. + https://doi.org/10.1093/imanum/22.3.329 + +* Hosking, J. R. M., & Wallis, J. R. (1997). Regional frequency analysis: an + approach based on L-moments. Cambridge Univ Pr. + +* Mostofi Zadeh, S., Durocher, M., Burn, D. H., & Ashkar, F. (2019). Pooled flood + frequency analysis: a comparison based on peaks-over-threshold and annual + maximum series. Hydrological Sciences Journal, 0(ja), null. + https://doi.org/10.1080/02626667.2019.1577556 diff --git a/vignettes/rfa_gauged.html b/vignettes/rfa_gauged.html new file mode 100644 index 0000000..9a9106a --- /dev/null +++ b/vignettes/rfa_gauged.html @@ -0,0 +1,486 @@ + + + + + + + + + + + + + + +Prediction of flood quantiles at ungauged sites + + + + + + + + + + + + + + + + + +

    Prediction of flood quantiles at ungauged sites

    + + + +
    +

    Introduction

    +

    In this document I will show how to use CSHShydRology to perform regional flood frequency analysis using pooling groups and the index-flood model. The methodology is presented using 45 hydrometric sites located in the Atlantic provinces of Canada. The dataset flowAtlantic contains the annual maximums of river discharge ams and catchment descriptors: drainage area, mean annual precipitation.

    +
    +
    +

    Measure of similarity

    +

    For this analysis, pooling groups are formed as the nearby sites from which regional information can be transfered to a site of interest (target). Different measures of similarity exist to identify the members of a pooling group. Geograpical distance and Euclidean distance between the catchment descriptors may be consider. The example below shows how to obtain these distance. Notice that the descriptors are transformed and scaled before the Euclidean distance is computed. Also, the Geodist function use the Haversine formula to compute a great-circle distance between point.

    + +

    Another measure of similarity is the one based on the seasonality of the annual maximum discharge that characterizes the type of flood regime the site of interest. An angular value (radian) can be attributed to the moment when a flood is observed \[ +\theta_i = \mathrm{(Julian \,date)}_i\left( \frac{2\pi}{365}\right). +\] Accordingly, a sample of \(n\) angular values is summarized by averaging each Cartesian coordinate separately.

    +

    \[ +\begin{align} +\bar x &= \frac{1}{n}\sum_{i=1}^n \cos(\theta_i) \\ +\bar y &= \frac{1}{n}\sum_{i=1}^n \sin(\theta_i) +\end{align} +\] However, these summary statistics are easier to interpret in polar coordinates.

    +

    \[ +\begin{align} +\theta &= \arctan \left( \bar y / \bar x\right)\\ +r &= \sqrt{\bar x^2 + \bar y^2} \\ +\end{align} +\] Here, \(\bar \theta\) represents the average moment of occurrence for the annual maximum discharges and \(\bar r\) represent its regularity during the year. In particular, values of \(\bar r\) close to 1 entails that the maximum discharge occurs almost the same day every year, while values close to 0 imply that the maximum discharge could be observed at any moment of the years. Even for regional frequency analysis based threshold modeling, Mostofi Zadeh et al. (2019) showed that the seasonality based on annual maximum discharges should be preferred.

    +

    The seasonality of one or several sites can be estimated using the SeasonStat function.

    + +
    ##          x          y      angle     radius 
    +## -0.2308825  0.5945593  1.9411980  0.6378146
    + +
    ##                    x         y    angle    radius
    +## 01AF007 -0.230882469 0.5945593 1.941198 0.6378146
    +## 01AF009 -0.308499369 0.7230383 1.974081 0.7861019
    +## 01AJ010  0.005594521 0.4226291 1.557560 0.4226661
    +## 01AK001 -0.130335849 0.7598669 1.740668 0.7709638
    +## 01AK007 -0.053384346 0.5568674 1.666370 0.5594204
    +## 01AL002 -0.040488450 0.6006337 1.638104 0.6019968
    +

    Next, the distance between sites can be evaluated using the Eucledean distance between cartesian or polar coordinates. The function DistSeason compute the distance between pairs \((r_j,\theta_j)\) and \((r_k, \theta_k)\) according to

    +

    \[ +h_{i,j} =\sqrt{\|r_j-r_k \|^2 + \left(\frac{\|\theta_j-\theta_k\|}{\pi}\right)^2} +\]

    + +

    The graphic below shows the seasonal statistics of the Atlantic rivers. A k-means algorithm is used to divide the sites in three regions. One region includes sites with more nival regimes (blue), where annual floods are occurring more regularly around May. A second region (green) represents sites with a more pluvial regime with a lower regularity and rainfall events occurring during winter. Finally, a third region (orange) regroups sites with mixed regimes where a dominant spring freshet occurs between March and May, but where maximum discharges are also frequently cause by rainfalls at other moments of the year.

    + +

    +
    +
    +

    Pooling groups

    +

    The index-flood model is frequently used to evaluate flood quantile based on a regional growth curve that characterizes a pooling group. This model assumes that all at-site distributions are proportional to the same regional growth curve up to a scale factor. This scale factor is usually taken as the sample mean. Most of the time, this regional growth curve is estimated using the L-moment algorithm that takes the average of the sample L-moments of all standardized distributions inside the pooling group to derive the parameters of the regional growth curve. A best distribution is then selected by identifying the distribution where the L-moments are the most coherent with the sample estimates. See Burn (1990) and Hosking and Wallis (1997) for a more in depth introduction.

    +

    The example below first used the function DataWide, to construct a matrix of the data where sites are represented by columns and years by rows. Next, nearest sites to the target 01AK007 are extracted. Here, the target is assumed to be the site with distance 0. Notice also that the example below makes sure that the distance matrix respect the order imposed by the columns of xd.

    + +

    Finally, the regional growth curve is estimated using the regional L-moments. The summary of the fitted model indicates that the best distribution is the generalized extreme value (GEV) distribution. This is determined by the Z-scores that identify the distribution with the closest L-kurtosis to its sample estimates. A complementary tool to the Z-score is the L-moment ratio diagram that illustrates the L-skewness and the L-kurtosis of all sites. It can be seen in the figure below that the average (dot) is located near the theoretical line of the GEV.

    + +
    ## 
    +## Regional frequency analysis with pooling groups
    +## 
    +## type: amax
    +## Nb. site: 25
    +## Station-year: 1245
    +## Homogeneity: 5.06 2.09 0.7
    +## 
    +## Z-scores (absolute):
    +## Zglo Zgev Zgno Zpe3 Zgpa 
    +## 2.28 0.61 1.44 3.07 7.43 
    +## 
    +## Regional L-moments:
    +##     L1    LCV    LSK   LKUR 
    +## 1.0000 0.2029 0.2116 0.1733 
    +## 
    +## Distribution: gev
    +## Parameter:
    +##       xi    alpha    kappa 
    +##  0.82283  0.27499 -0.06379
    + +

    +

    To assess the hypothesis of the index-flood model, the degree of homogeneity of the pooling group must be verified. Accordingly, for a homogenous group each at-site L-coefficient of variation \(V\) or LCV should be close to their regional value. Therefore, a large dispersion of the LCV provide evidences that the pooling groups is not homogenous. To this end, a common heterogeneity measure is \[ +H = \frac{V-\mu_V}{\sigma_V} +\] where values \(H < 1\) can be interpreted as acceptably homogenous, \(1\leq H<2\) possibly heterogenous and \(H \geq 2\) definitely heterogenous.

    +

    A pooling group may be found overall heterogeneous only because it contents few heterogenous elements. In turns, each site can be removed from the pooling group and the one that best improve the heterogeneity measure \(H\) should be permanently removed. This process can be repeated until a homogenous pooling group is found or that a given stopping criteria is reached. The function PoolRemove search for the heterogenous sites, removes them and updates the regional growth curve. In the present situation, two sites are removed to obtain a homogenous pooling group.

    + +
    ## [1] "n:25, h:5.06, t:1245"
    +## [1] "n:24, h:2.55, t:1149"
    + +
    ##         
    +## 1.51703
    +
    +
    +

    Intersite correlation

    +

    Snow accumulation or large rainfall system may create floods that affect
    +multiple sites simultaneously. This generates a spatial dependence that will result in larger uncertainties for the estimated flood quantiles in contrast to a scenario where all sites are independent. Better inference for the estimated flood quantiles can be obtained by a using parametric bootstrap that accounts for intersite correlation. For this resampling scheme, a multivariate Normal distribution is simulated at each time step and the at-site distribution are transformed to the original scale using at-site L-moments.

    +

    The spearman correlation \(\rho_{i,j}\) between pairs of the i-th and j-th sites measure the degree of association between series of flood events. This measure is well suited to quantify the intersite correlations between paired observations as it is not affected by the at-site distributions. The relation \[ +\theta_{i,j} = 2 \sin\left(\rho_{i,j}\frac{\pi}{6}\right) +\] links the correlation coefficients \(\theta_{i,j}\) of the multivariate Normal distribution to the spearman correlation. However, corrections should be done to ensure that the final covariance matrix is positive definite (Higham, 2002).

    +

    The function Intersite can be used to estimate the parameter of the multivariate normal distribution. The output is a list containing among others the correlation coefficient $corr and their corrected value model. The function sitename can be used to extract the names of the sites in a pooling group. This is useful to extract data or distance matrix from the pooling groups after heterogenous site have been extracted.

    + +
    ##         01AK007 01AL002 01AP002
    +## 01AK007    1.00    0.87    0.26
    +## 01AL002    0.87    1.00    0.43
    +## 01AP002    0.26    0.43    1.00
    +

    Due to the spatial distribution of the physical mechanism that generates intersite correlation. The strength of the dependence may depend on the distance between the sites. An exponential model can be fitted by the function Intersite if a distance \(h\) is provided. Note that it is important that the order of the column in the matrix of data and distance, be the same. The exponential model has the form

    +

    \[ +\widehat{\theta}_{i,j} = \begin{cases} +(1-\tau) \exp\left(-3 \left|\frac{h}{\gamma}\right|^p \right) & h > 0 \\ +1 & h = 0\\ +\end{cases} +\] where the nugget effect \(\tau \in [0,1]\) that represents a discontinuity at the origin \(h = 0\) and the range parameter \(\gamma > 0\) that controls the decay of the correlation with respect to the distance are estimated by weighted least squares with weights proportional to the number of paired observations.

    + +
    ## 
    +## Intersite-correlation
    +## 
    +## Method: exp
    +## Nb. sites: 23
    +## RMSE: 15.33
    +## Parameter:
    +##   nugget    range   smooth 
    +##   0.2496 436.1266   1.0000
    + +

    +
    +
    +

    Flood quantiles

    +

    Flood quantiles can be obtained from the function predict. However to obtain reliable confidence intervals, bootstraps is necessary and so the covariance matrix of the multivariate Normal distribution must be passed as an argument. The argument corr can also be a single value that corresponds to a constant coefficient of correlation. When, the function Intersite evaluates the covariance correlation matrix empirically, it evaluated the average coefficient of correlation that can be used as a common value.

    + +
    ##           pred       se     lower   upper
    +## 0.90  89.71647  7.67803  76.22335 105.780
    +## 0.99 142.26533 27.69585 100.41214 216.629
    + +
    ##           pred        se    lower    upper
    +## 0.90  89.71647  7.741799 75.90489 105.1242
    +## 0.99 142.26533 27.791801 99.95145 209.6870
    +
    +
    +

    Conclusion

    +

    In this document we showed how to perform a regional flood frequency analysis using similarity based seasonal statistics and pooling groups. First seasonal statistics were evaluated (SeasonStat) as well as the the pairwise distance (DistSeason) of the sites in the seasonal space. The annual maximums were then reorganized in a matrix with sites in columns and years in rows (DataWide). Next, the nearest sites to a target were identified (FindNearest) and an index flood model was fitted (FitRegLmom) using the L-moments algorithm. It was found that the pooling group of the target was not homogenous. The most heterogenous sites were then removed in a stepwise manner (PoolRemove) and the flood quantiles were finally estimated (predict). To account for the intersite correlation that may lead to underestimate the true uncertainty of the estimated flood quantiles, a power exponential model was considered (Intersite).

    +
    +
    +

    References

    +
      +
    • Burn, D. H. (1990). An appraisal of the “region of influence” approach to flood frequency analysis. Hydrological Sciences Journal, 35(2), 149–165. https://doi.org/10.1080/02626669009492415

    • +
    • Burn, D. H. (1997). Catchment similarity for regional flood frequency analysis using seasonality measures. Journal of Hydrology, 202(1–4), 212–230. https://doi.org/10.1016/S0022-1694(97)00068-1

    • +
    • Durocher, M., Burn, D. H., & Mostofi Zadeh, S. (2018). A nationwide regional flood frequency analysis at ungauged sites using ROI/GLS with copulas and super regions. Journal of Hydrology, 567, 191–202. https://doi.org/10.1016/j.jhydrol.2018.10.011

    • +
    • Higham, Nick (2002). Computing the nearest correlation matrix - a problem from finance; IMA Journal of Numerical Analysis 22, 329–343. https://doi.org/10.1093/imanum/22.3.329

    • +
    • Hosking, J. R. M., & Wallis, J. R. (1997). Regional frequency analysis: an approach based on L-moments. Cambridge Univ Pr.

    • +
    • Mostofi Zadeh, S., Durocher, M., Burn, D. H., & Ashkar, F. (2019). Pooled flood frequency analysis: a comparison based on peaks-over-threshold and annual maximum series. Hydrological Sciences Journal, 0(ja), null. https://doi.org/10.1080/02626667.2019.1577556

    • +
    +
    + + + + + + + + diff --git a/vignettes/rfa_pot.R b/vignettes/rfa_pot.R new file mode 100644 index 0000000..ded190a --- /dev/null +++ b/vignettes/rfa_pot.R @@ -0,0 +1,104 @@ +## ------------------------------------------------------------------------ +library(CSHShydRology) +data(flowStJohn) + +## Verify the complete years of data +y <- as.integer(format(flowStJohn$date,'%Y')) +sort(sapply(split(y,y), length))[1:5] + +## Keep only complet year +xd <- cbind(flowStJohn[y>=1927,], year = y[y>=1927]) + +## ------------------------------------------------------------------------ +## Fitting POT using MLE +fit <- FitPot(rgpa(2000, 1, 0)) +print(fit) + +## Show assymetrical confidence intervals +coef(fit, ci = TRUE) + +## Fitting POT using L-moments +FitPot(rgpa(2000, 1, 0), method = 'lmom', varcov = FALSE)$estimate + +## ----fig.height = 4,fig.width = 6---------------------------------------- + +## Define a threshold and the minimum separating time. Drainage Area = 14700. +thresh <- 500 +r0 <- round(4 + log(14700)) # 14 days + +## Extract peaks based on run declustering +peaks1 <- which.clusters(flow~date, xd, u = thresh, r = r0) + +## Extract peaks based on WRC recommendations +peaks2 <- which.floodPeaks(flow~date, xd, u = thresh, r = r0, rlow = 0.75) + +## Plot the peaks extracted for the year 1927 +plot(flow~date, xd[xd$year == 1927,],type = 'l', col = 'grey') +abline(h = thresh, col = 2 ,lwd = 2) +points(flow~date, xd[peaks1,], pch = 16, col = 'blue', cex=2) +points(flow~date, xd[peaks2,], pch = 17, col = 'red') +legend('topleft', col = c('blue','red'), pch = 16:17, + legend = c('Cluster','WRC')) + + +## ------------------------------------------------------------------------ +## Fit a POT model after declustering +fit <- FitPot(flow~date, xd, u = 1000, declust = 'wrc', r = r0) +print(fit) + +## ---- fig.height=6, fig.width=9------------------------------------------ +## Predict flood quantile of return period 10 and 100 years +predict(fit, rt = c(10,100), se = TRUE, ci = 'profile') + +## ---- fig.height=4, fig.width=6------------------------------------------ +## List of candidate thresholds +ulst <- seq(500,1500, 25) + +## Mean residual life plot +PlotMrl(flow~date, xd, u = ulst, declust = 'wrc', r = r0) + +## ---- fig.height = 4, fig.width = 6-------------------------------------- +candidates <- SearchThresh(flow~date, xd, u = ulst, declust = 'wrc', r = r0, + verbose = FALSE) + +PlotThresh(candidates, type = c('kappa')) + +## ---- fig.height = 4, fig.width = 6-------------------------------------- +PlotThresh(candidates, type = c('q2','q5','q10','q20','q50')) + +## ---- fig.height = 4, fig.width = 6-------------------------------------- +PlotThresh(candidates, type = c('ad')) + +## ------------------------------------------------------------------------ +## Threshold with maximum AD p-value +cvars <- c('u','ppy','ad','q50') +FindThresh(candidates, method = 'max')[,cvars] + +## First threshold with AD p-value > 0.25 +FindThresh(candidates, method = 'sgn', tol.sgn = 0.25, + ppy = c(1,3))[,cvars] + + +## ------------------------------------------------------------------------ +## Threshold with approximately 2.2 PPY +FindThresh(candidates, method = 'ppy', tol.ppy = 2.2)[,cvars] + +## ------------------------------------------------------------------------ +candidates.mod <- candidates +candidates.mod$ad <- pmin(0.2, candidates.mod$ad) + +## First threshold with AD p-value > 0.25 +FindThresh(candidates.mod, method = 'sgn-ppy', + tol.sgn = 0.25, tol.ppy = 2.2)[,cvars] + +FindThresh(candidates.mod, method = 'sgn-ppy', + tol.sgn = 0.15, tol.ppy = 2.2)[,cvars] + +## Verify the discrepencies with reference threshold ~ 1PPY +FindThresh(candidates, method = 'sgn', ppy = c(1,3), tol.sgn = 0.0, + qua = 'q50', tol.qua = .01)[,cvars] + +FindThresh(candidates, method = 'sgn', ppy = c(1,3), tol.sgn = 0.25, + qua = 'q50', tol.qua = .01)[,cvars] + + diff --git a/vignettes/rfa_pot.Rmd b/vignettes/rfa_pot.Rmd new file mode 100644 index 0000000..0206867 --- /dev/null +++ b/vignettes/rfa_pot.Rmd @@ -0,0 +1,312 @@ +--- +title: "At-site flood frequency analysis using threshold modeling" +output: + rmarkdown::html_vignette +vignette: > + %\VignetteIndexEntry{peaks-over-threshold} + %\VignetteEngine{knitr::rmarkdown} + \usepackage[utf8]{inputenc} + +--- + +## Introduction + +This document will present how `CSHShydRology` can be used to perform at-site flood +frequency analysis using the threshold modeling. +This example is illustrated using the daily discharge of the Saint-John River at +Fort Kent (NB). +First a verification is done to make sure that only complete year of data are +included. +In this case, one can see that after 1927, all years of observations are +complete. + + +```{r} +library(CSHShydRology) +data(flowStJohn) + +## Verify the complete years of data +y <- as.integer(format(flowStJohn$date,'%Y')) +sort(sapply(split(y,y), length))[1:5] + +## Keep only complet year +xd <- cbind(flowStJohn[y>=1927,], year = y[y>=1927]) +``` + +## Estimating model parameters + +By default the Function `FitPot` estimates the parameter of a Generalized Pareto +distribution (GPA) assuming that the data are independent exceedances with +lower bound $u = 0$. +$$ +F(x)= \exp\left\{- \left( 1-\kappa \frac{x}{\alpha} \right)^{1/\kappa} \right\} +$$ +The recommended estimation method is the maximum likelihood (MLE), but the L-moment +estimate can be obtained passing the argument `method = lmom`. +In each case, the covariance matrix of the estimate is evaluated if it is not +turned off by passing the argument `varcov = FALSE`. +For the L-moments, the covariance matrix is estimated using a bootstraps sample, +which can be time consuming for some situations. +For MLE, confidence intervals of the parameters are derived using the delta +method. +However, symmetrical confidence intervals can be unrealistic in some occasions +and the profile likelihood method can be used instead by using the function +`coef` with the argument `ci = TRUE`. + +```{r} +## Fitting POT using MLE +fit <- FitPot(rgpa(2000, 1, 0)) +print(fit) + +## Show assymetrical confidence intervals +coef(fit, ci = TRUE) + +## Fitting POT using L-moments +FitPot(rgpa(2000, 1, 0), method = 'lmom', varcov = FALSE)$estimate +``` + +## Declustering + +In practice, daily streamflow evolve smoothly and declustering techniques are +necessary to extract independents flood peaks above a desired threshold $u$. +Without declustering, exceedances forms clusters that are associated to +the same hydrological event. +With this package, peaks can be extracted using the function `which.cluster` or +`which.floodPeaks`. +The first method is a running declustering method that extracts the maximum of +each cluster separated by at least `r` observations below the threshold. +Such method may be more natural for studying rainfall events that are separated +by sunny days. +The second method follows the recommendation of the Water Resource Council of +the United States as described in Lang et al. (1999). +In brief, two adjacent peaks must respect the following two conditions: +i) they must be separated by $4+log(A)$ days, where $A$ is the drainage area +in square kilometers; and ii) the minimal intermediate flow must be less than +75% of the lowest of the two peaks. +The example below illustrates the extraction of the peaks by the two methods +and shows that the choice of a declustering method has a significant impact. + +```{r fig.height = 4,fig.width = 6} + +## Define a threshold and the minimum separating time. Drainage Area = 14700. +thresh <- 500 +r0 <- round(4 + log(14700)) # 14 days + +## Extract peaks based on run declustering +peaks1 <- which.clusters(flow~date, xd, u = thresh, r = r0) + +## Extract peaks based on WRC recommendations +peaks2 <- which.floodPeaks(flow~date, xd, u = thresh, r = r0, rlow = 0.75) + +## Plot the peaks extracted for the year 1927 +plot(flow~date, xd[xd$year == 1927,],type = 'l', col = 'grey') +abline(h = thresh, col = 2 ,lwd = 2) +points(flow~date, xd[peaks1,], pch = 16, col = 'blue', cex=2) +points(flow~date, xd[peaks2,], pch = 17, col = 'red') +legend('topleft', col = c('blue','red'), pch = 16:17, + legend = c('Cluster','WRC')) + +``` + +The declustering techniques are integrated to the function `FitPot` and +are performed when the argument `declust` is passed. +The example below leads to the identification of the same peaks as in `peaks2` +above, before fitting a GPA distribution. + +```{r} +## Fit a POT model after declustering +fit <- FitPot(flow~date, xd, u = 1000, declust = 'wrc', r = r0) +print(fit) +``` + +## Predicting flood quantiles + +In the summary of the model output, the shape parameter is positive, which +indicates a light tail where the distribution is bounded by $u + \alpha/\kappa$. +The flood quantiles $x_T$ of a $T$ year return period event is defined as the +quantile of probability $[1-1/(\lambda T)]$ of the distribution of the +exceedances, where $\lambda$ is the average number of exceedances per year. +A natural estimator of $\lambda$ is the fraction of flood events over the number +of years of observations. +Hence, for a GPA distribution the flood quantiles are +$$ +x_T = u + \frac{\alpha}{\kappa}\left[ 1 - \left(\lambda T\right)^{-\kappa} +\right]. +$$ +With this package, the flood quantiles are evaluated using the function +`predict`. +The standard deviation and the confidence interval can be included in the +output by passing specifying the argument `ci`. +In the example below, the profile likelihood method is used to evaluate the +confidence interval of the flood quantiles. +Other available methods are the delta method (`delta`) and +parametric bootstraps (`boot`). + + +```{r, fig.height=6, fig.width=9} +## Predict flood quantile of return period 10 and 100 years +predict(fit, rt = c(10,100), se = TRUE, ci = 'profile') +``` + +## Selecting the threshold + +An import aspect of using POT is the selection of a proper threshold. +This decision is generally based on the notion of stability. +This principle entails that if $u$ is a well-chosen threshold then the +exceedances follow a GPA distribution and +all the exceedances for higher thresholds $u^\ast>u$ also follow a GPA with +the same shape parameter. +The objective is therefore to find the lowest threshold that ensures such +stability. +One visual assessment of threshold stability is provided by the mean residual +life plot (MRL). +In this graph, the mean of the exceedances is plotted for various candidate +thresholds. +When stability is reached, the MRL plot should exhibit a linear trend. +In the figure below, the MRL plot indicates that a threshold $u = 1000$ as used +in the previous examples is a reasonable choice. + +```{r, fig.height=4, fig.width=6} +## List of candidate thresholds +ulst <- seq(500,1500, 25) + +## Mean residual life plot +PlotMrl(flow~date, xd, u = ulst, declust = 'wrc', r = r0) +``` + +However, due to sampling error, MRL plots does not always lead to clear +decision. +Another validation approach for selecting a threshold is by looking +directly at the evolution of the shape parameter with respect of the threshold. +The function `SearchThresh` return key statistics of the POT model for various +thresholds. +The graphics below shows that above `u = 1000` the shape parameter is stable and +leads to coherent estimated flood quantiles. + +```{r, fig.height = 4, fig.width = 6} +candidates <- SearchThresh(flow~date, xd, u = ulst, declust = 'wrc', r = r0, + verbose = FALSE) + +PlotThresh(candidates, type = c('kappa')) +``` + +```{r, fig.height = 4, fig.width = 6} +PlotThresh(candidates, type = c('q2','q5','q10','q20','q50')) +``` + +The process of selecting a good threshold can be automatized using a goodness of +fit test like the Anderson-Darling (AD) test. +The function `SearchThresh` also extracts the p-value of that test for every +candidate threshold. +The figure below shows that before a threshold of approximately 900, the +p-values of the AD test are low and does not support the hypothesis of a GPA. +```{r, fig.height = 4, fig.width = 6} +PlotThresh(candidates, type = c('ad')) +``` +After this changing point, the p-values increased until reaching 0.5 for a +threshold of about 950. +Here, the value 0.5 is the upper bound imposed by the table of Choulaki and +Stephen (2001), which is used for interpolating the p-values. +With the common significance level 0.05, it was found that such procedure +often selects a threshold that is too low and so, Solari et al. (2017) suggested +to use instead the maximum p-value. +Alternatively, Durocher et al. (2018) suggested of using a critical values of 0.25 to +avoid high probability of randomly acceptating the GPA (False positive). +Accordingly to this latter criteria, the lowest stable threshold among +the candidates is found at `u = 925`, while the maximum is `u = 950`. +This values can be extracted using the function `FindThresh`. +Note in particular that the argument `ppy` can be used to remove the candidate +threshold that a number of average peaks per year outsite a given interval. + +```{r} +## Threshold with maximum AD p-value +cvars <- c('u','ppy','ad','q50') +FindThresh(candidates, method = 'max')[,cvars] + +## First threshold with AD p-value > 0.25 +FindThresh(candidates, method = 'sgn', tol.sgn = 0.25, + ppy = c(1,3))[,cvars] + +``` + +Another method to automatically select the threshold is to imposed a given +number of peaks per year (PPY). +By passing the argument `type = 'ppy'` and `tol.ppy = 2.2`, the candidate threshold +with PPY the closest to 2.2 is returned. + +```{r} +## Threshold with approximately 2.2 PPY +FindThresh(candidates, method = 'ppy', tol.ppy = 2.2)[,cvars] +``` + +In some situation a critical p-value such as 0.25 may not be reached or the +threshold associated to a given PPY may lead to sample that is not well +approximated by a GPA. +Mixing criteria for automatically selecting a threshold may lead to +a more robust procedure. +The approach of selecting the first threshold that reached a specific p-value has +the advantage of being generally more precise as it includes more peaks and +ensure that GPA is a reasonable model. +The argument `sgn-max` or `sgn-ppy` indicate to `FindThres` to search for the +`sgn` threshold and if it cannot be found, will return the alternative candidates. + +In association with the method `sgn`, the function `FindThresh` can also reject +thresholds where the relative discrepency between the flood quantile of the +selected threshold and some reference thresholds is to large. +The reference threshold define as the average of the flood quantiles associated +to the 5 lowest thresholds among the candidates. +The last example below use the argument `ppy = c(1,3)` to impose a lower bound of +1 PPY. +Reference flood quantile is therefore the average flood quantile of 50 years +return period with threshold around 1 PPY. +In for the present data, the flood quantile quickly stabilize and the exemple below +that for a threshold of `u = 825`, the relative discrepencies between the selected +treshold and a threshold of 1 PPY is less than 1%. + + +```{r} +candidates.mod <- candidates +candidates.mod$ad <- pmin(0.2, candidates.mod$ad) + +## First threshold with AD p-value > 0.25 +FindThresh(candidates.mod, method = 'sgn-ppy', + tol.sgn = 0.25, tol.ppy = 2.2)[,cvars] + +FindThresh(candidates.mod, method = 'sgn-ppy', + tol.sgn = 0.15, tol.ppy = 2.2)[,cvars] + +## Verify the discrepencies with reference threshold ~ 1PPY +FindThresh(candidates, method = 'sgn', ppy = c(1,3), tol.sgn = 0.0, + qua = 'q50', tol.qua = .01)[,cvars] + +FindThresh(candidates, method = 'sgn', ppy = c(1,3), tol.sgn = 0.25, + qua = 'q50', tol.qua = .01)[,cvars] + +``` + +## Conclusion + +In this document, it was shown how a POT model can be fitted +on the flood peaks using a GPA distribution and to evaluate flood quantiles. +Instructions for fitting the model (`FitPot`), evaluate uncertainty for +the parameters (`coef`) and derived the flood quantile were provided (`predict`). +Finally, basic validation procedures based on the mean residual life plot +(`PlotMrl`) and goodness of fit tests (`GofTest`) were shown to assess the +selection of the threshold. +For a general introduction to the technical aspect of threshold modeling, +the reader is referred to Coles (2001) or Davison and Smith (1990). + +## References + +Choulakian, V., Stephens, M.A. (2001). Goodness-of-Fit Tests for the Generalized Pareto Distribution. Technometrics 43, 478–484. https://doi.org/10.2307/1270819 + +Coles, S., 2001. An introduction to statistical modeling of extreme values. Springer Verlag. + +Davison, A.C., Smith, R.L. (1990). Models for Exceedances over High Thresholds. Journal of the Royal Statistical Society. Series B (Methodological) 52, 393–442. + +Durocher, M., Zadeh, S.M., Burn, D.H., Ashkar, F. (2018). Comparison of automatic procedures for selecting flood peaks over threshold based on goodness-of-fit tests. Hydrological Processes 0. https://doi.org/10.1002/hyp.13223 + +Lang, M., Ouarda, T.B.M.J., Bobée, B. (1999). Towards operational guidelines for over-threshold modeling. Journal of Hydrology 225, 103–117. https://doi.org/10.1016/S0022-1694(99)00167-5 + +Solari, S., Egüen, M., Polo, M.J., Losada, M.A. (2017). Peaks Over Threshold (POT): A methodology for automatic threshold estimation using goodness of fit p-value. Water Resour. Res. 53, 2833–2849. https://doi.org/10.1002/2016WR019426 + diff --git a/vignettes/rfa_pot.html b/vignettes/rfa_pot.html new file mode 100644 index 0000000..b92a801 --- /dev/null +++ b/vignettes/rfa_pot.html @@ -0,0 +1,471 @@ + + + + + + + + + + + + + + +At-site flood frequency analysis using threshold modeling + + + + + + + + + + + + + + + + + +

    At-site flood frequency analysis using threshold modeling

    + + + +
    +

    Introduction

    +

    This document will present how CSHShydRology can be used to perform at-site flood frequency analysis using the threshold modeling. This example is illustrated using the daily discharge of the Saint-John River at Fort Kent (NB). First a verification is done to make sure that only complete year of data are included. In this case, one can see that after 1927, all years of observations are complete.

    + +
    ## 1926 1927 1929 1930 1931 
    +##   92  365  365  365  365
    + +
    +
    +

    Estimating model parameters

    +

    By default the Function FitPot estimates the parameter of a Generalized Pareto distribution (GPA) assuming that the data are independent exceedances with lower bound \(u = 0\). \[ +F(x)= \exp\left\{- \left( 1-\kappa \frac{x}{\alpha} \right)^{1/\kappa} \right\} +\] The recommended estimation method is the maximum likelihood (MLE), but the L-moment estimate can be obtained passing the argument method = lmom. In each case, the covariance matrix of the estimate is evaluated if it is not turned off by passing the argument varcov = FALSE. For the L-moments, the covariance matrix is estimated using a bootstraps sample, which can be time consuming for some situations. For MLE, confidence intervals of the parameters are derived using the delta method. However, symmetrical confidence intervals can be unrealistic in some occasions and the profile likelihood method can be used instead by using the function coef with the argument ci = TRUE.

    + +
    ## 
    +## Analysis of peaks over threshold
    +## 
    +## Threshold :  0
    +## Number of excess :  2000
    +## Number of years :  5.48
    +## Excess rate (yearly):  365.25
    +## Mean residual Life :  0.960293
    +## 
    +## Parameters :
    +##   alpha   kappa 
    +## 0.98474 0.02546 
    +## 
    +## std.err :
    +##   alpha   kappa 
    +## 0.03074 0.02179
    + +
    ##         estimate      lower      upper
    +## alpha 0.98473923  0.9165249 1.04571521
    +## kappa 0.02545681 -0.0285775 0.06496094
    + +
    ##      alpha      kappa 
    +## 1.00479130 0.01388243
    +
    +
    +

    Declustering

    +

    In practice, daily streamflow evolve smoothly and declustering techniques are necessary to extract independents flood peaks above a desired threshold \(u\). Without declustering, exceedances forms clusters that are associated to the same hydrological event. With this package, peaks can be extracted using the function which.cluster or which.floodPeaks. The first method is a running declustering method that extracts the maximum of each cluster separated by at least r observations below the threshold. Such method may be more natural for studying rainfall events that are separated by sunny days. The second method follows the recommendation of the Water Resource Council of the United States as described in Lang et al. (1999). In brief, two adjacent peaks must respect the following two conditions: i) they must be separated by \(4+log(A)\) days, where \(A\) is the drainage area in square kilometers; and ii) the minimal intermediate flow must be less than 75% of the lowest of the two peaks. The example below illustrates the extraction of the peaks by the two methods and shows that the choice of a declustering method has a significant impact.

    + +

    +

    The declustering techniques are integrated to the function FitPot and are performed when the argument declust is passed. The example below leads to the identification of the same peaks as in peaks2 above, before fitting a GPA distribution.

    + +
    ## 
    +## Analysis of peaks over threshold
    +## 
    +## Threshold :  1000
    +## Number of excess :  158
    +## Number of years :  88
    +## Excess rate (yearly):  1.7955
    +## Mean residual Life :  982.039
    +## 
    +## Parameters :
    +##     alpha     kappa 
    +## 1295.9003    0.3196 
    +## 
    +## std.err :
    +##     alpha     kappa 
    +## 120.26515   0.05413
    +
    +
    +

    Predicting flood quantiles

    +

    In the summary of the model output, the shape parameter is positive, which indicates a light tail where the distribution is bounded by \(u + \alpha/\kappa\). The flood quantiles \(x_T\) of a \(T\) year return period event is defined as the quantile of probability \([1-1/(\lambda T)]\) of the distribution of the exceedances, where \(\lambda\) is the average number of exceedances per year. A natural estimator of \(\lambda\) is the fraction of flood events over the number of years of observations. Hence, for a GPA distribution the flood quantiles are \[ +x_T = u + \frac{\alpha}{\kappa}\left[ 1 - \left(\lambda T\right)^{-\kappa} +\right]. +\] With this package, the flood quantiles are evaluated using the function predict. The standard deviation and the confidence interval can be included in the output by passing specifying the argument ci. In the example below, the profile likelihood method is used to evaluate the confidence interval of the flood quantiles. Other available methods are the delta method (delta) and parametric bootstraps (boot).

    + +
    ##         pred       se    lower    upper
    +## 10  3443.623 377.2849 3219.308 3642.194
    +## 100 4282.903 620.8015 4049.693 4825.945
    +
    +
    +

    Selecting the threshold

    +

    An import aspect of using POT is the selection of a proper threshold. This decision is generally based on the notion of stability. This principle entails that if \(u\) is a well-chosen threshold then the exceedances follow a GPA distribution and all the exceedances for higher thresholds \(u^\ast>u\) also follow a GPA with the same shape parameter. The objective is therefore to find the lowest threshold that ensures such stability. One visual assessment of threshold stability is provided by the mean residual life plot (MRL). In this graph, the mean of the exceedances is plotted for various candidate thresholds. When stability is reached, the MRL plot should exhibit a linear trend. In the figure below, the MRL plot indicates that a threshold \(u = 1000\) as used in the previous examples is a reasonable choice.

    + +

    +

    However, due to sampling error, MRL plots does not always lead to clear decision. Another validation approach for selecting a threshold is by looking directly at the evolution of the shape parameter with respect of the threshold. The function SearchThresh return key statistics of the POT model for various thresholds. The graphics below shows that above u = 1000 the shape parameter is stable and leads to coherent estimated flood quantiles.

    + +

    + +

    +

    The process of selecting a good threshold can be automatized using a goodness of fit test like the Anderson-Darling (AD) test. The function SearchThresh also extracts the p-value of that test for every candidate threshold. The figure below shows that before a threshold of approximately 900, the p-values of the AD test are low and does not support the hypothesis of a GPA.

    + +

    After this changing point, the p-values increased until reaching 0.5 for a threshold of about 950. Here, the value 0.5 is the upper bound imposed by the table of Choulaki and Stephen (2001), which is used for interpolating the p-values. With the common significance level 0.05, it was found that such procedure often selects a threshold that is too low and so, Solari et al. (2017) suggested to use instead the maximum p-value. Alternatively, Durocher et al. (2018) suggested of using a critical values of 0.25 to avoid high probability of randomly acceptating the GPA (False positive). Accordingly to this latter criteria, the lowest stable threshold among the candidates is found at u = 925, while the maximum is u = 950. This values can be extracted using the function FindThresh. Note in particular that the argument ppy can be used to remove the candidate threshold that a number of average peaks per year outsite a given interval.

    + +
    ##      u      ppy  ad      q50
    +## 19 950 1.886364 0.5 4087.983
    + +
    ##      u      ppy        ad      q50
    +## 18 925 1.977273 0.3518947 4082.018
    +

    Another method to automatically select the threshold is to imposed a given number of peaks per year (PPY). By passing the argument type = 'ppy' and tol.ppy = 2.2, the candidate threshold with PPY the closest to 2.2 is returned.

    + +
    ##      u      ppy         ad      q50
    +## 15 850 2.204545 0.02224744 4086.882
    +

    In some situation a critical p-value such as 0.25 may not be reached or the threshold associated to a given PPY may lead to sample that is not well approximated by a GPA. Mixing criteria for automatically selecting a threshold may lead to a more robust procedure. The approach of selecting the first threshold that reached a specific p-value has the advantage of being generally more precise as it includes more peaks and ensure that GPA is a reasonable model.
    +The argument sgn-max or sgn-ppy indicate to FindThres to search for the sgn threshold and if it cannot be found, will return the alternative candidates.

    +

    In association with the method sgn, the function FindThresh can also reject thresholds where the relative discrepency between the flood quantile of the selected threshold and some reference thresholds is to large. The reference threshold define as the average of the flood quantiles associated to the 5 lowest thresholds among the candidates. The last example below use the argument ppy = c(1,3) to impose a lower bound of 1 PPY. Reference flood quantile is therefore the average flood quantile of 50 years return period with threshold around 1 PPY. In for the present data, the flood quantile quickly stabilize and the exemple below that for a threshold of u = 825, the relative discrepencies between the selected treshold and a threshold of 1 PPY is less than 1%.

    + +
    ##      u      ppy         ad      q50
    +## 15 850 2.204545 0.02224744 4086.882
    + +
    ##      u      ppy        ad      q50
    +## 17 900 2.045455 0.1941356 4081.048
    + +
    ##      u      ppy    ad      q50
    +## 14 825 2.329545 0.001 4110.183
    + +
    ##      u      ppy        ad      q50
    +## 18 925 1.977273 0.3518947 4082.018
    +
    +
    +

    Conclusion

    +

    In this document, it was shown how a POT model can be fitted on the flood peaks using a GPA distribution and to evaluate flood quantiles. Instructions for fitting the model (FitPot), evaluate uncertainty for the parameters (coef) and derived the flood quantile were provided (predict). Finally, basic validation procedures based on the mean residual life plot (PlotMrl) and goodness of fit tests (GofTest) were shown to assess the selection of the threshold.
    +For a general introduction to the technical aspect of threshold modeling, the reader is referred to Coles (2001) or Davison and Smith (1990).

    +
    +
    +

    References

    +

    Choulakian, V., Stephens, M.A. (2001). Goodness-of-Fit Tests for the Generalized Pareto Distribution. Technometrics 43, 478–484. https://doi.org/10.2307/1270819

    +

    Coles, S., 2001. An introduction to statistical modeling of extreme values. Springer Verlag.

    +

    Davison, A.C., Smith, R.L. (1990). Models for Exceedances over High Thresholds. Journal of the Royal Statistical Society. Series B (Methodological) 52, 393–442.

    +

    Durocher, M., Zadeh, S.M., Burn, D.H., Ashkar, F. (2018). Comparison of automatic procedures for selecting flood peaks over threshold based on goodness-of-fit tests. Hydrological Processes 0. https://doi.org/10.1002/hyp.13223

    +

    Lang, M., Ouarda, T.B.M.J., Bobée, B. (1999). Towards operational guidelines for over-threshold modeling. Journal of Hydrology 225, 103–117. https://doi.org/10.1016/S0022-1694(99)00167-5

    +

    Solari, S., Egüen, M., Polo, M.J., Losada, M.A. (2017). Peaks Over Threshold (POT): A methodology for automatic threshold estimation using goodness of fit p-value. Water Resour. Res. 53, 2833–2849. https://doi.org/10.1002/2016WR019426

    +
    + + + + + + + + diff --git a/vignettes/rfa_ungauged.R b/vignettes/rfa_ungauged.R new file mode 100644 index 0000000..cbb024a --- /dev/null +++ b/vignettes/rfa_ungauged.R @@ -0,0 +1,19 @@ +## ------------------------------------------------------------------------ +library(CSHShydRology) +data(flowUngauged) + +## Transform data if necessary. +xd0 <- with(flowUngauged, + data.frame(area = scale(log(area)), + wb = scale(log(wb)), + stream = scale(log(stream)), + map = scale(log(map))) + ) + +## ------------------------------------------------------------------------ +## +coord <- cmdscale(GeoDist(~lon+lat,flowUngauged)) +colnames(coord) <- c('lon','lat') + +xd0 <- cbind(xd0, coord) + diff --git a/vignettes/rfa_ungauged.Rmd b/vignettes/rfa_ungauged.Rmd new file mode 100644 index 0000000..02e152e --- /dev/null +++ b/vignettes/rfa_ungauged.Rmd @@ -0,0 +1,381 @@ +--- +title: "Prediction of flood quantiles at ungauged sites" +output: + rmarkdown::html_vignette +vignette: > + %\VignetteIndexEntry{ungauged-RFA} + %\VignetteEngine{knitr::rmarkdown} + \usepackage[utf8]{inputenc} +--- + +**UNFINISHED** + +## Introduction + +In this document, I will show how to use `CSHShydRology` to predict +flood quantiles at ungauged sites. +For this purpose, flood quantiles need to be predicted based on +available catchment descriptors. +There are two general approaches, the quantile +regression techniques (QRT) and the parameter regression techniques (PRT). +In the former approach, at-site analyses are carried out on gauged sites to +obtain at-site estimates of the flood quantiles. +Afterward, the flood quantile of a target site is derived from the +at-site estimates using generally regression methods. +The second approach (PRT) predicts instead parameters of the target +distribution individually based on the at-site estimates of these parameters. +Note that for this second approach, statistics like L-moments could replace +parameters in order for deriving the target distribution (Durocher et al., 2019; +Laio et al., 2011). +Both methods were shown to lead to similar results (Ahn and Palmer, 2016; +Haddad and Rahman, 2012) and the choice may depend on practical considerations. + +Here the QRT approach is adopted to predict a 100 years return periods using a +combination on local regression and kriging. +Note that the prediction of each parameter (L-moments) for the PRT approach +would follow the same steps. + + +## Data preparation + +For this example, we are working with a group 562 stations across Canada where +relevant information are found in the dataset `flowUngauged`. +The instructions below prepared the main dataset containing 4 catchment +descriptors: drainage area (`area`), percentage of waterbodies (`wb`), +stream density (`stream`) and mean annual precipitation (`map`). +These descriptors are initially transformed and scaled. + + +```{r} +library(CSHShydRology) +data(flowUngauged) + +## Transform data if necessary. +xd0 <- with(flowUngauged, + data.frame(area = scale(log(area)), + wb = scale(log(wb)), + stream = scale(log(stream)), + map = scale(log(map))) + ) +``` + +Additionally, classical multidimensional scaling is used to project the +coordinates in a 2D space that aims to preserve the great-circle distance as +much as possible. +The code below add these new coordinates to the descriptors + +```{r} +## Project the coordinates +coord <- cmdscale(GeoDist(~lon+lat,flowUngauged)) +colnames(coord) <- c('lon','lat') + +xd0 <- cbind(xd0, coord) +``` + + +The instructions below show how to evaluate the desired at-site estimation +based on the sample L-moments of the annual maximum discharge for the +562 stations. +It uses the function `lAmax` that links L-moments to the parameters of a given +distribution and `qAmax` to evaluate the flood quantiles. +Note the presence of the argument `scale = FALSE` that specified that the LCV is passed rather than the second order L-moments. +Here, flood quantiles are assumed to follow a Generalized Extreme +Value (GEV) distribution. + + +```{r} +## Convert L-moments to parameter +para100 <- apply(flowUngauged[,c('l1','lcv','lsk')], 1, + lAmax, distr = 'gev', lscale = FALSE) + +## Estimate at-site flood quantiles +F100 <- function(z) qAmax(0.99, z, distr = 'gev') +qua100 <- apply(para100, 2, F100) +xd0 <- cbind(xd0, q100 = qua100) +``` + +For the rest of the example, we put aside 26 sites that will be considered +as ungauged. + +```{r} +## Create a set of ungauged sites +id <- seq(1,501,20) +xd <- xd0[-id, ] +target <- xd0[id,] +``` + +## Region of influence + +The prediction of the flood quantiles are done by the function `FitRoi`. +We denote $i = 0$ the target site and $i= 1, 2, \ldots, n$ the gauged +sites. +First, a measure of similarity is needed to define weights that represent the +importance of each gagauged site in the prediction of the target. +In this case, the measure of similarity is defined as the euclidean distance +$$ +h_{i,j} = \left\| \mathbf{s}_i-\mathbf{s}_j\right\| +$$ +between attributes $\mathbf{s_j}$ that could be catchment descriptors or coordinates. +For simplicity, it will be assumed that the gauged sites are sorted such as +the distance with the target $h_{0,i} = h_i \leq h_{i+1}$ are +increasing. +Accordingly, the weights are taken as +$$ +w_i = \begin{cases} +1 - (h_i/h_{n_k})^2 & i < n_k \\ +0 & i\geq n_k +\end{cases}, +$$ +where more importance to the sites having more similar attributes. +This choice create neighborhoods, or regions of influence (ROI) where only +the sites $i < n_k$ are contributing to the estimation of the target. +These weights are proportional to an Epechnikov kernel where the bandwidth is the +$n_k$-th nearest site. + +At target, the flood quantiles are predicted by a linear model +$$ +\log(Y) = \mathbf{X}\beta + \epsilon +$$ +where $\beta$ is a vector of parameters, $Y$ represents the at-site estimates, $\mathbf{X}$ is a design matrix +of catchment descriptors and $\epsilon$ is a term of error. +Note that the catchment descriptors in $\mathbf{X}$ may differ +from those used to define the measure of similarity ($\mathbf{s}_i$). +The estimates of the parameters $\widehat \beta$ are given by weighted +least-squares, which is the solution of +$$ +\left( \mathbf{X}' W \mathbf{X}\right)\widehat \beta = +\mathbf{X}'W \mathbf{y} +$$ +where $W=(w_1,\dots, w_n)$ is the diagonal matrix of weights. +The example below shows how to fit the local regression models on the +ungauged sites. +The estimated flood quantile +Note that the argument `ker = FALSE` can be passed to use +uniform weights instead of those defined earlier. +In that case the argument $n_k$ represents the sites included +in the neighborhood of the target. + + +```{r} +## Define the ROI model +formula.phy <- log(q100) ~ area + map + stream + wb +formula.dist <- ~ area + map + stream + wb + +## Fit the model +fit <- FitRoi(x = xd, xnew = target, nk = 50, + phy = formula.phy, similarity = formula.dist) +print(fit) +``` + +##### Fig. Flood quantiles of 100 years return period estimated by ROI. + +```{r, echo = FALSE} +plot(log(target$q100),fit$pred, + xlab = 'At-site flood quantiles (log)', + ylab = 'Predicted flood quantiles (log)') +abline(0,1) + +``` + +## Cross-validation + +Cross-validation is a technique used to measure the prediction error of +a model by resampling. +It is strongly suggested to use similar approach to calibrate the argument `nk` +that defines the size of the regions of influence. +The k-fold cross-validation strategy consists in dividing the gauged sites in k +groups of equal size. +Typical value of k are 5 or 10. +In turn each group is treated as ungauged and predicted by the other sites. +These predictions can be compared to the "known" flood quantiles by evaluating +common criteria such as the Root Mean Square Error (RMSE) or the Mean Absolute +Deviation (MAD). +The function `CvRoi` performs cross-validation and return the evaluation +criteria and the function `head` return the best + +```{r } +## List of size to try. +nk.lst <- seq(30,100,10) + +## Perform cross-validation +cv0 <- CvRoi(x = xd, nk = nk.lst, fold = 5, + phy = formula.phy, similarity = formula.dist, + verbose = FALSE) + +## output results +head(signif(cv0,3), crit = 'mad') +plot(cv0, crit = 'mad') + +``` +Cross-validation can also be used to select relevant catchment descriptor in +either the definition of the measure of similarity or the regression. +By default, the output of `RoiCv` varies as the groups are created randomly. +Specific cross-validation groups can be passed in argument to ensure that +competiting models are evaluated using the same design. +The second example below shows that the descriptors `wb` and `stream` improve +the predictive power of the model. + +```{r } + +## Create cross-validation groups +set.seed(392) +kf <- sample(rep_len(1:5, nrow(xd))) + +## Perform cross-validation with different choices of descriptors +cv0 <- CvRoi(x = xd, nk = nk.lst, fold = kf, + phy = formula.phy, similarity = formula.dist, + verbose = FALSE) + +formula.phy2 <- log(q100) ~ area + map + +cv1 <- CvRoi(x = xd, nk = nk.lst, fold = kf, + phy = formula.phy2, similarity = formula.dist, + verbose = FALSE) + +## Compare the prediction power +head(signif(cv0,3), crit = 'mad') +head(signif(cv1,3), crit = 'mad') + + +``` + +If other criteria than those included in `CvRoi` are not necessary, it is +possible to perform the cross-validation, but obtain the prediction and the residuals of the + +## Kriging + +The catchment descriptors provide useful information to describe the relation +between the flood quantiles and its physical catchment descriptors. +However, important characteristics of the basins may not be available and so, +spatial correlation among the residuals may remain if the missing +information is spatially distributed.(Durocher et al., 2019). +Therefore, a spatial predictor could be used to correct the initial regression +model by spatially predicting the residuals. +Considering $\mathbf{z} = \mathbf{y}-\mathbf{X} \widehat \beta$, +a linear predictor for the residual at the target site +may have the form $z_0 = \mathbf{a}'\mathbf{z}$, where $\mathbf{a}$ are unkown +parameters. +The simple kriging method found $\mathbf{a}$ that minimize the variance of the +predictor $\widehat z_0$ and has the form +$$ +\mathbf{a} = \Sigma^{-1}\sigma +$$ +where $\sigma$ is the covariance matrix of the residual and +$\sigma = \mathrm{cov}(\mathbf{z},z_0)$. +Kriging requires the estimation of a covariance model. +In this regards, texbooks such as Schabenberger and Gotway (2014) provide a good introduction on the modeling of spatial data. +One model of covariance with respect to a distance $h > 0$ is the exponential model +$$ +C(h) = C(0) -\tau \exp\left(-3 \frac{h}{\alpha}\right) +$$ +where $\alpha > 0$ is a parameter, called the practical range that characterizes +the rate at which the covariance falls with $h$ and +$\tau \in \left[0,C(0)\right]$ is a nugget effect +that creates a discontinuity at $h = 0$. + +The function `FitRoi` and `CvRoi` can directly perform the kriging on the +residuals by passing a set of coordinates to the argument `kriging`. +The example below shows that the addition of the kriging step improve the +prediction power of the model. + +```{r, warning = FALSE} +formula.krig <- ~ lon + lat + +cvk <- CvRoi(x = xd, nk = nk.lst, fold = kf, + phy = formula.phy, similarity = formula.dist, + kriging = formula.krig, verbose = FALSE) +``` + +##### Fig. Effect of kriging of the prediction of flood quantiles. +```{r, warning = FALSE} +plot(cvk, ylim = c(0.38, 0.45)) +lines(mad~nk, cv0, col = 'red') +legend('topleft', horiz = TRUE, + legend = c('with','without'), + col = c('black','red'), lty = rep(1,2)) +``` + +## Bootstrapping + +The argument `se = TRUE` can be passed to `FitRoi` to return estimation of the +standard deviation for the regression model (`phy.se`) or the kriging +(`krige.se`). +These outputs may be useful to assess the variability of the model, but they +don't give an approximation of the global uncertainty. +The all stepwise procedure can be view that include the at-site analyses, the +regression using ROI and kriging can be view as a larger regression model +$$ +Y = f(\mathbf{s}) + \eta + \omega +$$ +where $\eta$ is term of sampling error and $\omega$ is term of modeling error. +If they are assumed independent, a bootstrap can be used to evaluate +the total error by resampling the two terms of errors. + +The terms $\eta$ represent the uncertainty associated with the at-site analysis. +The example below obtains a small sample of 30 sampling residuals. +The simulation are performed by the function `RegSim` that is assuming here +that the annual maximums are coming from 50 years of data and they +are all correlated by a constant coefficient of 0.4. + +```{r} +lmm <- flowUngauged[-id, c('l1','lcv','lsk')] + +Fqua <- function(z){ + l <- lmom::samlmu(z) + p <- lmom::pelgev(l) + return(lmom::quagev(.98,p)) +} + +Fsim <- function(){ + xs <- RegSim(lmm, 'gev', nrec = 50, corr = .4) + return(apply(xs, 2, Fqua)) +} + +set.seed(12) +qua100 <- log(replicate(30, Fsim())) +eta <- apply(qua100, 2, '-', log(xd$q100)) + +``` + +For the + +```{r} +## Fit the model +fitk <- FitRoi(x = xd, xnew = target, nk = 110, + phy = formula.phy, similarity = formula.dist, + kriging = formula.krig) + +## Get the residual based on cross-validation +res <- residuals(fitk, xd) + +``` + + + + +## References + +Ahn, K.-H., & Palmer, R. (2016). Regional flood frequency analysis using + spatial proximity and basin characteristics: Quantile regression vs. + parameter regression technique. Journal of Hydrology, 540, 515-526. + https://doi.org/10.1016/j.jhydrol.2016.06.047 + +Durocher, M., Burn, D. H., Zadeh, S. M., & Ashkar, F. (2019). Estimating flood + quantiles at ungauged sites using nonparametric regression methods with + spatial components. Hydrological Sciences Journal, 64(9), 1056-1070. + https://doi.org/10.1080/02626667.2019.1620952 + + +Haddad, K., & Rahman, A. (2012). Regional flood frequency analysis in eastern + Australia: Bayesian GLS regression-based methods within fixed region and ROI + framework - Quantile Regression vs. Parameter Regression Technique. Journal + of Hydrology, 430-431, 142-161. https://doi.org/10.1016/j.jhydrol.2012.02.012 + +Laio, F., Ganora, D., Claps, P., & Galeati, G. (2011). Spatially smooth + regional estimation of the flood frequency curve (with uncertainty). + Journal of Hydrology, 408(1-2), 67-77. + http://dx.doi.org/10.1016/j.jhydrol.2011.07.022 + +Schabenberger, O., & Gotway, C. A. (2004). Statistical methods + for spatial data analysis (Vol. 64). CRC Press. + diff --git a/vignettes/rfa_ungauged.html b/vignettes/rfa_ungauged.html new file mode 100644 index 0000000..0e48050 --- /dev/null +++ b/vignettes/rfa_ungauged.html @@ -0,0 +1,322 @@ + + + + + + + + + + + + + + +Prediction of flood quantiles at ungauged sites + + + + + + + + + + + + + + + + + +

    Prediction of flood quantiles at ungauged sites

    + + + +

    UNFINISHED

    +
    +

    Introduction

    +

    In this document I will show how to use CSHShydRology to predict flood quantiles at ungauged sites when there is no hydrological information available at the desired station. In this situation the flood quantiles need to be predicted based on a set of known descriptors.

    +

    For this example we will work with a group 562 stations in Canada. The codes below prepared the dataset containing the 4 catchment descriptors: drainage area (area), percentage of waterbody (wb), stream density (stream) and mean annual precipitation (map). These descriptors are transformed and scale to have near Normal distribution.

    + +

    Additionally, classical multidimentional scaling is used to project the coordinates in a 2D space that aims to preserve great-circle distance as much as possible. The code below add these new coordinates to the descriptors

    + + +

    Here four descriptors are considered: Drainage area, percentage of water bodies, stream density and mean annual precipitation. The descriptors are transformed to logarithm scale and standardized in order to obtain less skew distributions. The coordinates used in this study were obtained by multidimensional scaling to have a set of Cartesian coordinates that preserve geographical distances.

    +
    + + + + + + + + From 8eed59a7ebe373bbaa912920ad1be06411ea372d Mon Sep 17 00:00:00 2001 From: Martin Durocher Date: Thu, 18 Jul 2019 17:05:52 -0400 Subject: [PATCH 02/21] update rfa --- CSHShydRology.Rproj | 2 +- CSHShydRology.pdf | Bin 158867 -> 266175 bytes DESCRIPTION | 6 +- R/rfa_CvRoi.R | 25 +- R/rfa_DataWide.R | 13 +- R/rfa_DistSeason.R | 24 +- R/rfa_ExtractAmax.R | 6 +- R/rfa_FindNearest.R | 4 +- R/rfa_FitAmax.R | 73 +++-- R/rfa_FitGev.R | 6 +- R/rfa_FitPot.R | 115 ++++--- R/rfa_FitRegLmom.R | 50 +-- R/rfa_FitRoi.R | 108 ++++--- R/rfa_GeoDist.R | 4 +- R/rfa_GofTest.R | 80 ++--- R/rfa_Intersite.R | 56 +--- R/rfa_JulianPlot.R | 3 + R/rfa_PlotMrl.R | 13 +- R/rfa_PlotThresh.R | 4 + R/rfa_PoolRemove.R | 2 +- R/rfa_RegSim.R | 27 +- R/rfa_SearchThresh.R | 2 + R/rfa_SeasonStat.R | 10 +- R/rfa_amax.R | 8 +- R/rfa_fgpa.R | 4 +- R/rfa_gpa.R | 23 +- R/rfa_plot_amax.R | 37 ++- R/rfa_plot_isite.R | 74 +++++ R/rfa_predict_amax.R | 47 +-- R/rfa_predict_fpot.R | 46 +-- R/rfa_predict_reglmom.R | 31 +- R/rfa_which_floodPeaks.R | 24 +- inst/R2pdf.R | 3 + man/Amax.Rd | 6 +- man/CvRoi.Rd | 17 +- man/DataWide.Rd | 8 +- man/DistSeason.Rd | 16 +- man/ExtractAmax.Rd | 5 +- man/FindNearest.Rd | 4 +- man/FitAmax.Rd | 11 +- man/FitGev.Rd | 4 +- man/FitPot.Rd | 35 ++- man/FitRegLmom.Rd | 16 +- man/FitRoi.Rd | 31 +- man/GPA.Rd | 7 +- man/GeoDist.Rd | 4 +- man/GofTest.Rd | 23 +- man/Intersite.Rd | 12 +- man/JulianPlot.Rd | 2 + man/PlotMrl.Rd | 14 +- man/PlotThresh.Rd | 4 + man/RegSim.Rd | 12 +- man/SearchThresh.Rd | 2 + man/SeasonStat.Rd | 19 +- man/fgpa.Rd | 4 +- man/plot.amax.Rd | 10 +- man/plot.isite.Rd | 49 +++ man/predict.amax.Rd | 8 +- man/predict.fpot.Rd | 8 +- man/predict.reglmom.Rd | 10 +- man/which.floodPeaks.Rd | 16 +- tests/testthat/test_rfa_FindNearest.R | 2 + tests/testthat/test_rfa_FitAmax.R | 2 + tests/testthat/test_rfa_FitPot.R | 9 +- tests/testthat/test_rfa_FitRoi.R | 11 +- .../{test_rfa_gof.R => test_rfa_GofTest.R} | 0 tests/testthat/test_rfa_Intersite.R | 9 +- tests/testthat/test_rfa_PoolRemove.R | 2 +- tests/testthat/test_rfa_SeasonStat.R | 24 +- tests/testthat/test_rfa_amax.R | 1 + tests/testthat/test_rfa_fgpa.R | 2 + tests/testthat/test_rfa_pot.R | 122 -------- vignettes/rfa_amax.R | 39 ++- vignettes/rfa_amax.Rmd | 189 ++++++----- vignettes/rfa_amax.html | 137 ++++---- vignettes/rfa_gauged.R | 11 +- vignettes/rfa_gauged.Rmd | 87 +++--- vignettes/rfa_gauged.html | 30 +- vignettes/rfa_pot.R | 17 +- vignettes/rfa_pot.Rmd | 161 +++++----- vignettes/rfa_pot.html | 177 ++++++----- vignettes/rfa_ungauged.R | 161 +++++++++- vignettes/rfa_ungauged.Rmd | 293 +++++++++++------- vignettes/rfa_ungauged.html | 244 ++++++++++++++- 84 files changed, 1842 insertions(+), 1175 deletions(-) create mode 100644 R/rfa_plot_isite.R create mode 100644 inst/R2pdf.R create mode 100644 man/plot.isite.Rd rename tests/testthat/{test_rfa_gof.R => test_rfa_GofTest.R} (100%) delete mode 100644 tests/testthat/test_rfa_pot.R diff --git a/CSHShydRology.Rproj b/CSHShydRology.Rproj index eaa6b81..1788e68 100644 --- a/CSHShydRology.Rproj +++ b/CSHShydRology.Rproj @@ -15,4 +15,4 @@ LaTeX: pdfLaTeX BuildType: Package PackageUseDevtools: Yes PackageInstallArgs: --no-multiarch --with-keep.source -PackageRoxygenize: rd,collate,namespace +PackageRoxygenize: rd,collate,namespace,vignette diff --git a/CSHShydRology.pdf b/CSHShydRology.pdf index 82fd2d613d1e76ad36b9c5ed18f20759a0be43e0..11d02b466d829493c21ac137f4327d8940f6b23f 100644 GIT binary patch delta 245799 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

    66Dh5vAWE+Ha(bq9)hW+K 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 Va6%+DE;dd!9(YPhaYYIE{{yF}ve^It delta 140519 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

    0abNz&Y@{I^2u5xywLL9JJCHV*ZB87G* zkx8xg@xAB?C^W7F#N>YltTue5)L{$BEk*6Xl5r5w%oG&3GsI`9%^T_sn@rgn??gnY zqhn(w2D^avlt6n=)-Ns`gwchI*F$fA8x?Wl+?dd&@vBGsXMg97!paQ)+@JoqeVP7F zC!xyJ6q=pb1H%Bnf?l(gw3QXrb{>a2fNYe-dk=PxX9J7tU`%M6N8ilGgJNE-U|gu? z!rGDPawrVe;KknP-V0wVG})8?^)w3Nwg$6iomNx%5>Qh2QN@o&sK-@O(%$nTl&JKk z)Sk;}C&#b-nRB7)ZZdC6?=`FH?866|_T4CGZ>hPd7#!Annc<8cw`qKewhoQU;bcDp z&;Rv_Q?ttAlvnjWFzE8_`uu#K+ZIspt0huXDjz=E_#PBx6ViNA7tAA&?6oo{8wDo! zZXe|Z9SCO!?-iLuJQ7kLsv2w|XF#-y=%OvK+uh)@K)7q{$(q#*WoV&S)@FeX}i!7r9E3-r+wD9 z>F|_Ag$8MouS*I&ycF+1lN->)Kh!gXvY06K0~#K5)7*3XNX>Iydut(AHF>kY!Mqc99oFFTf~2#| zD_w)j8XI^IR8%Ss`5CsV&#l6yp3+tJ2ry4)s_|-qvsY+#uf73pP|s>revZ8*pktYQ z0?W`N{;dB}kY#Mn9?eB^Czqq^z6?Opz(*xHy=a1d534%cxiZa*aX3j5H~InnF!71O zBO!jde4C=9;ox@9xcG%zM?uuJ0gC~Z9&RL4&rty{m_vRP&2h zm~p?|*WZC1VcCdcbex<^d-67P(Dq>($jOEBSZ8e4Tqd?7nP^tF+FuC81tJ-$0h2PV ziL@Lsm~vtv`$(*b(vy^@b9Mu~iBkob_h?%hK(=8t&QAa#FDe~K_*J{ROAg#w(q5#V zb9zk~W1x-LviHwDD4edFo-S2t*4ymrQrB_g>X)A#6RY#&euj)VU?&R9WRvAcvLf38 zc|;)iFe~-z(6OtTDz3o1dBO-kpr-W2f=&9hFT%nRyBv}eLeyIEPu*8E+hfSJ$JZH~ zrtz0X>Gz|HgM*~yPJCeJn?;;KmM($B-yxVI&v(V8<)N=3_m8{u%nGTt_Asln@7->c zXxG!Ee}D2rJR*lJU5L!pyVcY*@Akc)#Gx0_9!wIU_wu&FzKv<^8*KL#tdH_PukWOU zb_{SXPVWCs);U_*F4+?QWdkwTreMwtRJ4sXnsm^b4eM_p#mWjZub2G(9V*)R<=1%v z5-P5nnwMU5cJ|fzo&~jUOR)dpk-#-f`I18V(Dc2@ zVJ9MK@Yn~sHF4D|xzJ}c?0}3YC2hK_sSnEUq0BX)p#nVFvp_M2*_1FsaSiJ0WjSh6 z*4X;P>!HX-gUxZF+D6j`6B&!Wd~PTB_Dz{-g-&J@dahi%l5ne5`)&;5s+Q5k>zoDE ze}5S0cnlw}L;{Z~g2}Q24^}$ahibQs9#&gUH*q%S#e3P%RN8=L-Otel)&t++v!j`z zMrvWsjzx#rjuak8eKDx7ma{%)y_#6WtE{Gr&(gM45;L~sypAisZ9Vll)N^gS1eWr} z6<*C+=i1fGN>;%3Tr-51N*LA125l{_PK67c+rQZ5;_8BeNFr9s#YlmTR|?|0nt!L< zy09Ya?5#MQWA3VR({d1~_T9I4jjn3;wT@bzJpLWlc+GRvBbOS0o-5=*qRe>Fxv^C! z29LL>8e%r=5;I^3Dwac=CD?YRK`(K~Rq4)fS}rkOjW}C6aQCppL(F2P-dU(8XtE5v zK`{Sn9X)NMn(`T;&#^UuxIAx0WrHi=%AlEcjm{bIk2dtH%e7kxcV&{rNP2SmlF`uA z(@_)6ZtT4Ln}TQ!dG4z9t*oU*$eia*k2BdJ!&`vT6bTo~JTKBWHE*WuaEiiG?x(vP zH&cNi(ZXS!+RGm27uN`L8){Mbuk!&PqdV^R!TJspA(TPv^&g8&YC8_ z=*~T_%^23x-PEU=NC)}!>GOutQmcNl+rktuZWvhnCeLLtLM2gT8xDqSiSIN!bc8=! zk8cbS7Jz1_}xscs2=M-nA7a5oDV3B zoSC+4U&f;ej`&?dOBHnEEXgn9C=xSk$7eeG1GCGY;s#H9=ibe3YlzfL4kk^i4R1;t z#BuC>`52qd?Fo556E*><8>|6{`cP#|T6@RgD0`OIiP2k)T55fFq+K(iEo_yvH=K=L zDuG-PV$E=@0>K;1XuVIU2gNE2w*N|^M|=+(QpApCKJE6zDC#iW#BcVglV_K(H={e9 z@bHR4wm+b4@kg>G(QG%GEdp~h!i$cjuSzb=3A%(;+dq{_-hJ*B7V`|~O+_-VKpXxW zGTgq(AIQ=>TPslzf|^wz2A!Pl6uL(JBLtPeHyvi3`bP|Ei?Z>tDLmP3ig{@bNNplP zS!U&B;lY=ayD)~x0^tycD1ERCX09Xzvz`3>e#RKu@1H3qaZ)pD+=45CdhRUx0NeOs ze(AH;t|>Rkds{~6TtzY#98?!Lu{IQ zp%a!>D=VEBNett?00UMxHr~VXZ2j<$L9_Ncc_bCJ`gX;;MApwA0d=-{&im$6m~TAD zFkm}eUJpiOgn)Ebu8*-O$;6CXQmO=fY#>V@NxC3;ASSfOkJ)nx z2%}9=3*sd%lWT#`AK{XO4spwuj*Zcqg~jm9KnGW|XlR~HtSqDxkY(&Ur~i=B0m?c0J~0}^GM;hY+$-${ zUF3$DvIHAUNve1N4BMDR6sHP8B0&hnn^_!m!m0NhL(cj3#dRKWD+`)%$GB}+7-+C% ze^o9Ef?FgQFw0V}N|13UM39FK*XEC2EH`NC6y?L*RZ^<<+gB!BwX~C4DirN(&um`L zEN!az+Xi?D3*oos^dApfQu}K5`Ay=je7Gh@6T1m;LdtSLKKw9eAv0PobcNBi9)* zZVOAt&LLeGP*fEh+UJEqWYa^@OEvAObu2zmdAGCz^i!ib9Mp(WF`yLN5#%Jejyp_O zw8#5t?=4V-1C+eZy{g}jr=JV)Y#wWj9_ppa95bkZ!TZK{$G3=PgR$Q}}w;Zu}mR)v{mEO&iuBC_-RE~;G~z%(MMP7zTmn8k*4 zpo#(tJ7-v%DzRWl8b^3U`uAavxOrrvKtAxVpn~0?JE3w>!8ANhydkFS;*TK}dG3ze zL1G=rOi8o4FMKy$+I#TdNeEWr^(Q~(QvIEi&9l2QX{qf;= z>7aT0qWyE@whbVAlM2}i6Ig+c|FCW(QYuOaasTs4){|vDC#UaCM%@81ea(Zqhn*dR zS7itF0N6-0=8DA#Ad|YpDi`Qhec1($S=}0F)wrej)@q9=|t`&3bf5-r-*Cq%M?=0{YD6y$_^e~=SfiPpML8ATFyfx#Q;*7Y< zmyeDPNP$5hLRcjQYYrVs{6fdL`ah~qkc)pr@C`vX3LH0cvHtkKuIwI z$g_M{lV~sy6YW_0K4YpNY3A?`HmBSa>obUcb-<8OnWMb~FjuaM)Wx$ESpyxJ3gCyH zm}L5lNC^W4oS>0GGsfvTrVru+jjGiHfS(^PiEbt51hgYfalveLE|QgIMZ=ap-7uFz zuFS`1Ots49T8$f*wU`r?vNCiW>!+E6Ss@}&%1@7yyXFP(#Fcsyq05gmQ**3sbHs?(c{f?2zOf*N6Q6`&}kkK4{M zC*b58UH+yYzK)s|$tSPVkQf-_U|*d@84O3=ifqY^+cMK*ypP0diksKQB8BlBkkyA} zt>LWRB%07?gi8@{4VA|y6D<7>lONvASJN^P&L-ZWT7OS&o1on32CLV!FI-^%6Cia! z7|u2Vgtj1*MWzUD9BmE_Rf3}rZtSz74^WW=qb|V}TI)KFWQVIBkFNL__1oST-8P=k zt@h+i1WM;MTEZ5i!^qWB#J@!f9VvcYHAfaA>xdSd%U+Yaur*8$7_(9>8V_eLHcu*7 zW`GY9x)7^Rj=S0L?wBARhIaS~5x7V`Tfz(h-@pu~@L3%8)=m!VQfpo|b`q0{0X8|+ ze`?D8vod86{dBYYFlLJr@C@v_di1g5oq;cn&&qLR)E$edn-K~>i2&HWU}S7Zu(Tsb&Jkcw8E6Vqq8BfLzmKR;D zUttL~Nw4~+{>cvqdFQq)`Gl%M(4v!{)d+_+RSiZHlKn4Sx59zDUIZe~ZQj2k8T!g8 zBkfdMg8r!!2p%W70c1-z@S%lJZsF`eZe4u;e(oVjVHkfE^pXU3S4k@_wNCZ4vr?oi z9Q^!R15c<55Wj3R%#Cp`1L@{)p@@i|kPdp~K;w6UM{R@;mhGKWj47Fe%u zMHNeB5gZnhUM+`dEr{uXsuC#g34Yx1xN3owIIO;p#|qWEne=r*0)r3eKbh{ocpO;-V{~OO24#Z4 zCXqsbU&R)U>gB;=G+(37YU|_01br%m`+lOkZjfm&iaKX94J=R5}GS4`3c!^B+#!X9LBmo3#UntGW49DFNQ_F5E zA1%>h6U#{{A5dwIF5i0#q(;hs5-b72KpooEVeU?oaoTMgMx?pzbmUzrqtv;8VP|ur zYE#Jh1haaD&d5K)t9^Mu^>QGJ>y&pg<^wfC6US&^)NAQ2JjT_$i{uzS0QtA%=(#vD zN9|@B6)DO?D_4oJ#O)JFs5)Uu;i9sWJsI0Q50FPoKmx=e4J1;|avb|z+QL0Xh*(g@ zYd!{XRZS7iaEyO|;|~Kd)WY-(bdHuC?tC1ta9TM%IQahRY~!ta)G3fii}3K=s96iv zm7u%JdrW(NrJ|?H3!g1w6_b3-GeX*0ngxkoI+$nH6(PiU3|=r!!wkkC`9VRIN8KJ; zuAX@()kj0qDhE$q6|RY|f-&|2x5lO=lgxwEqSvxhEZt&U9|R%HdkWDfQuF zZoL70HY$+e3gQjceE=@ihfCO!`*3XcS%C)vPCv9Qvk0n zsW|{zcr5xI+OoH==Kr{1KmPGf|1HVc*x3HvDOO-TmQ}cVLgx)bOje6%f_p?;fn`)+ zs%2Ix2th$2NBJRv4oEmX3$pyMJE^KX9QOCaRjb>>Dm}j4CnGFm_?A4`=8E zq(nen5GizI<=97s-csVAqQB`iY71cr}cwlBkcw=a&8t+;3UNqRKf3p z^?>o>599^iw)8T>KhEQ_?f}NdOlVG4LoJW|(~4mqzO{EEufc=;L(D>4xIWBpp2mWc zKva_{yC}u|N5%lT2O5-TF#pWZ(?S2E*zp>iC9%Y$U_H3)*a5O)oLJoKA?J$u7(Ac? zQ|FsBJyA!dO-@x7bNZ-dHUh%oqm_}znj^-%hXkiNe^)nR;@J1WFl&`9PzNyY*UI)C z5`d?ZH}s4`)VHSWq-sa-0H3t7nF5-2&zbz#O*SQ6X`nh!AH?;PL8tv)Yg20=(B~ap zr|oW_OMkR{PIj6JS9u@)(|z~S>ze#P7EkAJSGjW^<|+HC8qTnOw@8wx)Rg)wKDSy1 z*P!#w=LR~5n&Qrs+SF$OgC5PtRw$G`YNT(jzcjrKjPAz81Z53z()RT5wgFyHfS|hs z#3!tHayISs1=`J#EDpUO4-`;Oq8{$CscOvZO`|kSXDS^xfy8YaAgEBmvXs^ zP@J>~97eFRkXQU@84nn`(FWS^oMdDMF=_C(1gs|5)|1CWA=}>dY7(Y^j^bQhDTlY4 zmut5*+(Xu^+6#bLqo-O~(;Jd$F_@sGP=tPRIFdZ)Z%{eyF}cD0&dmi|t_Bq*j#>X@ zEO@9tN{`=XB5z_zXH6|yw*W<*m{sQnTP;1hW@!~s%5LTLr?vuf)c}a3cf@!lnylj<5hn)0j|vs*_k?FC9?Czq%Y?%q{@bU=5VE0T+-gWmcjWXPO%71S^cIm+0x5Y><}Q2md>;DghF$;ocSl zLJ^$hAit!GtfhFs!kXHuq>#co;v>pqS{z|T%vo*L$Z2wQWP5W2fx|RN;yfIM!W(6a~i^$;>z+`NZB(j<)J9nG4))2OQA5cj@XcNSN7T z#?9?6;uV4FcdZKsbUZLC&an{_W6{y_n6bs$d6yg4BRQ2raSV-;8jb1-u(^*$cFMR6 zNfg`4xs*NiT*hfZiL=K^2nuD`L^Kbd+D}y0;AoUiP!tLECf*vlL@onl0&EE{3Ev64 z-OkpbxgrOtWr2M%a7DAtUL{Ib4XQ9Y3Q{*E#7hl836%$`FxBlPOh>N*6Inku;);P- zwYJ;eeEa2%Fa=TsF(DUZDhGUG?XDZ5gP)PI=Ma^DN+gEhmMK)3eypwP(dsalVY7b(DGdOqu>2U!NZ=yZkbQ!O=5*yG2&53$q;t>ei~j z2Z>)pn_SMOjGR#_{O2e?^((tZQ@@i^bi%uA+rPaZ z$)f{?6>1KZ)=SEd@WKIcB0ktTl++gfL&hs)0uEIbCp=m1R8gh=EK+%h3Xwy=pv}`V zL;MEQJWaZ}@Uuyzftr+6X|Sct-aNgustO_=?2T|sbU(>^2jYcEe3l2&<4y?{G_@Vc zW@l`K@VC&!$nKOK$1T!C|>?ZU_%LH z8g$Ka_`HG02&TSzk#MB3$Y+bdAX+-O!t+P~V~x5QhaCmOH>qleu1wIg^`Phl(gZM^ zb_+G~U|;L}anihoJY*Ykwg)}s$C(COXyx^qO6{ua2#J+{g3TlWXi62?f;Q)55|@$F z?;1DP4z}^NwgRI1p%?}XpLyLc{LXZDEDLE=LF%H;XMvl#jFTYc?rnFV5*ZA^VM2;m zsU6_^5d0^y2ZSq$V&8iBEdiS>TOzMVZQHu1lvyuw!377=b#Svt>JBq9G5y$QfMz(c zE&G$61&59+WHVq#F&mJSe1n%avh;}IRReR*J$IxbaE+J@*63Ze?knzCfLo}YIs9`u zlnFvwIDT}KwHOW`azF>TW!}1$kXQi_YCuJtT4$0)g0EmqF9i+0K4i>i^@|x@dV6t1oA#(%n4AVO#Wjt2oTHL!?_>cHCzbYM=rx-4 zkHK_^+~l>E=dGJru*W&HmI7B_Eviu{vZqYySj%W#I_xEMP>@#nWazhOFk7f`EzTOa zu3ak{r&_(LTf~83AErqx2qNC`p_^<<_)4Ofr=U%m$Exa!+FRJ4;N@vksl;$bAfcG> z*>1YUBQ>{@LDDgla2*dD-f{(AlYC6|jr+C&h4Ik&L^_2{;3T18nU#p~?mM}u=x!#* zzx`Ziv7vMf%Y(9}<(}}P3m^u4DKyRX2;5;V%ye4(U`>Eo1Vo#@M4O&I+&t}RGDoNz zWF96AxQGyKx)H|6sAU{tsdl2_z1QvW8C$5D!qS%0rAVLRxAc2-K)8TVG7Ze24AOQ_dQicBFk6U}P3H}8C9KTYm?TYzNVZ#bm z@wV2Yq7J^ieOw`gIiGHtd9(%x>d0|GEUBa6E3exNPjxv9tzn8oN#-T8Fp#}-!}O?O zjR>D1vbF0Ur@tWKgSW_`_4Unm*ArOHHPLBrLPQY`lZ~=HW-t!i|kD z?KGq~#1|`YsB}0LNWno5J|3~HZ@Zss%i*C@;WemQN52904`=y!<6J!My*v-!R;#Q` zp!5kLL4BUj%F@Nsi3vO%F8cWw;Pz1kc_azEtIfCrlXX^Y`{&M{1i&j;q3x+o`#S6F@1D z*4vfb9;jH*f7;3Xyy`Do8D$>!S-Vo` z^QJ;npli5crm9_`qOt3hZYZf9$1RIUs9R>qU+#qQobxt-alnm-jaFV#EvN3;H?^Vn zxwI_S|DjY8{O;9+rai6F@^1AQA9aD7^bJaL;|BVFH0m^?Mo@H!AFMw(|BKNMYij?; z{Mi3*9r7ktSA9FVo0dpsSo1h0!#b&a_A?0rK&Q~Qpi@Np?tI6?b1b!cJ;o!d5D5xt z3eeXvy1K5r`sVcfY3}ZF!J`o_lJ~Yu+3*jeb@H>3hq=$0T_0K=6<0Txv#qMOP0iyF z+}Y&$3K$%Qr~yYVlN#4aoCMZ;fmrr{*4TyHb%ydvHg$KHc%|HV553HKyU12xfHd9E zwi8EHD+|R`JEXRT-38htygABc1#K_s&Eb0{NxV^Op`>+ek5(I@g76umMT^Xo6OO*U zd$ghq2o|kW?*WaFn%F4r~sM7^c6_j@xTqc zbRyBjX`DO8JsTVlov}t$#J=$&;F`;?GYZk4+PpimnpId*>1!fT2b^ms&Vs#99OcLTecCo>dEO2y($j~WOs606_nsc{)wpMDKnH4x2h_P!l`X4UQT zQYmLs!eVt>KK?M_&0SI)JmHG<)n$as+x)qYH%sjsDkrm=$r;9$aBr4#YzOrfeG=-c ze{Id!+dpikPff6bbUOB!cw4l6Si(G9T%FlWA03mWfxZc0p$+`-Awnp6I=Vflo0g7} za@4>JSK5dAwV>I_ey21M6|L1uXxt&L715 z*sv{0cDfV0SV9j3oeB2rl+;0Q~G`LxtgYC@`f&VG{ks6fT)&*GRO{kkJLu4QM(C$_dTQ_*T$kae^XrWyz0ZZOa{48QTyhJ0=AGFP zvxB_|;Y1IbR=Q)wD(7vTN!zgn7a@@I1F)al3Zplqpn$vxqBzxTfaasem>(dQ`C7%t zJWARmOj+PIkMg<`i>V$~1*5rl`RInhiY7C8Vd(pKs<}9XDPk&Qh=G59cb1dG?1pxr37p0Xo7JT1%@?VVT+3yR{)3*gTe^X$b;Z5ChL zxF;RMM*_YU?DTcY!c&`X7=YF-mhNsr%*O|=^yHSX2@k(XS+CN>uftT5tw?I;;F`&E zHMdmWI9Ji8Z1RC6R*Rx@DSRJtLz_xyq9Ly^>MS(Tun!C)M8akQJd8=`J&x%4(Ff>btPsW%n66;VZ}httd8VM1KM@$eQEoMiNWJ^N7tf zT7kxA`@?^VQ5B1wuw5Db5|%@qPd^Hh>Yy+32IemYG|Y6^zQNbGn`u4kBaX?1+xz9rf7fnZ$5+R>v__KE;c{AwdcAac)x+GpGhW;&NwW;-<|#>~K3@%h zvp~=l7o8i25~y2oTt!%%J=C8w6HF5FMI!e3>MSo&WhkMduWVwAPCoEGS?7{tND2_v zi^<=G5&}y-(DJkpMN@(=L2@qtM>%EX{4aLJ`oAl$EzPZeo-=@dO2mSRBwwtC#j=vE zR^3#N3-1-ZH1CzL))N!*^<{OUTxyEDuQyPL5~{nq^hM#HT{>BWf7e!Yi4>J>-OtoOZp)=?oE*;R`Y%{ft zVomEn47aXzcIPlKR{PjrtiKbA7ovE!!7%+)9Dg8nY_)83z7C1j?j9&4M<>ezVi`tb zw9%7NJzO}O#Wg1hkQV(`kFThv`L#`(Zx0ZkS5vq6Z9f`m#P#c&8G)2cWvzw&Ovb{8 zbD%5E3|Sp`8;vq0Z;0@c962)tf`D1`m6kQ24V3Cmn|KNd$|}}njCLowy1FJaESbFz z{&o162ezy6z*w7C3(1_fe3cBGx@KYinmgh8`+p2OlFEiG5g)Fa$7JW`8yzePF#tK> zVfa!Z*GIc=|=mmJj{ApbNm2; zm~U}iNy2Ul(bDk|oo;kMuWTI}dg;-a9=Yq!5qgnZDZfWl6=7eNeKnl?#;4zm+3+DTEMtKb-3)ckPSy@YNDI zl0ca$Gq=}+U`5wTsNtQ7fI602gpHv4gl5sdaQi0qdYpD0IC_jr&GXV`R_Np#9{&w?^8jmh!men-eNNZA6_8NnEBrsufz0#am+hNtTNZ<{S z0a?LzS&^Ao8=cwwV~FO;A{bG_JEa2_HGvtxx=CC8w@Fa(I9#IEsx-(6OC`2e;mTm zt=Yk{jwntTYu|Q1hVja0=$r89B)Bb%gzw>90P9-aMY~iGw2ZxR3nASmCW4M`gd9+0 zP~_(!1Fmey)RvgO-o*_fCGRW4!970YPT>YfC@EEz#AELxIbDbIe+D7WFz;&#ho-|I- zG+1oz{N0QC7wwB`;M_pQ_HaS@)Rd8k4fE5qM8KxAcH8=)HJ*%~`S3rDcCpB3ptSb~ zImdSjsiD-PtQYE|uJ6kxIIks*x2l=DyZ@ua-K9hL zSqPYYdDubjNlq_HW;>e14O@}NX8cwSHP0&yxKA;6x8sBCkB-MEC|Qez6s3CuV4&~k z{1gIFukT1oUpRGgldK@sUYFa>@FiHYko+ZCQ(@XLhb}i13GU&P+3QE4rWrmo@9al)}F~!yp*PVxx zpM^y0UTd7Ky$`X`IGGf5o0hRDW`}qKt5<1p6>P-gTZ`*k>l&8_mss)fx5wi~0DU<4n|G z5-Gu>kCzbW(JZJf_c5NQ*{4`nD;PFFE~+iJKkh0p&>I)XoJ)>f#5G2_V0>TKluA)! zexXvi)@f|>x9{xg>4f;&4&E<15vVp{yL>Q7-*GQ2yP*%HEN&ZxpYON5mnu8~Q&Jx< z8#vaCOvE;$vBHqwB6fa>>>!NrEi=ckXt|o`u#=_4w6=OTei<(>RO~)HH+vCo&{^AV zk|hmG#e0UEpGE9H+=D4`vP{6iX?pXO{c`#-f;f><{gX*b#bN@%cHu&35$JAfn7KT7 zqsKJVdmtKh_0f%?{1CFc&?`AYNlOh2;Ar9IQ4X zWEWUgL=i=5BV$n0x#~32y#H8XdeU`GX9u3oFLd!E-eg8+wAL7MzMuUo&i48|)Lw?m z0#W&)cGs=9I3-HeVqjYj0Q`!GT8peGp`Q)|;!jE}Mp`do?ZSA^{Z;)HAo?c}K9q@f zLX&e^8F z&xpxcS94RuLZ4E=7M%T@PnIcrcXW_GDqfsYwO<7+0C- zVhV!jq{9UyAev;9W7I3tA_zc%B9LS;Din~76H647!b&_I35*=(;)EoDbM!DW^eegznX4q^T)QSn-;^T8vL+WSbmC|I`w~3D zcE;E3ulLvWr=v^@3X2kdSvS6F^^Heee3yslj@JjoN26xAHrPG|xIev)rOdkf@I@zl zwEi$#=sKyVC|De6vfBz+>J7dbXcp_sao)SrTQ!Z}%$Wb&;uPzo$HVF!J;pH7s#KEzIrqIUcEG5Ue~ktHZ;$IBVPI`(l>( z)bOJ7;RMMcL_bBdGLI{7{0~>&p!*7hx>-T(>Gwty*WU zfzBOoPsnOyeMk?vQ`#>1a$WiU;J*neKapVyXAPI1INv6aRgt+CyDKvthx7{&xLdNbaLVM9U}noXQ-!G&L#DxZ>V3YuB$Tg@mLq-zB*3kHzil zs7S5C7W?F{Ix79MvEf(+9dm+*8Qss$^{@{^03gazT&Vg6O&y!A|34;K4(9)vWSRf# z5e970)OOhX2Mp{OkdQN>B99l_L;9^zDkQO4&8^B4CH5PVUo+xG=*T9=eZ5WJYTekQ zkJ2b%*M}bda}3LhlI?Dh>^8s@%wtl}C-2Y{S0_B#e*IGvEGC`l16iV+tG4ZR;CE|+ z>dOQ4yC;=@=1OXh{F59=IK}F?{FB~5zz6vJQD{`yBOU?S@VB30E!XnYbg(^OYRHo7 zfDh&%`enlX5^3nB_ZBNDT1h>%OxvyWkc{Dit~H{9;wtaG2td&F(FGxom%|&D6RVO#n~_ zBz(xGr)ijo_3J9+XqHB%5Fcd13iYVi7x~a|qBoGM@{eBg_ODaRISI&6HXXLtg!uL& zorCVSUUFQLVMjt&EEzcJR56b<(uU#tldC*ez z?4tnWy0TbV_HCPGkI9a%w|3ycb&=+w(&wGtlYxTqEiZD+VSfSJp`}91oDjZ- z#AQ^#+kE__FK+n;#v_#d(_*}gu^OfFUbg{31qA5m`xCoHi#;(l#0v0ge2wm+cW>@z zNq1wq;{7atOudVPAf?A&>r132vR|+9DU7pBsSeW$7LhceFbR4cQ&=d)a;asK+IaZ| z)(c4KPeroNL@_6Ir=X)iO%dF(X%4^dBa)DZ*gCF7g)AY*zCmL@`B{@ z)$#K+YG}fjx0np?o9Do*O#=i!3;S3&{>$4t!|@DgY2|*`D*Sc4l2%1Uh1$A0GJVMl zp2{_8)fGHUC=!qX4!5mM%|C2GyL0D^o<_0-Y-n$y10?Tr$LP-tYb+&WM$3?D)7 zrH%e@59oA4pqO=nadjkvPJQUQaK)s`YD(-^5<8WX9I2%;Poo3#ynd)y{)-^sp4ho( zG9Hpsi~#+JPC|NFcB}SXm6)0y`kI5%}SVHWO|2uzc^C3n(N(ME)lnP zA;~E63Ri6sak~bL%rd__9iD4P+qC*n&eFOJ;v*TR-^|!;iZDymP8x@(;={5#mf`23 zUR{MVp{r3=r~3nqm|d|m4^`Yg+qZ5V_%QtIxRY81i&HMIcH@W14o$1RXEQRE=oo-b70FFg&X{2 zd)NH;hQFAOA6!cQkLsBu^v^ks^&jumoffF6?Xt*)?4M__7l@^Z@hsKqTjEY60t0Vr zXp{6SO{gTe2FK>^hnBO*^NPboy+tT}$VZK_2d*Ey3YOgJ*|+wSLm<_y;|r zu|;2X-{2C7t8|jABY|M4_#1_lyi zf#(DTZ68hP3oV?zkvS7q89?QfjtxA}|B>L~OXam8M||~)14v{IbG=1Z`(er3-<}!ubY1E0tAK^VmFn$Oc`^ny7FT4 zch<=GXA0z1X7~xfrn?E^70)q^+`nAoF>TYJj0b`=H8Q9ZD*KHJc6W*@k7{61<4yW) znm#sZz$oCx8%K<>#+x!4a77>FPGHx%?%86u))uW(A~+cu`wTB$b}c{tFz;ydW*3pb zYneh(g`j>L)2VzUzO6ZryE;9f+{>Z82)}KMKtt}C?jBOpc1au@K{~pbO(O;4fQtyt z;g>|G`Ac$gd@%Z+SteggWE2R`A_${GcCS3kkR@OGKF-e2!#nQQcdoX{;MKCH^g};5 z{=G|Ez?YAA;g#9KlBeaaUDbc*ncb$?b8-2*!O3{4nMy7@b7&Sd&`h86PsbU-mFeB%(`qWC4 z@y08)n#ck|AjjU9+L!5h-^D<9RHI!Ve@W}iTBxvB8KVucHt^{A@1X6-8dnpBm3efb z>-WkKix9_KccB4YSI^n{`sO8-w~&Wp1I5e@XG;1D7oLwj%@I%mzea6K0W z7nU+?dS3gc@)GB#NR{ruaPwYvdUabuq8pt%MNs{Bil{-80L2msE}UJ&dqK~5!wQy`D}a%u^Amxh}ALUX$b zU*ts?e8(5}n>LrqD2G6K@i*lp8f+ckatchb@K)s5i>bH@iXt#<3y`Z{41v3jBSI1m8@QbIHgSz@wOc%gcCxQqWNGLR+IKlL*UeVmN zzZDUR4mbFplXnC$+Z`O#I5WcxE~wEgIV2=Dg1Dt+zZD-p6NpH@8Jh+S4>Rs1UR?+Y z#aLkQFQ~C!Kv7`uFE?x<#57OHVE$GX9z$d=NC@!OdB*x);S4RJ^=Q{RY%Ivb5T5=Y z4Z-vn59O#DfafLp6cT_I?f#V(Ex3Xl(nuvjrbRtzMFNyO+8YLd)RgTKd@iVRm{YiJ zWdGzaziR9n6kMc7<8CIEIUMjSm%YiD0cs!yK;EPjw+r;EA@M|@)}l88(QF{(Ycic=@pKtyrR>jOuM-1kz1Bx+-pYXwdm&gM0FEO* zLG4c&WPw5T_X7b;*d)|-lF-ma`%@=TI_Py1P2Otw44Jj|ofOr!$iGI5_S^Lt88<4A zDg0U@i0@R;^vN_FUhb7%Tbbjr?KQ+s`JJ-$E8^ep7AG&w4qUkp0f)AnU_T6tTCw?JH$1 zv!qE(M<80$mN~t>6|^Y(U_cbV5IQd47nOnpng;2rEQ1J8O@ZT4fhT4|Hj_vvjW@_h zz9x>c#RrpnMcg{2YT@ID?(uY}k?Gyn2plJxb<3k5OFQcOikz>vrrTqQ^4~(-hc92` z^Oo^Bz)^WV>SEZPDrITfah&T}%(ts#yWuwV5pYg|6)L_3PIYXo)qnZ?$kgpRdwo%A zIGR?zah?SfPn)T#wy>DOQwC?tE~zHuA!&#k0|U1b4(T4Ru0(Jdqp#)ox?9*w%T zlaYsNyp^U~G8sHQ%G6r1iT?bTxY;!Uzc8PTV*Xl15$y~bBH5CIA)~XvHVt4F4>lpA zo!~>_*sK6=<*j~}I5i+{BmDwYUK*Um*DNkd(z{>9&`fTSfgZD^ZUF>mvb&Ktp*~u~ zQ3J?^Zl*5o71Wi#u*8SM8zO0`a2PqpJLY}-xsTvqCcURy6aRzTnOEJWu-$7} zYknc2%fm;FbCPLZYk483=Bajj2;**dAswjrOL1b)q=6mbv0BY{S|OsNzhPO`CN&)` z+Ms}e6fo<$l6u?2eJtnA)(bHv?qN_thEVYY!YM+gY6cgYtmgPR0fx@&T^+csp>N7n z(KK1PG_}PD;~HUU69QK&A;z|#gX|v`Q0PzhTclPpq{dE%ma1)Q=Bb6~JxT-b)fI4{ z^U;^fdkn{JFv_~xuFlp!GGxLA|2CZ1s#xvKl1uY(HtI5&a?IVHQkAj#py(R>s38jf z;qnE6eEfFj7mUJLuSgbm!_k2deI=)k_5g+%0uB8EHE6gviKXD6^8PPLqC2Ko&+SG` z+57!jc`1p%!bA-#p*%f#-%(pFVHiLzs!77-nCpV~wUOMLFKK`CEvXu(BO~nM=Ji~P znc7{Pe<74_J7Ty2J^r~gb$aPL#m&~5n3Gd&e8rIT+n~Ut-WAzkc+`4l$`z*)73p7N z?JO@UFMty!nCvC*rvXePJ(cm;0d9$2nWG0~SImuvCL?(CdA8;C@B5Wr8w?=Sz?A`I z_w?6FCF78S?!$&iP4+!9Bq`a0MARMP4Uv01pLa>r`IqyY45@j`xX-xSZN*q|W@6^Y zDO3(}gX?UjSeFAwPF9MZfTXPT)TxnH3(>C`B?qt0^hE`=m~~IB6dMi#rLk(=-@K)k z_4okwy4H&=XO2rwgyZe-VZC())&9wzw}U!YLpSqfTWZqe;`;dbqYrHQVI_gv!;8db z@}_Bo2P9Oo<671<(Uq>SI&4~k-t|cZnp*7FnY|o=Bpu?{;syEF^q5j6(^mxVJKpfa z!sh?-ufffe(7TEO#>Mq7hxFeFirjxvF1pS%?7d0N=plB%G0fH!b#!dcR4wTyNk+|4 z(9n1e#Ypm`U!U|k#8rv~Y%?AMA!~asjk-UuR#tgeUQ8eFEFX^;a}@*7PF2mC9AJj1 zVam|a1I%N&D<)ocUb~(wT)vJN5unmR5x*nQX`VH1kj1q#&~|MlMa2TpzgAMUs(@_6tW$VRB|!l=3yNF+;R%(^+?y=rUcCfwl+xnqV^CT8Flk({!^O=RGAv_l zzUI7_qwsqrBN&#gpqc#9W|FOw)gJB_>9O|8iD`_1+xpl7YXQqHC&@tP;}Iy5uDY4( zCx;qIAv7u{mN2yzRU<}fQ2vo**uz+svQmaN^8<0e9P9Og^AZ@1}DEW@41ZR*U(acCF$Exn&FnK zO@mFER;NA70Ga{-2jx;6^o1>?T)68LciT3RLPRDj|7Y99dYlUVgZ;+Xvpy__D(!?U z`ns6fW0Dq$)gy{YsHyzN6K0LXQ@+yli;=K7qW;W2Oe+hd>pcVC*g=*9I1}u5b9hFP zTQxLjE}nB``?#yHzwzI3XHdTle_oTvBzb*K%gXi5=NC)^AH_*|O6Q4-!v|%Hr_I4MM4TvAr9iF=uhPID`Vrlk^ z9PZl*&hzjIUZaRwFc$=5GfqR6pWFEBEj4a0A0BG`#{Gh;8sGzIX5G}#0=M}4c2;y_ zHp|dEL>>{b~%L2w9=KaXUXg+=?D~h*JQJdAJ{CijwRu8)D+G+>#=Ksddn))uP@V0Jw z4`Du)X8S%AQY&t=O@m*3z83G8ywoG|8@p`N)!{RXUVhL`rM?oRFHmrH6KA$M^3|Pl zY*efOb)}Ds<{7PO%GfAO)_!+}!U)6Cl9(MAjjm&s4Bnh>F1o4fcm;6{o>rWy)B~LY zo{wT^a}F4Yi?f-%7QHE~>wyaw@wVf)?>}$1XUWzBTKL@j!uE6CzQO~=A8)%2ZmK>Z zBd8YXaG}gY@i-GIjm4EiZv&R-j|rSrpmhd_&i{rG+Efv4G1M&5$%O>4*p}}IXJ`Fy5J#1U%sGxS?)h?b!vn}ks*uWm zPxptr<1u|50plyO=OoP1YwM>=@8kO=#AB5L5t5-tan_aL?b9JBSmGQ>1c4eI&)pmV zH#=^8VO(et;4UdJ*PRj=`~Apgo>7B+$grWg0&AXNH0`e*j|d%@RlKIdS$*4weqx2A z9Z`E%QvPcIi&Zi^k{w^8E(>6Ax>rrJU@} z|5OUEj-Z+-A*KFU&P3F6bI3ZFryI}R;S~G!3(jYG)JT|zSCReK;J>@>&im&b@W~~4vs#GK*kC6jz zfA(6?PTPPisvNZQ*^tFMdce_GMUEKy?)5S*3cn;7)^@nLM}Mehu7R;)%fL;m!O1R>(BQiCelGRtF4-9jHH0t1%2Z+Lib|~Pm~1$3Ut!3nH|$FmjEY^SD!4D_cujV&v}z!KM0Odth!n>xAHYL*M^qyC`P{gjZrGkoQVuMW-$zOCX_@aus6P9)k`5i z=NdC&gg+NcCPbCZ+~UgIv=NU)hw2*N?^lPav(9aD(SwyI{*4S?LfqE55?*T5o}J(M ziHG1GWwQzfjc^R$x}pWwiyi4K;~%3365X4+kz+R{xg8$3>ZH*zr)amgHbjK1H`BPb z@lk9TuF|e|^vK(DOpYx4+%|I_X#3u-)}=ggkBa_#Brm(sk#IF!F0Wal%+4xPTlQ$} zxo%VH;thHE+fWA(&6=O|QC($vGtdOTO&-L^8zeSD)!`_<8XHFRs}%YoFf^$2>m1^Y6Wtka=(Sh556r$rh;Iz5ytpE-ECW`hrShBmiU-8~nb zKWe>EWPSp0>8N#gtN3GGB|F=Pih+1ufbAQ8ivRw`^VV2Y`2knfR{EO~w;*3X_uC=l z4z$J)&cw~tl%a{s)w!Q3Vb0oN9N)u8mi?riw|I-{Qw^SlB!I>r_&Gj4*bTo)VlNyl z2R(^~VWt(U5izar@VzHzhs8Wx%ibzlT?ArFPQetQ{~a-?zg;x2VO?yRVvs0Ko(n4# zXd>j{dkK3-I%c#1}Y*>-$yolklBkNbin zVCfE!*!!6DSKf4#HRnHgtYkROJ;VRDGw{>okZ`*Sr+WYBM|`ud0YjjJ7sZBfga6%b z0Nl!+F)J|rmgr(@S;PBqy6qcKaW?-vE`R)v3?99?uJeP@G%w;$LzPYSKoYH5jbcJq zy*4EdSN&IW(q7Ib25&0Ujo}he@4P-C_yaj%hGRM4J$T>g$vT?q0p8)Zxl-)PBu!%W z3EtC4rv9ID4aUOyUmuvP|2@mor2apRm6-yF2?V?RLQo(31b6dg*Rl%^oH2pE}{>+83vEME8!UI1Zh3W~}&FEdm;oX*Vkj9E4;b_^DW zOjdk~-nCknvD2>MiOQIUH(nH0R3u(IP3|;CGBLR6z%T#vZWY+E?J713B<57aoI2As5+YgKrK;xT$8 z*iHv~p`c*Z+P0ES6)l(6TaGcbC2(de2c=P+70!8?nqt!k&ffL#D!JUybK{~`zcaMH zPN|||oY}m1q!HXi5%S_8M3|UnGhy3D5!CB9i5~-EaS$~NV?RTm4N_uNdVcSIt>aQ? zkQbgyFZ?!uyK;)ZdY%pRGuBLzRgw&(Fwf26O>R^?zf znGz$A4>LcvFTgv^6uwbjLSv?Lhd%z^Z<88svbZ%Ws?gwV7;PA9oH~ENxa=o7GOxL? zwraIY@yNDSznD?2c1iBVXh=A;QYGj4X^aXKh$*IV+iFHQrrV`EvT@bqu0%<@yEBpU z9YT@SBVyzP&R{y2R26_9arq>q-#!r{Kub##9aD?HCpmR9IYTxexNK*Uz~QyopTo{( z5xxf|!!zw&nzO#TD<{k}?Ki)#WH?v~9MWtL^2B$)7@XQAd%TuQP4@)Og{mM9 zC(&{MsUcVC9a)XzrEw#c0#Pf^X;{C{i4j5#*hhYd{Y8hwd%;j`)|yR(;A>7G1R{9k zNAREGgU!nJ|MM0&xmXiWAZdUswRPKdW(1#U4H%Dlf9+%wx#p0EJh639$Y4WrPJ_SU zq76v{sZ3=IOyk>1*vCdxCx5!c17+flV?*HnLtGdh4Ot!NMg))T2}FhZ<>ZGNATlBx z$YLS__6yhDeyQGLjs0@}e5xC9MZ`IjInpR;ED*I^jIvb8mo0-|sTN>G?P>3z&yUTA zDLg#bMfI2Gx$<+QVA0H&K?^K*E)*vD?)NsDqStj}(Sz;?Lr69vihvVEBGA{>UP>ME zTL*%YWvjjw%ciTeb>eL70Y*Ympru3?&Z@EvBZ`A7V11)xG+3Uc|4VEs7Vd9Y81uxB zngW86#!(HZ1Cl0z!CoNK9)TZU4C|@o&QhRM~O_c zYl%)jgvvNysL80*c;wZwNZ4hHPLg8k)} zSy2v1$R@c`ZGJ$KAa$weYa>j(#_=pcnxar-hl^1pI)zj8WH7@`t^6aqQXt!O%h%K; z7B@DmI-j>oM4n3~jgDbZg-hjvncK zzF(Fs-n~yIg!@*4yWKcn6^wzQ^v{Ax(1E8kyeNe{Rz&tG;H$>?#5Bry=ex_3$<@I= zgLJBEg2gDf%K3nNjU6sKt@WR07>E0RVTSN z@d|5lcvb0tU_JaPOEGX}TvlsxWTf#*1_pxEJ^VuUoxZx9@(>bg@5XGsjOz@8A|!;)Juv;<&4vwmY_p%FTBE$ zH_8Dld>E1?Z6#CG$@g%v59l=URb%>bY6VHRn9)j4ns4u-grJO6SkY~g-JGw^{~Swb zP@fuUrO-B0hUSWR zXt{eNaz-R}l*x)GtSx@0Ad+oc>HBA+O?|*$wQnVNhtvrTUOaY2^bnY>BrRzfM;%MA z>}C^zqn?Ly%_)p{6RQ7W1Tn;fE*5}vjrvt=b& zkd3{opghs=y)=l3t@G;kI~2z{G^-_W@cIWtk4(ZxGTaNFiXlNHN_Xs@!-CEt7*$KJ zW@AcD*J_Q|?S<~Wb8^7{x2wyQC~v053qMg#*4v_``nf+_eVQ0f3oA2P`_GAj5PKr% znjxx_>EGHpP(x>yNZ6+A2{(o5G8OF^H^u?!2m_Xa`^h!1O`?-kcFH%@`+v99L5aAQ z3{I|5U6G%gJ3OY9dia({lX$D7vd1>`IXB7c;t$oA&3zURTfq*$4YhOn-wW@xTic~cZa}}& zv}^4L!E8+wk0WS)F*+1V#$bZG^6})cxED#`QD{LY0KP)puB_)>=~;;!JwTI0J{2a9 zrZyobcP-|DG=jcL<4Y6{{!?`OQnd(Fja@!GeOIR&y`PC;+oiht#n20u!AHT~Z}{ka>vE zv)@-X)PSSG4-B#5#g;+P+5*kIaMMk`4okCHnK?WjFVA$q9TFd}x&S{N$-74Ern%aoci+Ajf z{%P<3vvPrY%b*DAa4fSmxVF?{%}@TX5vUBS{m9di*7 zC~;F1WQYO9g%skaiIw|gd4P*MYKUv20U+!nDKOtc*C zs0*&=T^JoA0;$u)O=E?WDLxuwrvy6xrT#@~<-p zLFg7axA43ruhK7h$YI*jEqu7UFVXnoolePUKz>AXfrZ?TJJFUiW2v(7(yHhs0;tSH1Rxm zVvYXKpB+FasM`GN;T^Wc$FI9LHBYyU52k6~&B~=|KSL+q2V5TGSAOo#m%Z`Bx5;Cg zDEXSt=9lZ6^OA_|d1qQ$(Qr4YN&RfSJst9Ci+(PJnKf^y?ZgjRSzugTDwZLg%w__O zv+4Y8q)SP&Zqk08-;i0;EMM4n>ZchTS^pte%Ou*b6nxAc)WFrp;Y6RlQYyzq&+XM# z7kpcSL@l%ZxM7jFqf7jdQV&8m{CtEAFMQk4OY?OGjXaM&sQo8_p>4XzF^a3aXJ4(y zjn!jVxuCtY`Z(cE0zd+XMk}jJ=yEH(x+T<=Y+=i2(>P3W8!d`Zf&CRJe^xNxAL&2} zm9n+!j^FUda9aYA2#$b?dRCYg2BhBET_7%QHtO~fEE(vG-tM5$7D0SI&(1C2ka&m} z%{sYP3b%Pkedis$mDrhf)wy5{<1}8)ue6eGf}TS|&k!-O090NQ56e$5+h0Z%bO1A;=FIN^0~sYY@02_Qc~w}N{rlbFqAuzz9RMFyWH-nm;Yn1 zuFs+BC#*B>;1Y6=ebK!b@U37IIUogM7H^E!Z-*E2Ro;~LQQoro6j`$m3xcIXxp^!1 zn$`hJuGMxl0%~&1s*V1L~MylOpDrcCG|Z;tOqhX^o+%>)>}6s9}X3Th^KJz zjpY7t)K4s%g3$;XH^1~rk%|HwOe^|r`C?X_cuaw?7W^fktCX2n(~ml5|1u@+fewyK z{AA-DRB|kSN*MQ>Mh88QCn^-Sm#&B$`;<2tg03HlZFCDxb0L4A{~8cL3{x4Yv&R5K z)0RdA)oVKX>}L>#A9ad%lQ&eu%tLFmP&M11O(_`_Sl7?|FN6_+d_08a#NqHjpT>V@ z^ChpcDVL{58YQ_D3E%b`9#pseIk&XxrIGM=N(VF2k&#f?w89Hxv)vs%7teYc(biQK8rV*c zG@rbge+c`NS%vvyR{LU1hBIR9$QMDX6<86)IqVmKk>k|nQ$j${k;3n*HMi&8{+G+D<)G=krJTrge2uscHOkVj_r8d@?E`^AT` z`9b##O%0Fs5BGu^n3?W>rsQOi5efIs4fMg7gMV*ec5H+uRS8>P_2Sk}*Wtbc{q%*H zNuTit*J?}cnLUpLQ6uw$_v4>gM1y&40nuiYlcF+DufJ zM1JXrayA2$?@#4~29}%#F@QJQI#2pn4(T?_2jmdSEc^qiFy*HyJ_z<87Gnr$~lK3twMd0~48247IKVQI)$E z!2zFS5DBFRid3FJoJ_z|!6rY$Fe5Vw7&bw9D<>)|twEN$1p%QG|03ol@KyJBR}F{= zc!QT*#)?AH-s^4l+3hJKBiBn1CUp>WJT5N3ge2^qyJ+;CyDOQbDEhAmj5FX$7&kVJ zU`PKzLGS#l33M5FB=CDA@{xjme)evgAM;@3y%E=;OPtUneYsx zNMB4#COL3|HK0MJt-ssUJIB{ML#NZ~@MdU&Ohj5|`h7K8y*J_F$)S8-of^HZ@j~NA z%dGsWE4DSXFhT_512Fj~&NDMXm^l3? zxD)t5{vuUR_94_eL4|;v>t*`%!10oPa!BZAf?&;d%YTXMf?(BchvM~+e&XGLXp;Mq z{RD|P*bdFW>>+)?s{_?61jt-L#^1L868K3RaqWTBj(kcQFgkXlrbfKmK^)~@?KY8MBMi0GPX3kTb6iV2cH0Y=A!{tz@P0T+CH`2>_Mk*uTZYHCVWHu zPSUmhe8%n9nDV6vS^4QreEAtg z1URpYF94?BRx5ZsU?N|xwfNRwrXNqnhagu|gd5bZ#XuoA-O+Uhx+XI;Hs7_*_CMd8 z0l3Z=N*bd4`%^VfFGQAKbMn^~Nha_DqW2Y>j-ELH`yT(5fuM;@b**N1BW1+gy=~oV zM}uVsFSSE-jJQ?Vkg-Vwx`WTy-HxRT+!1j#Cxm6~=Y;#mOgVTM=u?9LhHQjhmBexzN}?S6fB}IFapp zM3L%*(^n*r?YC?g*&cib)hRkF?4uSaZR+#N`PU&q6Zv^0l=GQ4;8nbz2%Wb>6m)I< zVPEjL0#MYG*LsuxYI`H40IT*vu;QoBI2lTQ)ny;m6_Er*0Gip%HsL^VMVFjRr;3;n zAurL7pkaOmHf_3|bv*;=lbH-4cFx@YsA76hSxNq4wX=w ze5b0+@QTrmD$-$OuNMbRw>oCo?vC3!`kGFQZc3K zF{H5dQ491jQMUDcJm7PeYI#DY`4^`!I<`M6E`G5{McsNSQv)@_!^<`J+0V*EYCHzH zXJ$Ek3GSvRHYxf(N$+6{R60B9K7S>%q>%^0!o!iA*X8*i8<|h7?J9ew5v}(Z&=e_R z>f1eFn#?1B1>qhoWptX}ho2He`_;jheiJr(kJWlY$}hC8u}WC;#mL3$2hj{WjIW6l|TG1b(Kd zxcBqYSyvZ5;&S((3J1di^mm_|{{siA$~lvf*|gjZaQgzMc?YVW@A*B)LajPmFccHt zC_tO4ww*zri1WSDOq&^Necz!gnY0>awzoSe?2R*Nm2>~gAGdpx=1<{PrxLx1?`&qo z=#fK*6>+T>SM|BGdDCW#Ay1{-c){%2Q{GacC+@xLUexP!#vD6|tiYc?wH|0HC;2%8 zp>DK7KrAKk3OL8*i$dLZ-<5rqFY2`k_&~fhFLlr4<2Ao<1fvg0<*6|X!*I{jymDIR z*J4io$uId!y2)=@$Yr8+-=*OxsG#ZOlnw$J!snDLN_uw~&YW+sj7|sAiakOl&BmAe zsNa%5cW=|_rgxNK&&?VCIzv(I4!kK+uUx-HiuNI4OP%b!t@U}MLgjxK-;0c;PC;M6D&2BT^uiO&P z{3rAP0^v+9v&znM>s~0b5!n^TYS_H8 zf#^v_Q5%zd0x{b)UNuiGS-YH~>*ZKNns3-srUQ(6uYr zeQHGdt64VLO{z|~>AiKH99ea6q&s<%INq$(l!&l0RLI2W@T&>InUST~V|_IT)>0Nx zM>V|IN>kjm2YHB7S>Qd!iMYdIh`1=`0F&9YieMqC0@=oM0=sSN?tywv&a7KOnYS}H zu*H!sP?yYx=DtlF`PEB@HqN2V$u~XB4e$Ns4OggdCbDH>r#jO9Hfv|!GW?1_EchoL z(8h~sU_+-eZNfDSg+jL258F*LWTwHh+URt={_F*8a7z?e6xSS2|M7&4T#M&i2TT){ z3zX8&IJGTX`$BHT({EEV!iZgdRW3k6ISnP{l1TWX>fuS1?}eKorf&*wkNIyT4LSxT zbzJB-XJgjX*v?Kk`>Bg6sAT==VN$YM6RT2c1E&+oIFF?HowJ7<%v+9cALlfbw{=m8 z!3y0W4u5Tp-+aLITtAuBQa!o1sh@C2a(@x??%j9}4!DVyxIgMJ4YrI#7mShiJQp z#;Rl1ue`Px0wkw<+Ky1#AUhfCIOO^xA4vr1-auEW>uQGaX(LlUDt}1T?*L${+6_$} zpmR}W3Vy@s@JK`XE$XtNvM$_;5|K$5I}oy?pb;LMpdxStk%kTm;5HzT#Kpd{OrJA@^#(Odmi4M zU!OK>I=jvWwnA{nXi8OwYn9iB4~=;3g?ZwC;9)WOc@q&}zm^i<#1uYXNglGFhITTdIr* zrHeUZJSG@XbAIHIkCQN!8-o5*kVj+>?wkGhY*1T021n2N^U(Hv6vc=DJn7mu%PpfG zSEEWz>W;H{o`m(!8>8^*Kbnl9Azv5F?yNrK5x+8(<&})Y?~HK5nwN}yd#Ib%xXKyP z>7EOl{WAu?wc0VfGy~aGcfyb3Q2)9Rp zF-YDg-2KyS1%dr9{r|ZzHUH>2(@E#rQvY4gN59w z?q0;X#DJ|mI*O+bws>qNvuh+w&uX6vTN*rcrBY&Zt<42&Nbg>8N+G7<+7xXAT??=N zOY~~`JH-Q^|&jNPSHj+kP%sG>TuqxcIaEZ7pi^HONS#>1l zoMMM-mnU4ag#~CvOZ%s#n-z??FWSaGTkkMJlo`Pr=rMkhF!g5ja@N3_Bb!i|nX>Q_3A5Hn9d5M^4e z-9r+3SJ1{hx8eo|u#bl1d~-OB-h{y|llG!2L1vn(D3T)^49SzS$&)-^E$FXJka@?X zTVg7Uf&yl($R?+*1tX1fCvX z_gE`LJa*|lOpSL63Si}Z?_{1r(z4p{`Ob#*refm~(3rph^n5fx9_h&`Q3B zC0HySa#d(We zW5Q&{=C(WrJ>=E21z}ZN(UI z?682Bu7V_dH6=v^(!>PV)eWo!3)pTCo&~V%qd664tQ>8pVB)%ff?DLq?6~C;8o3(^ z+rlt)vzME3cCwTi2%{$q9=IzJ>Ps5ZssB_A`}Vh~wTFtx5ZNhfG#AtHyzU89R7YEq z3w3fhJ?Ns%^OBDC23z~s*e?WD>-XsoWV1h|etR(m&df>Kc$u;Q1yK%EGbqgTp zeEUp|l$-VIQ=0xDa4iP)>O0Y@p?AI|2 zW1QfTv5&nZbe36%81U+~s%f}dN~U$bRcz#=`Zht(Q`5<4`O44d%GF$E9l?vC!5&32 zLHq8z$dsFMd4b!EZ21BFQExvawb~Xqy^nBB?RF#&v%i|P3LtT?i9f$PN zS&%gxMFqzK6(9{|a8E2lhWM+l7t`4;{LL(1Q!(noX)*|wA<;7sB1!}-KLGRb+Dw)q z5hTUy2JyMRm(-TOApNwsPj=DYl(J`*lmm-j0HB#j7c~L?LD_OLS>E(Ze4?< zGdsDH=NP7gP>prBsfwQtdw^f1jJ|&Z(pgvD*s=e@fl{rBTcxPoLFG3=q{&)pLJF~9 zE&u60mt4lRvzo0ej@eR~h82bWv}6!x)-YP+yQzi=&I8?QOkUAjwCA(#PRPs1J$<3W z-VnySUARsvs{Pyc@~*BVnQ{;$EGJGeU0STW>)ia0U-)-<-w)(Ch6w1}@|YfMt*DJm zkBn~PVbsW~S*rwpW?LIR51KPFlJG8W4p`1Zff8CnfsgkZF2F6iu_qC|AV7AxT$rpJdcv0q3TnTLgIr}j$j>H&^mW93DtbOROL=&38_Mc+ zzPK%U$ZJ2x8)Xs2Tn6e+8)}547ADeGUhGtAH>FsF!HDQgtlp_>{tcMzvTig zqrpyL|-Q&qo8%&5wXn7iOo*``mY?a;~uWI1H6wpr>KMU!ILfUd3sL?GK z@JSpdZaP6OT>-m2f!e=#E!!2k$C{%%OqH(|_ZSr1M_Z`0-czTWIOrGuA~#gVa4AZQ zT%qWN#LXLB`*hDa8$?hz-%_}%e!7146qGPlPjxI!S1QBV_-)AjakBI4cOt)Nc@DdU zFm7x`%lavzsUbu2G^nkgdt`m0VSkxRBkI`Mx(%%u^#qI*#8e2b7ELPEpn6FTt_L4n zK#RWLgkJW_qy*(-aT~AigN_8|{-uVw)2MPw2NigTusR@gr z=Dk%GyC;rU;WiaXB#lE%Lj(dn_)Zx=!aNCi9lqI6?KCMbv`EWc_Odj=!?b`*R6=-k zwOvj&O93JSWKWu}tqky9@YZ=&%JaCcei{s{{B9Wl3}4=y$+_+iJL5P1Htps$^BE4A zVuPBV_c8$`96kS#u8tkPIp@;R*US49aJLoVHR|eNc?Q_shM|)X47ObrK17tpvOPS< zt2hg4$wR(qJJX9viHy~x7>8$JCM;SmTL)EicOZy3t$26cWVQhL7ALYD;rjvW@`qR# z!GLzhP)B)-(Wx>PfiBWAYFfs69^$-Lao<56)jAxaaP=Au^sBN0>T=}*hiJ@`Ge41y zPndYUBJ+}~Vs;VqVzg0qbh~Dw09Qox1y$&ctoJpW@0z&wfkueMo{uDV>MUvfei-3Kmc^^hGw!qi|&<5 zmz(y;)T7H6tcTmm5^t!z(%-KxV;Dtw7l!45#@f!O>8`@s0|n>Rfqep#WsN6Uxk^2w2E&$iy1E}{QwuB)iGkRsi_~q1ttU6l(~n0) z;*Xr}kO9Th_uuaMt+=;ka9Ka&Wy|D#WhPYC7tZ&Mjb*$*jH=DzhxKK1r798X#{yKw z0jbuv&;aD9M|ILoYIukSZx^-FC!E!vMQdx~R1#LMV2}3i(v=-)HeTgYAC&y#U_6Dk zq~5Wy?-vSUTM`vTTiSeKxu==_iu|&rND$^LfoP|nW({fi+QDHe8*dYBzkE~`nflG^ zmE_0J;*{2&h`00H-Ql1oMvKWgGJ#XLpE$Pe*Gd)_j0;1S?1*}lq=9S`qL#u_>?Epf z7#Ed4iu`$)CJpNiv$SksrHMLg_Fs)**JdM?7!5sY!`L=7w$bbM8j-QRCeFF_MLU-i zu;u6WAR!yQGCOEOwoh>Hw0zD1chq`JJJ94t&7AQAERS#nt)n#~DTd#*)BxR#mw=(h zv)lyT2Ra5XvIHLzz*7@xPMs!;C>fdow$>(?kMR@cIgtXE0=d`}YF-%KE2a z>v}P+5f-~ZeoZfjqOu&7DqzFQTiEl*^!Xe--`aoGWu7hNG_fq#tW8Z$N^> z&NdQe_yjV~LbMT>$=eni0O$!AQDr+;uOU=K?ee4g4@IJbYr!yH0#3}lC$AlZVG~^5 zF>ay(P3$?Qa{;xKi{$5O6?+d6iUmiRU5c#>+BzhK{2n=Ev(p(iQGBk79H&eMH>15H z_F@qhtOrq@z9lOOZADrnN<|W75YvZ{DW;LveB_5h&Ii*1MsDRwkc2W*_CR)|M=D+>z+9_JS+zsXy2dP zNvUEToH3tdDT^Iqs5Iqt+Of$cj^}Qh4K6`ui_l?UVwq;pi)GvP&)H;FaMz4p_P;z{ zv?`~ufo|*60x(#vftwzmxs0OqF;g6|cGHLCXl%eTcb|&LIHXcrHVWpPSZqa!n@vI0 zp_$#oqrriF^b*U!-g4vTi8a1C(gwvMs>EX2$~HvF0E{VQzndM z#7B~jFT}e+U%@pda$L%W{{1uBkXY|nYff2yX#tw_JMKDc(yVgJmJ>sbs@ZTO+xKz# zn^nA*NFFZQC6n0dYHHp_Vj}|Bp=bGDGCU$DUH#pHqzlSSh`}iwK^vwCyVP-zAus7!@sLG$GWAp%89d_P3|XKaFO2Fd6uK)La)|0 zf%#$LNzCG~dP&xPD@oH*qx_dd3D)SGw~<>xI$}$1WU3*A1^IQ0C?brIN^3HUgUtFS zWDk~sI!vkxpWMRF!n8sskZV*`zch>8{{u2W&A+gp*9yYNZEtj3w2Efy2C_}_sX8NE zPkMIcwIt9>GX>omcC@n7@O)r?#XgJ2OqnXrG+>*B={4Jpq}Yd=Ob-2ll~DKAmszMoU3q1r3>5%6Y5 zu<3Dx1a{upmch0i2HP3gN~cciWQ}&#Sf-O5f}9iLaB_8Z*2F2LQGJc#LC*+st<)Yu zP-=fSA`xiNj%1{cFFQswMZa!f3knwUjD)^s(fL$D2J<0_ghG#+e1Ok|AF8%a9d9L{ zp*_|<;F0Euvq^{7eu98x`I>}~e$no7an6?7=cd%QANFDPo0-BnR=KqW=}Y{V^l&Rl z-kkSD?`8>=&@T(F4%pPu)^E_f-fNb<#JYd%TosU>Q^O$f-A%)>dhSg_n9{2femm`n zR&CiO%?^pviql6jNh#q#GRe~Ux>|OfreyDeiP7j`Q08QmPrchorV(x5pmNa1%fjK7 zda2RtNvi^7#bx^bSUmLJ{c;E!+UcGKF+r>uj>1sbvtY;JFv_v17L>Hq*`mJyW&M8? zoD=ov6eG`#SVRwS+&(ALpc6E-u__1l8&l|a4p;Em*ND<-jtqkbwrLddIT?c18C8vH zSQaZ^B^-oCW6;_(_&-^l5fQc4QAm5h)wN2QU_-(^J7UND?2;9-o?A1!e71j2>@6LK z&sC-y!nDHK>b$u$Myx{EFdX2}hr_gH+~qB5oECN(l4V$n$kiXpvfur{V^@k#b;)vn zB(0*TZvEVWmM@JkiMH+dh5W3*ka82zH+$t{L`xbDT3%k0{cfhS61DZ z@tmOOTR%RDf_)lzeggvUm6(6sPgG7m+hq9e%;GQQwSx8G%A~Rx+{CmQ)sKSdAE?Ek z4-avB@RZY!*7#_Iq7K;+{mWcJN`0qc4+MHCc<+mvKc6stGS=-633}@j(1aOfoO8Bk z5$UN+VKSdY)yqp|zfrPp&(8C?HK0|LElK<5-D$PJsnBIb6Y!UWc!GanTmQ$%LscLM zRI|WJy5QGSq?r(Cxy2?8H4h5%qcoYt8|5IuP&$<HDG`D-VoE=2ysfKx#jw30D4wr}M z3TPQQzkHY+sq+gKYhQoRlREV!1yiaUy2-Kas&dvKYsfvedqo%#)vCNmarr8on+rP4 zQ({Qad%G`>S!sJ%>vdvKKDF&(%cIAoF5;iI&y2KUfOUmnLZ0E-=`i~DZ|79~^aKks`OX)=`%-oAbr=KTdJj>%HL zQ6|Nsn8ZFa8=E)F6tP?78hmveYKnl#rid7iRP|vEVuLPdopv90c*8XAiB8peP~gqh zZV{3X6`K_Pu6KW!uHA;kl|6Topj_#>1ORD>Rc z53l^z*yUc^Fz*_)RkM7IAU9{nC<#WMX9}#0=@05>Dtc&LbVYf|{QTiRuC=87fO(s= z&TECV?khcijdYA%NF=TR{VST{+1KvrJs!V5D0!PIR{DPgr!myB#gXNGzb>Nxamro8 z*d^}aG{jYJAKBNFq_hTg%gI)%sq}Gw>Ub3ZjG0*#>o;ADUbiL}BZ+dV?QVC6C1M4) zN#D<$?LMa;)hCo4kq_}ka+CAx!evN4TQ{ZWbbh`%5~IA=3DJSOh<2FeRz61aV!g0v zq0;WE{}6w~ExQYYLc0m&nbsNq{;Ccmz{5Ght>=*R3r4B-3pFwcsPaK|uL&>&ceu|w zE@0M!O>N>R3G@mr=vX?SINrq4jIpWcA~oQQWq=(!h5IO`5wv5x%At}>yNU9{^XD)> z=7mxdJWtY<+Hy%J+xPkYa+$}5B`wrNQwgR*W9xq~1*&gR@O*RSm2H6Z5>+ zJHV82wnC(zeRMKt$o=tTo)scfP&M{LyttrTFTU@lOVyXpV|@Ny73uA(MQBI)(pGMH zsWgdz7mWIRt2HU9o%bo9M*g9WnEYn`Zq~!D7ix|K3S)+$kffiRI>hPjRh#J$Z4Bj*o1rW) zJmLD*OxmG1nq?YV@roi8B5|Jd0poNCG+}@KMI&KXz^GuE6l)BDD^7h`Gnu0%u;=@t z?3WChYSz3uHCxwVJf-NOh39xKmYrUJHD`Y3Rd!#0kbWO6p3V1MIHOs$J8Ts!_rovH zUbSX^&=Gzz^b(C%LSpz~>1-VZ&AKk=2W-h|*o{}{_RBX?{rl5lMDv+AB#?UZ2eg0a z(q@Y-h#U%i+ibbeu=u(9&4@@1#2^yrB-su){?EPCbcA}nD0?al9CGt(@??t>DaX1` zZl;GkkO~pce)D*tP#p&+htTYFzf7%DVHjbcAFMQTb^Rn@k;u|k>e~||%h&U~IdZM& zY|C@BXNKamvizQMLFW$TMGqn<-#&i?F}(EVPuiZ(-7bERodj6RkxUvL<;icQciUi& z(Mw%p5SP#MB(Ch1)g53v5h12}Ew|MmkL!`|xV_5#lz|nVO7!1^;LOX*Ud1HPLK#XB zqd_e5(x-))=|C63ujfMPv8%?W7Msd`U9ZK+t*hgNeMq@*zH}^DBdL2rdT!-E+ z*k(sh%aSd2M`YC|$~rG8jjoAD@KLX{xZD~3a`j5AX?g63Y1IS1f9ij2TtQx#FI)|; zXa?T!*9t4&JbHk_<9aoYCeo{JxF@!o1R=B|USB77r3z2RvS=*))0>}|q@a9JM z*4qW6!4$cJw^&>_v4t)^f^yp}Tkk;; zV^>TbJGmN){cbf)YYf?~E1p=mh1=Y2JSbI`~ z6o1udz%E6-gPl2~FCmz2T*@UlHki&ajzi2o7(_#33B(3a>6q4k%5q2P({o?J68jLK z40l9TS4@IVPN;u)$3%mAi`fgEp6UR704?zu_$@s^>kP{kvyH~bbUK%$h&51OZim4-B2Jpv@NBPE3s(~u`T#oVtW^Ey73K{(vj$9WuMOnf3Y$@qb%;5K_D}Arcl=I{Br%7W)k(CeJHkUZ9-@V54H8txr$Yl zS9mZeC4|=9gUPhCqabK|=KiP_7<-m}0&I*Q5E`fv0oo@1Bp%q(+BEkZs6Gps=^Cc@ zCo>|7+J}F`wyCtsBU#Sn9Xl};h~<>`ZS0JN#!;=fVJF`5CC}v<7DLeD&HAFkeG{n1 zePF+YX;d@u^66q(Tq{nu>gZKjvhR7(^kiPxUF*TAqE=@D`ijo~b#Ny0kO&IFcpN|c z95>7VI1oMO0(x)firH5|M6;0;x~@DWMh!wi57vK31;zL-pnlrdrybE+eia`&j4f<2 zbgH{yiU!Aa9D0QtrxANt0WHyW&;8g*DDG5fhuSwYR9&8SI8u0Ek;zJfN*vkIStUTd z?-O9`^H^yoN%ll$n$K#6>3(Yk*2zH{Nwt+eLH&Kt-k9y$C6<)WMwe0}vpPtpQbf)f zW7f>+28l33)|b*AKG*(>sEA5fj~7T(Yqy~UeY+qpOEnkRlgsR4@p2a&d=Usnr4N5T@Mi}5^wvnzhEwB7Y#U~M0I5|&v zILP5qO-yWqIV=YD93)-KBqrg;VnHLW&+dL1_2CL;c6n=YQ&}sCv#-HcuiSg7`Yn=A zqQB_$kte&JSi}9!?vSdx@=Fq)Fxy;^1HqQ=d&d1`k$VSPZ@e6jsUQ2#p~UEA8uNc8 zBovVK%iY9bQE}Hn66C0v5qlQh6#3CWzUb*#O?G+F(?Iv;3Dh#QC+~FFsK}Vd@*C@p zANkzxpuJcf`=ZFa6`GoFv>_^w<{+GMlVxYeJNaZ-Xwy*>x*zer%cVryuT2UVQ#=e; zu~CQk2{ImY^@@>|AsP+Fi#4kmQqzAvV6fHPLe2Iae3(#p@Vi)}J(dDEh7~}8<_BhB zwJC^SG}MDhv#MpGdJ2n)uCK15l2e?LJo8P$a`mR&5EmLq4@={`PdTEeQwb3{a)r$ z*RkYt_QmRa!k^?F%|{h1%V|zLo8HS@e#%Hy?ik3Q|Jp@ z$_8@HbaE=4^Ee_EjO_YUw+w&BIR#v124$@w=rbaCyjg-*Hp&e2GUWOciHtNJxT!7T znHbZt4AD#Os9Mt1`kowa4Buo5m~$Uz3Q?Wt@Wy2%o!2A)Jy~1@IL0p{SwtbNp_cS; zAQUnxu7DRM*5w5I0?#+jje7_ljV12d;;r|ODtbj4tu|aSWoI+Yo{4{77=%o!af*6KTG&|2* zD|v0}ijxR3=pmAlmG66kR5=9A#5gg%r}=|Lv;|h~0v9O+c6qpQ0`_%q{D)NkMVJji z=QSU6ha%il(AA`Lz)OG4>asOOy0Gf<$vLQ{2*Rl^6br|*#9kCSQHs8+Hqoi$z zg;DEi(xQ-C$IfP}z%OW=2~7E|{GNb} z*Xy-T410ENa@|`3j!eUX$&{x%iFZfKX=LbVjGC^e~Yn}E?Dr!9Jv{x;b&Y{E2ZCjyjWcmF zFlQ3wG|j7;`~_$?l*PH5^YDy`q#XB+F@&IZwZ+uuN_>6lh1e8P)xEz=vPBA5k9~z3 zs%p%;ao!5*M5^DXvGIq`oCzlR13nOCL+l4~?7wB*a$bKhHGG&!rZ@wYoYJ#1Gik`b zyXA{Yqj3qxe?(D{-P#DzGA9p!U2Y4q<DrLBpG->?UzSYP+pmc+L zZ~+=Myk&pF*>QDRDCzwswQ*Y=&SucyMwr9hjfPopm5l@8>aK*Z(>(7M6Nfin&o!8* zwz89V%ci6R1f_~c!Q?7IVBwH>2CKbS?B;vjfF|oW=tvJG46uM5O#I|Lq5lbC(5htr z#dq!u2`eDk@mI&F!(;bRVrnVk;0QDwenPZ@B9}ez}S7$fqMua|gbI-jTEBc>KD&5CzJIwFGgH$Qk(OF1gBM>%uFSf(L)Vvjb|&Ys{!FA|>E@$ifJsvuR)oxm4u#$P7sC zY=*rrJ)2o+@5}0Rc6LQU=Yp};vx%cRrqba|`7s`vT7Q2N@nB%kBN0rwf;)?WiJ$h9 zzOm6_i(mM`zj&RtOmg3u$7)xlWT6hw&%ziwKxm!Sr7|ACn#>E-Ft+mq z0_aXv2ZvE@7U?j!vDbX&@P6!C&L`6|%u-6vQ55*y0#Sl%H*B`@mEI-3Hi#9p4Et5s zvURR4;3-QT@B98riiUq2m&(8m#ffY~=}?Wpz2@=t8^%lr$XuUEXUsrc(RKL`-^Jz& zw-J{)L^LY8zM9c~M~Nz}{n7RX6k($pNO|tIX4Q7E3)bg()!Bp+6 zP>SQ3IW#@R-YP!Z@6ZSQ+q$~>#vx2F3aokgl1|{ptvBJhdRjCk2bnLBfAX)aqPfkg z)k!l*`%oWMR0Gu^D9>oDU#@yl2jQBDh>qTeZovPFtA9AJqtOkZ81$c2wS)g@)h5y~ zX-xR6%#DmI*64qMs>mnBC7{Xw9V#pQF~-?oa=Bf4!3ExndmQ0tc!I?IKL5^up$OSm zI+5~H6{epA#aoahow|&Q{<0Fk1UE-Mu}TjKJ4N?Ey-Cn|GR}b>tTCq*+%FrY@I(T34lf61s}zWd7bkr?w>N*X#jQsQw^wt^oOr)hR>r5E zr)G`ea8xPB@n%rqZkgOFweUHuTu5hi4k0uS5h7q#jr&t?x}<0IBRvpDP!Hd5!$JCP z%HXl$p_MizsYynNY0`sKF$)ULYgH+}v{~Z6aFJHv_fc=}-gB^RTTe|@Cby8BGvZOc z+G3HH>V1F2`FO5ZJBfQ1cMTkILNtG}zPZ9%3E@$SABn-$$QCGkRw1!O_NN+35}7RkGPeSg_)BY? zrTWcEm~_mZbG>m6bFd{k zAY(ngkz+nK>ylbg`Z3E)sy-1atb_^j+w>9@<;0+(gNjsg3&cOsMt~ zxDvf%50OiBRB`USlB(S$uh{B0-V%R!T(Iv0(^fB^9^EhLsfCY50Nl4t8iFzLy26@^ zBdx4%24BiVY~k)+H{Tosj_H#U(2ftfbajX{QlCbtIm)UY|il3>zaSpD0o{W zmvcriLGKj$b`%2+naEIKBz$U`KEv)86y1!kT0dLCuZgzMIgCD%OJ(ThXx>McdM9Wu zJf499hO62dhoh2sOznDZr(N&Kuv&ITimQHx`934S7ou9{T;O6#g?2-~kr!3_vOFBQSuEZOa^T7`q(mOzXXe>2`W={I-YZEru7{>+M+=c{4__~K*sMj=e848RXT z7|7B(;57}Qmfm&y$I{0==jzk60vEck*j$Dcj}DNLguweKI|Oa?Z<^DUbLIYT=hp74 zUv4{j?Kko=88v^F;QS+tLKo28w-bx+@P*Bc&qU=zd$vSfv%l+3&MfZD9E5qHa$$5n zQ=IXf)E%8{^4Uf!ruSu45b}tRU#}OC`8~yAyT-*CkMO=?mh^aXiKH`7V~x>SwK4Fi z`Lw|>^A|E1zG-FB^}BUFKgkW?CK$~)3&=S+Jr5By>Uw`yj9#11Dp!U^^W}j;H%Z$L zj<=$Az;q?54KXbAjfhu*`B83jN`8i~KiU^&$_*~8hq4xD7B*m7l3EL2y6npL<3(LJ z1IWFs^~qi88N*dkp_dZN#uP4l&Tgqa$EehEvQ=^_A0gzEq8l=QX!)$X=H@HLuLc5x z*3$}?hAn@l6d&?pcxiQZU)1fPE6x+bA9A52KJB;a7WqK_toqP-236KrR=*|S-P)2Ma8M_92P3QiW6J$V*p>gAaGleO zuWCK?0tbJbb&v6fo%8mqt#F3GF7x%AI#_s!!i9fotH?xDj;FFRJX%he&rv3Hfhgu> z%1i45E9aU{XNOSFef{tO4OJ#(&dPDnpYJrYfP!>V?IN9$F^ArRnT)*o!WBOmYFm`O zXLR`TTAfM>mJlCVTC5!Ue{=}ueOw6c%x@165q`Yr@(73KoXOf9^Q)JH*Ip0hDG6*F zN27mD(AXjbKJm$2%cu!TkHPoDUXQ=J^K>F^=cV9Xo?m2&(nwmQb(7B3EA$z2d#>(T zTI2J4->ut3^hOJ$Z#PcFz-?CqCcVLAE1BOEzGp!u{W*n&b5mDORpKw-s{f)EM`?j1 zzP|BPE6-*l+#hQ6(P%H&yY3=-ud?qY9qxY@s+cD_vqV<}1ydoc`E++r{l`$ea#QuE zLJVvBTYh=Ii+Un))khwxDQ{|)xTf2i(Y_tl#DpJ74O*2KqJ7*D^&CfU-Hkb?w>F|n zjt!x8WX+2_tKEjnW|Hwn3!d#)O$(}8x8Y&Eq6sx|XHaScDaVhJ%LCqnhTY>Zhk}8?L-v`KTh6kzIH=9{hG~$5ESCks@>_IK^X4Z{PLvm)uP2pVywljHaWlG7b4Js;DcGTOwY}s zISKyJb-Wzyvs2I@_#@8Z*UQ9YiComf0zOo|#lhp<(vLXb730q&?MQQJIX-_w20#b} zWlIP`4=r@+mZYgKRlz02I>O`Mv%@qouClw4a?MMW)(=IbIylXA(^K^{yb`49-#N_} zinfTu|CFhBCDZ9Ic=>fzi(Id%OF$NBzvuqH0vROc+xBLzK?#zql5w;Bjxk=TuRkJi z_R;B;T%E)o=-&ubSNmBVbwCj;4A_r36N zVKw?H@Yc~gf*uym#&f25xBR_5roLFY&$2TMp0_dN0EeSETgBg76@?HIJds@e-5#zY zJ=i%(YZLV)oqMQgl09r_uL6-=F&6}YK%e9^n$7evE3klZzp=`+Z*U_^d zQ^s!#>a-b=ub<8S&caAQ=pDCv#u1$Kf-5Pu|vXh`(UXn?SDk26KN5sADn$(O_L1)AxtJ zHfT--SCL3a^(G=9=>f7QwD!^nIU+w{Z}G)a5z&eW+2^k$TI! z8}GhF(<50(xk+Cz^wufYlBZj)|Ao42(O*D-C_R%jm`+4FH}Ko0AzaIGT?m`O2CBQ~ z;xp75rzY2jXaIjkI#A}jx~ucwm0Gimb6{^BYnJcj{P}}VCL#iMfp{Q6 z17rWLU+OII-P%}J#D@6-d@Fb`^+^8XDf)mQm!mrKZL%#IGH@UOmI4?T#4OxMt^Fk) zr~;Q|4f%hOii0%w)NEdtS-4Lqu+f?2zvy?DTzOHcsZ<0+3Mn&M4i>tG(>wTGT+?ut8FY9Ma`S-sXbLyMlZrwifc4#fIiCLBI6c7D#*5oU2uMuvI%nOBhsx{sir)c=bI75PoNjuN=DHsfnOYP%>6-J%xFFAkPYsD@ z%_!6+$EVRL-WJsqG+^26*q42V7gT3ylQty`A-z^W3kHbF-IY?8ZAqJ9uN~O2;l79NeCXQ%=2}${iV9sT0UchY3)efJKqOd z+FY|JMm)#-`s9g4NIu2heOMPbm&+T1e)gVW2?ht0+$92SWGxI#VHUj{S^rNn>%o8Z z`63Kxzrdu2LDafOK6-h`TtrMIyD6GaB@k`fL6-jLPX%FWMU=PN=xbqYERcidMK}AF z`zP8zQX^PNXCaNF;;qxa)N#fI3#w~8(CCBLVa#M#-1QMdmwYX0-_uaVK2V%bj0) zX1jH3%!fA5r$f76j;didWNCaja7-hXZ&+!=kb?$Qvt_?Fh>WLUs0Fnj&dbJP0Fdc( zOb>{OKuarh)_{!;S66i3f1Q3o`c^-Q;9+KWpT^-uCENHU&C8KwWoXx_o-2QkXkO3@ z_*+wqRK0V+xa#X<)1P(d@o#gDNUU4Bbek{PZ}K{=j;`$z$7EsIg6x^O7)KT|oXsX7 z$xjZ3WAgNM_vvazB7`Q+VwFru3@9S4pl-Ja)SDY%=pLg!=`gFUvCQ^5o*tb)k68`l zn*$3BthQM!YNtf&E%8X8w}*ep1{nh=axfpvhJP&*e*yQBJl;Tz-J*cYoLCqVZFZ(d zyj$-1LF8N5*xtkn>#H6++`X1_%oZJxoSAT3!$|ElRz7)|7sxIbn$O>;d`eT<`9{vDU<jD!4v1kMa zM=XvrqSgw~59}VDe&2ucnUD`@t*~LL-T^lW&K}mKMu1G%R=jWjF~+xd(HiIKbc`EG z-S+kjuV7zU<2SafV6e@p9(!fpyZy3+`cVYgV!6}uc?b-2 zyYXVqG*N3;&bzc5w9=k&Pzt1DEmSC0T6i#DrzH4qnq?Y!Sa16e*MUelMcI10+=MR0 z^s&D~^Y}xUPfbXa6ieFNbDF(ffR)?vq=s%1K!?xe3e5fPXD9uUBswdPADulYv4G`D z-PEy3U;6nSsl$JSnldvTkEMm6ynz+CY9ffO?Nr-Nl+nlYOL9d-X+J?5)HD8s%1Y&^ zau9@Mc7vO|n!zakELC4t-dD@b%z0j$nNq7bVRK1JJMkV6Wjx5Si zygoCQ|BruP&FNaGZR{e~^OHAW6<*lw%b-0z!z>-@faT&UU+NQChZ*t^`j3B0$->>M zmJx+wha9!^XRSatC#NUAHsb~Zp#Fmdl;Iijd%+K6ddTs zN%*^n<1ebJDgDA~zzUaL^B*-%Z=Y=&aILDYLU@0;4Qmv1p~O$hZ&1p#Bp*2;`#_C3 z>=y(di{&WHfr&S>>2zlAvBZ))E4tvqefWNo{NvGFRi7_d8fE7y7id+$yLnf0%CnN)mWDvA zwmpCUh$xG8?X4RcS_aKN%@33JdkAb%`gSLJFJA}GsrLZfZ%fgG_D0w(H`6kq_tzk{ zsvKn=Ei+;*HQftXV7c#}S$%a=I~$?Q$^}IaOdQ}9Go7~e@@v(GYq((qf|-BaUNE1j z$HnzFwEqcshU2Mx>D8u^{~J=ZT!SdG!wP>C2dI*=&u6Ond8hFl*AaGND_pNIF90hK zO(}87I~xTlT>jsHze8aC*`?osec=&2L^V>e+2Jjbwc&L43+tm?@WCNh2Cy3fD4HIY zpb275Bpa6i=ojkWaT6{Qi~wJ`0Xf0@kBwZ}FUMl;NAWFWf5uu&lk=nV?EdZS7M_3h zl?V>tc3dBZv0zTxP%iMoL`E2Zv#IJPhYqz~Qffrrh?a_yhP?KJJK8rQfTBgJCFm95 zj)i4~+m&ci6O?X?7CS1hqxXr=2lpb?Ua_`nbDQj30sM0(P}*gMXZ#qx37*ez<{6-} zg{h$?=XOrWi@OiEw>;Bqo5iT0rLz1}0Q;Bi1ZdtPud{{Z`Vc*0|0e#9)K z;#7u=WRdkekZ((LO31}K!67hMMXP_#A^8(9=B>(@Hn-4)c)qIO{T9b*Xos!KoWN790*46) zwTI}YepO|)sKRKs*hPWft~-AqWqS6XG;mK2l|GvniWor6cItbROgp40+$}z<4G5Vu zWH!r2&|2}HTx@O7-9zrOQkMG#v5(j<^=Qaf+`gX2KD|r1&c#{a)l@%By>3QyG;U8z z(2AeXHaGimU)cmRz(~XSxGs-Pxii-WG5bChOo;nR9!imE4vsC1BZ_~!{8vlJ-%sy) zjj7=8v>yNr|G#x0>L4hU;J;e{f^PXi0#`}W+rDDgWIPsv&(Af*pQ)Z6Ou{%#7+1N$ zg_U2kAiQ2c;uShA*1sP>XA^LPwk#}(**A%Mj>w_yI$k&Dm^GmYYr`=Xu9B!#BRpy5 zknHo9H79?|gVzu)e*=G`jT1I1t#WOo$vZKP zksQfHK-lrF2i!Sk+VC+iy%M9MTKf?km{I2ga>Sfo+enhi$qQy+02-<~68s0wbo~ts zR6I>AXLlTRa?4~l!6Bb4&}aD5*>S7^w-t18bT5%N*(ZIuGxC37Rn4o-ID6W|=6oX- z%`c|N&2gCl+~eB{Pfd78*ps=t$9UJ9*9%7xd8WjU8Txbn#hG{8a06OVlJ@ES46HH! zQ!-T#MAKplpad+R9v)0 zIEd^UZa$eeoymW?%95gb>tTw3i6w7#h!#uF4@^``Xiw7Hhz;f5qk*l=dYaTbAPVBx zEd^?>K~V$5&XPultn5;duP6`y zAC5Tn7P6}JFT35@TJ@Z@q8_rJ1JB3232O)DME2tnPsh@XbZ|@YC}=uZr(p2$OGMRHZ4stHHP+ zOi)pj9krqr@C*@^E(=qIrd=Yz=6MnOVYbX=@jybJCt9gK1K-GUNk!!7l_T7i3q|O2 z=NW&44F!SiSA!ULlDIdqbJ$e;_D&Ly5MfNgII3y|KtSY3Ng`bow zHyS5=jO#7GXP>B;GeO7PZb@zDw7<-)VN<#V(aD|^dDGad)*I(9+tUleU^4jHtS z=%4(&8J6rf;y0ff3_9?3l}eg>w#S3XcwB!b$LJ~M+xcU= z+xQ{rsB4()$7Gs7LeC7+_`AuMA|-Jni%)Vooaai^c753Ue{iZgsoT zV(VvJEQxU7@OOUvmZ_9*Ri6hrc&%CLTRecY+DT|#%!5EE*#Ld`qy@a0T^98&)rp}c z6dg%X`Y}%3a5f~O8w#qeP+I+#l!AW)Mf71PTn99dR(SLV?*U=Ko#k6NC7V9qpFAsy zUn$MqDn108V2v?i0^IIG7Ls?u_vGT9(CRzsMa)T7n4sg^m;|H%6%c(sE^;2iA6hi} zl5YFuQ=wtQ1Dup951e$-M3m^BC zUB9|oV*rpL<==G_Rr7GfEu~5Xu^4&0<>)B`j_-n;jU#T!E4?*@V4wx0ugmU!k{9>x zJ)60w#pA8Nk`3O`8g@x`)m9c`xT@6|&Oh6J>WYIfm?YSurjt-{t4TIE|M(MiTVBBx zhiZaLo6V}joB5AGu1Sc`@1uV+YP}pfRYo~c)d_h8X`82LOA;^Y(&r!6gX1xhp8`Nk z3SgJarI&kcWG(*3P`28}Oz8h!X=v~|Mxy8F>LjvyD=&JvXTx|NK<|j_gAZhf;OZ)M z$4GL8wBfE@*(ElJfafz~d10TfamtCh{^vvuIE!NoanJLsL-Je^K#6}Dx4F+P$rb!A zMYJ0~dNLxKkOT&Mc}QW@j8o=i0&UOypyEs>0<88e;NhSgb#xBBBMjN=-RLECn#2r> z)dENlSR$X2&NEN_-ef6W>b5Ds&`5_Tp~Ad<9Mw;wFijBozWr)d_ivvC^eYR>{Kxx1 zp!4A0>vJeP`_<_NU^RbKFLpKkLtx>ypmk@ev-2Y`%pUVZ)nDlY(nF39(xQaMBVO~0 z!K?Hx=cVQw?o2kJl$#)0dH94apa5r&cy{bB6M!p&sOVmQJjNMUrIf(}7@WC0SnDiB z-EG>OE1xl_`vB8>HR&4hssWvKc#A8T4z!8{^jTPDL4I%wLQH=qVq(LR4CkjNqDOCL z1V;GMjfmW-)p&C%8%bcapf!SeYkYxb`j=c>@#qEPH;M|}x341KQ9jr$*F9nT8u>t| z^MPH;PRuSfL7Bdu#BZH*_qd}PsgJ(s{-G8F$yB$ci+0Rzbdy->qM_*ae5y+k0wQmP zng|u2Zzab?qY{4vax71ksNtORuzl2a0qXuLK2Q#uHjOMEe0l2P5C;JMWL5mYKz;$5 zV?BW!T#K6Ax1o{reELML1LrS49MvSJ05CX;X@lH>ca?^Xhb5d0*LE#TN+Yo;yh{v6 zo0rt@spJ>UrK!u{IPr>Fpt%8Lepa)cVUkS`eo~u$SBHO9qugLneLm97>VR_Kka!#B zgW=B8k7Ck^k@T_yIjUXHUPNgJxkx+^<7?Ey-BxaeR=wVHO~GZy{;n!@+X`qyd64g2 zS{5Xl9yfmLt>anQb&drh^n-R!PHEfq#XpLKy%JAy7fx8p8a_`y^oHArQkR766?pvp z+LG$Lu%~}&|IMFvIT7lTN=H9LXIkNCGf7Yt6*s~-A-tJaW@A->PW|;O#fQ5++Md#- z+!t{7#HvQ$aH=s#Ex0rLf!}3kK1XSUsc#btT&d;+!9JSU06lfQeb+j4aES1@EAgYa zTs4W-i$^nR$e8bKD!1QCT(2HZ zeKtGviLY$ro-2 zob&6pM$A+~A=DRy=H;hKb^8y7WdX?T5hNdza%D<1;**EH7}v9nP#mshZQ87A+g9&o zqy~S3aB8|3o$Ju`QGn&^b;!;wY+#~QT@*j=4NlqU4`c0|g977|v`A2hI5t$=jD@!m&8q*G9Q+DcXNv zV;v#Xhz{JZFw<6r86?=^`B9p`{yW&oOs>rjzK1hdbh*C19N+o&awk<{Nr#vdH{2*q zT*i!3-T~Z=+$r1AW+L7++Z+Acuyu3gw2wlaT*Qrzi7r2f&2HLgq|jS4 z@=m{AJNMYt-0fy~(ok=wP^mv437ykls!KkKHB)OfynSnDL#C0@CP=QvOfi31l{$P3 zxWo!B1pTZ-0S^o~228P}_8D|wL;BCc69+GV#c*k_k4{o2X3ksn*pvGD zJs!rJz_l3bC|bLMh)op#rsu3{!vHLtM%70zAwueFA+Op?sL#=3;U$_(STiT1G!_vy z0w|d+?Jz%l(u>R6T*^>J;G}=+ZI<6i61`ZDp8nq`U)2Et^^rvG(w7mo9<>+&cI(Xs z&C`h6{b@ld3jOKC8#kr4mDJEA)aRs)*!YhJr}i#cfGb4srjZkT57c0ag8)365z8Wc z5vhc70Tgiip+J~k*R{bh{AQQzMziDLYq7?@6LJFdHw-`Wz?`}#Mq7WC`QEhHXVWab z-T|i138dwqL>;+B$NO4RNwc722xEGXY961l)zxvjG|#_v?{-KJya!~Yy`Q%i$l;}T z$H|DEHO33yOiOlo;J4jR+Lg@v;+!40oTDFVnvk5Kl7a6gXxdM^k7IuNWYUkZd^awY z*Ef>Y_{V-XaB=Dq_Pl>dw$@@;3{+_mKnX7tc4{9FEQ%&`yCw}|x)ypyIUY0xV}-fRAS=ka68BdQk(Ae`nZ!N{wrh`!MT3H`sB zyQjsQIRwo-8#ZRnJug#IhtntDN=S}Wi|qQr-lL61O6a~ZaO{5-aLaolx~;~nsGNrS z8Fsa@V9SJa1O(v)NO_?_g0ael8nohYQmd}0()oF)0f4`F@L+KV3VK8h7_ozCsRsFv zQ-67jmumD`!IKGrg4_s5gp``zve?l&M?WFaU*2vg`JYJw~I62@l7bbt`*Qp+u5de-|?~Lmtf3UA-*@uB#jKX4{FZE(;|NG1a!OPIxHC09g zPUHmnb@POW)ln^SK~lcN^!S`)yjRWa2 z;JIk4;=kJJi^bj6W7#u1Nz4){2GO9<@EpKcbj1F`l7gkIIio_rRq z59A+0;0k-0+?PR0EcT7waL_7nML;`a9o3mzG&AC=Eb1OO^e`|<Au4LHnuxwTEeB4*9+OVMSA6tw~h zS4!UnxVLH&k$R~cAk;U<<#H0atni;f4e*R?F}b$hW1?q&2dNIO&-&1DD>t3!E>%jzng9QDSC+&cw#$Jg&w-I0NDUfj(@*+HQ=fE&D^2b8X&`@};t1EAf-<7(M zqzB*cl|VBTb1+-Q7|NP6iy9*@PiF4fN~Z4a=Lb>&ODz+4cuZ=4@MVG)w9z5Ku@~_RuRwQ2(1@>$chzu{HO{p zBjGkvu)nm1ysuI(?dYmiDnyD{43rJF&5=4)a zu%T&f`x*^;4T>dQJt8b8jBSX2Ux*a}w*}!imG+ofz=G*bgPV#wgVhBr z$`pV+tr#%EVdR5<(e^9g1!wMGP2@_0|0Fcte~7XZv5pptO&K~7&@eHFNnWZQZ4rr9 zHY4nB+@|mlaevsq>HbZ|jVakAUDlIu*k88b3#Ze4Vy_LUs}`Fgp$Br$A z4Dq$~7z@=?U!HukGXKWaq3*+~I@Rjbojvz+k4g6v)99kmavp5-NdWru$EX&bA}@4o zo*;rou&_#_2-Y74r+mMhYU+QNw_lil=awO+KMM^Lsc!@*of_`4b>RW<{3A57pHnvdL#1|Ow9z~&OlTaA_EDZ0piW1+6n zy;k5@wCl%GQDsG=$`v9dKw>}N+tsNcQYOe32BJ zeFQk*(p*sykG}4DBiwK`>0?z&fS=&hV5}^vCa!`)`>+5lF=S;;|DR>H7II%h`TSPy zU|Er%9i2oMP5DQxx4&oHz&M|Ot4%Z-@&Y}|Tx1d=xBAU=N-K4=IhF?f&^n-zpYgf9 z=h>@YeUtlRqHyUk)byQ60&K*ALsjz6-XB2Y;h?-h%RircW*`^?*g>h zqPs;Bb)DUHNMGh^AfdX73BQ{By<))c&g2UIAw5K}8DTHHgoP~1EoG5^1d_GOnbhLq za;9ew5%0RmmJq6jyBGaGX-zo$a~<6bwr;h`F2|pV0*6pame_3GWwmu*IDAz=Y+$LR z=d4gkrHUr70*<1qX1Z}h%n90L;ayl|yuxLxRDBcNid9)gMM><%J$-U4*k|jC1kj$$ zaBsD}=Gx>XJ?r~x>n&n`sJX6`lQ(j?uYV-otDxOU2F_6Ie!Kh!Q=aDpt-T7_Z^)WB z_}{9C)C6Q^DlZ?w_wBVC%UVhoS#22i4O2VyNu ztJIk1@vINw7uiU#hE?|pjoyIfuon#nog2e{s~KgGDq;aB3s;g}m7gB=Yr5uG5p?)Z zrr6r3a z$Nzm-t_=uL2E$obR|LSjxv@VXfqXVKu<;vyFa;%Etj}80cnuK{F3aL^$BtL{vwbqo zPLJ+Uv!xPi;7fK(!jX4?hel>pswGXAUqMigI|yF}c-)CqJaG$2!3FyvHI-(6vK7pR zox1cUvh=#)POFF2LP#!}ykh$D_KWEtgPx~0*8}$94zNEuOpDwJcd_3paR#!03T19& zb98cLVQmU!Ze(v_Y6>+lF_&SP0~EK&hyr~Z0yQv~V3`9Iw_T(HuNwn3Fg2H9nFAEJ zB)|eI2?I4SHSSKyV9}?>jSdrp}%FXYTp2s@B{3bU*!e?OltK zR9THt#0+EtlmywkFtReS@BtL9>`YvpRY7)&AYOS!1)!M~;6u)dKuIa)1T=QB0@;fj zy8!tBT0k>^IM5V-z{Un(<>lo?pah7496X(@EG%6BG#aW}wDj~0|CIb?0xGL4QLB;umjq=e1!O4JE{SJ02fOjz}(6f2oO_J)|OF}0?K;Fs}XzvW91(<`J0Ji@)08BylW>$Zd=FIee5lh4wU<`0}0Ge8TxB)#( zfewGE7yu4HCp#-==Z|-Ql{3J?$=KfIqX#Y^fR(+et*hBz06ygApuYh*IDtMa>^^iK z!IVMHF3zS-Rt_$JkF3h#lK;TzVrlI1S8ivk4>bT}{$XhbGIjl{q`!3^VLr4j##Z*u z02iQ#%U`*FOn?A0D`y8=W6zJ=AHf`)tp0}K>TG3i@lON{04Jb@v6GoC(AoJT%t!3M zy7SLE0spOfV+RLY&%eDve_Q<*1}hh5pshI*0xR1`PE(hU+!j{$2+V)Yij2KE2*Aqn z54oAE!++}BfKGomh~}@Eq5S}1YzDHo^#qs!%@LS?6+tc^DFHP9JC>RLeI)-IDE_w) z{BNQ6|Bu{%<>5Y|1YP1wblau1Fa~?*6d$(GA_m+EfKM|_@IS_iRB+cD`!b751^T{m5Zq*z}(pO zqhEi2%QfuHfKIkn_P`Hb|86OOk(GtzUv%o0R;D)ge-Xg>4;9ef>|f!3Q1v%>W+e$F zC3SiF|6#fQZK(V)1TN~H4j@*?%4W3L`2C@&I@b` zwW+I<(+9zSU;dA(|MUF!%maZQKvRU(C6Fn9uyuM?hD$w8-tdIDZvS^y$l(x&vL^N7 zLjPJ&uU~rjPu?n{*SZj<<|)2E-#iyj9p3h3=?+G}W7|^qrUHKz5c-hQ_7$RSQgw2F z(;oyf8Vdkx*UPe7j=2T#dwjN_YfN}BBAY22t+P+>m~?-6FWSvZ;Np=H^t>)UA}EWTqz zoPaTsK$XjRaK!)c5@6#@nJx}!F!AM7d=)gwJct5z-}aq=^NEJ?UO;JQdaYc41&pGY zz^s*gsr(FgO%fx~+_~(EJ4x*qmY&NepU=DIMRT<^YBG`znU4-5e9NDZNc-bUY|T#- zKAh2#d$OX}tvo))+L_}uYj{rtoGGidCCrS2t<*2K7S)WK?*atx%RzWd<4@p(3njDi z^cN(5BvHhGRcwKVcPuXw0z{R6AY>JXaXMa$bxwdT4;*@ufumd-%nWZ!AI`ugb}smi z6;;tlT6+FPTKWm`0#hHBR3n|sivov|)e?G2{?WR6pl5)qKvp;5kW!=zL7C&s+*Y%a z6C6=?So^6BmLHzO7^Y@Zw;`sbAOjVjPhDLgGjv6U{QtS2(d!&JM4=8l?QZB)Cu}sSh>k6q4Iu1OJ|*j)D+maXazoU3yW5I zEQUVIrf>03U`Nn^U!QWF{dd{=H$N*VIb4{IGnwM9`p;fPzT^6#**MFoHa%)5?xVT> zSy|>Hi+uG(&W@^o5H;&)h^|){gX>ftgd^51D8sx2kLki&!^XM~9rxT7(Dk&=;NZ>4 z)~8Z&%om_-#`K^6Vs-ufo}eJ`Q7>GBmEIB*^#SZ{ z?9!`qMQ^r*BXteg!=N^e7$!}|qyW1Tp;aG65!B(HJJCvW0_G0qeo|M|+TEFmND_7u zJCotIE})cunM84uC_A-PnTzb->YX8%-O4U6z+OTL+u{TEC_FYfBJq;UKk@$LsiE*4 z+1T34x+4|VtSCW8*|Wq~`?kO_6JZ+fQNn=U<-S*Zx4zPo0)2FEeOjBMT5<@(peew5 z^cME*Yv?}9BPhUm1CmVxwK3~Dcg{f^P#( zig`bwYE8@g{9?;elv!>}{CqKyz&R8b=e*z}rZ8Civp;en!@869otN98zyc|^&vw~~ zay#LF5CJCm?s5#>LF2`0>RT;K;5ARs(;`oy>{alQxG z=uoAObQsQ+i{~eG6-sRFyMokVuuKRFW=PY2?zo}>C&q5^t3$g4?B_6Ij5L(#=pLf; zREdb?C$}X))J%}1LXmy0L`FtqN-3UoH$4R7y~q`nAdUzGisgn((z5yTfL43e&@V*6 zT8&()pjz8LPw^7@Ln6z5tS*zvIxo(1as5Asc8=mF`uWC%1#Sw7#P*Hpq9x7#xoDSv zSh8@VRvm=1K6whOyrRnHXKH>FeE=2{OQIJ(dK-ikw^v^8SaXUcK0~Np2>q`PGXv`W z{$#~Fnb8ol-ENLLkErxc&usBN9__w_f5^BF-WmWaZ2<%3b}lH95a*f!GhpRC7PUsU z3;ED%PobOnvvVe)$;Nc<@fVQaE&X+W$YDtjaFi3pwJ)+0xoH5gpRaYl+xKDT?E(ab zM|1(54Mb>9MgW?46(3>*#c{=|FJ~k;is4I`9&?AmJK#aPhUH5RK6O#cgzdB+dUU2T=I9QmaqW0R^TRAWVxRbIbnh%PlhO2i)H3@A;@^IRA#-z&88YC=Ot04S z`YdMP_95!uT8QY->5d$16yIA2%$^SpKa&|d5S+E2RJtmY4KM78s zxBjZBvVnEe3{ljq7W}=AaGpzl?Qa%dL3J4|ZB%S{`#UtKbXOGsx+i#wVyB6w4PjCL zz6RGSHE*dZN4I;i_tBl`s+$*d{VmzIl^j$nV} z>^qpPnfLjSoS^f#*ZnL#mkt@mAW&Q_!m(L3c*lm&$)hQ69D{`sWuiBK6N5uG^;?<~ z1BX`STUF~Kuvu*AbM=Xu8ssvGVB0m5vpcTPk_&N`9a5xbql(0OttvOf$TTOd6whJ#jOx-sXbGL3fG#}`

    wK7Cq+s~C^6xpQ>ramCrKt0FvsEO?M`riVg`kcwI4|Pn^xv| zQ;rP9s};qhjwBM&v(9BT7Dscx#@RI+^n{o(|D5w_YDm5s$}czJ-jMeG5d>tpN7ka` zhrqEuq!J{{!hVTW6S zG%}%ZF_aL$dsi(_4=HZ=5#Q>KdMN7FLVN8tAcBfTA`unzz=O9 zbA_f!9lJUf5>X=oayjbJuYjVBxXp`_2_R8xBgT{;BPtx!<9V+-w_I$jE00vKhN=XlK|R?!p?Oj+SgD!zzrzVz&1a0ti`)`!*A~%k2cMz zlY4VTGkv83vCKz}q-VVM7Nw;s)u{TfSlYoM-NqJIeuxVbx?*53L=4BC(v(h_0 zxWpjv^1XvzexSNcdrIbvZxvjXd!*unq<|L-b}%x3kfcVNJ%bbjy+71q4Z)s%8~XZ- zN(VFlOoY9CtS{cN`RR~q`YEoX%3Wo3{>nGx3HntW8Y(;M$?)nKHy+th7T>357a1cH zyuS^vV}eAj@mX$xMyu36^b`U=F5Bv=mdrRzIIQ;(m&sHt6=UV#<#Ry^?5jOzP0cCx zi!Voi-xH$(dh(`wiO22NbMaSn@yrB5%!Py@Cm#tc<=+=&K6(DQea1v+?lRX@6v1q? zwqtZtk$>vmiN-qn#%W{W;_o1$2#^|uFBRagv4!om#?}e*RtBJzU9NoDp4?MH%nKrP|M^1iwt6XzJ@;9nCs=}_goZ0L=^C?Z9LOj2HLoP z`G++rloV6;sEdB3$vet<-o2${O-e9c)`=*oU1`&wIPOH*_yg}9e~|cVc|b;P3*-Ls zmZwkiMchaHBc4|n_2`epE9>WEij@OA4y8mF4row6?)LSzOAp*ZmGJ~872L~;BM68J zGCSz{%V&x#TJWrFmqKYkCGQEQ8TVT!Tb&umUM&C1f6ca+R8zusnZ6BMa%Gp?sq znY~VyKGL$+N(N>7WGpmmIq=`^XTWG%2(+DAM5N1oFO%o~g07LFses{`YfBGis8>BU zl)UBg@OBYW^(qqaHL15|MQY^4l;B+1rY zXyulI{%k$LD$D-}35otC5*@c!F2)R>^PP#Lg`~F`kDm-$Nbm7$JJX!qZ`(IFmqFTd zFR)PDjs!gWYuhq?1$_kP6|&`oNQHziB?Q@OJGFqEM%UR>S6lYVZJ(qjRY2UVHyi#(CJ~Po?br` z0;x-~1=H0_l*XrcC(6aB(KEo4OS`Yw^9wa(oX{Z6eZw(gqy)y_%C!Uz+Kqm|CB52< ztPd%6VG2m}r5-0^=h(DHR6~xz^M^XjFnu@wiEH2dD`w==wfi{|BVUbwOgA0k9a

    For example:

    - -

    - -

    - -

    +
    result8 <- ch_hydrograph_plot(
    +  flows = daily_flows, precip = precip,
    +  prd = myprd, leg_pos = "right"
    +) # change legend to the right side
    +

    +
    result9 <- ch_hydrograph_plot(
    +  flows = daily_flows, precip = precip,
    +  prd = myprd, leg_box = TRUE
    +) # add legend fill and outline
    +

    +
    result10 <- ch_hydrograph_plot(
    +  flows = daily_flows, precip = precip,
    +  prd = myprd, zero_axis = F
    +) # default plot outside of function with buffer around axis
    +

    From c17eb361235bc2de15f8845afafa88aebabf51b0 Mon Sep 17 00:00:00 2001 From: Martin Durocher Date: Wed, 26 Feb 2020 23:32:34 -0500 Subject: [PATCH 18/21] Add LmomDiag.R --- NAMESPACE | 1 + R/rfa_LmomDiag.R | 32 ++++++++++++++++++++++++++++++++ R/rfa_plot_reglmom.R | 31 ++++++++++++++++++++++++++++--- man/FitRegLmom.Rd | 10 +++++++++- 4 files changed, 70 insertions(+), 4 deletions(-) create mode 100644 R/rfa_LmomDiag.R diff --git a/NAMESPACE b/NAMESPACE index 02409f5..fba1e83 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -118,6 +118,7 @@ export(GeoDist) export(GofTest) export(Intersite) export(JulianPlot) +export(LmomDiag) export(PadPot) export(PlotMrl) export(PlotThresh) diff --git a/R/rfa_LmomDiag.R b/R/rfa_LmomDiag.R new file mode 100644 index 0000000..d117a47 --- /dev/null +++ b/R/rfa_LmomDiag.R @@ -0,0 +1,32 @@ +#' @export +#' +LmomDiag <- function(distr = c('glo','gev','gno','pe3','gpa'), + x = seq(-1,1, len = 50), plot = TRUE){ + + ## Coefficient of fitted polynomials that approximate the relation between + ## L-skewness and L-kurtosis + bmat <- read.table(text = " + glo gev gno pe3 gpa + 0 1.666667e-01 0.107158699 1.225038e-01 1.226259e-01 -4.316343e-11 + 1 5.500064e-16 0.112615852 2.100695e-17 4.849455e-16 2.000000e-01 + 2 8.333333e-01 0.845179976 7.923906e-01 2.887205e-01 9.600000e-01 + 3 -1.085827e-14 -0.073172867 -7.453141e-15 -4.074033e-15 -1.919999e-01 + 4 2.658698e-14 0.005277763 -2.114303e-02 1.064608e+00 3.839996e-02 + 5 4.643463e-14 -0.066938343 4.843957e-14 1.743865e-14 -7.680604e-03 + 6 -9.309061e-14 0.100281501 2.770630e-01 -8.906645e-01 1.536177e-03 + 7 -7.209454e-14 0.087677507 -9.447091e-14 -3.055534e-14 -3.057862e-04 + 8 1.274086e-13 -0.132783946 -3.775294e-01 5.728072e-01 6.109048e-05 + 9 3.641720e-14 -0.060103832 5.399747e-14 1.810627e-14 -1.370841e-05 + 10 -5.915841e-14 0.074848480 2.066031e-01 -1.581181e-01 2.769001e-06") + + bmat <- as.matrix(bmat[, distr]) + + ## Evaluate the function at multiple points + xmat <- model.matrix(~poly(x, 10, raw = TRUE)) + pt <- xmat %*% bmat + + if(plot) + for(ii in 1:ncol(bmat)) lines(x, pt[,ii], col = ii) + + return(invisible(pt)) +} diff --git a/R/rfa_plot_reglmom.R b/R/rfa_plot_reglmom.R index 4d3ad01..e4b637f 100644 --- a/R/rfa_plot_reglmom.R +++ b/R/rfa_plot_reglmom.R @@ -1,8 +1,33 @@ #' @export #' @rdname FitRegLmom -plot.reglmom <- function(x, ...){ +plot.reglmom <- function(x, xlab = 'L-Skew', ylab = 'L-kur', + line.distr = c('glo','gev','gno','pe3','gpa'), legend.do = TRUE, + legend.args = NULL, ...){ + + ## Scatter plot of the L-ratios lmm <- x$lmom[,3:4] - colnames(lmm) <- c('t_3','t_4') - lmom::lmrd(lmm, ...) + colnames(lmm) <- c(xlab, ylab) + plot(lmm, ...) points(x$rlmom[3],x$rlmom[4], pch = 16, col = 'red', cex = 1.5) + + ## Add theoritical lines + LmomDiag(line.distr) + + ## Add legend + if(legend.do){ + + if(is.null(legend.args$color)) + legend.args$col <- seq_along(line.distr) + + if(is.null(legend.args$legend)) + legend.args$legend <- line.distr + + if(is.null(legend.args$x)) + legend.args$x <- 'topleft' + + if(is.null(legend.args$lty)) + legend.args$lty <- rep(1,length(line.distr)) + + do.call(graphics::legend, legend.args) + } } \ No newline at end of file diff --git a/man/FitRegLmom.Rd b/man/FitRegLmom.Rd index 3b39e0b..388e16f 100644 --- a/man/FitRegLmom.Rd +++ b/man/FitRegLmom.Rd @@ -20,7 +20,15 @@ FitRegLmom( \method{coef}{reglmom}(object, distr = NULL, ...) -\method{plot}{reglmom}(x, ...) +\method{plot}{reglmom}( + x, + xlab = "L-Skew", + ylab = "L-kur", + line.distr = c("glo", "gev", "gno", "pe3", "gpa"), + legend.do = TRUE, + legend.args = NULL, + ... +) \method{print}{reglmom}(x, ...) From c751ec883c69721315c27de0cf171cbb013c099c Mon Sep 17 00:00:00 2001 From: Martin Durocher Date: Mon, 2 Mar 2020 21:35:34 -0500 Subject: [PATCH 19/21] rfa_LmomDiag --- R/rfa_LmomDiag.R | 1 - 1 file changed, 1 deletion(-) diff --git a/R/rfa_LmomDiag.R b/R/rfa_LmomDiag.R index d117a47..7a17dee 100644 --- a/R/rfa_LmomDiag.R +++ b/R/rfa_LmomDiag.R @@ -1,5 +1,4 @@ #' @export -#' LmomDiag <- function(distr = c('glo','gev','gno','pe3','gpa'), x = seq(-1,1, len = 50), plot = TRUE){ From cce3850f2fbeee6987a525dd4a7e377e539ca8aa Mon Sep 17 00:00:00 2001 From: Martin Durocher Date: Thu, 5 Mar 2020 12:39:52 -0500 Subject: [PATCH 20/21] Update rfa_print_goftest.R --- R/rfa_print_goftest.R | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/R/rfa_print_goftest.R b/R/rfa_print_goftest.R index 7af5298..784df04 100644 --- a/R/rfa_print_goftest.R +++ b/R/rfa_print_goftest.R @@ -7,9 +7,9 @@ print.goftest <- function(x, ...){ methodName <- 'Modified Shapiro-Wilk' cat('\nGoodness-of-fit test\n', - '\nTest =', methodName, - '\nDistribution =', x$distr) + '\nTest :', methodName, + '\nDistribution :', x$distr) - cat('\nstatistic :', round(x$stat,4), + cat('\nStatistic :', round(x$stat,4), '\np-value :', round(x$pvalue,4), '\n\n') } \ No newline at end of file From dd4cdf7988e7fe4d9e73eb745647fd31d9783b6e Mon Sep 17 00:00:00 2001 From: Martin Durocher Date: Sat, 28 Mar 2020 13:47:45 -0400 Subject: [PATCH 21/21] Merge branch 'martin' into dev --- R/rfa_Intersite.R | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/R/rfa_Intersite.R b/R/rfa_Intersite.R index 7fae99d..8651564 100644 --- a/R/rfa_Intersite.R +++ b/R/rfa_Intersite.R @@ -146,19 +146,20 @@ Intersite <- pcor <- corr[lower.tri(corr)] pdist <- distance[lower.tri(distance)] w <- nmat[lower.tri(nmat)] - - ## remove NA - pid <- !is.na(pcor) + + ## remove pairs too far + pid <- (pdist <= distance.max) pcor <- pcor[pid] pdist <- pdist[pid] w <- w[pid] - ## remove pairs too far - pid <- (pdist <= distance.max) + ## remove NA + pid <- !is.na(pcor) pcor <- pcor[pid] pdist <- pdist[pid] w <- w[pid] + ## binning brks <- quantile(pdist, seq(0,1, len = distance.bin + 1)) brks.bin <- as.integer(cut(pdist, brks))